ZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaCBiL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaAppbmRleCA0OWRhZjY5Li45MTM2OTZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oCkBAIC0zMSw2ICszMSwxMCBAQAogY2xhc3MgQ2FwdHVyZVJlcXVlc3Q7CiBjbGFzcyBDYW1lcmFNZXRhZGF0YTsKIAorZW51bSB7CisgICAgTk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVMgPSAtMSwKK307CisKIGNsYXNzIElDYW1lcmFEZXZpY2VVc2VyIDogcHVibGljIElJbnRlcmZhY2UKIHsKICAgICAvKioKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDUzZTdkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODMxOGQyOC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGlidmlkZW9lZGl0b3JwbGF5ZXIKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9ycGxheWVyCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgIFwKLSAgICBWaWRlb0VkaXRvclRvb2xzLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JQbGF5ZXIuY3BwIFwKLSAgICBQcmV2aWV3UGxheWVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllci5jcHAgXAotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvclNSQy5jcHAgXAotICAgIER1bW15QXVkaW9Tb3VyY2UuY3BwIFwKLSAgICBEdW1teVZpZGVvU291cmNlLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZy5jcHAgXAotICAgIFByZXZpZXdSZW5kZXJlci5jcHAgXAotICAgIEk0MjBDb2xvckNvbnZlcnRlci5jcHAgXAotICAgIE5hdGl2ZVdpbmRvd1JlbmRlcmVyLmNwcAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uCi0KLQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgICBcCi0gICAgbGliYXVkaW9yZXNhbXBsZXIgICAgICAgICBcCi0gICAgbGliYXVkaW91dGlscyAgICAgICAgICAgICBcCi0gICAgbGliYmluZGVyICAgICAgICAgICAgICAgICBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgICAgICBcCi0gICAgbGlibG9nICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliRUdMICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliR0xFU3YyICAgICAgICAgICAgICAgICBcCi0gICAgbGliZ3VpICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlibWVkaWEgICAgICAgICAgICAgICAgICBcCi0gICAgbGliZHJtZnJhbWV3b3JrICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHQgICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgbGlic3RhZ2VmcmlnaHRfb214ICAgICAgICBcCi0gICAgbGlic3luYyAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlidWkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlidXRpbHMgICAgICAgICAgICAgICAgICBcCi0gICAgbGlidmlkZW9lZGl0b3Jfb3NhbCAgICAgICBcCi0KLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL3N5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9sdnBwIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2VkaXRvciBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0KLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgIC1ETTRfRU5BQkxFX1JFTkRFUklOR01PREUgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX0NPREVDUyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfQVVESU9ERUMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1ZJREVPREVDIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9BVURJT0VOQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfVklERU9FTkMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX1JFQURFUlMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUXzNHUFBfUkVBREVSCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotI2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYmNhYjY4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkR1bW15QXVkaW9Tb3VyY2UiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgIkR1bW15QXVkaW9Tb3VyY2UuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vc3RhdGljCi1zcDxEdW1teUF1ZGlvU291cmNlPiBEdW1teUF1ZGlvU291cmNlOjpDcmVhdGUoCi0gICAgICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgaW50NjRfdCBmcmFtZUR1cmF0aW9uVXMsIGludDY0X3QgYXVkaW9EdXJhdGlvblVzKSB7Ci0KLSAgICBBTE9HVigiQ3JlYXRlICIpOwotICAgIHJldHVybiBuZXcgRHVtbXlBdWRpb1NvdXJjZShzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEdXJhdGlvblVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0R1cmF0aW9uVXMpOwotCi19Ci0KLUR1bW15QXVkaW9Tb3VyY2U6OkR1bW15QXVkaW9Tb3VyY2UoCi0gICAgICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgaW50NjRfdCBmcmFtZUR1cmF0aW9uVXMsIGludDY0X3QgYXVkaW9EdXJhdGlvblVzKQotICAgIDogbVNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUpLAotICAgICAgbUNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpLAotICAgICAgbUZyYW1lRHVyYXRpb25VcyhmcmFtZUR1cmF0aW9uVXMpLAotICAgICAgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUoMCksCi0gICAgICBtQXVkaW9EdXJhdGlvblVzKGF1ZGlvRHVyYXRpb25VcyksCi0gICAgICBtVGltZVN0YW1wVXMoMCksCi0gICAgICBtQnVmZmVyR3JvdXAoTlVMTCkgewotCi0gICAgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPSAoaW50MzJfdCkKLSAgICAgICAgICAgICgoMUwgKiBtU2FtcGxpbmdSYXRlICogbUZyYW1lRHVyYXRpb25VcykvMTAwMDAwMCk7Ci0gICAgbU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPSBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSAgKiBtQ2hhbm5lbENvdW50OwotCi0gICAgQUxPR1YoIkNvbnN0cnVjdG9yOiBFIik7Ci0gICAgQUxPR1YoInNhbXBsaW5nUmF0ZSA9ICVkIiwgc2FtcGxpbmdSYXRlKTsKLSAgICBBTE9HVigiY2hhbm5lbENvdW50ID0gJWQiLCBjaGFubmVsQ291bnQpOwotICAgIEFMT0dWKCJmcmFtZUR1cmF0aW9uVXMgPSAlbGxkIiwgZnJhbWVEdXJhdGlvblVzKTsKLSAgICBBTE9HVigiYXVkaW9EdXJhdGlvblVzID0gJWxsZCIsIGF1ZGlvRHVyYXRpb25Vcyk7Ci0gICAgQUxPR1YoIm1OdW1iZXJPZlNhbXBsZVBlckZyYW1lID0gJWQiLCBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSk7Ci0gICAgQUxPR1YoIkNvbnN0cnVjdG9yOiBYIik7Ci19Ci0KLUR1bW15QXVkaW9Tb3VyY2U6On5EdW1teUF1ZGlvU291cmNlKCkgewotICAgIC8qIERvIG5vdGhpbmcgaGVyZT8gKi8KLSAgICBBTE9HVigifkR1bW15QXVkaW9Tb3VyY2UiKTsKLX0KLQotdm9pZCBEdW1teUF1ZGlvU291cmNlOjpzZXREdXJhdGlvbihpbnQ2NF90IGF1ZGlvRHVyYXRpb25VcykgewotICAgIEFMT0dWKCJzZXREdXJhdGlvbjogJWxsZCB1cyBhZGRlZCB0byAlbGxkIHVzIiwKLSAgICAgICAgYXVkaW9EdXJhdGlvblVzLCBtQXVkaW9EdXJhdGlvblVzKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbUF1ZGlvRHVyYXRpb25VcyArPSBhdWRpb0R1cmF0aW9uVXM7Ci19Ci0KLXN0YXR1c190IER1bW15QXVkaW9Tb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBBTE9HVigic3RhcnQ6IEUiKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIG1UaW1lU3RhbXBVcyA9IDA7Ci0KLSAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIoCi0gICAgICAgICAgICBuZXcgTWVkaWFCdWZmZXIobU51bWJlck9mU2FtcGxlUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCkpKTsKLQotICAgIEFMT0dWKCJzdGFydDogWCIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgRHVtbXlBdWRpb1NvdXJjZTo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCIpOwotCi0gICAgZGVsZXRlIG1CdWZmZXJHcm91cDsKLSAgICBtQnVmZmVyR3JvdXAgPSBOVUxMOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXNwPE1ldGFEYXRhPiBEdW1teUF1ZGlvU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgQUxPR1YoImdldEZvcm1hdCIpOwotCi0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUNoYW5uZWxDb3VudCk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1TYW1wbGluZ1JhdGUpOwotICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgbUZyYW1lRHVyYXRpb25Vcyk7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkR1bW15QXVkaW9Tb3VyY2UiKTsKLQotICAgIHJldHVybiBtZXRhOwotfQotCi1zdGF0dXNfdCBEdW1teUF1ZGlvU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0KLSAgICBBTE9HVigicmVhZDogRSIpOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwotCi0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA+PSAwKTsKLSAgICAgICAgbVRpbWVTdGFtcFVzID0gc2Vla1RpbWVVczsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtVGltZVN0YW1wVXMgPj0gbUF1ZGlvRHVyYXRpb25VcykgewotICAgICAgICAgICAgQUxPR0koInJlYWQ6IEVPUyByZWFjaGVkICVsbGQgPiAlbGxkIiwKLSAgICAgICAgICAgICAgICBtVGltZVN0YW1wVXMsIG1BdWRpb0R1cmF0aW9uVXMpOwotCi0gICAgICAgICAgICAqb3V0ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhY3F1aXJlIGJ1ZmZlciBmcm9tIG1CdWZmZXJHcm91cDogJWQiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1lbXNldCgodWludDhfdCAqKSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAwLCBtTnVtYmVyT2ZTYW1wbGVQZXJGcmFtZSA8PCAxKTsKLSAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpLCAobU51bWJlck9mU2FtcGxlUGVyRnJhbWUgPDwgMSkpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtVGltZVN0YW1wVXMpOwotCi0gICAgQUxPR1YoInJlYWQ6IG9mZnNldCAgPSAlZCwgc2l6ZSA9ICVkLCBtVGltZVN0YW1wVXMgPSAlbGxkIiwKLSAgICAgICAgICAgICBidWZmZXItPnJhbmdlX29mZnNldCgpLCBidWZmZXItPnNpemUoKSwgbVRpbWVTdGFtcFVzKTsKLQotICAgIG1UaW1lU3RhbXBVcyA9IG1UaW1lU3RhbXBVcyArIG1GcmFtZUR1cmF0aW9uVXM7Ci0gICAgKm91dCA9IGJ1ZmZlcjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotfS8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15QXVkaW9Tb3VyY2UuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZjI1YThjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlBdWRpb1NvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgRFVNTVlfQVVESU9TT1VSQ0VfSF8KLSNkZWZpbmUgRFVNTVlfQVVESU9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZXRhRGF0YTsKLXN0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOwotCi1zdHJ1Y3QgRHVtbXlBdWRpb1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7Ci0KLXB1YmxpYzoKLSAgICBzdGF0aWMgc3A8RHVtbXlBdWRpb1NvdXJjZT4gQ3JlYXRlKAotICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lRHVyYXRpb25VcywgaW50NjRfdCBhdWRpb0R1cmF0aW9uVXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLSAgICB2b2lkIHNldER1cmF0aW9uKGludDY0X3QgYXVkaW9EdXJhdGlvblVzKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkR1bW15QXVkaW9Tb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBpbnQzMl90IG1TYW1wbGluZ1JhdGU7Ci0gICAgaW50MzJfdCBtQ2hhbm5lbENvdW50OwotICAgIGludDY0X3QgbUZyYW1lRHVyYXRpb25VczsKLSAgICBpbnQzMl90IG1OdW1iZXJPZlNhbXBsZVBlckZyYW1lOwotICAgIGludDY0X3QgbUF1ZGlvRHVyYXRpb25VczsKLSAgICBpbnQ2NF90IG1UaW1lU3RhbXBVczsKLSAgICBNdXRleCBtTG9jazsKLQotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1CdWZmZXJHcm91cDsKLQotICAgIER1bW15QXVkaW9Tb3VyY2UoCi0gICAgICAgICAgICBpbnQzMl90IHNhbXBsaW5nUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICBpbnQ2NF90IGZyYW1lRHVyYXRpb25VcywgaW50NjRfdCBhdWRpb0R1cmF0aW9uVXMpOwotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZQotICAgIER1bW15QXVkaW9Tb3VyY2UoY29uc3QgRHVtbXlBdWRpb1NvdXJjZSAmKTsKLSAgICBEdW1teUF1ZGlvU291cmNlICZvcGVyYXRvcj0oY29uc3QgRHVtbXlBdWRpb1NvdXJjZSAmKTsKLQotfTsKLQotfS8vbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0jZW5kaWYgLy9EVU1NWV9BVURJT1NPVVJDRV9IXwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmRiY2YyYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0R1bW15VmlkZW9Tb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkR1bW15VmlkZW9Tb3VyY2UiCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlICJWaWRlb0VkaXRvclRvb2xzLmgiCi0jaW5jbHVkZSAiRHVtbXlWaWRlb1NvdXJjZS5oIgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3A8RHVtbXlWaWRlb1NvdXJjZT4gRHVtbXlWaWRlb1NvdXJjZTo6Q3JlYXRlKAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICB1aW50NjRfdCBjbGlwRHVyYXRpb24sIGNvbnN0IGNoYXIgKmltYWdlVXJpKSB7Ci0KLSAgICBBTE9HVigiQ3JlYXRlIik7Ci0gICAgcmV0dXJuIG5ldyBEdW1teVZpZGVvU291cmNlKAotICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBjbGlwRHVyYXRpb24sIGltYWdlVXJpKTsKLQotfQotCi0KLUR1bW15VmlkZW9Tb3VyY2U6OkR1bW15VmlkZW9Tb3VyY2UoCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgIHVpbnQ2NF90IGNsaXBEdXJhdGlvbiwgY29uc3QgY2hhciAqaW1hZ2VVcmkpIHsKLQotICAgIEFMT0dWKCJDb25zdHJ1Y3RvcjogRSIpOwotCi0gICAgbUZyYW1lV2lkdGggPSB3aWR0aDsKLSAgICBtRnJhbWVIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgbUltYWdlQ2xpcER1cmF0aW9uID0gY2xpcER1cmF0aW9uOwotICAgIG1VcmkgPSBpbWFnZVVyaTsKLSAgICBtSW1hZ2VCdWZmZXIgPSBOVUxMOwotCi0gICAgQUxPR1YoIiVzIiwgbVVyaSk7Ci0gICAgQUxPR1YoIkNvbnN0cnVjdG9yOiBYIik7Ci19Ci0KLQotRHVtbXlWaWRlb1NvdXJjZTo6fkR1bW15VmlkZW9Tb3VyY2UoKSB7Ci0gICAgLyogRG8gbm90aGluZyBoZXJlPyAqLwotICAgIEFMT0dWKCJ+RHVtbXlWaWRlb1NvdXJjZSIpOwotfQotCi0KLQotc3RhdHVzX3QgRHVtbXlWaWRlb1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIEFMT0dWKCJzdGFydDogRSIpOwotCi0gICAgLy8gR2V0IHRoZSBmcmFtZSBidWZmZXIgZnJvbSB0aGUgcmdiIGZpbGUsIG1VcmksCi0gICAgLy8gYW5kIHN0b3JlIGl0cyBjb250ZW50IGludG8gYSBNZWRpYUJ1ZmZlcgotICAgIHN0YXR1c190IGVyciA9IEx2R2V0SW1hZ2VUaHVtYk5haWwoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopbVVyaSwKLSAgICAgICAgICAgICAgICAgICAgbUZyYW1lSGVpZ2h0LCBtRnJhbWVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKiopICZtSW1hZ2VCdWZmZXIpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkx2R2V0SW1hZ2VUaHVtYk5haWwgZmFpbGVkOiAlZCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbUlzRmlyc3RJbWFnZUZyYW1lID0gdHJ1ZTsKLSAgICBtSW1hZ2VTZWVrVGltZSA9IDA7Ci0gICAgbUltYWdlUGxheVN0YXJ0VGltZSA9IDA7Ci0gICAgbUZyYW1lVGltZVVzID0gMDsKLQotICAgIEFMT0dWKCJzdGFydDogWCIpOwotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0dXNfdCBEdW1teVZpZGVvU291cmNlOjpzdG9wKCkgewotICAgIEFMT0dWKCJzdG9wIik7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBpZiAobUltYWdlQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtSW1hZ2VCdWZmZXIpOwotICAgICAgICBtSW1hZ2VCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotc3A8TWV0YURhdGE+IER1bW15VmlkZW9Tb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICBBTE9HVigiZ2V0Rm9ybWF0Iik7Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgbUZyYW1lV2lkdGgpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIG1GcmFtZUhlaWdodCk7Ci0gICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBtSW1hZ2VDbGlwRHVyYXRpb24pOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICJEdW1teVZpZGVvU291cmNlIik7Ci0KLSAgICByZXR1cm4gbWV0YTsKLX0KLQotc3RhdHVzX3QgRHVtbXlWaWRlb1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsCi0gICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotCi0gICAgQUxPR1YoInJlYWQ6IEUiKTsKLQotICAgIGNvbnN0IGludDMyX3Qga1RpbWVTY2FsZSA9IDEwMDA7ICAvKiB0aW1lIHNjYWxlIGluIG1zICovCi0gICAgYm9vbCBzZWVraW5nID0gZmFsc2U7Ci0gICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKLSAgICAgICAgc2Vla2luZyA9IHRydWU7Ci0gICAgICAgIG1JbWFnZVNlZWtUaW1lID0gc2Vla1RpbWVVczsKLSAgICAgICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZtSW1hZ2VQbGF5U3RhcnRUaW1lLCBrVGltZVNjYWxlKTsKLSAgICB9Ci0KLSAgICBpZiAoKG1JbWFnZVNlZWtUaW1lID09IG1JbWFnZUNsaXBEdXJhdGlvbikgfHwKLSAgICAgICAgKG1GcmFtZVRpbWVVcyA9PSAoaW50NjRfdCltSW1hZ2VDbGlwRHVyYXRpb24pKSB7Ci0gICAgICAgIEFMT0dWKCJyZWFkOiBFT1MgcmVhY2hlZCIpOwotICAgICAgICAqb3V0ID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcigKLSAgICAgICAgICAgIG1JbWFnZUJ1ZmZlciwgKG1GcmFtZVdpZHRoICogbUZyYW1lSGVpZ2h0ICogMS41KSk7Ci0KLSAgICAvLyBTZXQgdGltZXN0YW1wIG9mIGJ1ZmZlcgotICAgIGlmIChtSXNGaXJzdEltYWdlRnJhbWUpIHsKLSAgICAgICAgTTRPU0FfY2xvY2tHZXRUaW1lKCZtSW1hZ2VQbGF5U3RhcnRUaW1lLCBrVGltZVNjYWxlKTsKLSAgICAgICAgbUZyYW1lVGltZVVzID0gIChtSW1hZ2VTZWVrVGltZSArIDEpOwotICAgICAgICBBTE9HVigicmVhZDoganBnIDFzdCBmcmFtZSB0aW1lVXMgPSAlbGxkLCBiZWdpbiBjdXQgdGltZSA9ICUiIFBSSXUzMiwKLSAgICAgICAgICAgIG1GcmFtZVRpbWVVcywgbUltYWdlU2Vla1RpbWUpOwotCi0gICAgICAgIG1Jc0ZpcnN0SW1hZ2VGcmFtZSA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE00T1NBX1RpbWUgIGN1cnJlbnRUaW1lTXM7Ci0gICAgICAgIE00T1NBX2Nsb2NrR2V0VGltZSgmY3VycmVudFRpbWVNcywga1RpbWVTY2FsZSk7Ci0KLSAgICAgICAgbUZyYW1lVGltZVVzID0gbUltYWdlU2Vla1RpbWUgKwotICAgICAgICAgICAgKGN1cnJlbnRUaW1lTXMgLSBtSW1hZ2VQbGF5U3RhcnRUaW1lKSAqIDEwMDBMTDsKLQotICAgICAgICBBTE9HVigicmVhZDoganBnIGZyYW1lIHRpbWVVcyA9ICVsbGQiLCBtRnJhbWVUaW1lVXMpOwotICAgIH0KLQotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtRnJhbWVUaW1lVXMpOwotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgbUZyYW1lV2lkdGggKiBtRnJhbWVIZWlnaHQgKiAxLjUpOwotCi0gICAgKm91dCA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gZXJyOwotfQotCi19Ly8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvRHVtbXlWaWRlb1NvdXJjZS5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2NTE0ZjIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9EdW1teVZpZGVvU291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBEVU1NWV9WSURFT1NPVVJDRV9IXwotI2RlZmluZSBEVU1NWV9WSURFT1NPVVJDRV9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlICJNNE9TQV9DbG9jay5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzICBNZWRpYUJ1ZmZlcjsKLWNsYXNzICBNZXRhRGF0YTsKLQotc3RydWN0IER1bW15VmlkZW9Tb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotCi1wdWJsaWM6Ci0gICAgc3RhdGljIHNwPER1bW15VmlkZW9Tb3VyY2U+IENyZWF0ZSgKLSAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNsaXBEdXJhdGlvbiwgY29uc3QgY2hhciAqaW1hZ2VVcmkpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5EdW1teVZpZGVvU291cmNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgdWludDMyX3QgbUZyYW1lV2lkdGg7Ci0gICAgdWludDMyX3QgbUZyYW1lSGVpZ2h0OwotICAgIHVpbnQ2NF90IG1JbWFnZUNsaXBEdXJhdGlvbjsKLSAgICBjb25zdCBjaGFyICptVXJpOwotICAgIGludDY0X3QgbUZyYW1lVGltZVVzOwotICAgIGJvb2wgbUlzRmlyc3RJbWFnZUZyYW1lOwotICAgIHZvaWQgKm1JbWFnZUJ1ZmZlcjsKLSAgICBNNE9TQV9UaW1lIG1JbWFnZVBsYXlTdGFydFRpbWU7Ci0gICAgdWludDMyX3QgbUltYWdlU2Vla1RpbWU7Ci0KLSAgICBEdW1teVZpZGVvU291cmNlKAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgIHVpbnQ2NF90IGNsaXBEdXJhdGlvbiwgY29uc3QgY2hhciAqaW1hZ2VVcmkpOwotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZQotICAgIER1bW15VmlkZW9Tb3VyY2UoY29uc3QgRHVtbXlWaWRlb1NvdXJjZSAmKTsKLSAgICBEdW1teVZpZGVvU291cmNlICZvcGVyYXRvcj0oY29uc3QgRHVtbXlWaWRlb1NvdXJjZSAmKTsKLQotfTsKLQotCi19Ly9uYW1lc3BhY2UgYW5kcm9pZAotCi0KLSNlbmRpZiAvL0RVTU1ZX1ZJREVPU09VUkNFX0hfCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvSTQyMENvbG9yQ29udmVydGVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvSTQyMENvbG9yQ29udmVydGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzIxZDNmZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL0k0MjBDb2xvckNvbnZlcnRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPEk0MjBDb2xvckNvbnZlcnRlci5oPgotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxkbGZjbi5oPgotCi1JNDIwQ29sb3JDb252ZXJ0ZXI6Okk0MjBDb2xvckNvbnZlcnRlcigpIHsKLSAgICAvLyBPcGVuIHRoZSBzaGFyZWQgbGlicmFyeQotICAgIG1IYW5kbGUgPSBkbG9wZW4oImxpYkk0MjBjb2xvcmNvbnZlcnQuc28iLCBSVExEX05PVyk7Ci0KLSAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJJNDIwQ29sb3JDb252ZXJ0ZXI6IGNhbm5vdCBsb2FkIGxpYkk0MjBjb2xvcmNvbnZlcnQuc28iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIEZpbmQgdGhlIGVudHJ5IHBvaW50Ci0gICAgdm9pZCAoKmdldEk0MjBDb2xvckNvbnZlcnRlcikoSTQyMENvbG9yQ29udmVydGVyICpjb252ZXJ0ZXIpID0KLSAgICAgICAgKHZvaWQgKCopKEk0MjBDb2xvckNvbnZlcnRlciopKSBkbHN5bShtSGFuZGxlLCAiZ2V0STQyMENvbG9yQ29udmVydGVyIik7Ci0KLSAgICBpZiAoZ2V0STQyMENvbG9yQ29udmVydGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIkk0MjBDb2xvckNvbnZlcnRlcjogY2Fubm90IGxvYWQgZ2V0STQyMENvbG9yQ29udmVydGVyIik7Ci0gICAgICAgIGRsY2xvc2UobUhhbmRsZSk7Ci0gICAgICAgIG1IYW5kbGUgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gRmlsbCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMuCi0gICAgZ2V0STQyMENvbG9yQ29udmVydGVyKHRoaXMpOwotCi0gICAgQUxPR0koIkk0MjBDb2xvckNvbnZlcnRlcjogbGliSTQyMGNvbG9yY29udmVydC5zbyBsb2FkZWQiKTsKLX0KLQotYm9vbCBJNDIwQ29sb3JDb252ZXJ0ZXI6OmlzTG9hZGVkKCkgewotICAgIHJldHVybiBtSGFuZGxlICE9IE5VTEw7Ci19Ci0KLUk0MjBDb2xvckNvbnZlcnRlcjo6fkk0MjBDb2xvckNvbnZlcnRlcigpIHsKLSAgICBpZiAobUhhbmRsZSkgewotICAgICAgICBkbGNsb3NlKG1IYW5kbGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvSTQyMENvbG9yQ29udmVydGVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL0k0MjBDb2xvckNvbnZlcnRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDQ4ZTQ0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvSTQyMENvbG9yQ29udmVydGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBJNDIwX0NPTE9SX0NPTlZFUlRFUl9ICi0jZGVmaW5lIEk0MjBfQ09MT1JfQ09OVkVSVEVSX0gKLQotI2luY2x1ZGUgPElJNDIwQ29sb3JDb252ZXJ0ZXIuaD4KLQotLy8gVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBJNDIwIGNvbG9yIGNvbnZlcnRlciBmdW5jdGlvbnMgaW4KLS8vIElJNDIwQ29sb3JDb252ZXJ0ZXIsIHdoaWNoIGlzIGxvYWRlZCBmcm9tIGEgc2hhcmVkIGxpYnJhcnkuCi1jbGFzcyBJNDIwQ29sb3JDb252ZXJ0ZXI6IHB1YmxpYyBJSTQyMENvbG9yQ29udmVydGVyIHsKLXB1YmxpYzoKLSAgICBJNDIwQ29sb3JDb252ZXJ0ZXIoKTsKLSAgICB+STQyMENvbG9yQ29udmVydGVyKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnZlcnRlciBmdW5jdGlvbnMgYXJlIHN1Y2Nlc3NmdWxseSBsb2FkZWQuCi0gICAgYm9vbCBpc0xvYWRlZCgpOwotcHJpdmF0ZToKLSAgICB2b2lkKiBtSGFuZGxlOwotfTsKLQotI2VuZGlmIC8qIEk0MjBfQ09MT1JfQ09OVkVSVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci9sdnBwL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9OYXRpdmVXaW5kb3dSZW5kZXJlci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL05hdGl2ZVdpbmRvd1JlbmRlcmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmUwZjc0Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL05hdGl2ZVdpbmRvd1JlbmRlcmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJOYXRpdmVXaW5kb3dSZW5kZXJlciIKLSNpbmNsdWRlICJOYXRpdmVXaW5kb3dSZW5kZXJlci5oIgotCi0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPGd1aS9HTENvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlICJWaWRlb0VkaXRvclRvb2xzLmgiCi0KLSNkZWZpbmUgQ0hFQ0tfRUdMX0VSUk9SIENIRUNLKEVHTF9TVUNDRVNTID09IGVnbEdldEVycm9yKCkpCi0jZGVmaW5lIENIRUNLX0dMX0VSUk9SIENIRUNLKEdMZW51bShHTF9OT19FUlJPUikgPT0gZ2xHZXRFcnJvcigpKQotCi0vLwotLy8gVmVydGV4IGFuZCBmcmFnbWVudCBwcm9ncmFtcwotLy8KLQotLy8gVGhlIG1hdHJpeCBpcyBkZXJpdmVkIGZyb20KLS8vIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCi0vLwotLy8gUiAqIDI1NSA9IDEuMTY0ICogKFkgLSAxNikgKyAxLjU5NiAqIChWIC0gMTI4KQotLy8gRyAqIDI1NSA9IDEuMTY0ICogKFkgLSAxNikgLSAwLjgxMyAqIChWIC0gMTI4KSAtIDAuMzkxICogKFUgLSAxMjgpCi0vLyBCICogMjU1ID0gMS4xNjQgKiAoWSAtIDE2KSArIDIuMDE4ICogKFUgLSAxMjgpCi0vLwotLy8gSGVyZSB3ZSBhc3N1bWUgWVVWIGFyZSBpbiB0aGUgcmFuZ2Ugb2YgWzAsMjU1XSwgUkdCIGFyZSBpbiB0aGUgcmFuZ2Ugb2YKLS8vIFswLCAxXQotI2RlZmluZSBSR0IyWVVWX01BVFJJWCBcCi0iY29uc3QgbWF0NCByZ2IyeXV2ID0gbWF0NCgiXAotIiAgICA2NS41MjI1NSwgICAtMzcuNzkzOTgsICAgMTExLjk4NzMyLCAgICAgMC4wMDAwMCwiXAotIiAgIDEyOC42MjcyOSwgICAtNzQuMTkzMzQsICAgLTkzLjgxMDg4LCAgICAgMC4wMDAwMCwiXAotIiAgICAyNC45MjIzMywgICAxMTEuOTg3MzIsICAgLTE4LjE3NjQ0LCAgICAgMC4wMDAwMCwiXAotIiAgICAxNi4wMDAwMCwgICAxMjguMDAwMDAsICAgMTI4LjAwMDAwLCAgICAgMS4wMDAwMCk7XG4iCi0KLSNkZWZpbmUgWVVWMlJHQl9NQVRSSVggXAotImNvbnN0IG1hdDQgeXV2MnJnYiA9IG1hdDQoIlwKLSIgICAwLjAwNDU2LCAgIDAuMDA0NTYsICAgMC4wMDQ1NiwgICAwLjAwMDAwLCJcCi0iICAgMC4wMDAwMCwgIC0wLjAwMTUzLCAgIDAuMDA3OTEsICAgMC4wMDAwMCwiXAotIiAgIDAuMDA2MjYsICAtMC4wMDMxOSwgICAwLjAwMDAwLCAgIDAuMDAwMDAsIlwKLSIgIC0wLjg3NDE2LCAgIDAuNTMxMzMsICAtMS4wODU5OSwgICAxLjAwMDAwKTtcbiIKLQotc3RhdGljIGNvbnN0IGNoYXIgdlNyY05vcm1hbFtdID0KLSAgICAiYXR0cmlidXRlIHZlYzQgdlBvc2l0aW9uO1xuIgotICAgICJhdHRyaWJ1dGUgdmVjMiB2VGV4UG9zO1xuIgotICAgICJ1bmlmb3JtIG1hdDQgdGV4TWF0cml4O1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgdGV4Q29vcmRzO1xuIgotICAgICJ2YXJ5aW5nIGZsb2F0IHRvcERvd247XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBnbF9Qb3NpdGlvbiA9IHZQb3NpdGlvbjtcbiIKLSAgICAiICB0ZXhDb29yZHMgPSAodGV4TWF0cml4ICogdmVjNCh2VGV4UG9zLCAwLjAsIDEuMCkpLnh5O1xuIgotICAgICIgIHRvcERvd24gPSB2VGV4UG9zLnk7XG4iCi0gICAgIn1cbiI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGZTcmNOb3JtYWxbXSA9Ci0gICAgIiNleHRlbnNpb24gR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCA6IHJlcXVpcmVcbiIKLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHRleFNhbXBsZXI7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB0ZXhDb29yZHM7XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4U2FtcGxlciwgdGV4Q29vcmRzKTtcbiIKLSAgICAifVxuIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgZlNyY1NlcGlhW10gPQotICAgICIjZXh0ZW5zaW9uIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgOiByZXF1aXJlXG4iCi0gICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICJ1bmlmb3JtIHNhbXBsZXJFeHRlcm5hbE9FUyB0ZXhTYW1wbGVyO1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgdGV4Q29vcmRzO1xuIgotICAgIFJHQjJZVVZfTUFUUklYCi0gICAgWVVWMlJHQl9NQVRSSVgKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIHZlYzQgcmdiID0gdGV4dHVyZTJEKHRleFNhbXBsZXIsIHRleENvb3Jkcyk7XG4iCi0gICAgIiAgdmVjNCB5dXYgPSByZ2IyeXV2ICogcmdiO1xuIgotICAgICIgIHl1diA9IHZlYzQoeXV2LngsIDExNy4wLCAxMzkuMCwgMS4wKTtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB5dXYycmdiICogeXV2O1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBmU3JjTmVnYXRpdmVbXSA9Ci0gICAgIiNleHRlbnNpb24gR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCA6IHJlcXVpcmVcbiIKLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlckV4dGVybmFsT0VTIHRleFNhbXBsZXI7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB0ZXhDb29yZHM7XG4iCi0gICAgUkdCMllVVl9NQVRSSVgKLSAgICBZVVYyUkdCX01BVFJJWAotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgdmVjNCByZ2IgPSB0ZXh0dXJlMkQodGV4U2FtcGxlciwgdGV4Q29vcmRzKTtcbiIKLSAgICAiICB2ZWM0IHl1diA9IHJnYjJ5dXYgKiByZ2I7XG4iCi0gICAgIiAgeXV2ID0gdmVjNCgyNTUuMCAtIHl1di54LCB5dXYueSwgeXV2LnosIDEuMCk7XG4iCi0gICAgIiAgZ2xfRnJhZ0NvbG9yID0geXV2MnJnYiAqIHl1djtcbiIKLSAgICAifVxuIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgZlNyY0dyYWRpZW50W10gPQotICAgICIjZXh0ZW5zaW9uIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgOiByZXF1aXJlXG4iCi0gICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICJ1bmlmb3JtIHNhbXBsZXJFeHRlcm5hbE9FUyB0ZXhTYW1wbGVyO1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgdGV4Q29vcmRzO1xuIgotICAgICJ2YXJ5aW5nIGZsb2F0IHRvcERvd247XG4iCi0gICAgUkdCMllVVl9NQVRSSVgKLSAgICBZVVYyUkdCX01BVFJJWAotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgdmVjNCByZ2IgPSB0ZXh0dXJlMkQodGV4U2FtcGxlciwgdGV4Q29vcmRzKTtcbiIKLSAgICAiICB2ZWM0IHl1diA9IHJnYjJ5dXYgKiByZ2I7XG4iCi0gICAgIiAgdmVjNCBtaXhpbiA9IHZlYzQoMTUuMC8zMS4wLCA1OS4wLzYzLjAsIDMxLjAvMzEuMCwgMS4wKTtcbiIKLSAgICAiICB2ZWM0IHl1djIgPSByZ2IyeXV2ICogdmVjNCgobWl4aW4ueHl6ICogdG9wRG93biksIDEpO1xuIgotICAgICIgIHl1diA9IHZlYzQoeXV2LngsIHl1djIueSwgeXV2Mi56LCAxKTtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB5dXYycmdiICogeXV2O1xuIgotICAgICJ9XG4iOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLU5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpOYXRpdmVXaW5kb3dSZW5kZXJlcihzcDxBTmF0aXZlV2luZG93PiBuYXRpdmVXaW5kb3csCi0gICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgICA6IG1OYXRpdmVXaW5kb3cobmF0aXZlV2luZG93KQotICAgICwgbURzdFdpZHRoKHdpZHRoKQotICAgICwgbURzdEhlaWdodChoZWlnaHQpCi0gICAgLCBtTGFzdFZpZGVvRWZmZWN0KC0xKQotICAgICwgbU5leHRUZXh0dXJlSWQoMTAwKQotICAgICwgbUFjdGl2ZUlucHV0cygwKQotICAgICwgbVRocmVhZENtZChDTURfSURMRSkgewotICAgIGNyZWF0ZVRocmVhZCh0aHJlYWRTdGFydCwgdGhpcyk7Ci19Ci0KLS8vIFRoZSBmdW5jdGlvbnMgYmVsb3cgcnVuIGluIHRoZSBHTCB0aHJlYWQuCi0vLwotLy8gQWxsIEdMLXJlbGF0ZWQgd29yayBpcyBkb25lIGluIHRoaXMgdGhyZWFkLCBhbmQgb3RoZXIgdGhyZWFkcyBzZW5kCi0vLyByZXF1ZXN0cyB0byB0aGlzIHRocmVhZCB1c2luZyBhIGNvbW1hbmQgY29kZS4gV2UgZXhwZWN0IG1vc3Qgb2YgdGhlCi0vLyB0aW1lIHRoZXJlIHdpbGwgb25seSBiZSBvbmUgdGhyZWFkIHNlbmRpbmcgaW4gcmVxdWVzdHMsIHNvIHdlIGxldAotLy8gb3RoZXIgdGhyZWFkcyB3YWl0IHVudGlsIHRoZSByZXF1ZXN0IGlzIGZpbmlzaGVkIGJ5IEdMIHRocmVhZC4KLQotaW50IE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjp0aHJlYWRTdGFydCh2b2lkKiBzZWxmKSB7Ci0gICAgQUxPR0QoImNyZWF0ZSB0aHJlYWQiKTsKLSAgICAoKE5hdGl2ZVdpbmRvd1JlbmRlcmVyKilzZWxmKS0+Z2xUaHJlYWQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6Z2xUaHJlYWQoKSB7Ci0gICAgaW5pdGlhbGl6ZUVHTCgpOwotICAgIGNyZWF0ZVByb2dyYW1zKCk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGJvb2wgcXVpdCA9IGZhbHNlOwotICAgIHdoaWxlICghcXVpdCkgewotICAgICAgICBzd2l0Y2ggKG1UaHJlYWRDbWQpIHsKLSAgICAgICAgICAgIGNhc2UgQ01EX0lETEU6Ci0gICAgICAgICAgICAgICAgbUNvbmQud2FpdChtTG9jayk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBjYXNlIENNRF9SRU5ERVJfSU5QVVQ6Ci0gICAgICAgICAgICAgICAgcmVuZGVyKG1UaHJlYWRSZW5kZXJJbnB1dCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENNRF9SRVNFUlZFX1RFWFRVUkU6Ci0gICAgICAgICAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgbVRocmVhZFRleHR1cmVJZCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0xfRVJST1I7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENNRF9ERUxFVEVfVEVYVFVSRToKLSAgICAgICAgICAgICAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZtVGhyZWFkVGV4dHVyZUlkKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ01EX1FVSVQ6Ci0gICAgICAgICAgICAgICAgdGVybWluYXRlRUdMKCk7Ci0gICAgICAgICAgICAgICAgcXVpdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGVsbCB0aGUgcmVxdWVzdGVyIHRoYXQgdGhlIGNvbW1hbmQgaXMgZmluaXNoZWQuCi0gICAgICAgIG1UaHJlYWRDbWQgPSBDTURfSURMRTsKLSAgICAgICAgbUNvbmQuYnJvYWRjYXN0KCk7Ci0gICAgfQotICAgIEFMT0dEKCJxdWl0Iik7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmluaXRpYWxpemVFR0woKSB7Ci0gICAgbUVnbERpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgIENIRUNLX0VHTF9FUlJPUjsKLQotICAgIEVHTGludCBtYWpvclZlcnNpb247Ci0gICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKLSAgICBlZ2xJbml0aWFsaXplKG1FZ2xEaXNwbGF5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKLSAgICBDSEVDS19FR0xfRVJST1I7Ci0KLSAgICBFR0xDb25maWcgY29uZmlnOwotICAgIEVHTGludCBudW1Db25maWdzID0gLTE7Ci0gICAgRUdMaW50IGNvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgRUdMX1dJTkRPV19CSVQsCi0gICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgRUdMX1JFRF9TSVpFLCA4LAotICAgICAgICBFR0xfR1JFRU5fU0laRSwgOCwKLSAgICAgICAgRUdMX0JMVUVfU0laRSwgOCwKLSAgICAgICAgRUdMX05PTkUKLSAgICB9OwotICAgIGVnbENob29zZUNvbmZpZyhtRWdsRGlzcGxheSwgY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOwotICAgIENIRUNLX0VHTF9FUlJPUjsKLQotICAgIG1FZ2xTdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShtRWdsRGlzcGxheSwgY29uZmlnLAotICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCBOVUxMKTsKLSAgICBDSEVDS19FR0xfRVJST1I7Ci0KLSAgICBFR0xpbnQgY29udGV4dEF0dHJpYnNbXSA9IHsgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsIEVHTF9OT05FIH07Ci0gICAgbUVnbENvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KG1FZ2xEaXNwbGF5LCBjb25maWcsIEVHTF9OT19DT05URVhULAotICAgICAgICBjb250ZXh0QXR0cmlicyk7Ci0gICAgQ0hFQ0tfRUdMX0VSUk9SOwotCi0gICAgZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlLCBtRWdsU3VyZmFjZSwgbUVnbENvbnRleHQpOwotICAgIENIRUNLX0VHTF9FUlJPUjsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6dGVybWluYXRlRUdMKCkgewotICAgIGVnbERlc3Ryb3lDb250ZXh0KG1FZ2xEaXNwbGF5LCBtRWdsQ29udGV4dCk7Ci0gICAgZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICBlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fQ09OVEVYVCk7Ci0gICAgZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKLX0KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6Y3JlYXRlUHJvZ3JhbXMoKSB7Ci0gICAgR0x1aW50IHZTaGFkZXI7Ci0gICAgbG9hZFNoYWRlcihHTF9WRVJURVhfU0hBREVSLCB2U3JjTm9ybWFsLCAmdlNoYWRlcik7Ci0KLSAgICBjb25zdCBjaGFyKiBmU3JjW05VTUJFUl9PRl9FRkZFQ1RTXSA9IHsKLSAgICAgICAgZlNyY05vcm1hbCwgZlNyY1NlcGlhLCBmU3JjTmVnYXRpdmUsIGZTcmNHcmFkaWVudAotICAgIH07Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTUJFUl9PRl9FRkZFQ1RTOyBpKyspIHsKLSAgICAgICAgR0x1aW50IGZTaGFkZXI7Ci0gICAgICAgIGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBmU3JjW2ldLCAmZlNoYWRlcik7Ci0gICAgICAgIGNyZWF0ZVByb2dyYW0odlNoYWRlciwgZlNoYWRlciwgJm1Qcm9ncmFtW2ldKTsKLSAgICAgICAgZ2xEZWxldGVTaGFkZXIoZlNoYWRlcik7Ci0gICAgICAgIENIRUNLX0dMX0VSUk9SOwotICAgIH0KLQotICAgIGdsRGVsZXRlU2hhZGVyKHZTaGFkZXIpOwotICAgIENIRUNLX0dMX0VSUk9SOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpjcmVhdGVQcm9ncmFtKAotICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXIsIEdMdWludCBmcmFnbWVudFNoYWRlciwgR0x1aW50KiBvdXRQZ20pIHsKLQotICAgIEdMdWludCBwcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtKCk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xMaW5rUHJvZ3JhbShwcm9ncmFtKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIEdMaW50IGxpbmtTdGF0dXMgPSBHTF9GQUxTRTsKLSAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9MSU5LX1NUQVRVUywgJmxpbmtTdGF0dXMpOwotICAgIGlmIChsaW5rU3RhdHVzICE9IEdMX1RSVUUpIHsKLSAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7Ci0gICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOwotICAgICAgICBpZiAoaW5mb0xlbikgewotICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoaW5mb0xlbik7Ci0gICAgICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtLCBpbmZvTGVuLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgIEFMT0dFKCJQcm9ncmFtIGxpbmsgbG9nOlxuJXNcbiIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgcHJvZ3JhbSA9IDA7Ci0gICAgfQotCi0gICAgKm91dFBnbSA9IHByb2dyYW07Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OmxvYWRTaGFkZXIoR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIqIHBTb3VyY2UsCi0gICAgICAgIEdMdWludCogb3V0U2hhZGVyKSB7Ci0gICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmcFNvdXJjZSwgTlVMTCk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIEdMaW50IGNvbXBpbGVkID0gMDsKLSAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZjb21waWxlZCk7Ci0gICAgaWYgKCFjb21waWxlZCkgewotICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKLSAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOwotICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhpbmZvTGVuKTsKLSAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgaW5mb0xlbiwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgIEFMT0dFKCJTaGFkZXIgY29tcGlsZSBsb2c6XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgfQotICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOwotICAgICAgICBzaGFkZXIgPSAwOwotICAgIH0KLSAgICAqb3V0U2hhZGVyID0gc2hhZGVyOwotfQotCi1OYXRpdmVXaW5kb3dSZW5kZXJlcjo6fk5hdGl2ZVdpbmRvd1JlbmRlcmVyKCkgewotICAgIENIRUNLKG1BY3RpdmVJbnB1dHMgPT0gMCk7Ci0gICAgc3RhcnRSZXF1ZXN0KENNRF9RVUlUKTsKLSAgICBzZW5kUmVxdWVzdCgpOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpyZW5kZXIoUmVuZGVySW5wdXQqIGlucHV0KSB7Ci0gICAgc3A8R0xDb25zdW1lcj4gU1QgPSBpbnB1dC0+bVNUOwotICAgIHNwPFN1cmZhY2U+IFNUQyA9IGlucHV0LT5tU1RDOwotCi0gICAgaWYgKGlucHV0LT5tSXNFeHRlcm5hbEJ1ZmZlcikgewotICAgICAgICBxdWV1ZUV4dGVybmFsQnVmZmVyKFNUQy5nZXQoKSwgaW5wdXQtPm1CdWZmZXIsCi0gICAgICAgICAgICBpbnB1dC0+bVdpZHRoLCBpbnB1dC0+bUhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcXVldWVJbnRlcm5hbEJ1ZmZlcihTVEMuZ2V0KCksIGlucHV0LT5tQnVmZmVyKTsKLSAgICB9Ci0KLSAgICBTVC0+dXBkYXRlVGV4SW1hZ2UoKTsKLSAgICBnbENsZWFyQ29sb3IoMCwgMCwgMCwgMCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGNhbGN1bGF0ZVBvc2l0aW9uQ29vcmRpbmF0ZXMoaW5wdXQtPm1SZW5kZXJpbmdNb2RlLAotICAgICAgICBpbnB1dC0+bVdpZHRoLCBpbnB1dC0+bUhlaWdodCk7Ci0KLSAgICBjb25zdCBHTGZsb2F0IHRleHR1cmVDb29yZGluYXRlc1tdID0gewotICAgICAgICAgMC4wZiwgIDEuMGYsCi0gICAgICAgICAwLjBmLCAgMC4wZiwKLSAgICAgICAgIDEuMGYsICAwLjBmLAotICAgICAgICAgMS4wZiwgIDEuMGYsCi0gICAgfTsKLQotICAgIHVwZGF0ZVByb2dyYW1BbmRIYW5kbGUoaW5wdXQtPm1WaWRlb0VmZmVjdCk7Ci0KLSAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobVBvc2l0aW9uSGFuZGxlLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAsCi0gICAgICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobVBvc2l0aW9uSGFuZGxlKTsKLSAgICBDSEVDS19HTF9FUlJPUjsKLQotICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtVGV4UG9zSGFuZGxlLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAsCi0gICAgICAgIHRleHR1cmVDb29yZGluYXRlcyk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1UZXhQb3NIYW5kbGUpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgR0xmbG9hdCB0ZXhNYXRyaXhbMTZdOwotICAgIFNULT5nZXRUcmFuc2Zvcm1NYXRyaXgodGV4TWF0cml4KTsKLSAgICBnbFVuaWZvcm1NYXRyaXg0ZnYobVRleE1hdHJpeEhhbmRsZSwgMSwgR0xfRkFMU0UsIHRleE1hdHJpeCk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBpbnB1dC0+bVRleHR1cmVJZCk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoCi0gICAgICAgIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKAotICAgICAgICBHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Ci0gICAgQ0hFQ0tfR0xfRVJST1I7Ci0KLSAgICBlZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpxdWV1ZUludGVybmFsQnVmZmVyKEFOYXRpdmVXaW5kb3cgKmFudywKLSAgICBNZWRpYUJ1ZmZlciogYnVmZmVyKSB7Ci0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7Ci0gICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAoYW53LCB0aW1lVXMgKiAxMDAwKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBhbnctPnF1ZXVlQnVmZmVyKGFudywgYnVmZmVyLT5ncmFwaGljQnVmZmVyKCkuZ2V0KCksIC0xKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgQUxPR0UoInF1ZXVlQnVmZmVyIGZhaWxlZCB3aXRoIGVycm9yICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YURhdGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOwotICAgIG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5UmVuZGVyZWQsIDEpOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpxdWV1ZUV4dGVybmFsQnVmZmVyKEFOYXRpdmVXaW5kb3cqIGFudywKLSAgICBNZWRpYUJ1ZmZlciogYnVmZmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KGFudywgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMik7Ci0gICAgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoYW53LCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOKTsKLQotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKLSAgICBDSEVDSyhOT19FUlJPUiA9PSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KGFudywgJmFuYikpOwotICAgIENIRUNLKGFuYiAhPSBOVUxMKTsKLQotICAgIC8vIENvcHkgdGhlIGJ1ZmZlcgotICAgIHVpbnQ4X3QqIGltZyA9IE5VTEw7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmKG5ldyBHcmFwaGljQnVmZmVyKGFuYiwgZmFsc2UpKTsKLSAgICBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOwotICAgIGNvcHlJNDIwQnVmZmVyKGJ1ZmZlciwgaW1nLCB3aWR0aCwgaGVpZ2h0LCBidWYtPmdldFN0cmlkZSgpKTsKLSAgICBidWYtPnVubG9jaygpOwotICAgIENIRUNLKE5PX0VSUk9SID09IGFudy0+cXVldWVCdWZmZXIoYW53LCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpLCAtMSkpOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpjb3B5STQyMEJ1ZmZlcihNZWRpYUJ1ZmZlciogc3JjLCB1aW50OF90KiBkc3QsCi0gICAgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwgaW50IHN0cmlkZSkgewotICAgIGludCBzdHJpZGVVViA9IChzdHJpZGUgLyAyICsgMHhmKSAmIH4weGY7Ci0gICAgdWludDhfdCogcCA9ICh1aW50OF90KilzcmMtPmRhdGEoKSArIHNyYy0+cmFuZ2Vfb2Zmc2V0KCk7Ci0gICAgLy8gWQotICAgIGZvciAoaW50IGkgPSBzcmNIZWlnaHQ7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgbWVtY3B5KGRzdCwgcCwgc3JjV2lkdGgpOwotICAgICAgICBkc3QgKz0gc3RyaWRlOwotICAgICAgICBwICs9IHNyY1dpZHRoOwotICAgIH0KLSAgICAvLyBUaGUgc3JjIGlzIEk0MjAsIHRoZSBkc3QgaXMgWVYxMi4KLSAgICAvLyBVCi0gICAgcCArPSBzcmNXaWR0aCAqIHNyY0hlaWdodCAvIDQ7Ci0gICAgZm9yIChpbnQgaSA9IHNyY0hlaWdodCAvIDI7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgbWVtY3B5KGRzdCwgcCwgc3JjV2lkdGggLyAyKTsKLSAgICAgICAgZHN0ICs9IHN0cmlkZVVWOwotICAgICAgICBwICs9IHNyY1dpZHRoIC8gMjsKLSAgICB9Ci0gICAgLy8gVgotICAgIHAgLT0gc3JjV2lkdGggKiBzcmNIZWlnaHQgLyAyOwotICAgIGZvciAoaW50IGkgPSBzcmNIZWlnaHQgLyAyOyBpID4gMDsgaS0tKSB7Ci0gICAgICAgIG1lbWNweShkc3QsIHAsIHNyY1dpZHRoIC8gMik7Ci0gICAgICAgIGRzdCArPSBzdHJpZGVVVjsKLSAgICAgICAgcCArPSBzcmNXaWR0aCAvIDI7Ci0gICAgfQotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjp1cGRhdGVQcm9ncmFtQW5kSGFuZGxlKHVpbnQzMl90IHZpZGVvRWZmZWN0KSB7Ci0gICAgaWYgKG1MYXN0VmlkZW9FZmZlY3QgPT0gdmlkZW9FZmZlY3QpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1MYXN0VmlkZW9FZmZlY3QgPSB2aWRlb0VmZmVjdDsKLSAgICBpbnQgaTsKLSAgICBzd2l0Y2ggKG1MYXN0VmlkZW9FZmZlY3QpIHsKLSAgICAgICAgY2FzZSBWSURFT19FRkZFQ1RfTk9ORToKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVklERU9fRUZGRUNUX1NFUElBOgotICAgICAgICAgICAgaSA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT19FRkZFQ1RfTkVHQVRJVkU6Ci0gICAgICAgICAgICBpID0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFZJREVPX0VGRkVDVF9HUkFESUVOVDoKLSAgICAgICAgICAgIGkgPSAzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBnbFVzZVByb2dyYW0obVByb2dyYW1baV0pOwotICAgIENIRUNLX0dMX0VSUk9SOwotCi0gICAgbVBvc2l0aW9uSGFuZGxlID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihtUHJvZ3JhbVtpXSwgInZQb3NpdGlvbiIpOwotICAgIG1UZXhQb3NIYW5kbGUgPSBnbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtW2ldLCAidlRleFBvcyIpOwotICAgIG1UZXhNYXRyaXhIYW5kbGUgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihtUHJvZ3JhbVtpXSwgInRleE1hdHJpeCIpOwotICAgIENIRUNLX0dMX0VSUk9SOwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpjYWxjdWxhdGVQb3NpdGlvbkNvb3JkaW5hdGVzKAotICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgcmVuZGVyaW5nTW9kZSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0KSB7Ci0gICAgZmxvYXQgeCwgeTsKLSAgICBzd2l0Y2ggKHJlbmRlcmluZ01vZGUpIHsKLSAgICAgICAgY2FzZSBNNHhWU1Nfa1Jlc2l6aW5nOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgeCA9IDE7Ci0gICAgICAgICAgICB5ID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00eFZTU19rQ3JvcHBpbmc6Ci0gICAgICAgICAgICB4ID0gZmxvYXQoc3JjV2lkdGgpIC8gbURzdFdpZHRoOwotICAgICAgICAgICAgeSA9IGZsb2F0KHNyY0hlaWdodCkgLyBtRHN0SGVpZ2h0OwotICAgICAgICAgICAgLy8gTWFrZSB0aGUgc21hbGxlciBzaWRlIDEKLSAgICAgICAgICAgIGlmICh4ID4geSkgewotICAgICAgICAgICAgICAgIHggLz0geTsKLSAgICAgICAgICAgICAgICB5ID0gMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeSAvPSB4OwotICAgICAgICAgICAgICAgIHggPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTR4VlNTX2tCbGFja0JvcmRlcnM6Ci0gICAgICAgICAgICB4ID0gZmxvYXQoc3JjV2lkdGgpIC8gbURzdFdpZHRoOwotICAgICAgICAgICAgeSA9IGZsb2F0KHNyY0hlaWdodCkgLyBtRHN0SGVpZ2h0OwotICAgICAgICAgICAgLy8gTWFrZSB0aGUgbGFyZ2VyIHNpZGUgMQotICAgICAgICAgICAgaWYgKHggPiB5KSB7Ci0gICAgICAgICAgICAgICAgeSAvPSB4OwotICAgICAgICAgICAgICAgIHggPSAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4IC89IHk7Ci0gICAgICAgICAgICAgICAgeSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBtUG9zaXRpb25Db29yZGluYXRlc1swXSA9IC14OwotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzFdID0geTsKLSAgICBtUG9zaXRpb25Db29yZGluYXRlc1syXSA9IC14OwotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzNdID0gLXk7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbNF0gPSB4OwotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzVdID0gLXk7Ci0gICAgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbNl0gPSB4OwotICAgIG1Qb3NpdGlvbkNvb3JkaW5hdGVzWzddID0geTsKLX0KLQotLy8KLS8vICBUaGUgZnVuY3Rpb25zIGJlbG93IHJ1biBpbiBvdGhlciB0aHJlYWRzLgotLy8KLQotdm9pZCBOYXRpdmVXaW5kb3dSZW5kZXJlcjo6c3RhcnRSZXF1ZXN0KGludCBjbWQpIHsKLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgd2hpbGUgKG1UaHJlYWRDbWQgIT0gQ01EX0lETEUpIHsKLSAgICAgICAgbUNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotICAgIG1UaHJlYWRDbWQgPSBjbWQ7Ci19Ci0KLXZvaWQgTmF0aXZlV2luZG93UmVuZGVyZXI6OnNlbmRSZXF1ZXN0KCkgewotICAgIG1Db25kLmJyb2FkY2FzdCgpOwotICAgIHdoaWxlIChtVGhyZWFkQ21kICE9IENNRF9JRExFKSB7Ci0gICAgICAgIG1Db25kLndhaXQobUxvY2spOwotICAgIH0KLSAgICBtTG9jay51bmxvY2soKTsKLX0KLQotUmVuZGVySW5wdXQqIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpjcmVhdGVSZW5kZXJJbnB1dCgpIHsKLSAgICBBTE9HRCgibmV3IHJlbmRlciBpbnB1dCAlZCIsIG1OZXh0VGV4dHVyZUlkKTsKLSAgICBSZW5kZXJJbnB1dCogaW5wdXQgPSBuZXcgUmVuZGVySW5wdXQodGhpcywgbU5leHRUZXh0dXJlSWQpOwotCi0gICAgc3RhcnRSZXF1ZXN0KENNRF9SRVNFUlZFX1RFWFRVUkUpOwotICAgIG1UaHJlYWRUZXh0dXJlSWQgPSBtTmV4dFRleHR1cmVJZDsKLSAgICBzZW5kUmVxdWVzdCgpOwotCi0gICAgbU5leHRUZXh0dXJlSWQrKzsKLSAgICBtQWN0aXZlSW5wdXRzKys7Ci0gICAgcmV0dXJuIGlucHV0OwotfQotCi12b2lkIE5hdGl2ZVdpbmRvd1JlbmRlcmVyOjpkZXN0cm95UmVuZGVySW5wdXQoUmVuZGVySW5wdXQqIGlucHV0KSB7Ci0gICAgQUxPR0QoImRlc3Ryb3kgcmVuZGVyIGlucHV0ICVkIiwgaW5wdXQtPm1UZXh0dXJlSWQpOwotICAgIEdMdWludCB0ZXh0dXJlSWQgPSBpbnB1dC0+bVRleHR1cmVJZDsKLSAgICBkZWxldGUgaW5wdXQ7Ci0KLSAgICBzdGFydFJlcXVlc3QoQ01EX0RFTEVURV9URVhUVVJFKTsKLSAgICBtVGhyZWFkVGV4dHVyZUlkID0gdGV4dHVyZUlkOwotICAgIHNlbmRSZXF1ZXN0KCk7Ci0KLSAgICBtQWN0aXZlSW5wdXRzLS07Ci19Ci0KLS8vCi0vLyAgUmVuZGVySW5wdXQKLS8vCi0KLVJlbmRlcklucHV0OjpSZW5kZXJJbnB1dChOYXRpdmVXaW5kb3dSZW5kZXJlciogcmVuZGVyZXIsIEdMdWludCB0ZXh0dXJlSWQpCi0gICAgOiBtUmVuZGVyZXIocmVuZGVyZXIpCi0gICAgLCBtVGV4dHVyZUlkKHRleHR1cmVJZCkgewotICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOwotICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOwotICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7Ci0gICAgbVNUID0gbmV3IEdMQ29uc3VtZXIoY29uc3VtZXIsIG1UZXh0dXJlSWQpOwotICAgIG1TVEMgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7Ci0gICAgbmF0aXZlX3dpbmRvd19jb25uZWN0KG1TVEMuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKLX0KLQotUmVuZGVySW5wdXQ6On5SZW5kZXJJbnB1dCgpIHsKLX0KLQotQU5hdGl2ZVdpbmRvdyogUmVuZGVySW5wdXQ6OmdldFRhcmdldFdpbmRvdygpIHsKLSAgICByZXR1cm4gbVNUQy5nZXQoKTsKLX0KLQotdm9pZCBSZW5kZXJJbnB1dDo6dXBkYXRlVmlkZW9TaXplKHNwPE1ldGFEYXRhPiBtZXRhKSB7Ci0gICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJm1XaWR0aCkpOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmbUhlaWdodCkpOwotCi0gICAgaW50IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKLSAgICBpZiAobWV0YS0+ZmluZFJlY3Qoa0tleUNyb3BSZWN0LCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSkgewotICAgICAgICBtV2lkdGggPSByaWdodCAtIGxlZnQgKyAxOwotICAgICAgICBtSGVpZ2h0ID0gYm90dG9tIC0gdG9wICsgMTsKLSAgICB9Ci0KLSAgICAvLyBJZiByb3RhdGlvbiBkZWdyZWVzIGlzIDkwIG9yIDI3MCwgc3dhcCB3aWR0aCBhbmQgaGVpZ2h0Ci0gICAgLy8gKG1XaWR0aCBhbmQgbUhlaWdodCBhcmUgdGhlIF9yb3RhdGVkXyBzb3VyY2UgcmVjdGFuZ2xlKS4KLSAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKLSAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7Ci0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHJvdGF0aW9uRGVncmVlcyA9PSA5MCB8fCByb3RhdGlvbkRlZ3JlZXMgPT0gMjcwKSB7Ci0gICAgICAgIGludCB0bXAgPSBtV2lkdGg7Ci0gICAgICAgIG1XaWR0aCA9IG1IZWlnaHQ7Ci0gICAgICAgIG1IZWlnaHQgPSB0bXA7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlcklucHV0OjpyZW5kZXIoTWVkaWFCdWZmZXIqIGJ1ZmZlciwgdWludDMyX3QgdmlkZW9FZmZlY3QsCi0gICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLCBib29sIGlzRXh0ZXJuYWxCdWZmZXIpIHsKLSAgICBtVmlkZW9FZmZlY3QgPSB2aWRlb0VmZmVjdDsKLSAgICBtUmVuZGVyaW5nTW9kZSA9IHJlbmRlcmluZ01vZGU7Ci0gICAgbUlzRXh0ZXJuYWxCdWZmZXIgPSBpc0V4dGVybmFsQnVmZmVyOwotICAgIG1CdWZmZXIgPSBidWZmZXI7Ci0KLSAgICBtUmVuZGVyZXItPnN0YXJ0UmVxdWVzdChOYXRpdmVXaW5kb3dSZW5kZXJlcjo6Q01EX1JFTkRFUl9JTlBVVCk7Ci0gICAgbVJlbmRlcmVyLT5tVGhyZWFkUmVuZGVySW5wdXQgPSB0aGlzOwotICAgIG1SZW5kZXJlci0+c2VuZFJlcXVlc3QoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvTmF0aXZlV2luZG93UmVuZGVyZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjZiNGNiYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL05hdGl2ZVdpbmRvd1JlbmRlcmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTkFUSVZFX1dJTkRPV19SRU5ERVJFUl9IXwotI2RlZmluZSBOQVRJVkVfV0lORE9XX1JFTkRFUkVSX0hfCi0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0KLS8vIFRoZSBOYXRpdmVXaW5kb3dSZW5kZXJlciBkcmF3cyB2aWRlbyBmcmFtZXMgc3RvcmVkIGluIE1lZGlhQnVmZmVycyB0bwotLy8gYW4gQU5hdGl2ZVdpbmRvdy4gIEl0IGNhbiBhcHBseSAicmVuZGVyaW5nIG1vZGUiIGFuZCBjb2xvciBlZmZlY3RzIHRvCi0vLyB0aGUgZnJhbWVzLiAiUmVuZGVyaW5nIG1vZGUiIGlzIHRoZSBvcHRpb24gdG8gZG8gcmVzaXppbmcsIGNyb3BwaW5nLAotLy8gb3IgYmxhY2stYm9yZGVyaW5nIHdoZW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXNwZWN0IHJhdGlvIGFyZQotLy8gZGlmZmVyZW50LiBDb2xvciBlZmZlY3RzIGluY2x1ZGUgc2VwaWEsIG5lZ2F0aXZlLCBhbmQgZ3JhZGllbnQuCi0vLwotLy8gVGhlIGlucHV0IHRvIE5hdGl2ZVdpbmRvd1JlbmRlcmVyIGlzIHByb3ZpZGVkIGJ5IHRoZSBSZW5kZXJJbnB1dCBjbGFzcywKLS8vIGFuZCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgYWN0aXZlIFJlbmRlcklucHV0IGF0IHRoZSBzYW1lIHRpbWUuIEFsdGhvdWdoCi0vLyB3ZSBvbmx5IGV4cGVjdCB0aGF0IGhhcHBlbnMgYnJpZWZseSB3aGVuIG9uZSBjbGlwIGlzIGFib3V0IHRvIGZpbmlzaAotLy8gYW5kIHRoZSBuZXh0IGNsaXAgaXMgYWJvdXQgdG8gc3RhcnQuCi0vLwotLy8gV2UgYWxsb2NhdGUgYSBTdXJmYWNlIGZvciBlYWNoIFJlbmRlcklucHV0IGFuZCB0aGUgdXNlciBjYW4gdXNlCi0vLyB0aGUgZ2V0VGFyZ2V0V2luZG93KCkgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjb3JyZXNwb25kaW5nIEFOYXRpdmVXaW5kb3cKLS8vIGZvciB0aGF0IFN1cmZhY2UuIFRoZSBpbnRlbnRpb24gaXMgdGhhdCB0aGUgdXNlciBjYW4gcGFzcyB0aGF0Ci0vLyBBTmF0aXZlV2luZG93IHRvIE9NWENvZGVjOjpDcmVhdGUoKSBzbyB0aGUgY29kZWMgY2FuIGRlY29kZSBkaXJlY3RseQotLy8gdG8gYnVmZmVycyBwcm92aWRlZCBieSB0aGUgdGV4dHVyZS4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBHTENvbnN1bWVyOwotY2xhc3MgU3VyZmFjZTsKLWNsYXNzIFJlbmRlcklucHV0OwotCi1jbGFzcyBOYXRpdmVXaW5kb3dSZW5kZXJlciB7Ci1wdWJsaWM6Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIoc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotICAgIH5OYXRpdmVXaW5kb3dSZW5kZXJlcigpOwotCi0gICAgUmVuZGVySW5wdXQqIGNyZWF0ZVJlbmRlcklucHV0KCk7Ci0gICAgdm9pZCBkZXN0cm95UmVuZGVySW5wdXQoUmVuZGVySW5wdXQqIGlucHV0KTsKLQotcHJpdmF0ZToKLSAgICAvLyBObyBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIoY29uc3QgTmF0aXZlV2luZG93UmVuZGVyZXIgJik7Ci0gICAgTmF0aXZlV2luZG93UmVuZGVyZXIgJm9wZXJhdG9yPShjb25zdCBOYXRpdmVXaW5kb3dSZW5kZXJlciAmKTsKLQotICAgIC8vIEluaXRpYWxpemF0aW9uIGFuZCBmaW5pYWxpemF0aW9uCi0gICAgdm9pZCBpbml0aWFsaXplRUdMKCk7Ci0gICAgdm9pZCB0ZXJtaW5hdGVFR0woKTsKLSAgICB2b2lkIGNyZWF0ZVByb2dyYW1zKCk7Ci0gICAgdm9pZCBjcmVhdGVQcm9ncmFtKAotICAgICAgICAgICAgR0x1aW50IHZlcnRleFNoYWRlciwgR0x1aW50IGZyYWdtZW50U2hhZGVyLCBHTHVpbnQqIG91dFBnbSk7Ci0gICAgdm9pZCBsb2FkU2hhZGVyKAotICAgICAgICAgICAgR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIqIHBTb3VyY2UsIEdMdWludCogb3V0U2hhZGVyKTsKLQotICAgIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWQgZXZlcnkgZnJhbWUuCi0gICAgdm9pZCByZW5kZXIoUmVuZGVySW5wdXQqIGlucHV0KTsKLSAgICB2b2lkIHF1ZXVlSW50ZXJuYWxCdWZmZXIoQU5hdGl2ZVdpbmRvdyogYW53LCBNZWRpYUJ1ZmZlciogYnVmZmVyKTsKLSAgICB2b2lkIHF1ZXVlRXh0ZXJuYWxCdWZmZXIoQU5hdGl2ZVdpbmRvdyogYW53LCBNZWRpYUJ1ZmZlciogYnVmZmVyLAotICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICB2b2lkIGNvcHlJNDIwQnVmZmVyKE1lZGlhQnVmZmVyKiBzcmMsIHVpbnQ4X3QqIGRzdCwKLSAgICAgICAgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwgaW50IHN0cmlkZSk7Ci0gICAgdm9pZCB1cGRhdGVQcm9ncmFtQW5kSGFuZGxlKHVpbnQzMl90IHZpZGVvRWZmZWN0KTsKLSAgICB2b2lkIGNhbGN1bGF0ZVBvc2l0aW9uQ29vcmRpbmF0ZXMoTTR4VlNTX01lZGlhUmVuZGVyaW5nIHJlbmRlcmluZ01vZGUsCi0gICAgICAgICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQpOwotCi0gICAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSBpbml0aWFsaXplZCBvbmNlIGFuZCBkb2Vzbid0IGNoYW5nZSBhZnRlcndhcmRzLgotICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1OYXRpdmVXaW5kb3c7Ci0gICAgaW50IG1Ec3RXaWR0aCwgbURzdEhlaWdodDsKLSAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OwotICAgIEVHTFN1cmZhY2UgbUVnbFN1cmZhY2U7Ci0gICAgRUdMQ29udGV4dCBtRWdsQ29udGV4dDsKLSAgICBlbnVtIHsKLSAgICAgICAgRUZGRUNUX05PUk1BTCwKLSAgICAgICAgRUZGRUNUX1NFUElBLAotICAgICAgICBFRkZFQ1RfTkVHQVRJVkUsCi0gICAgICAgIEVGRkVDVF9HUkFESUVOVCwKLSAgICAgICAgTlVNQkVSX09GX0VGRkVDVFMKLSAgICB9OwotICAgIEdMdWludCBtUHJvZ3JhbVtOVU1CRVJfT0ZfRUZGRUNUU107Ci0KLSAgICAvLyBXZSB1c2Ugb25lIHNoYWRlciBwcm9ncmFtIGZvciBlYWNoIGVmZmVjdC4gbUxhc3RWaWRlb0VmZmVjdCByZW1lbWJlcnMKLSAgICAvLyB0aGUgcHJvZ3JhbSB1c2VkIGZvciB0aGUgbGFzdCBmcmFtZS4gd2hlbiB0aGUgZWZmZWN0IHVzZWQgY2hhbmdlcywKLSAgICAvLyB3ZSBjaGFuZ2UgdGhlIHByb2dyYW0gdXNlZCBhbmQgdXBkYXRlIHRoZSBoYW5kbGVzLgotICAgIHVpbnQzMl90IG1MYXN0VmlkZW9FZmZlY3Q7Ci0gICAgR0xpbnQgbVBvc2l0aW9uSGFuZGxlOwotICAgIEdMaW50IG1UZXhQb3NIYW5kbGU7Ci0gICAgR0xpbnQgbVRleE1hdHJpeEhhbmRsZTsKLQotICAgIC8vIFRoaXMgaXMgdGhlIHZlcnRleCBjb29yZGluYXRlcyB1c2VkIGZvciB0aGUgZnJhbWUgdGV4dHVyZS4KLSAgICAvLyBJdCdzIGNhbGN1bGF0ZWQgYWNjb3JkaW5nIHRoZSB0aGUgcmVuZGVyaW5nIG1vZGUgYW5kIHRoZSBzb3VyY2UgYW5kCi0gICAgLy8gZGVzdGluYXRpb24gYXNwZWN0IHJhdGlvLgotICAgIEdMZmxvYXQgbVBvc2l0aW9uQ29vcmRpbmF0ZXNbOF07Ci0KLSAgICAvLyBXZSB1c2UgYSBkaWZmZXJlbnQgR0wgaWQgZm9yIGVhY2ggU3VyZmFjZS4KLSAgICBHTHVpbnQgbU5leHRUZXh0dXJlSWQ7Ci0KLSAgICAvLyBOdW1iZXIgb2YgZXhpc3RpbmcgUmVuZGVySW5wdXRzLCBqdXN0IGZvciBkZWJ1Z2dpbmcuCi0gICAgaW50IG1BY3RpdmVJbnB1dHM7Ci0KLSAgICAvLyBUaGUgR0wgdGhyZWFkIGZ1bmN0aW9ucwotICAgIHN0YXRpYyBpbnQgdGhyZWFkU3RhcnQodm9pZCogc2VsZik7Ci0gICAgdm9pZCBnbFRocmVhZCgpOwotCi0gICAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSB1c2VkIHRvIGNvbW11bmljYXRlIGJldHdlZW4gdGhlIEdMIHRocmVhZCBhbmQKLSAgICAvLyBvdGhlciB0aHJlYWRzLgotICAgIE11dGV4IG1Mb2NrOwotICAgIENvbmRpdGlvbiBtQ29uZDsKLSAgICBlbnVtIHsKLSAgICAgICAgQ01EX0lETEUsCi0gICAgICAgIENNRF9SRU5ERVJfSU5QVVQsCi0gICAgICAgIENNRF9SRVNFUlZFX1RFWFRVUkUsCi0gICAgICAgIENNRF9ERUxFVEVfVEVYVFVSRSwKLSAgICAgICAgQ01EX1FVSVQsCi0gICAgfTsKLSAgICBpbnQgbVRocmVhZENtZDsKLSAgICBSZW5kZXJJbnB1dCogbVRocmVhZFJlbmRlcklucHV0OwotICAgIEdMdWludCBtVGhyZWFkVGV4dHVyZUlkOwotCi0gICAgLy8gVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIHNlbmQgY29tbWFuZHMgdG8gdGhlIEdMIHRocmVhZC4KLSAgICAvLyBzZW5kUmVxdWVzdCgpIGFsc28gd2FpdHMgZm9yIHRoZSBHTCB0aHJlYWQgYWNrbm93bGVkZ2VzIHRoZQotICAgIC8vIGNvbW1hbmQgaXMgZmluaXNoZWQuCi0gICAgdm9pZCBzdGFydFJlcXVlc3QoaW50IGNtZCk7Ci0gICAgdm9pZCBzZW5kUmVxdWVzdCgpOwotCi0gICAgZnJpZW5kIGNsYXNzIFJlbmRlcklucHV0OwotfTsKLQotY2xhc3MgUmVuZGVySW5wdXQgewotcHVibGljOgotICAgIC8vIFJldHVybnMgdGhlIEFOYXRpdmVXaW5kb3cgY29ycmVzcG9uZHMgdG8gdGhlIFN1cmZhY2UuCi0gICAgQU5hdGl2ZVdpbmRvdyogZ2V0VGFyZ2V0V2luZG93KCk7Ci0KLSAgICAvLyBVcGRhdGVzIHZpZGVvIGZyYW1lIHNpemUgZnJvbSB0aGUgTWVkaWFTb3VyY2UncyBtZXRhZGF0YS4gU3BlY2lmaWNhbGx5Ci0gICAgLy8gd2UgbG9vayBmb3Iga0tleVdpZHRoLCBrS2V5SGVpZ2h0LCBhbmQgKG9wdGlvbmFsbHkpIGtLZXlDcm9wUmVjdC4KLSAgICB2b2lkIHVwZGF0ZVZpZGVvU2l6ZShzcDxNZXRhRGF0YT4gbWV0YSk7Ci0KLSAgICAvLyBSZW5kZXJzIHRoZSBidWZmZXIgd2l0aCB0aGUgZ2l2ZW4gdmlkZW8gZWZmZWN0IGFuZCByZW5kaW5nIG1vZGUuCi0gICAgLy8gVGhlIHZpZGVvIGVmZmV0cyBhcmUgZGVmaW5lZCBpbiBWaWRlb0VkaXRvclRvb2xzLmgKLSAgICAvLyBTZXQgaXNFeHRlcm5hbEJ1ZmZlciB0byB0cnVlIG9ubHkgd2hlbiB0aGUgYnVmZmVyIGdpdmVuIGlzIG5vdAotICAgIC8vIHByb3ZpZGVkIGJ5IHRoZSBTdXJmYWNlLgotICAgIHZvaWQgcmVuZGVyKE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQzMl90IHZpZGVvRWZmZWN0LAotICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgcmVuZGVyaW5nTW9kZSwgYm9vbCBpc0V4dGVybmFsQnVmZmVyKTsKLXByaXZhdGU6Ci0gICAgUmVuZGVySW5wdXQoTmF0aXZlV2luZG93UmVuZGVyZXIqIHJlbmRlcmVyLCBHTHVpbnQgdGV4dHVyZUlkKTsKLSAgICB+UmVuZGVySW5wdXQoKTsKLSAgICBOYXRpdmVXaW5kb3dSZW5kZXJlciogbVJlbmRlcmVyOwotICAgIEdMdWludCBtVGV4dHVyZUlkOwotICAgIHNwPEdMQ29uc3VtZXI+IG1TVDsKLSAgICBzcDxTdXJmYWNlPiBtU1RDOwotICAgIGludCBtV2lkdGgsIG1IZWlnaHQ7Ci0KLSAgICAvLyBUaGVzZSBhcmUgb25seSB2YWxpZCBkdXJpbmcgcmVuZGVyKCkgY2FsbHMKLSAgICB1aW50MzJfdCBtVmlkZW9FZmZlY3Q7Ci0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1SZW5kZXJpbmdNb2RlOwotICAgIGJvb2wgbUlzRXh0ZXJuYWxCdWZmZXI7Ci0gICAgTWVkaWFCdWZmZXIqIG1CdWZmZXI7Ci0KLSAgICBmcmllbmQgY2xhc3MgTmF0aXZlV2luZG93UmVuZGVyZXI7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE5BVElWRV9XSU5ET1dfUkVOREVSRVJfSF8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdQbGF5ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzZmZTBhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlByZXZpZXdQbGF5ZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5oIgotI2luY2x1ZGUgIkR1bW15QXVkaW9Tb3VyY2UuaCIKLSNpbmNsdWRlICJEdW1teVZpZGVvU291cmNlLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JTUkMuaCIKLSNpbmNsdWRlICJQcmV2aWV3UGxheWVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotCi12b2lkIGFkZEJhdHRlcnlEYXRhKHVpbnQzMl90IHBhcmFtcykgewotICAgIHNwPElCaW5kZXI+IGJpbmRlciA9Ci0gICAgICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5wbGF5ZXIiKSk7Ci0gICAgc3A8SU1lZGlhUGxheWVyU2VydmljZT4gc2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllclNlcnZpY2U+KGJpbmRlcik7Ci0gICAgQ0hFQ0soc2VydmljZS5nZXQoKSAhPSBOVUxMKTsKLQotICAgIHNlcnZpY2UtPmFkZEJhdHRlcnlEYXRhKHBhcmFtcyk7Ci19Ci0KLXN0cnVjdCBQcmV2aWV3UGxheWVyRXZlbnQgOiBwdWJsaWMgVGltZWRFdmVudFF1ZXVlOjpFdmVudCB7Ci0gICAgUHJldmlld1BsYXllckV2ZW50KAotICAgICAgICAgICAgUHJldmlld1BsYXllciAqcGxheWVyLAotICAgICAgICAgICAgdm9pZCAoUHJldmlld1BsYXllcjo6Km1ldGhvZCkoKSkKLSAgICAgICAgOiBtUGxheWVyKHBsYXllciksCi0gICAgICAgICAgbU1ldGhvZChtZXRob2QpIHsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5QcmV2aWV3UGxheWVyRXZlbnQoKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIGZpcmUoVGltZWRFdmVudFF1ZXVlICpxdWV1ZSwgaW50NjRfdCAvKiBub3dfdXMgKi8pIHsKLSAgICAgICAgKG1QbGF5ZXItPiptTWV0aG9kKSgpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBQcmV2aWV3UGxheWVyICptUGxheWVyOwotICAgIHZvaWQgKFByZXZpZXdQbGF5ZXI6OiptTWV0aG9kKSgpOwotCi0gICAgUHJldmlld1BsYXllckV2ZW50KGNvbnN0IFByZXZpZXdQbGF5ZXJFdmVudCAmKTsKLSAgICBQcmV2aWV3UGxheWVyRXZlbnQgJm9wZXJhdG9yPShjb25zdCBQcmV2aWV3UGxheWVyRXZlbnQgJik7Ci19OwotCi1QcmV2aWV3UGxheWVyOjpQcmV2aWV3UGxheWVyKE5hdGl2ZVdpbmRvd1JlbmRlcmVyKiByZW5kZXJlcikKLSAgICA6IG1RdWV1ZVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbVRpbWVTb3VyY2UoTlVMTCksCi0gICAgICBtVmlkZW9SZW5kZXJlcklzUHJldmlldyhmYWxzZSksCi0gICAgICBtQXVkaW9QbGF5ZXIoTlVMTCksCi0gICAgICBtRGlzcGxheVdpZHRoKDApLAotICAgICAgbURpc3BsYXlIZWlnaHQoMCksCi0gICAgICBtRmxhZ3MoMCksCi0gICAgICBtRXh0cmFjdG9yRmxhZ3MoMCksCi0gICAgICBtVmlkZW9CdWZmZXIoTlVMTCksCi0gICAgICBtTGFzdFZpZGVvVGltZVVzKC0xKSwKLSAgICAgIG1OYXRpdmVXaW5kb3dSZW5kZXJlcihyZW5kZXJlciksCi0gICAgICBtQ3VyckZyYW1pbmdFZmZlY3RJbmRleCgwKSwKLSAgICAgIG1GcmFtZVJHQkJ1ZmZlcihOVUxMKSwKLSAgICAgIG1GcmFtZVlVVkJ1ZmZlcihOVUxMKSB7Ci0KLSAgICBDSEVDS19FUShtQ2xpZW50LmNvbm5lY3QoKSwgKHN0YXR1c190KU9LKTsKLSAgICBEYXRhU291cmNlOjpSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOwotCi0KLSAgICBtVmlkZW9SZW5kZXJlciA9IE5VTEw7Ci0gICAgbUVmZmVjdHNTZXR0aW5ncyA9IE5VTEw7Ci0gICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKLSAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMgPSAwOwotICAgIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUgPSAwOwotICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSA9IDA7Ci0gICAgbU51bWJlckVmZmVjdHMgPSAwOwotICAgIG1EZWNvZGVkVmlkZW9UcyA9IDA7Ci0gICAgbURlY1ZpZGVvVHNTdG9yeUJvYXJkID0gMDsKLSAgICBtQ3VycmVudFZpZGVvRWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0gICAgbVByb2dyZXNzQ2JJbnRlcnZhbCA9IDA7Ci0gICAgbU51bWJlckRlY1ZpZGVvRnJhbWVzID0gMDsKLSAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UG9zdGVkID0gZmFsc2U7Ci0gICAgbUlzQ2hhbmdlU291cmNlUmVxdWlyZWQgPSB0cnVlOwotCi0gICAgbVZpZGVvRXZlbnQgPSBuZXcgUHJldmlld1BsYXllckV2ZW50KHRoaXMsICZQcmV2aWV3UGxheWVyOjpvblZpZGVvRXZlbnQpOwotICAgIG1WaWRlb0V2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1WaWRlb0xhZ0V2ZW50ID0gbmV3IFByZXZpZXdQbGF5ZXJFdmVudCh0aGlzLCAmUHJldmlld1BsYXllcjo6b25WaWRlb0xhZ1VwZGF0ZSk7Ci0gICAgbVZpZGVvRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbUNoZWNrQXVkaW9TdGF0dXNFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQoCi0gICAgICAgICAgICB0aGlzLCAmUHJldmlld1BsYXllcjo6b25DaGVja0F1ZGlvU3RhdHVzKTsKLSAgICBtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtU3RyZWFtRG9uZUV2ZW50ID0gbmV3IFByZXZpZXdQbGF5ZXJFdmVudCgKLSAgICAgICAgICAgIHRoaXMsICZQcmV2aWV3UGxheWVyOjpvblN0cmVhbURvbmUpOwotICAgIG1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbVByb2dyZXNzQ2JFdmVudCA9IG5ldyBQcmV2aWV3UGxheWVyRXZlbnQodGhpcywKLSAgICAgICAgICZQcmV2aWV3UGxheWVyOjpvblByb2dyZXNzQ2JFdmVudCk7Ci0KLSAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50ID0gbmV3IFByZXZpZXdQbGF5ZXJFdmVudCh0aGlzLAotICAgICAgICAmUHJldmlld1BsYXllcjo6b25VcGRhdGVPdmVybGF5RXZlbnQpOwotICAgIG1Qcm9ncmVzc0NiRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICBtT3ZlcmxheVVwZGF0ZUV2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1SZW5kZXJpbmdNb2RlID0gKE00eFZTU19NZWRpYVJlbmRlcmluZylNRURJQV9SRU5ERVJJTkdfSU5WQUxJRDsKLSAgICBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCA9IGZhbHNlOwotICAgIHJlc2V0KCk7Ci19Ci0KLVByZXZpZXdQbGF5ZXI6On5QcmV2aWV3UGxheWVyKCkgewotCi0gICAgaWYgKG1RdWV1ZVN0YXJ0ZWQpIHsKLSAgICAgICAgbVF1ZXVlLnN0b3AoKTsKLSAgICB9Ci0KLSAgICByZXNldCgpOwotCi0gICAgaWYgKG1WaWRlb1JlbmRlcmVyKSB7Ci0gICAgICAgIG1OYXRpdmVXaW5kb3dSZW5kZXJlci0+ZGVzdHJveVJlbmRlcklucHV0KG1WaWRlb1JlbmRlcmVyKTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgY2xlYXJfbCgpOwotICAgIG1DbGllbnQuZGlzY29ubmVjdCgpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OmNhbmNlbFBsYXllckV2ZW50c19sKGJvb2wgdXBkYXRlUHJvZ3Jlc3NDYikgewotICAgIG1RdWV1ZS5jYW5jZWxFdmVudChtVmlkZW9FdmVudC0+ZXZlbnRJRCgpKTsKLSAgICBtVmlkZW9FdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtUXVldWUuY2FuY2VsRXZlbnQobVN0cmVhbURvbmVFdmVudC0+ZXZlbnRJRCgpKTsKLSAgICBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1RdWV1ZS5jYW5jZWxFdmVudChtQ2hlY2tBdWRpb1N0YXR1c0V2ZW50LT5ldmVudElEKCkpOwotICAgIG1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZyA9IGZhbHNlOwotICAgIG1RdWV1ZS5jYW5jZWxFdmVudChtVmlkZW9MYWdFdmVudC0+ZXZlbnRJRCgpKTsKLSAgICBtVmlkZW9MYWdFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICBpZiAodXBkYXRlUHJvZ3Jlc3NDYikgewotICAgICAgICBtUXVldWUuY2FuY2VsRXZlbnQobVByb2dyZXNzQ2JFdmVudC0+ZXZlbnRJRCgpKTsKLSAgICAgICAgbVByb2dyZXNzQ2JFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldERhdGFTb3VyY2UoY29uc3QgY2hhciAqcGF0aCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbChwYXRoKTsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0RGF0YVNvdXJjZV9sKGNvbnN0IGNoYXIgKnBhdGgpIHsKLSAgICByZXNldF9sKCk7Ci0KLSAgICBtVXJpID0gcGF0aDsKLQotICAgIC8vIFRoZSBhY3R1YWwgd29yayB3aWxsIGJlIGRvbmUgZHVyaW5nIHByZXBhcmF0aW9uIGluIHRoZSBjYWxsIHRvCi0gICAgLy8gOjpmaW5pc2hTZXREYXRhU291cmNlX2wgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIGNhbGxpbmcgdGhyZWFkIGluCi0gICAgLy8gc2V0RGF0YVNvdXJjZSBmb3IgYW55IHNpZ25pZmljYW50IHRpbWUuCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXREYXRhU291cmNlX2woY29uc3Qgc3A8TWVkaWFFeHRyYWN0b3I+ICZleHRyYWN0b3IpIHsKLSAgICBib29sIGhhdmVBdWRpbyA9IGZhbHNlOwotICAgIGJvb2wgaGF2ZVZpZGVvID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7ICsraSkgewotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpKTsKLQotICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICAgICAgaWYgKCFoYXZlVmlkZW8gJiYgIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgewotICAgICAgICAgICAgc2V0VmlkZW9Tb3VyY2UoZXh0cmFjdG9yLT5nZXRUcmFjayhpKSk7Ci0gICAgICAgICAgICBoYXZlVmlkZW8gPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKCFoYXZlQXVkaW8gJiYgIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgewotICAgICAgICAgICAgc2V0QXVkaW9Tb3VyY2UoZXh0cmFjdG9yLT5nZXRUcmFjayhpKSk7Ci0gICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSkgewotICAgICAgICAgICAgICAgIC8vIE9ubHkgZG8gdGhpcyBmb3Igdm9yYmlzIGF1ZGlvLCBub25lIG9mIHRoZSBvdGhlciBhdWRpbwotICAgICAgICAgICAgICAgIC8vIGZvcm1hdHMgZXZlbiBzdXBwb3J0IHRoaXMgcmluZ3RvbmUgc3BlY2lmaWMgaGFjayBhbmQKLSAgICAgICAgICAgICAgICAvLyByZXRyaWV2aW5nIHRoZSBtZXRhZGF0YSBvbiBzb21lIGV4dHJhY3RvcnMgbWF5IHR1cm4gb3V0Ci0gICAgICAgICAgICAgICAgLy8gdG8gYmUgdmVyeSBleHBlbnNpdmUuCi0gICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZpbGVNZXRhID0gZXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOwotICAgICAgICAgICAgICAgIGludDMyX3QgbG9vcDsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZU1ldGEgIT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZU1ldGEtPmZpbmRJbnQzMihrS2V5QXV0b0xvb3AsICZsb29wKQotICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxvb3AgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVUT19MT09QSU5HOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXZlQXVkaW8gJiYgaGF2ZVZpZGVvKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEFkZCB0aGUgc3VwcG9ydCBmb3IgRHVtbXkgYXVkaW8qLwotICAgIGlmKCAhaGF2ZUF1ZGlvICl7Ci0gICAgICAgIG1BdWRpb1RyYWNrID0gRHVtbXlBdWRpb1NvdXJjZTo6Q3JlYXRlKDMyMDAwLCAyLCAyMDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1QbGF5RW5kVGltZU1zZWMpKjEwMDBMTCkpOwotICAgICAgICBpZihtQXVkaW9UcmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFoYXZlQXVkaW8gJiYgIWhhdmVWaWRlbykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtRXh0cmFjdG9yRmxhZ3MgPSBleHRyYWN0b3ItPmZsYWdzKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXREYXRhU291cmNlX2xfanBnKCkgewotICAgIEFMT0dWKCJzZXREYXRhU291cmNlX2xfanBnIik7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIG1BdWRpb1NvdXJjZSA9IER1bW15QXVkaW9Tb3VyY2U6OkNyZWF0ZSgzMjAwMCwgMiwgMjAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1QbGF5RW5kVGltZU1zZWMpKjEwMDBMTCkpOwotICAgIGlmKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNldEF1ZGlvU291cmNlKG1BdWRpb1NvdXJjZSk7Ci0gICAgfQotICAgIHN0YXR1c190IGVycm9yID0gbUF1ZGlvU291cmNlLT5zdGFydCgpOwotICAgIGlmIChlcnJvciAhPSBPSykgewotICAgICAgICBBTE9HRSgiRXJyb3Igc3RhcnRpbmcgZHVtbXkgYXVkaW8gc291cmNlIik7Ci0gICAgICAgIG1BdWRpb1NvdXJjZS5jbGVhcigpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1EdXJhdGlvblVzID0gKG1QbGF5RW5kVGltZU1zZWMgLSBtUGxheUJlZ2luVGltZU1zZWMpKjEwMDBMTDsKLQotICAgIG1WaWRlb1NvdXJjZSA9IER1bW15VmlkZW9Tb3VyY2U6OkNyZWF0ZShtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHVyYXRpb25VcywgbVVyaSk7Ci0KLSAgICB1cGRhdGVTaXplVG9SZW5kZXIobVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKSk7Ci0gICAgc2V0VmlkZW9Tb3VyY2UobVZpZGVvU291cmNlKTsKLSAgICBzdGF0dXNfdCBlcnIxID0gbVZpZGVvU291cmNlLT5zdGFydCgpOwotICAgIGlmIChlcnIxICE9IE9LKSB7Ci0gICAgICAgIG1WaWRlb1NvdXJjZS5jbGVhcigpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1Jc1ZpZGVvU291cmNlSnBnID0gdHJ1ZTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cmVzZXRfbCgpIHsKLQotICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgbUZsYWdzIHw9IFBSRVBBUkVfQ0FOQ0VMTEVEOwotICAgIH0KLQotICAgIHdoaWxlIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgbVByZXBhcmVkQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIGNhbmNlbFBsYXllckV2ZW50c19sKCk7Ci0gICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKLSAgICBtVmlkZW9UcmFjay5jbGVhcigpOwotCi0gICAgLy8gU2h1dGRvd24gYXVkaW8gZmlyc3QsIHNvIHRoYXQgdGhlIHJlc3BvbmUgdG8gdGhlIHJlc2V0IHJlcXVlc3QKLSAgICAvLyBhcHBlYXJzIHRvIGhhcHBlbiBpbnN0YW50YW5lb3VzbHkgYXMgZmFyIGFzIHRoZSB1c2VyIGlzIGNvbmNlcm5lZAotICAgIC8vIElmIHdlIGRpZCB0aGlzIGxhdGVyLCBhdWRpbyB3b3VsZCBjb250aW51ZSBwbGF5aW5nIHdoaWxlIHdlCi0gICAgLy8gc2h1dGRvd24gdGhlIHZpZGVvLXJlbGF0ZWQgcmVzb3VyY2VzIGFuZCB0aGUgcGxheWVyIGFwcGVhciB0bwotICAgIC8vIG5vdCBiZSBhcyByZXNwb25zaXZlIHRvIGEgcmVzZXQgcmVxdWVzdC4KLSAgICBpZiAobUF1ZGlvUGxheWVyID09IE5VTEwgJiYgbUF1ZGlvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gSWYgd2UgaGFkIGFuIGF1ZGlvIHBsYXllciwgaXQgd291bGQgaGF2ZSBlZmZlY3RpdmVseQotICAgICAgICAvLyB0YWtlbiBwb3NzZXNzaW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UgYW5kIHN0b3BwZWQgaXQgd2hlbgotICAgICAgICAvLyBfaXRfIGlzIHN0b3BwZWQuIE90aGVyd2lzZSB0aGlzIGlzIHN0aWxsIG91ciByZXNwb25zaWJpbGl0eS4KLSAgICAgICAgbUF1ZGlvU291cmNlLT5zdG9wKCk7Ci0gICAgfQotICAgIG1BdWRpb1NvdXJjZS5jbGVhcigpOwotCi0gICAgbVRpbWVTb3VyY2UgPSBOVUxMOwotCi0gICAgLy9TaW5nbGUgYXVkaW8gcGxheWVyIGluc3RhbmNlIHVzZWQKLSAgICAvL1NvIGRvbm90IGRlbGV0ZSBpdCBoZXJlCi0gICAgLy9JdCBpcyBkZWxldGVkIGZyb20gUHJldmlld0NvbnRyb2xsZXIgY2xhc3MKLSAgICAvL2RlbGV0ZSBtQXVkaW9QbGF5ZXI7Ci0gICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKLQotICAgIGlmIChtVmlkZW9CdWZmZXIpIHsKLSAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1WaWRlb1NvdXJjZS0+c3RvcCgpOwotCi0gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIE9NWAotICAgICAgICAvLyBjb21wb25lbnQgaXMgY29tcGxldGVseSByZWxlYXNlZCBieSB0aGUgdGltZSB3ZSBtYXkgdHJ5Ci0gICAgICAgIC8vIHRvIGluc3RhbnRpYXRlIGl0IGFnYWluLgotICAgICAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVZpZGVvU291cmNlOwotICAgICAgICBtVmlkZW9Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgd2hpbGUgKHRtcC5wcm9tb3RlKCkgIT0gTlVMTCkgewotICAgICAgICAgICAgdXNsZWVwKDEwMDApOwotICAgICAgICB9Ci0gICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICB9Ci0KLSAgICBtRHVyYXRpb25VcyA9IC0xOwotICAgIG1GbGFncyA9IDA7Ci0gICAgbUV4dHJhY3RvckZsYWdzID0gMDsKLSAgICBtVmlkZW9XaWR0aCA9IG1WaWRlb0hlaWdodCA9IC0xOwotICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IDA7Ci0gICAgbVZpZGVvVGltZVVzID0gMDsKLQotICAgIG1TZWVraW5nID0gTk9fU0VFSzsKLSAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSBmYWxzZTsKLSAgICBtU2Vla1RpbWVVcyA9IDA7Ci0KLSAgICBtVXJpLnNldFRvKCIiKTsKLQotICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgPSBWSURFT19FRkZFQ1RfTk9ORTsKLSAgICBtSXNWaWRlb1NvdXJjZUpwZyA9IGZhbHNlOwotICAgIG1GcmFtZVJHQkJ1ZmZlciA9IE5VTEw7Ci0gICAgaWYobUZyYW1lWVVWQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtRnJhbWVZVVZCdWZmZXIpOwotICAgICAgICBtRnJhbWVZVVZCdWZmZXIgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cGxheSgpIHsKLSAgICBBTE9HVigicGxheSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOwotICAgIG1GbGFncyAmPSB+SU5GT1JNRURfQVZfRU9TOwotICAgIHJldHVybiBwbGF5X2woKTsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c3RhcnRBdWRpb1BsYXllcl9sKCkgewotICAgIEFMT0dWKCJzdGFydEF1ZGlvUGxheWVyX2wiKTsKLSAgICBDSEVDSyghKG1GbGFncyAmIEFVRElPX1JVTk5JTkcpKTsKLQotICAgIGlmIChtQXVkaW9Tb3VyY2UgPT0gTlVMTCB8fCBtQXVkaW9QbGF5ZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKCEobUZsYWdzICYgQVVESU9QTEFZRVJfU1RBUlRFRCkpIHsKLSAgICAgICAgbUZsYWdzIHw9IEFVRElPUExBWUVSX1NUQVJURUQ7Ci0KLSAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBzdGFydGVkIHRoZSBNZWRpYVNvdXJjZSBpbiBvcmRlciB0byBlbmFibGUKLSAgICAgICAgLy8gdGhlIHByZWZldGNoZXIgdG8gcmVhZCBpdHMgZGF0YS4KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvUGxheWVyLT5zdGFydCgKLSAgICAgICAgICAgICAgICB0cnVlIC8qIHNvdXJjZUFscmVhZHlTdGFydGVkICovKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb1BsYXllci0+cmVzdW1lKCk7Ci0gICAgfQotCi0gICAgbUZsYWdzIHw9IEFVRElPX1JVTk5JTkc7Ci0KLSAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldEF1ZGlvUGxheWVyKFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKmF1ZGlvUGxheWVyKSB7Ci0gICAgQUxPR1YoInNldEF1ZGlvUGxheWVyIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBDSEVDSyghKG1GbGFncyAmIFBMQVlJTkcpKTsKLSAgICBtQXVkaW9QbGF5ZXIgPSBhdWRpb1BsYXllcjsKLQotICAgIEFMT0dWKCJTZXRBdWRpb1BsYXllciIpOwotICAgIG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkID0gdHJ1ZTsKLQotICAgIC8vIGNoZWNrIGlmIHRoZSBuZXcgYW5kIG9sZCBzb3VyY2UgYXJlIGR1bW15Ci0gICAgc3A8TWVkaWFTb3VyY2U+IGFuQXVkaW9Tb3VyY2UgPSBtQXVkaW9QbGF5ZXItPmdldFNvdXJjZSgpOwotICAgIGlmIChhbkF1ZGlvU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgLy8gQXVkaW8gcGxheWVyIGRvZXMgbm90IGhhdmUgYW55IHNvdXJjZSBzZXQuCi0gICAgICAgIEFMT0dWKCJzZXRBdWRpb1BsYXllcjogQXVkaW8gcGxheWVyIGRvZXMgbm90IGhhdmUgYW55IHNvdXJjZSBzZXQiKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIElmIG5ldyB2aWRlbyBzb3VyY2UgaXMgbm90IGR1bW15LCB0aGVuIGFsd2F5cyBjaGFuZ2Ugc291cmNlCi0gICAgLy8gRWxzZSBhdWRpbyBwbGF5ZXIgY29udGludWVzIHVzaW5nIG9sZCBhdWRpbyBzb3VyY2UgYW5kIHRoZXJlIGFyZQotICAgIC8vIGZyYW1lIGRyb3BzIHRvIG1haW50YWluIEFWIHN5bmMKLSAgICBzcDxNZXRhRGF0YT4gbWV0YTsKLSAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbWV0YSA9IG1WaWRlb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnBWaWRTcmNUeXBlOwotICAgICAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICZwVmlkU3JjVHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChzdHJjbXAocFZpZFNyY1R5cGUsICJEdW1teVZpZGVvU291cmNlIikgIT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIgVmlkZW8gY2xpcCB3aXRoIHNpbGVudCBhdWRpbzsgbmVlZCB0byBjaGFuZ2Ugc291cmNlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciAqcFNyY1R5cGUxOwotICAgIGNvbnN0IGNoYXIgKnBTcmNUeXBlMjsKLSAgICBtZXRhID0gYW5BdWRpb1NvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICZwU3JjVHlwZTEpKSB7Ci0gICAgICAgIGlmIChzdHJjbXAocFNyY1R5cGUxLCAiRHVtbXlBdWRpb1NvdXJjZSIpID09IDApIHsKLSAgICAgICAgICAgIG1ldGEgPSBtQXVkaW9Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAmcFNyY1R5cGUyKSkgewotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAocFNyY1R5cGUyLCAiRHVtbXlBdWRpb1NvdXJjZSIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUlzQ2hhbmdlU291cmNlUmVxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBzZXQgdGhlIG5ldyBwbGF5IGR1cmF0aW9uIGZvciB0aGUgZXhpc3Rpbmcgc291cmNlCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhU291cmNlICpwTWVkaWFTcmMgPSBhbkF1ZGlvU291cmNlLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBEdW1teUF1ZGlvU291cmNlICpwRHVtbXlBdWRpb1NvdXJjZSA9IChEdW1teUF1ZGlvU291cmNlKilwTWVkaWFTcmM7Ci0gICAgICAgICAgICAgICAgICAgIC8vSW5jcmVtZW50IHRoZSBkdXJhdGlvbiBvZiBhdWRpbyBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgcER1bW15QXVkaW9Tb3VyY2UtPnNldER1cmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKChtUGxheUVuZFRpbWVNc2VjKSoxMDAwTEwpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIHRoZSBuZXcgYXVkaW8gc291cmNlCi0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIGNvbnRpbnVlIHVzaW5nIG9sZCBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNldEF1ZGlvUGxheWVyOiBzdG9wIG5ldyBhdWRpbyBzb3VyY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om9uU3RyZWFtRG9uZSgpIHsKLSAgICBBTE9HVigib25TdHJlYW1Eb25lIik7Ci0gICAgLy8gUG9zdGVkIHdoZW5ldmVyIGFueSBzdHJlYW0gZmluaXNoZXMgcGxheWluZy4KLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKCFtU3RyZWFtRG9uZUV2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICBpZiAobVN0cmVhbURvbmVTdGF0dXMgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICBBTE9HVigiTUVESUFfRVJST1IgJWQiLCBtU3RyZWFtRG9uZVN0YXR1cyk7Ci0KLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbCgKLSAgICAgICAgICAgICAgICBNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgbVN0cmVhbURvbmVTdGF0dXMpOwotCi0gICAgICAgIHBhdXNlX2wodHJ1ZSAvKiBhdCBlb3MgKi8pOwotCi0gICAgICAgIG1GbGFncyB8PSBBVF9FT1M7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBib29sIGFsbERvbmUgPQotICAgICAgICAobVZpZGVvU291cmNlID09IE5VTEwgfHwgKG1GbGFncyAmIFZJREVPX0FUX0VPUykpCi0gICAgICAgICAgICAmJiAobUF1ZGlvU291cmNlID09IE5VTEwgfHwgKG1GbGFncyAmIEFVRElPX0FUX0VPUykpOwotCi0gICAgaWYgKCFhbGxEb25lKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUZsYWdzICYgKExPT1BJTkcgfCBBVVRPX0xPT1BJTkcpKSB7Ci0gICAgICAgIHNlZWtUb19sKDApOwotCi0gICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIk1FRElBX1BMQVlCQUNLX0NPTVBMRVRFIik7Ci0gICAgICAgIC8vcGF1c2UgYmVmb3JlIHNlbmRpbmcgZXZlbnQKLSAgICAgICAgcGF1c2VfbCh0cnVlIC8qIGF0IGVvcyAqLyk7Ci0KLSAgICAgICAgLy9UaGlzIGxvY2sgaXMgdXNlZCB0byBzeW5jcm9uaXplIG9uU3RyZWFtRG9uZSgpIGluIFByZXZpZXdQbGF5ZXIgYW5kCi0gICAgICAgIC8vc3RvcFByZXZpZXcoKSBpbiBQcmV2aWV3Q29udHJvbGxlcgotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2tDb250cm9sKTsKLSAgICAgICAgLyogTWFrZSBzdXJlIFByZXZpZXdQbGF5ZXIgb25seSBub3RpZmllcyBNRURJQV9QTEFZQkFDS19DT01QTEVURSBvbmNlIGZvciBlYWNoIGNsaXAhCi0gICAgICAgICAqIEl0IGhhcHBlbnMgdHdpY2UgaW4gZm9sbG93aW5nIHNjZW5hcmlvLgotICAgICAgICAgKiBUbyBtYWtlIHRoZSBjbGlwcyBpbiBwcmV2aWV3IHN0b3J5Ym9hcmQgYXJlIHBsYXllZCBhbmQgc3dpdGNoZWQgc21vb3RobHksCi0gICAgICAgICAqIFByZXZpZXdDb250cm9sbGVyIHVzZXMgdHdvIFByZXZpZXdQbGF5ZXIgaW5zdGFuY2VzIGFuZCBvbmUgQXVkaW9QbGF5ZXIuCi0gICAgICAgICAqIFRoZSB0d28gUHJldmlld1BsYXllciB1c2UgdGhlIHNhbWUgQXVkaW9QbGF5ZXIgdG8gcGxheSB0aGUgYXVkaW8sCi0gICAgICAgICAqIGFuZCBjaGFuZ2UgdGhlIGF1ZGlvIHNvdXJjZSBvZiB0aGUgQXVkaW9QbGF5ZXIuCi0gICAgICAgICAqIElmIHRoZSBhdWRpbyBzb3VyY2Ugb2YgY3VycmVudCBwbGF5aW5nIGNsaXAgYW5kIG5leHQgY2xpcCBhcmUgZHVtbXkKLSAgICAgICAgICogYXVkaW8gc291cmNlKGltYWdlIG9yIHZpZGVvIHdpdGhvdXQgYXVkaW8pLCBpdCB3aWxsIG5vdCBjaGFuZ2UgdGhlIGF1ZGlvIHNvdXJjZQotICAgICAgICAgKiB0byBhdm9pZCB0aGUgImF1ZGlvIGdsaXRjaCIsIGFuZCBrZWVwIHVzaW5nIHRoZSBjdXJyZW50IGF1ZGlvIHNvdXJjZS4KLSAgICAgICAgICogV2hlbiB0aGUgdmlkZW8gb2YgY3VycmVudCBjbGlwIHJlYWNoZWQgdGhlIEVPUywgUHJldmlld1BsYXllciB3aWxsIHNldCBFT1MgZmxhZwotICAgICAgICAgKiBmb3IgdmlkZW8gYW5kIGF1ZGlvLCBhbmQgaXQgd2lsbCBub3RpZnkgTUVESUFfUExBWUJBQ0tfQ09NUExFVEUuCi0gICAgICAgICAqIEJ1dCB0aGUgYXVkaW8oZHVtbXkgYXVkaW8gc291cmNlKSBpcyBzdGlsbCBwbGF5aW5nKGZvciBuZXh0IGNsaXApLAotICAgICAgICAgKiBhbmQgd2hlbiBpdCByZWFjaGVkIHRoZSBFT1MsIGFuZCB2aWRlbyByZWFjaGVkIEVPUywKLSAgICAgICAgICogUHJldmlld1BsYXllciB3aWxsIG5vdGlmeSBNRURJQV9QTEFZQkFDS19DT01QTEVURSBhZ2Fpbi4gKi8KLSAgICAgICAgaWYgKCEobUZsYWdzICYgSU5GT1JNRURfQVZfRU9TKSkgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QTEFZQkFDS19DT01QTEVURSk7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gSU5GT1JNRURfQVZfRU9TOwotICAgICAgICB9Ci0gICAgICAgIG1GbGFncyB8PSBBVF9FT1M7Ci0gICAgICAgIEFMT0dWKCJvblN0cmVhbURvbmUgZW5kIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cGxheV9sKCkgewotICAgIEFMT0dWKCJwbGF5X2wiKTsKLQotICAgIG1GbGFncyAmPSB+U0VFS19QUkVWSUVXOwotCi0gICAgaWYgKG1GbGFncyAmIFBMQVlJTkcpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBtU3RhcnROZXh0UGxheWVyID0gZmFsc2U7Ci0KLSAgICBpZiAoIShtRmxhZ3MgJiBQUkVQQVJFRCkpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcHJlcGFyZV9sKCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1GbGFncyB8PSBQTEFZSU5HOwotICAgIG1GbGFncyB8PSBGSVJTVF9GUkFNRTsKLQotICAgIGJvb2wgZGVmZXJyZWRBdWRpb1NlZWsgPSBmYWxzZTsKLQotICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBpZiAobUF1ZGlvUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllciA9IG5ldyBWaWRlb0VkaXRvckF1ZGlvUGxheWVyKG1BdWRpb1NpbmssIHRoaXMpOwotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2V0U291cmNlKG1BdWRpb1NvdXJjZSk7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldEF1ZGlvTWl4U2V0dGluZ3MoCi0gICAgICAgICAgICAgICAgIG1QcmV2aWV3UGxheWVyQXVkaW9NaXhTZXR0aW5ncyk7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZSgKLSAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4UENNRmlsZUhhbmRsZSk7Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldEF1ZGlvTWl4U3RvcnlCb2FyZFNraW1UaW1lU3RhbXAoCi0gICAgICAgICAgICAgICAgIG1BdWRpb01peFN0b3J5Qm9hcmRUUywgbUN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSwKLSAgICAgICAgICAgICAgICAgbUN1cnJlbnRNZWRpYVZvbHVtZVZhbHVlKTsKLQotICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVESU9QTEFZRVJfU1RBUlRFRDsKLSAgICAgICAgICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IHN0YXJ0ZWQgdGhlIE1lZGlhU291cmNlIGluIG9yZGVyIHRvIGVuYWJsZQotICAgICAgICAgICAgICAgIC8vIHRoZSBwcmVmZXRjaGVyIHRvIHJlYWQgaXRzIGRhdGEuCi0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvUGxheWVyLT5zdGFydCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogc291cmNlQWxyZWFkeVN0YXJ0ZWQgKi8pOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAvL2RlbGV0ZSBtQXVkaW9QbGF5ZXI7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH4oUExBWUlORyB8IEZJUlNUX0ZSQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtVGltZVNvdXJjZSA9IG1BdWRpb1BsYXllcjsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVESU9fUlVOTklORzsKLSAgICAgICAgICAgICAgICBkZWZlcnJlZEF1ZGlvU2VlayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib29sIGlzQXVkaW9QbGF5ZXJTdGFydGVkID0gbUF1ZGlvUGxheWVyLT5pc1N0YXJ0ZWQoKTsKLQotICAgICAgICAgICAgaWYgKG1Jc0NoYW5nZVNvdXJjZVJlcXVpcmVkID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicGxheV9sOiBDaGFuZ2UgYXVkaW8gc291cmNlIHJlcXVpcmVkIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNBdWRpb1BsYXllclN0YXJ0ZWQgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRTb3VyY2UobUF1ZGlvU291cmNlKTsKLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldE9ic2VydmVyKHRoaXMpOwotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFNldHRpbmdzKAotICAgICAgICAgICAgICAgICBtUHJldmlld1BsYXllckF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFN0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTdG9yeUJvYXJkVFMsIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWVkaWFWb2x1bWVWYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNBdWRpb1BsYXllclN0YXJ0ZWQgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnJlc3VtZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBtQXVkaW9QbGF5ZXItPnN0YXJ0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH4oUExBWUlORyB8IEZJUlNUX0ZSQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJwbGF5X2w6IE5vIFNvdXJjZSBjaGFuZ2UgcmVxdWlyZWQiKTsKLSAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnNldEF1ZGlvTWl4U3RvcnlCb2FyZFNraW1UaW1lU3RhbXAoCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFN0b3J5Qm9hcmRUUywgbUN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSwKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRNZWRpYVZvbHVtZVZhbHVlKTsKLQotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cmVzdW1lKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1GbGFncyB8PSBBVURJT1BMQVlFUl9TVEFSVEVEOwotICAgICAgICAgICAgbUZsYWdzIHw9IEFVRElPX1JVTk5JTkc7Ci0gICAgICAgICAgICBtVGltZVNvdXJjZSA9IG1BdWRpb1BsYXllcjsKLSAgICAgICAgICAgIGRlZmVycmVkQXVkaW9TZWVrID0gdHJ1ZTsKLSAgICAgICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobVRpbWVTb3VyY2UgPT0gTlVMTCAmJiBtQXVkaW9QbGF5ZXIgPT0gTlVMTCkgewotICAgICAgICBtVGltZVNvdXJjZSA9ICZtU3lzdGVtVGltZVNvdXJjZTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIHNlZWsgb3B0aW9uIGZvciBJbWFnZSBzb3VyY2UgZmlsZXMgYW5kIHJlYWQuCi0gICAgLy8gVGhpcyByZXNldHMgdGhlIHRpbWVzdGFtcGluZyBmb3IgaW1hZ2UgcGxheQotICAgIGlmIChtSXNWaWRlb1NvdXJjZUpwZykgewotICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgTWVkaWFCdWZmZXIgKmFMb2NhbEJ1ZmZlcjsKLSAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8obVNlZWtUaW1lVXMpOwotICAgICAgICBtVmlkZW9Tb3VyY2UtPnJlYWQoJmFMb2NhbEJ1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICBhTG9jYWxCdWZmZXItPnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gS2ljayBvZmYgdmlkZW8gcGxheWJhY2sKLSAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOwotICAgIH0KLQotICAgIGlmIChkZWZlcnJlZEF1ZGlvU2VlaykgewotICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYSBzZWVrIHJlcXVlc3Qgd2hpbGUgd2Ugd2VyZSBwYXVzZWQKLSAgICAgICAgLy8gYW5kIHdlJ3JlIGp1c3Qgc3RhcnRpbmcgdXAgYWdhaW4sIGhvbm9yIHRoZSByZXF1ZXN0IG5vdy4KLSAgICAgICAgc2Vla0F1ZGlvSWZOZWNlc3NhcnlfbCgpOwotICAgIH0KLQotICAgIGlmIChtRmxhZ3MgJiBBVF9FT1MpIHsKLSAgICAgICAgLy8gTGVnYWN5IGJlaGF2aW91ciwgaWYgYSBzdHJlYW0gZmluaXNoZXMgcGxheWluZyBhbmQgdGhlbgotICAgICAgICAvLyBpcyBzdGFydGVkIGFnYWluLCB3ZSBwbGF5IGZyb20gdGhlIHN0YXJ0Li4uCi0gICAgICAgIHNlZWtUb19sKDApOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjppbml0UmVuZGVyZXJfbCgpIHsKLSAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCkgewotICAgICAgICBpZihtVmlkZW9SZW5kZXJlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtVmlkZW9SZW5kZXJlciA9IG1OYXRpdmVXaW5kb3dSZW5kZXJlci0+Y3JlYXRlUmVuZGVySW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNpemVUb1JlbmRlcihtVmlkZW9Tb3VyY2UtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2Vla1RvKGludDY0X3QgdGltZVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAoKG1FeHRyYWN0b3JGbGFncyAmIE1lZGlhRXh0cmFjdG9yOjpDQU5fU0VFSykgfHwgKG1Jc1ZpZGVvU291cmNlSnBnKSkgewotICAgICAgICByZXR1cm4gc2Vla1RvX2wodGltZVVzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6Z2V0VmlkZW9EaW1lbnNpb25zKAotICAgICAgICBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtVmlkZW9XaWR0aCA8IDAgfHwgbVZpZGVvSGVpZ2h0IDwgMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAqd2lkdGggPSBtVmlkZW9XaWR0aDsKLSAgICAqaGVpZ2h0ID0gbVZpZGVvSGVpZ2h0OwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmluaXRBdWRpb0RlY29kZXJfbCgpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1BdWRpb1RyYWNrLT5nZXRGb3JtYXQoKTsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKSB7Ci0gICAgICAgIG1BdWRpb1NvdXJjZSA9IG1BdWRpb1RyYWNrOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwPE1lZGlhU291cmNlPiBhUmF3U291cmNlOwotICAgICAgICBhUmF3U291cmNlID0gT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICBtQ2xpZW50LmludGVyZmFjZSgpLCBtQXVkaW9UcmFjay0+Z2V0Rm9ybWF0KCksCi0gICAgICAgICAgICAgICAgZmFsc2UsIC8vIGNyZWF0ZUVuY29kZXIKLSAgICAgICAgICAgICAgICBtQXVkaW9UcmFjayk7Ci0KLSAgICAgICAgaWYoYVJhd1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtQXVkaW9Tb3VyY2UgPSBuZXcgVmlkZW9FZGl0b3JTUkMoYVJhd1NvdXJjZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUF1ZGlvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICBpZiAobUF1ZGlvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKLSAgICAgICAgICAgIHNldER1cmF0aW9uX2woZHVyYXRpb25Vcyk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU291cmNlLT5zdGFydCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIG1BdWRpb1NvdXJjZS5jbGVhcigpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFApKSB7Ci0gICAgICAgIC8vIEZvciBsZWdhY3kgcmVhc29ucyB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gaWdub3JlIHRoZSBhYnNlbmNlCi0gICAgICAgIC8vIG9mIGFuIGF1ZGlvIGRlY29kZXIgZm9yIFFDRUxQIGluc3RlYWQgb2YgYWJvcnRpbmcgcGxheWJhY2sKLSAgICAgICAgLy8gYWx0b2dldGhlci4KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHJldHVybiBtQXVkaW9Tb3VyY2UgIT0gTlVMTCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6aW5pdFZpZGVvRGVjb2Rlcl9sKHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgaW5pdFJlbmRlcmVyX2woKTsKLQotICAgIGlmIChtVmlkZW9SZW5kZXJlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3QgY3JlYXRlIHJlbmRlcmVyIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIG1WaWRlb1NvdXJjZSA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICBtQ2xpZW50LmludGVyZmFjZSgpLCBtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCksCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgIG1WaWRlb1RyYWNrLAotICAgICAgICAgICAgTlVMTCwgZmxhZ3MsIG1WaWRlb1JlbmRlcmVyLT5nZXRUYXJnZXRXaW5kb3coKSk7Ci0KLSAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICBpZiAobVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKLSAgICAgICAgICAgIHNldER1cmF0aW9uX2woZHVyYXRpb25Vcyk7Ci0gICAgICAgIH0KLQotICAgICAgICB1cGRhdGVTaXplVG9SZW5kZXIobVZpZGVvVHJhY2stPmdldEZvcm1hdCgpKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtVmlkZW9Tb3VyY2UtPnN0YXJ0KCk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgbVZpZGVvU291cmNlLmNsZWFyKCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1WaWRlb1NvdXJjZSAhPSBOVUxMID8gT0sgOiBVTktOT1dOX0VSUk9SOwotfQotCi0KLXZvaWQgUHJldmlld1BsYXllcjo6b25WaWRlb0V2ZW50KCkgewotICAgIHVpbnQzMl90IGk9MDsKLSAgICBNNE9TQV9FUlIgZXJyMSA9IE00Tk9fRVJST1I7Ci0gICAgaW50NjRfdCBpbWFnZUZyYW1lVGltZVVzID0gMDsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKCFtVmlkZW9FdmVudFBlbmRpbmcpIHsKLSAgICAgICAgLy8gVGhlIGV2ZW50IGhhcyBiZWVuIGNhbmNlbGxlZCBpbiByZXNldF9sKCkgYnV0IGhhZCBhbHJlYWR5Ci0gICAgICAgIC8vIGJlZW4gc2NoZWR1bGVkIGZvciBleGVjdXRpb24gYXQgdGhhdCB0aW1lLgotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1WaWRlb0V2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgaWYgKG1GbGFncyAmIFNFRUtfUFJFVklFVykgewotICAgICAgICBtRmxhZ3MgJj0gflNFRUtfUFJFVklFVzsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFRpbWVTb3VyY2UgKnRzX3N0ID0gICZtU3lzdGVtVGltZVNvdXJjZTsKLSAgICBpbnQ2NF90IHRpbWVTdGFydFVzID0gdHNfc3QtPmdldFJlYWxUaW1lVXMoKTsKLQotICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0KLSAgICAgICAgaWYobUF1ZGlvU291cmNlICE9IE5VTEwpIHsKLQotICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gc2VlayB0aGUgdmlkZW8gc291cmNlIGZpcnN0LCBmb2xsb3dlZCBieQotICAgICAgICAgICAgLy8gdGhlIGF1ZGlvIHNvdXJjZS4KLSAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGF2b2lkIGp1bXBzIGluIHRoZSBEYXRhU291cmNlIG9mZnNldCBjYXVzZWQgYnkKLSAgICAgICAgICAgIC8vIHRoZSBhdWRpbyBjb2RlYyBwcmVmZXRjaGluZyBkYXRhIGZyb20gdGhlIG9sZCBsb2NhdGlvbnMKLSAgICAgICAgICAgIC8vIHdoaWxlIHRoZSB2aWRlbyBjb2RlYyBpcyBhbHJlYWR5IHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBuZXcKLSAgICAgICAgICAgIC8vIGxvY2F0aW9ucywgd2UnbGwgInBhdXNlIiB0aGUgYXVkaW8gc291cmNlLCBjYXVzaW5nIGl0IHRvCi0gICAgICAgICAgICAvLyBzdG9wIHJlYWRpbmcgaW5wdXQgZGF0YSB1bnRpbCBhIHN1YnNlcXVlbnQgc2Vlay4KLQotICAgICAgICAgICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMICYmIChtRmxhZ3MgJiBBVURJT19SVU5OSU5HKSkgewotICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UoKTsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfkFVRElPX1JVTk5JTkc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQXVkaW9Tb3VyY2UtPnBhdXNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIW1WaWRlb0J1ZmZlcikgewotICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgaWYgKG1TZWVraW5nICE9IE5PX1NFRUspIHsKLSAgICAgICAgICAgIEFMT0dWKCJMViBQTEFZRVIgc2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpIiwgbVNlZWtUaW1lVXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcyAvIDFFNik7Ci0KLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKAotICAgICAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1WaWRlb1NvdXJjZS0+cmVhZCgmbVZpZGVvQnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBDSEVDSyghbVZpZGVvQnVmZmVyKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiTFYgUExBWUVSIFZpZGVvU291cmNlIHNpZ25hbGxlZCBmb3JtYXQgY2hhbmdlIik7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZV9sKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1JlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBpbml0UmVuZGVyZXJfbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTaXplVG9SZW5kZXIobVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBTbyB2aWRlbyBwbGF5YmFjayBpcyBjb21wbGV0ZSwgYnV0IHdlIG1heSBzdGlsbCBoYXZlCi0gICAgICAgICAgICAgICAgLy8gYSBzZWVrIHJlcXVlc3QgcGVuZGluZyB0aGF0IG5lZWRzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGF1ZGlvIHRyYWNrCi0gICAgICAgICAgICAgICAgaWYgKG1TZWVraW5nICE9IE5PX1NFRUspIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInZpZGVvIHN0cmVhbSBlbmRlZCB3aGlsZSBzZWVraW5nISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5pc2hTZWVrSWZOZWNlc3NhcnkoLTEpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJQcmV2aWV3UGxheWVyOiBvblZpZGVvRXZlbnQgRU9TIHJlYWNoZWQuIik7Ci0gICAgICAgICAgICAgICAgbUZsYWdzIHw9IFZJREVPX0FUX0VPUzsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICAgICAgICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsKLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGxhc3QgZGVjb2RlZCB0aW1lc3RhbXAgdG8gZHVyYXRpb24KLSAgICAgICAgICAgICAgICBtRGVjb2RlZFZpZGVvVHMgPSAobVBsYXlFbmRUaW1lTXNlYyoxMDAwTEwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1WaWRlb0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFNvbWUgZGVjb2RlcnMsIG5vdGFibHkgdGhlIFBWIEFWQyBzb2Z0d2FyZSBkZWNvZGVyCi0gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHNwdXJpb3VzIGVtcHR5IGJ1ZmZlcnMgdGhhdCB3ZSBqdXN0IHdhbnQgdG8gaWdub3JlLgotCi0gICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50NjRfdCB2aWRlb1RpbWVVczsKLSAgICAgICAgICAgIENIRUNLKG1WaWRlb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnZpZGVvVGltZVVzKSk7Ci0KLSAgICAgICAgICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvVGltZVVzIDwgbVNlZWtUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVycyBhcmUgYmVmb3JlIHNlZWsgdGltZQotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlbQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZigodmlkZW9UaW1lVXMvMTAwMCkgPCBtUGxheUJlZ2luVGltZU1zZWMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRnJhbWVzIGFyZSBiZWZvcmUgYmVnaW4gY3V0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgLy8gRG9ub3QgcmVuZGVyCi0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1OdW1iZXJEZWNWaWRlb0ZyYW1lcysrOwotCi0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0sobVZpZGVvQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7Ci0gICAgc2V0UG9zaXRpb25fbCh0aW1lVXMpOwotCi0gICAgaWYgKCFtU3RhcnROZXh0UGxheWVyKSB7Ci0gICAgICAgIGludDY0X3QgcGxheWJhY2tUaW1lUmVtYWluaW5nID0gKG1QbGF5RW5kVGltZU1zZWMgKiAxMDAwTEwpIC0gdGltZVVzOwotICAgICAgICBpZiAocGxheWJhY2tUaW1lUmVtYWluaW5nIDw9IDE1MDAwMDApIHsKLSAgICAgICAgICAgIC8vV2hlbiBsZXNzIHRoYW4gMS41IHNlYyBvZiBwbGF5YmFjayBsZWZ0Ci0gICAgICAgICAgICAvLyBzZW5kIG5vdGlmaWNhdGlvbiB0byBzdGFydCBuZXh0IHBsYXllcgotCi0gICAgICAgICAgICBtU3RhcnROZXh0UGxheWVyID0gdHJ1ZTsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woMHhBQUFBQUFBQSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTZWVrVHlwZSB3YXNTZWVraW5nID0gbVNlZWtpbmc7Ci0gICAgZmluaXNoU2Vla0lmTmVjZXNzYXJ5KHRpbWVVcyk7Ci0gICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMICYmICEobUZsYWdzICYgKEFVRElPX1JVTk5JTkcpKSkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBzdGFydEF1ZGlvUGxheWVyX2woKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIlN0YXJ0aW5nIHRoZSBhdWRpbyBwbGF5ZXIgZmFpbGVkIHcvIGVyciAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBUaW1lU291cmNlICp0cyA9IChtRmxhZ3MgJiBBVURJT19BVF9FT1MpID8gJm1TeXN0ZW1UaW1lU291cmNlIDogbVRpbWVTb3VyY2U7Ci0KLSAgICBpZih0cyA9PSBOVUxMKSB7Ci0gICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYoIW1Jc1ZpZGVvU291cmNlSnBnKSB7Ci0gICAgICAgIGlmIChtRmxhZ3MgJiBGSVJTVF9GUkFNRSkgewotICAgICAgICAgICAgbUZsYWdzICY9IH5GSVJTVF9GUkFNRTsKLQotICAgICAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gdHMtPmdldFJlYWxUaW1lVXMoKSAtIHRpbWVVczsKLSAgICAgICAgfQotCi0gICAgICAgIGludDY0X3QgcmVhbFRpbWVVcywgbWVkaWFUaW1lVXM7Ci0gICAgICAgIGlmICghKG1GbGFncyAmIEFVRElPX0FUX0VPUykgJiYgbUF1ZGlvUGxheWVyICE9IE5VTEwKLSAgICAgICAgICAgICYmIG1BdWRpb1BsYXllci0+Z2V0TWVkaWFUaW1lTWFwcGluZygmcmVhbFRpbWVVcywgJm1lZGlhVGltZVVzKSkgewotICAgICAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gcmVhbFRpbWVVcyAtIG1lZGlhVGltZVVzOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50NjRfdCBub3dVcyA9IHRzLT5nZXRSZWFsVGltZVVzKCkgLSBtVGltZVNvdXJjZURlbHRhVXM7Ci0KLSAgICAgICAgaW50NjRfdCBsYXRlbmVzc1VzID0gbm93VXMgLSB0aW1lVXM7Ci0KLSAgICAgICAgaWYgKHdhc1NlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAgICAgLy8gTGV0J3MgZGlzcGxheSB0aGUgZmlyc3QgZnJhbWUgYWZ0ZXIgc2Vla2luZyByaWdodCBhd2F5LgotICAgICAgICAgICAgbGF0ZW5lc3NVcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIkF1ZGlvIHRpbWUgc3RhbXAgPSAlbGxkIGFuZCB2aWRlbyB0aW1lIHN0YW1wID0gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLT5nZXRSZWFsVGltZVVzKCksdGltZVVzKTsKLSAgICAgICAgaWYgKGxhdGVuZXNzVXMgPiA0MDAwMCkgewotICAgICAgICAgICAgLy8gV2UncmUgbW9yZSB0aGFuIDQwbXMgbGF0ZS4KLQotICAgICAgICAgICAgQUxPR1YoIkxWIFBMQVlFUiB3ZSdyZSBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuZXNzVXMsIGxhdGVuZXNzVXMgLyAxRTYpOwotCi0gICAgICAgICAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxhdGVuZXNzVXMgPCAtMjUwMDApIHsKLSAgICAgICAgICAgIC8vIFdlJ3JlIG1vcmUgdGhhbiAyNW1zIGVhcmx5LgotICAgICAgICAgICAgQUxPR1YoIldlJ3JlIG1vcmUgdGhhbiAyNW1zIGVhcmx5LCBsYXRlbmVzcyAlbGxkIiwgbGF0ZW5lc3NVcyk7Ci0KLSAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woMjUwMDApOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3IHx8IG1WaWRlb1JlbmRlcmVyID09IE5VTEwpIHsKLSAgICAgICAgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcgPSBmYWxzZTsKLQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBpbml0UmVuZGVyZXJfbCgpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHRpbWVzdGFtcCBleGNlZWRzIGVuZEN1dFRpbWUgb2YgY2xpcCwgZG9ub3QgcmVuZGVyCi0gICAgaWYoKHRpbWVVcy8xMDAwKSA+IG1QbGF5RW5kVGltZU1zZWMpIHsKLSAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgIG1GbGFncyB8PSBWSURFT19BVF9FT1M7Ci0gICAgICAgIG1GbGFncyB8PSBBVURJT19BVF9FT1M7Ci0gICAgICAgIEFMT0dWKCJQcmV2aWV3UGxheWVyOiBvblZpZGVvRXZlbnQgdGltZVVzID4gbVBsYXlFbmRUaW1lOyBzZW5kIEVPUy4uIik7Ci0gICAgICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQgPSBmYWxzZTsKLSAgICAgICAgLy8gU2V0IHRoZSBsYXN0IGRlY29kZWQgdGltZXN0YW1wIHRvIGR1cmF0aW9uCi0gICAgICAgIG1EZWNvZGVkVmlkZW9UcyA9IChtUGxheUVuZFRpbWVNc2VjKjEwMDBMTCk7Ci0gICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBDYXB0dXJlIHRoZSBmcmFtZSB0aW1lc3RhbXAgdG8gYmUgcmVuZGVyZWQKLSAgICBtRGVjb2RlZFZpZGVvVHMgPSB0aW1lVXM7Ci0KLSAgICAvLyBQb3N0IHByb2Nlc3NpbmcgdG8gYXBwbHkgdmlkZW8gZWZmZWN0cwotICAgIGZvcihpPTA7aTxtTnVtYmVyRWZmZWN0cztpKyspIHsKLSAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgZWZmZWN0IHN0YXJ0dGltZSBtYXRjaGVzIHRoZSBjbGlwIGJlaW5nIHByZXZpZXdlZAotICAgICAgICBpZigobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA8IChtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQvMTAwMCkpIHx8Ci0gICAgICAgIChtRWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lID49Ci0gICAgICAgICAoKG1EZWNWaWRlb1RzU3RvcnlCb2FyZC8xMDAwKSArIG1QbGF5RW5kVGltZU1zZWMgLSBtUGxheUJlZ2luVGltZU1zZWMpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhpcyBlZmZlY3QgZG9lc24ndCBiZWxvbmcgdG8gdGhpcyBjbGlwLCBjaGVjayBuZXh0IG9uZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2hlY2sgaWYgZWZmZWN0IGFwcGxpZXMgdG8gdGhpcyBwYXJ0aWN1bGFyIGZyYW1lIHRpbWVzdGFtcAotICAgICAgICBpZigobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA8PQotICAgICAgICAgKCgodGltZVVzK21EZWNWaWRlb1RzU3RvcnlCb2FyZCkvMTAwMCktbVBsYXlCZWdpblRpbWVNc2VjKSkgJiYKLSAgICAgICAgICAgICgobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSttRWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24pID49Ci0gICAgICAgICAgICAgKCgodGltZVVzK21EZWNWaWRlb1RzU3RvcnlCb2FyZCkvMTAwMCktbVBsYXlCZWdpblRpbWVNc2VjKSkKLSAgICAgICAgICAgICAgJiYgKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlEdXJhdGlvbiAhPSAwKSkgewotICAgICAgICAgICAgc2V0VmlkZW9Qb3N0UHJvY2Vzc2luZ05vZGUoCi0gICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUsIFRSVUUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc2V0VmlkZW9Qb3N0UHJvY2Vzc2luZ05vZGUoCi0gICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUsIEZBTFNFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vUHJvdmlkZSB0aGUgb3ZlcmxheSBVcGRhdGUgaW5kaWNhdGlvbiB3aGVuIHRoZXJlIGlzIGFuIG92ZXJsYXkgZWZmZWN0Ci0gICAgaWYgKG1DdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfRlJBTUlORykgewotICAgICAgICBtQ3VycmVudFZpZGVvRWZmZWN0ICY9IH5WSURFT19FRkZFQ1RfRlJBTUlORzsgLy9uZXZlciBhcHBseSBmcmFtaW5nIGhlcmUuCi0gICAgICAgIGlmICghbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCkgewotICAgICAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgaW5kZXg7Ci0gICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtTnVtYmVyRWZmZWN0czsgaW5kZXgrKykgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0aW1lTXMgPSBtRGVjb2RlZFZpZGVvVHMvMTAwMDsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGltZU9mZnNldCA9IG1EZWNWaWRlb1RzU3RvcnlCb2FyZC8xMDAwOwotICAgICAgICAgICAgICAgIGlmKG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLlZpZGVvRWZmZWN0VHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoKG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnVpU3RhcnRUaW1lICsgMSkgPD0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVNcyArIHRpbWVPZmZzZXQgLSBtUGxheUJlZ2luVGltZU1zZWMpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnVpU3RhcnRUaW1lIC0gMSArCi0gICAgICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aUR1cmF0aW9uKSA+PQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZU1zICsgdGltZU9mZnNldCAtIG1QbGF5QmVnaW5UaW1lTXNlYykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluZGV4IDwgbU51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgICAgICBtQ3VyckZyYW1pbmdFZmZlY3RJbmRleCA9IGluZGV4OwotICAgICAgICAgICAgICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHBvc3RPdmVybGF5VXBkYXRlRXZlbnRfbCgpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJGcmFtaW5nIGluZGV4ID0gJWxkIiwgbUN1cnJGcmFtaW5nRWZmZWN0SW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiTm8gZnJhbWluZyBlZmZlY3RzIGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSBpZiAobU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZCkgewotICAgICAgICAvL1Bvc3QgdGhlIGV2ZW50IHdoZW4gdGhlIG92ZXJsYXkgaXMgbm8gbW9yZSB2YWxpZAotICAgICAgICBBTE9HVigiT3ZlcmxheSBpcyBEb25lIik7Ci0gICAgICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQgPSBmYWxzZTsKLSAgICAgICAgcG9zdE92ZXJsYXlVcGRhdGVFdmVudF9sKCk7Ci0gICAgfQotCi0gICAgaWYgKG1WaWRlb1JlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgbVZpZGVvUmVuZGVyZXItPnJlbmRlcihtVmlkZW9CdWZmZXIsIG1DdXJyZW50VmlkZW9FZmZlY3QsCi0gICAgICAgICAgICAgICAgbVJlbmRlcmluZ01vZGUsIG1Jc1ZpZGVvU291cmNlSnBnKTsKLSAgICB9Ci0KLSAgICBtVmlkZW9CdWZmZXItPnJlbGVhc2UoKTsKLSAgICBtVmlkZW9CdWZmZXIgPSBOVUxMOwotCi0gICAgLy8gUG9zdCBwcm9ncmVzcyBjYWxsYmFjayBiYXNlZCBvbiBjYWxsYmFjayBpbnRlcnZhbCBzZXQKLSAgICBpZihtTnVtYmVyRGVjVmlkZW9GcmFtZXMgPj0gbVByb2dyZXNzQ2JJbnRlcnZhbCkgewotICAgICAgICBwb3N0UHJvZ3Jlc3NDYWxsYmFja0V2ZW50X2woKTsKLSAgICAgICAgbU51bWJlckRlY1ZpZGVvRnJhbWVzID0gMDsgIC8vIHJlc2V0IGNvdW50ZXIKLSAgICB9Ci0KLSAgICAvLyBpZiByZWFjaGVkIEVuZEN1dFRpbWUgb2YgY2xpcCwgcG9zdCBFT1MgZXZlbnQKLSAgICBpZigodGltZVVzLzEwMDApID49IG1QbGF5RW5kVGltZU1zZWMpIHsKLSAgICAgICAgQUxPR1YoIlByZXZpZXdQbGF5ZXI6IG9uVmlkZW9FdmVudCBFT1MuIik7Ci0gICAgICAgIG1GbGFncyB8PSBWSURFT19BVF9FT1M7Ci0gICAgICAgIG1GbGFncyB8PSBBVURJT19BVF9FT1M7Ci0gICAgICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQgPSBmYWxzZTsKLSAgICAgICAgLy8gU2V0IHRoZSBsYXN0IGRlY29kZWQgdGltZXN0YW1wIHRvIGR1cmF0aW9uCi0gICAgICAgIG1EZWNvZGVkVmlkZW9UcyA9IChtUGxheUVuZFRpbWVNc2VjKjEwMDBMTCk7Ci0gICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmICgod2FzU2Vla2luZyAhPSBOT19TRUVLKSAmJiAobUZsYWdzICYgU0VFS19QUkVWSUVXKSkgewotICAgICAgICAgICAgbUZsYWdzICY9IH5TRUVLX1BSRVZJRVc7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZighbUlzVmlkZW9Tb3VyY2VKcGcpIHsKLSAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKDMzMDAwKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cHJlcGFyZSgpIHsKLSAgICBBTE9HVigicHJlcGFyZSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIHByZXBhcmVfbCgpOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpwcmVwYXJlX2woKSB7Ci0gICAgQUxPR1YoInByZXBhcmVfbCIpOwotICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJFRCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKG1GbGFncyAmIFBSRVBBUklORykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtSXNBc3luY1ByZXBhcmUgPSBmYWxzZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBwcmVwYXJlQXN5bmNfbCgpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHdoaWxlIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKLSAgICAgICAgbVByZXBhcmVkQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIHJldHVybiBtUHJlcGFyZVJlc3VsdDsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6cHJlcGFyZUFzeW5jKCkgewotICAgIEFMT0dWKCJwcmVwYXJlQXN5bmMiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBwcmVwYXJlQXN5bmNfbCgpOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpwcmVwYXJlQXN5bmNfbCgpIHsKLSAgICBBTE9HVigicHJlcGFyZUFzeW5jX2wiKTsKLSAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOyAgLy8gYXN5bmMgcHJlcGFyZSBhbHJlYWR5IHBlbmRpbmcKLSAgICB9Ci0KLSAgICBpZiAoIW1RdWV1ZVN0YXJ0ZWQpIHsKLSAgICAgICAgbVF1ZXVlLnN0YXJ0KCk7Ci0gICAgICAgIG1RdWV1ZVN0YXJ0ZWQgPSB0cnVlOwotICAgIH0KLQotICAgIG1GbGFncyB8PSBQUkVQQVJJTkc7Ci0gICAgbUFzeW5jUHJlcGFyZUV2ZW50ID0gbmV3IFByZXZpZXdQbGF5ZXJFdmVudCgKLSAgICAgICAgICAgIHRoaXMsICZQcmV2aWV3UGxheWVyOjpvblByZXBhcmVBc3luY0V2ZW50KTsKLQotICAgIG1RdWV1ZS5wb3N0RXZlbnQobUFzeW5jUHJlcGFyZUV2ZW50KTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6ZmluaXNoU2V0RGF0YVNvdXJjZV9sKCkgewotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2U7Ci0gICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvcjsKLQotICAgIGRhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKAotICAgICAgICAgICAgTlVMTCAvKiBodHRwU2VydmljZSAqLywgbVVyaS5zdHJpbmcoKSwgTlVMTCk7Ci0KLSAgICBpZiAoZGF0YVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vSWYgZmlsZSB0eXBlIGlzIC5yZ2IsIHRoZW4gbm8gbmVlZCB0byBjaGVjayBmb3IgRXh0cmFjdG9yCi0gICAgaW50IHVyaUxlbiA9IHN0cmxlbihtVXJpKTsKLSAgICBpbnQgc3RhcnRPZmZzZXQgPSB1cmlMZW4gLSA0OwotICAgIGlmKCFzdHJuY2FzZWNtcChtVXJpK3N0YXJ0T2Zmc2V0LCAiLnJnYiIsIDQpKSB7Ci0gICAgICAgIGV4dHJhY3RvciA9IE5VTEw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKGRhdGFTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0KTsKLSAgICB9Ci0KLSAgICBpZiAoZXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoImZpbmlzaFNldERhdGFTb3VyY2VfbDogZmFpbGVkIHRvIGNyZWF0ZSBleHRyYWN0b3IiKTsKLSAgICAgICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbF9qcGcoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKGV4dHJhY3Rvcik7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6b25QcmVwYXJlQXN5bmNFdmVudCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIEFMT0dWKCJvblByZXBhcmVBc3luY0V2ZW50Iik7Ci0KLSAgICBpZiAobUZsYWdzICYgUFJFUEFSRV9DQU5DRUxMRUQpIHsKLSAgICAgICAgQUxPR1YoInByZXBhcmUgd2FzIGNhbmNlbGxlZCBiZWZvcmUgZG9pbmcgYW55dGhpbmciKTsKLSAgICAgICAgYWJvcnRQcmVwYXJlKFVOS05PV05fRVJST1IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1Vcmkuc2l6ZSgpID4gMCkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBmaW5pc2hTZXREYXRhU291cmNlX2woKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBhYm9ydFByZXBhcmUoZXJyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtVmlkZW9UcmFjayAhPSBOVUxMICYmIG1WaWRlb1NvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGluaXRWaWRlb0RlY29kZXJfbChPTVhDb2RlYzo6a0hhcmR3YXJlQ29kZWNzT25seSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgYWJvcnRQcmVwYXJlKGVycik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTCAmJiBtQXVkaW9Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBpbml0QXVkaW9EZWNvZGVyX2woKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBhYm9ydFByZXBhcmUoZXJyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgICBmaW5pc2hBc3luY1ByZXBhcmVfbCgpOwotCi19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6ZmluaXNoQXN5bmNQcmVwYXJlX2woKSB7Ci0gICAgQUxPR1YoImZpbmlzaEFzeW5jUHJlcGFyZV9sIik7Ci0gICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgewotICAgICAgICBpZiAobVZpZGVvU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VUX1ZJREVPX1NJWkUsIDAsIDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplX2woKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1BSRVBBUkVEKTsKLSAgICB9Ci0KLSAgICBtUHJlcGFyZVJlc3VsdCA9IE9LOwotICAgIG1GbGFncyAmPSB+KFBSRVBBUklOR3xQUkVQQVJFX0NBTkNFTExFRCk7Ci0gICAgbUZsYWdzIHw9IFBSRVBBUkVEOwotICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IE5VTEw7Ci0gICAgbVByZXBhcmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OmFjcXVpcmVMb2NrKCkgewotICAgIEFMT0dWKCJhY3F1aXJlTG9jayIpOwotICAgIG1Mb2NrQ29udHJvbC5sb2NrKCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cmVsZWFzZUxvY2soKSB7Ci0gICAgQUxPR1YoInJlbGVhc2VMb2NrIik7Ci0gICAgbUxvY2tDb250cm9sLnVubG9jaygpOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpsb2FkRWZmZWN0c1NldHRpbmdzKAotICAgICAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3RTZXR0aW5ncywgaW50IG5FZmZlY3RzKSB7Ci0KLSAgICBBTE9HVigibG9hZEVmZmVjdHNTZXR0aW5ncyIpOwotICAgIG1OdW1iZXJFZmZlY3RzID0gbkVmZmVjdHM7Ci0gICAgbUVmZmVjdHNTZXR0aW5ncyA9IHBFZmZlY3RTZXR0aW5nczsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmxvYWRBdWRpb01peFNldHRpbmdzKAotICAgICAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpIHsKLQotICAgIEFMT0dWKCJsb2FkQXVkaW9NaXhTZXR0aW5ncyIpOwotICAgIG1QcmV2aWV3UGxheWVyQXVkaW9NaXhTZXR0aW5ncyA9IHBBdWRpb01peFNldHRpbmdzOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKAotICAgICAgICBNNE9TQV9Db250ZXh0IHBBdWRpb01peFBDTUZpbGVIYW5kbGUpIHsKLQotICAgIEFMT0dWKCJzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUiKTsKLSAgICBtQXVkaW9NaXhQQ01GaWxlSGFuZGxlID0gcEF1ZGlvTWl4UENNRmlsZUhhbmRsZTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtKAotICAgICAgICBNNE9TQV9VSW50MzIgYXVkaW9NaXhTdG9yeUJvYXJkVFMsCi0gICAgICAgIE00T1NBX1VJbnQzMiBjdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUsCi0gICAgICAgIE00T1NBX1VJbnQzMiBwcmltYXJ5VHJhY2tWb2xWYWx1ZSApIHsKLQotICAgIEFMT0dWKCJzZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbSIpOwotICAgIG1BdWRpb01peFN0b3J5Qm9hcmRUUyA9IGF1ZGlvTWl4U3RvcnlCb2FyZFRTOwotICAgIG1DdXJyZW50TWVkaWFCZWdpbkN1dFRpbWUgPSBjdXJyZW50TWVkaWFCZWdpbkN1dFRpbWU7Ci0gICAgbUN1cnJlbnRNZWRpYVZvbHVtZVZhbHVlID0gcHJpbWFyeVRyYWNrVm9sVmFsdWU7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZXRQbGF5YmFja0JlZ2luVGltZSh1aW50MzJfdCBtc2VjKSB7Ci0KLSAgICBtUGxheUJlZ2luVGltZU1zZWMgPSBtc2VjOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0UGxheWJhY2tFbmRUaW1lKHVpbnQzMl90IG1zZWMpIHsKLQotICAgIG1QbGF5RW5kVGltZU1zZWMgPSBtc2VjOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0U3Rvcnlib2FyZFN0YXJ0VGltZSh1aW50MzJfdCBtc2VjKSB7Ci0KLSAgICBtU3Rvcnlib2FyZFN0YXJ0VGltZU1zZWMgPSBtc2VjOwotICAgIG1EZWNWaWRlb1RzU3RvcnlCb2FyZCA9IG1TdG9yeWJvYXJkU3RhcnRUaW1lTXNlYyAqIDEwMDBMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCh1aW50MzJfdCBjYkludGVydmFsKSB7Ci0KLSAgICBtUHJvZ3Jlc3NDYkludGVydmFsID0gY2JJbnRlcnZhbDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0TWVkaWFSZW5kZXJpbmdNb2RlKAotICAgICAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbW9kZSwKLSAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgb3V0cHV0VmlkZW9TaXplKSB7Ci0KLSAgICBtUmVuZGVyaW5nTW9kZSA9IG1vZGU7Ci0KLSAgICAvKiBnZXQgdGhlIHZpZGVvIHdpZHRoIGFuZCBoZWlnaHQgYnkgcmVzb2x1dGlvbiAqLwotICAgIHJldHVybiBnZXRWaWRlb1NpemVCeVJlc29sdXRpb24oCi0gICAgICAgICAgICAgICAgb3V0cHV0VmlkZW9TaXplLAotICAgICAgICAgICAgICAgICAgICAmbU91dHB1dFZpZGVvV2lkdGgsICZtT3V0cHV0VmlkZW9IZWlnaHQpOwotCi19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnJlc2V0Sm5pQ2FsbGJhY2tUaW1lU3RhbXAoKSB7Ci0KLSAgICBtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQgPSBtU3Rvcnlib2FyZFN0YXJ0VGltZU1zZWMgKiAxMDAwTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnBvc3RQcm9ncmVzc0NhbGxiYWNrRXZlbnRfbCgpIHsKLSAgICBpZiAobVByb2dyZXNzQ2JFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtUHJvZ3Jlc3NDYkV2ZW50UGVuZGluZyA9IHRydWU7Ci0KLSAgICBtUXVldWUucG9zdEV2ZW50KG1Qcm9ncmVzc0NiRXZlbnQpOwotfQotCi0KLXZvaWQgUHJldmlld1BsYXllcjo6b25Qcm9ncmVzc0NiRXZlbnQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBpZiAoIW1Qcm9ncmVzc0NiRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVByb2dyZXNzQ2JFdmVudFBlbmRpbmcgPSBmYWxzZTsKLSAgICAvLyBJZiBwbGF5YmFjayBzdGFydHMgZnJvbSBwcmV2aW91cyBJLWZyYW1lLAotICAgIC8vIHRoZW4gc2VuZCBmcmFtZSBzdG9yeWJvYXJkIGR1cmF0aW9uCi0gICAgaWYgKChtRGVjb2RlZFZpZGVvVHMvMTAwMCkgPCBtUGxheUJlZ2luVGltZU1zZWMpIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCAwLCBtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQvMTAwMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCAwLAotICAgICAgICAoKChtRGVjb2RlZFZpZGVvVHMrbURlY1ZpZGVvVHNTdG9yeUJvYXJkKS8xMDAwKS1tUGxheUJlZ2luVGltZU1zZWMpKTsKLSAgICB9Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdE92ZXJsYXlVcGRhdGVFdmVudF9sKCkgewotICAgIGlmIChtT3ZlcmxheVVwZGF0ZUV2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1PdmVybGF5VXBkYXRlRXZlbnRQZW5kaW5nID0gdHJ1ZTsKLSAgICBtUXVldWUucG9zdEV2ZW50KG1PdmVybGF5VXBkYXRlRXZlbnQpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om9uVXBkYXRlT3ZlcmxheUV2ZW50KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAoIW1PdmVybGF5VXBkYXRlRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbU92ZXJsYXlVcGRhdGVFdmVudFBlbmRpbmcgPSBmYWxzZTsKLQotICAgIGludCB1cGRhdGVTdGF0ZSA9IG1PdmVybGF5VXBkYXRlRXZlbnRQb3N0ZWQ/IDE6IDA7Ci0gICAgbm90aWZ5TGlzdGVuZXJfbCgweEJCQkJCQkJCLCB1cGRhdGVTdGF0ZSwgbUN1cnJGcmFtaW5nRWZmZWN0SW5kZXgpOwotfQotCi0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0VmlkZW9Qb3N0UHJvY2Vzc2luZ05vZGUoCi0gICAgICAgIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdHlwZSwgTTRPU0FfQm9vbCBlbmFibGUpIHsKLQotICAgIHVpbnQzMl90IGVmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotCi0gICAgLy9NYXAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0byBsb2NhbCBlbnVtCi0gICAgc3dpdGNoKHR5cGUpIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlRnJvbUJsYWNrOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0ZBREVGUk9NQkxBQ0s7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVUb0JsYWNrOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0ZBREVUT0JMQUNLOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0JMQUNLQU5EV0hJVEU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1Bpbms6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfUElOSzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW46Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfR1JFRU47Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1NlcGlhOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX1NFUElBOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9ORUdBVElWRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZzoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9GUkFNSU5HOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0ZJRlRJRVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTY6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfQ09MT1JfUkdCMTY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50OgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0dSQURJRU5UOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9OT05FOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGVuYWJsZSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgIC8vSWYgYWxyZWFkeSBzZXQsIHRoZW4gbm8gbmVlZCB0byBzZXQgYWdhaW4KLSAgICAgICAgaWYgKCEobUN1cnJlbnRWaWRlb0VmZmVjdCAmIGVmZmVjdCkpIHsKLSAgICAgICAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgfD0gZWZmZWN0OwotICAgICAgICAgICAgaWYgKGVmZmVjdCA9PSBWSURFT19FRkZFQ1RfRklGVElFUykgewotICAgICAgICAgICAgICAgIG1Jc0ZpZnRpZXNFZmZlY3RTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSAgewotICAgICAgICAvL1Jlc2V0IG9ubHkgaWYgYWxyZWFkeSBzZXQKLSAgICAgICAgaWYgKG1DdXJyZW50VmlkZW9FZmZlY3QgJiBlZmZlY3QpIHsKLSAgICAgICAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgJj0gfmVmZmVjdDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6c2V0SW1hZ2VDbGlwUHJvcGVydGllcyh1aW50MzJfdCB3aWR0aCx1aW50MzJfdCBoZWlnaHQpIHsKLSAgICBtVmlkZW9XaWR0aCA9IHdpZHRoOwotICAgIG1WaWRlb0hlaWdodCA9IGhlaWdodDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnJlYWRGaXJzdFZpZGVvRnJhbWUoKSB7Ci0gICAgQUxPR1YoInJlYWRGaXJzdFZpZGVvRnJhbWUiKTsKLQotICAgIGlmICghbVZpZGVvQnVmZmVyKSB7Ci0gICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgICAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAgICAgQUxPR1YoInNlZWtpbmcgdG8gJWxsZCB1cyAoJS4yZiBzZWNzKSIsIG1TZWVrVGltZVVzLAotICAgICAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcyAvIDFFNik7Ci0KLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKAotICAgICAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1WaWRlb1NvdXJjZS0+cmVhZCgmbVZpZGVvQnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBDSEVDSyghbVZpZGVvQnVmZmVyKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9Tb3VyY2Ugc2lnbmFsbGVkIGZvcm1hdCBjaGFuZ2UiKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplX2woKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvUmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvUmVuZGVyZXJJc1ByZXZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGluaXRSZW5kZXJlcl9sKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFN0cmVhbURvbmVFdmVudF9sKGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTaXplVG9SZW5kZXIobVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigiRU9TIHJlYWNoZWQuIik7Ci0gICAgICAgICAgICAgICAgbUZsYWdzIHw9IFZJREVPX0FUX0VPUzsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1WaWRlb0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFNvbWUgZGVjb2RlcnMsIG5vdGFibHkgdGhlIFBWIEFWQyBzb2Z0d2FyZSBkZWNvZGVyCi0gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHNwdXJpb3VzIGVtcHR5IGJ1ZmZlcnMgdGhhdCB3ZSBqdXN0IHdhbnQgdG8gaWdub3JlLgotCi0gICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50NjRfdCB2aWRlb1RpbWVVczsKLSAgICAgICAgICAgIENIRUNLKG1WaWRlb0J1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnZpZGVvVGltZVVzKSk7Ci0gICAgICAgICAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAgICAgICAgIGlmICh2aWRlb1RpbWVVcyA8IG1TZWVrVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMgYXJlIGJlZm9yZSBzZWVrIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZW0KLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCh2aWRlb1RpbWVVcy8xMDAwKSA8IG1QbGF5QmVnaW5UaW1lTXNlYykgewotICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJzIGFyZSBiZWZvcmUgYmVnaW4gY3V0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZW0KLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0sobVZpZGVvQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7Ci0gICAgc2V0UG9zaXRpb25fbCh0aW1lVXMpOwotCi0gICAgbURlY29kZWRWaWRlb1RzID0gdGltZVVzOwotCi0gICAgcmV0dXJuIE9LOwotCi19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OmdldExhc3RSZW5kZXJlZFRpbWVNcyh1aW50MzJfdCAqbGFzdFJlbmRlcmVkVGltZU1zKSB7Ci0gICAgKmxhc3RSZW5kZXJlZFRpbWVNcyA9ICgoKG1EZWNvZGVkVmlkZW9UcyttRGVjVmlkZW9Uc1N0b3J5Qm9hcmQpLzEwMDApLW1QbGF5QmVnaW5UaW1lTXNlYyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnVwZGF0ZVNpemVUb1JlbmRlcihzcDxNZXRhRGF0YT4gbWV0YSkgewotICAgIGlmIChtVmlkZW9SZW5kZXJlcikgewotICAgICAgICBtVmlkZW9SZW5kZXJlci0+dXBkYXRlVmlkZW9TaXplKG1ldGEpOwotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRMaXN0ZW5lcihjb25zdCB3cDxNZWRpYVBsYXllckJhc2U+ICZsaXN0ZW5lcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpyZXNldCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJlc2V0X2woKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpjbGVhcl9sKCkgewotICAgIG1EaXNwbGF5V2lkdGggPSAwOwotICAgIG1EaXNwbGF5SGVpZ2h0ID0gMDsKLQotICAgIGlmIChtRmxhZ3MgJiBQTEFZSU5HKSB7Ci0gICAgICAgIHVwZGF0ZUJhdHRlcnlVc2FnZV9sKCk7Ci0gICAgfQotCi0gICAgaWYgKG1GbGFncyAmIFBSRVBBUklORykgewotICAgICAgICBtRmxhZ3MgfD0gUFJFUEFSRV9DQU5DRUxMRUQ7Ci0KLSAgICAgICAgaWYgKG1GbGFncyAmIFBSRVBBUklOR19DT05ORUNURUQpIHsKLSAgICAgICAgICAgIC8vIFdlIGFyZSBiYXNpY2FsbHkgZG9uZSBwcmVwYXJpbmcsIHdlJ3JlIGp1c3QgYnVmZmVyaW5nCi0gICAgICAgICAgICAvLyBlbm91Z2ggZGF0YSB0byBzdGFydCBwbGF5YmFjaywgd2UgY2FuIHNhZmVseSBpbnRlcnJ1cHQgdGhhdC4KLSAgICAgICAgICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1QcmVwYXJlZENvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICBjYW5jZWxQbGF5ZXJFdmVudHNfbCh0cnVlKTsKLQotICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0gICAgbVZpZGVvVHJhY2suY2xlYXIoKTsKLQotICAgIC8vIFNodXRkb3duIGF1ZGlvIGZpcnN0LCBzbyB0aGF0IHRoZSByZXNwb25lIHRvIHRoZSByZXNldCByZXF1ZXN0Ci0gICAgLy8gYXBwZWFycyB0byBoYXBwZW4gaW5zdGFudGFuZW91c2x5IGFzIGZhciBhcyB0aGUgdXNlciBpcyBjb25jZXJuZWQKLSAgICAvLyBJZiB3ZSBkaWQgdGhpcyBsYXRlciwgYXVkaW8gd291bGQgY29udGludWUgcGxheWluZyB3aGlsZSB3ZQotICAgIC8vIHNodXRkb3duIHRoZSB2aWRlby1yZWxhdGVkIHJlc291cmNlcyBhbmQgdGhlIHBsYXllciBhcHBlYXIgdG8KLSAgICAvLyBub3QgYmUgYXMgcmVzcG9uc2l2ZSB0byBhIHJlc2V0IHJlcXVlc3QuCi0gICAgaWYgKG1BdWRpb1BsYXllciA9PSBOVUxMICYmIG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIElmIHdlIGhhZCBhbiBhdWRpbyBwbGF5ZXIsIGl0IHdvdWxkIGhhdmUgZWZmZWN0aXZlbHkKLSAgICAgICAgLy8gdGFrZW4gcG9zc2Vzc2lvbiBvZiB0aGUgYXVkaW8gc291cmNlIGFuZCBzdG9wcGVkIGl0IHdoZW4KLSAgICAgICAgLy8gX2l0XyBpcyBzdG9wcGVkLiBPdGhlcndpc2UgdGhpcyBpcyBzdGlsbCBvdXIgcmVzcG9uc2liaWxpdHkuCi0gICAgICAgIG1BdWRpb1NvdXJjZS0+c3RvcCgpOwotICAgIH0KLSAgICBtQXVkaW9Tb3VyY2UuY2xlYXIoKTsKLQotICAgIG1UaW1lU291cmNlID0gTlVMTDsKLQotICAgIGRlbGV0ZSBtQXVkaW9QbGF5ZXI7Ci0gICAgbUF1ZGlvUGxheWVyID0gTlVMTDsKLQotICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBzaHV0ZG93blZpZGVvRGVjb2Rlcl9sKCk7Ci0gICAgfQotCi0gICAgbUR1cmF0aW9uVXMgPSAtMTsKLSAgICBtRmxhZ3MgPSAwOwotICAgIG1FeHRyYWN0b3JGbGFncyA9IDA7Ci0gICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gMDsKLSAgICBtVmlkZW9UaW1lVXMgPSAwOwotCi0gICAgbVNlZWtpbmcgPSBOT19TRUVLOwotICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IGZhbHNlOwotICAgIG1TZWVrVGltZVVzID0gMDsKLQotICAgIG1Vcmkuc2V0VG8oIiIpOwotCi0gICAgbUJpdHJhdGUgPSAtMTsKLSAgICBtTGFzdFZpZGVvVGltZVVzID0gLTE7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6bm90aWZ5TGlzdGVuZXJfbChpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpIHsKLSAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7Ci0KLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQobXNnLCBleHQxLCBleHQyKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpvblZpZGVvTGFnVXBkYXRlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKCFtVmlkZW9MYWdFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtVmlkZW9MYWdFdmVudFBlbmRpbmcgPSBmYWxzZTsKLQotICAgIGludDY0X3QgYXVkaW9UaW1lVXMgPSBtQXVkaW9QbGF5ZXItPmdldE1lZGlhVGltZVVzKCk7Ci0gICAgaW50NjRfdCB2aWRlb0xhdGVCeVVzID0gYXVkaW9UaW1lVXMgLSBtVmlkZW9UaW1lVXM7Ci0KLSAgICBpZiAoIShtRmxhZ3MgJiBWSURFT19BVF9FT1MpICYmIHZpZGVvTGF0ZUJ5VXMgPiAzMDAwMDBsbCkgewotICAgICAgICBBTE9HVigidmlkZW8gbGF0ZSBieSAlbGxkIG1zLiIsIHZpZGVvTGF0ZUJ5VXMgLyAxMDAwbGwpOwotCi0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woCi0gICAgICAgICAgICAgICAgTUVESUFfSU5GTywKLSAgICAgICAgICAgICAgICBNRURJQV9JTkZPX1ZJREVPX1RSQUNLX0xBR0dJTkcsCi0gICAgICAgICAgICAgICAgdmlkZW9MYXRlQnlVcyAvIDEwMDBsbCk7Ci0gICAgfQotCi0gICAgcG9zdFZpZGVvTGFnRXZlbnRfbCgpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6Om5vdGlmeVZpZGVvU2l6ZV9sKCkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKTsKLQotICAgIGludDMyX3QgdldpZHRoLCB2SGVpZ2h0OwotICAgIGludDMyX3QgY3JvcExlZnQsIGNyb3BUb3AsIGNyb3BSaWdodCwgY3JvcEJvdHRvbTsKLQotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ2V2lkdGgpKTsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJnZIZWlnaHQpKTsKLQotICAgIG1HaXZlbldpZHRoID0gdldpZHRoOwotICAgIG1HaXZlbkhlaWdodCA9IHZIZWlnaHQ7Ci0KLSAgICBpZiAoIW1ldGEtPmZpbmRSZWN0KAotICAgICAgICAgICAgICAgIGtLZXlDcm9wUmVjdCwgJmNyb3BMZWZ0LCAmY3JvcFRvcCwgJmNyb3BSaWdodCwgJmNyb3BCb3R0b20pKSB7Ci0KLSAgICAgICAgY3JvcExlZnQgPSBjcm9wVG9wID0gMDsKLSAgICAgICAgY3JvcFJpZ2h0ID0gdldpZHRoIC0gMTsKLSAgICAgICAgY3JvcEJvdHRvbSA9IHZIZWlnaHQgLSAxOwotCi0gICAgICAgIEFMT0dEKCJnb3QgZGltZW5zaW9ucyBvbmx5ICVkIHggJWQiLCB2V2lkdGgsIHZIZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dEKCJnb3QgY3JvcCByZWN0ICVkLCAlZCwgJWQsICVkIiwKLSAgICAgICAgICAgICBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKLSAgICB9Ci0KLSAgICBtQ3JvcFJlY3QubGVmdCA9IGNyb3BMZWZ0OwotICAgIG1Dcm9wUmVjdC5yaWdodCA9IGNyb3BSaWdodDsKLSAgICBtQ3JvcFJlY3QudG9wID0gY3JvcFRvcDsKLSAgICBtQ3JvcFJlY3QuYm90dG9tID0gY3JvcEJvdHRvbTsKLQotICAgIGludDMyX3QgZGlzcGxheVdpZHRoOwotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleURpc3BsYXlXaWR0aCwgJmRpc3BsYXlXaWR0aCkpIHsKLSAgICAgICAgQUxPR1YoIkRpc3BsYXkgd2lkdGggY2hhbmdlZCAoJWQ9PiVkKSIsIG1EaXNwbGF5V2lkdGgsIGRpc3BsYXlXaWR0aCk7Ci0gICAgICAgIG1EaXNwbGF5V2lkdGggPSBkaXNwbGF5V2lkdGg7Ci0gICAgfQotICAgIGludDMyX3QgZGlzcGxheUhlaWdodDsKLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAmZGlzcGxheUhlaWdodCkpIHsKLSAgICAgICAgQUxPR1YoIkRpc3BsYXkgaGVpZ2h0IGNoYW5nZWQgKCVkPT4lZCkiLCBtRGlzcGxheUhlaWdodCwgZGlzcGxheUhlaWdodCk7Ci0gICAgICAgIG1EaXNwbGF5SGVpZ2h0ID0gZGlzcGxheUhlaWdodDsKLSAgICB9Ci0KLSAgICBpbnQzMl90IHVzYWJsZVdpZHRoID0gY3JvcFJpZ2h0IC0gY3JvcExlZnQgKyAxOwotICAgIGludDMyX3QgdXNhYmxlSGVpZ2h0ID0gY3JvcEJvdHRvbSAtIGNyb3BUb3AgKyAxOwotICAgIGlmIChtRGlzcGxheVdpZHRoICE9IDApIHsKLSAgICAgICAgdXNhYmxlV2lkdGggPSBtRGlzcGxheVdpZHRoOwotICAgIH0KLSAgICBpZiAobURpc3BsYXlIZWlnaHQgIT0gMCkgewotICAgICAgICB1c2FibGVIZWlnaHQgPSBtRGlzcGxheUhlaWdodDsKLSAgICB9Ci0KLSAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKLSAgICBpZiAoIW1WaWRlb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgIGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlcykpIHsKLSAgICAgICAgcm90YXRpb25EZWdyZWVzID0gMDsKLSAgICB9Ci0KLSAgICBpZiAocm90YXRpb25EZWdyZWVzID09IDkwIHx8IHJvdGF0aW9uRGVncmVlcyA9PSAyNzApIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbCgKLSAgICAgICAgICAgICAgICBNRURJQV9TRVRfVklERU9fU0laRSwgdXNhYmxlSGVpZ2h0LCB1c2FibGVXaWR0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbCgKLSAgICAgICAgICAgICAgICBNRURJQV9TRVRfVklERU9fU0laRSwgdXNhYmxlV2lkdGgsIHVzYWJsZUhlaWdodCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpwYXVzZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKLQotICAgIHJldHVybiBwYXVzZV9sKCk7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnBhdXNlX2woYm9vbCBhdF9lb3MpIHsKLSAgICBpZiAoIShtRmxhZ3MgJiBQTEFZSU5HKSkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgY2FuY2VsUGxheWVyRXZlbnRzX2woKTsKLQotICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCAmJiAobUZsYWdzICYgQVVESU9fUlVOTklORykpIHsKLSAgICAgICAgaWYgKGF0X2VvcykgewotICAgICAgICAgICAgLy8gSWYgd2UgcGxheWVkIHRoZSBhdWRpbyBzdHJlYW0gdG8gY29tcGxldGlvbiB3ZQotICAgICAgICAgICAgLy8gd2FudCB0byBtYWtlIHN1cmUgdGhhdCBhbGwgc2FtcGxlcyByZW1haW5pbmcgaW4gdGhlIGF1ZGlvCi0gICAgICAgICAgICAvLyB0cmFjaydzIHF1ZXVlIGFyZSBwbGF5ZWQgb3V0LgotICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5wYXVzZSh0cnVlIC8qIHBsYXlQZW5kaW5nU2FtcGxlcyAqLyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtRmxhZ3MgJj0gfkFVRElPX1JVTk5JTkc7Ci0gICAgfQotCi0gICAgbUZsYWdzICY9IH5QTEFZSU5HOwotICAgIHVwZGF0ZUJhdHRlcnlVc2FnZV9sKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgUHJldmlld1BsYXllcjo6aXNQbGF5aW5nKCkgY29uc3QgewotICAgIHJldHVybiAobUZsYWdzICYgUExBWUlORykgfHwgKG1GbGFncyAmIENBQ0hFX1VOREVSUlVOKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1TdXJmYWNlID0gc3VyZmFjZTsKLSAgICBzZXROYXRpdmVXaW5kb3dfbChzdXJmYWNlKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRTdXJmYWNlVGV4dHVyZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYnVmZmVyUHJvZHVjZXIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbVN1cmZhY2UuY2xlYXIoKTsKLSAgICBpZiAoYnVmZmVyUHJvZHVjZXIgIT0gTlVMTCkgewotICAgICAgICBzZXROYXRpdmVXaW5kb3dfbChuZXcgU3VyZmFjZShidWZmZXJQcm9kdWNlcikpOwotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzaHV0ZG93blZpZGVvRGVjb2Rlcl9sKCkgewotICAgIGlmIChtVmlkZW9CdWZmZXIpIHsKLSAgICAgICAgbVZpZGVvQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgbVZpZGVvU291cmNlLT5zdG9wKCk7Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGhhY2sgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBPTVgKLSAgICAvLyBjb21wb25lbnQgaXMgY29tcGxldGVseSByZWxlYXNlZCBieSB0aGUgdGltZSB3ZSBtYXkgdHJ5Ci0gICAgLy8gdG8gaW5zdGFudGlhdGUgaXQgYWdhaW4uCi0gICAgd3A8TWVkaWFTb3VyY2U+IHRtcCA9IG1WaWRlb1NvdXJjZTsKLSAgICBtVmlkZW9Tb3VyY2UuY2xlYXIoKTsKLSAgICB3aGlsZSAodG1wLnByb21vdGUoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHVzbGVlcCgxMDAwKTsKLSAgICB9Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldE5hdGl2ZVdpbmRvd19sKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmUpIHsKLSAgICBtTmF0aXZlV2luZG93ID0gbmF0aXZlOwotCi0gICAgaWYgKG1WaWRlb1NvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HSSgiYXR0ZW1wdGluZyB0byByZWNvbmZpZ3VyZSB0byB1c2UgbmV3IHN1cmZhY2UiKTsKLQotICAgIGJvb2wgd2FzUGxheWluZyA9IChtRmxhZ3MgJiBQTEFZSU5HKSAhPSAwOwotCi0gICAgcGF1c2VfbCgpOwotCi0gICAgc2h1dGRvd25WaWRlb0RlY29kZXJfbCgpOwotCi0gICAgQ0hFQ0tfRVEoaW5pdFZpZGVvRGVjb2Rlcl9sKCksIChzdGF0dXNfdClPSyk7Ci0KLSAgICBpZiAobUxhc3RWaWRlb1RpbWVVcyA+PSAwKSB7Ci0gICAgICAgIG1TZWVraW5nID0gU0VFSzsKLSAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKLSAgICAgICAgbVNlZWtUaW1lVXMgPSBtTGFzdFZpZGVvVGltZVVzOwotICAgICAgICBtRmxhZ3MgJj0gfihBVF9FT1MgfCBBVURJT19BVF9FT1MgfCBWSURFT19BVF9FT1MpOwotICAgIH0KLQotICAgIGlmICh3YXNQbGF5aW5nKSB7Ci0gICAgICAgIHBsYXlfbCgpOwotICAgIH0KLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRBdWRpb1NpbmsoCi0gICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1BdWRpb1NpbmsgPSBhdWRpb1Npbms7Ci19Ci0KLXN0YXR1c190IFByZXZpZXdQbGF5ZXI6OnNldExvb3BpbmcoYm9vbCBzaG91bGRMb29wKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1GbGFncyA9IG1GbGFncyAmIH5MT09QSU5HOwotCi0gICAgaWYgKHNob3VsZExvb3ApIHsKLSAgICAgICAgbUZsYWdzIHw9IExPT1BJTkc7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnNldER1cmF0aW9uX2woaW50NjRfdCBkdXJhdGlvblVzKSB7Ci0gICAgaWYgKG1EdXJhdGlvblVzIDwgMCB8fCBkdXJhdGlvblVzID4gbUR1cmF0aW9uVXMpIHsKLSAgICAgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOwotICAgIH0KLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6Z2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKG1EdXJhdGlvblVzIDwgMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAqZHVyYXRpb25VcyA9IG1EdXJhdGlvblVzOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJldmlld1BsYXllcjo6Z2V0UG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25VcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVNlZWtpbmcgIT0gTk9fU0VFSykgewotICAgICAgICAqcG9zaXRpb25VcyA9IG1TZWVrVGltZVVzOwotICAgIH0gZWxzZSBpZiAobVZpZGVvU291cmNlICE9IE5VTEwKLSAgICAgICAgICAgICYmIChtQXVkaW9QbGF5ZXIgPT0gTlVMTCB8fCAhKG1GbGFncyAmIFZJREVPX0FUX0VPUykpKSB7Ci0gICAgICAgICpwb3NpdGlvblVzID0gbVZpZGVvVGltZVVzOwotICAgIH0gZWxzZSBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgKnBvc2l0aW9uVXMgPSBtQXVkaW9QbGF5ZXItPmdldE1lZGlhVGltZVVzKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnBvc2l0aW9uVXMgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZXRQb3NpdGlvbl9sKGludDY0X3QgdGltZVVzKSB7Ci0gICAgbVZpZGVvVGltZVVzID0gdGltZVVzOwotfQotCi1zdGF0dXNfdCBQcmV2aWV3UGxheWVyOjpzZWVrVG9fbChpbnQ2NF90IHRpbWVVcykgewotICAgIEFMT0dWKCJzZWVrVG9fbCIpOwotICAgIGlmIChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTikgewotICAgICAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOwotICAgICAgICBwbGF5X2woKTsKLSAgICB9Ci0KLSAgICBpZiAoKG1GbGFncyAmIFBMQVlJTkcpICYmIG1WaWRlb1NvdXJjZSAhPSBOVUxMICYmIChtRmxhZ3MgJiBWSURFT19BVF9FT1MpKSB7Ci0gICAgICAgIC8vIFZpZGVvIHBsYXliYWNrIGNvbXBsZXRlZCBiZWZvcmUsIHRoZXJlJ3Mgbm8gcGVuZGluZwotICAgICAgICAvLyB2aWRlbyBldmVudCByaWdodCBub3cuIEluIG9yZGVyIGZvciB0aGlzIG5ldyBzZWVrCi0gICAgICAgIC8vIHRvIGJlIGhvbm9yZWQsIHdlIG5lZWQgdG8gcG9zdCBvbmUuCi0KLSAgICAgICAgcG9zdFZpZGVvRXZlbnRfbCgpOwotICAgIH0KLQotICAgIG1TZWVraW5nID0gU0VFSzsKLSAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSBmYWxzZTsKLSAgICBtU2Vla1RpbWVVcyA9IHRpbWVVczsKLSAgICBtRmxhZ3MgJj0gfihBVF9FT1MgfCBBVURJT19BVF9FT1MgfCBWSURFT19BVF9FT1MpOwotCi0gICAgc2Vla0F1ZGlvSWZOZWNlc3NhcnlfbCgpOwotCi0gICAgaWYgKCEobUZsYWdzICYgUExBWUlORykpIHsKLSAgICAgICAgQUxPR1YoInNlZWtpbmcgd2hpbGUgcGF1c2VkLCBzZW5kaW5nIFNFRUtfQ09NUExFVEUgbm90aWZpY2F0aW9uIgotICAgICAgICAgICAgICIgaW1tZWRpYXRlbHkuIik7Ci0KLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRUVLX0NPTVBMRVRFKTsKLSAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKLQotICAgICAgICBpZiAoKG1GbGFncyAmIFBSRVBBUkVEKSAmJiBtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZsYWdzIHw9IFNFRUtfUFJFVklFVzsKLSAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpzZWVrQXVkaW9JZk5lY2Vzc2FyeV9sKCkgewotICAgIGlmIChtU2Vla2luZyAhPSBOT19TRUVLICYmIG1WaWRlb1NvdXJjZSA9PSBOVUxMICYmIG1BdWRpb1BsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1BsYXllci0+c2Vla1RvKG1TZWVrVGltZVVzKTsKLQotICAgICAgICBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpIHsKLSAgICBDSEVDSyhzb3VyY2UgIT0gTlVMTCk7Ci0gICAgbUF1ZGlvVHJhY2sgPSBzb3VyY2U7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6c2V0VmlkZW9Tb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpIHsKLSAgICBDSEVDSyhzb3VyY2UgIT0gTlVMTCk7Ci0gICAgbVZpZGVvVHJhY2sgPSBzb3VyY2U7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6ZmluaXNoU2Vla0lmTmVjZXNzYXJ5KGludDY0X3QgdmlkZW9UaW1lVXMpIHsKLSAgICBpZiAobVNlZWtpbmcgPT0gU0VFS19WSURFT19PTkxZKSB7Ci0gICAgICAgIG1TZWVraW5nID0gTk9fU0VFSzsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtU2Vla2luZyA9PSBOT19TRUVLIHx8IChtRmxhZ3MgJiBTRUVLX1BSRVZJRVcpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoInNlZWtpbmcgYXVkaW8gdG8gJWxsZCB1cyAoJS4yZiBzZWNzKS4iLCB2aWRlb1RpbWVVcywgdmlkZW9UaW1lVXMgLyAxRTYpOwotCi0gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSB2aWRlbyB0aW1lLCBzZWVrIGF1ZGlvIHRvIHRoZSBvcmlnaW5hbGx5Ci0gICAgICAgIC8vIHJlcXVlc3RlZCBzZWVrIHRpbWUgaW5zdGVhZC4KLQotICAgICAgICBtQXVkaW9QbGF5ZXItPnNlZWtUbyh2aWRlb1RpbWVVcyA8IDAgPyBtU2Vla1RpbWVVcyA6IHZpZGVvVGltZVVzKTsKLSAgICAgICAgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgPSB0cnVlOwotICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICghbVNlZWtOb3RpZmljYXRpb25TZW50KSB7Ci0gICAgICAgIC8vIElmIHdlJ3JlIHBsYXlpbmcgdmlkZW8gb25seSwgcmVwb3J0IHNlZWsgY29tcGxldGUgbm93LAotICAgICAgICAvLyBvdGhlcndpc2UgYXVkaW8gcGxheWVyIHdpbGwgbm90aWZ5IHVzIGxhdGVyLgotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFRUtfQ09NUExFVEUpOwotICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwotICAgIH0KLQotICAgIG1GbGFncyB8PSBGSVJTVF9GUkFNRTsKLSAgICBtU2Vla2luZyA9IE5PX1NFRUs7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6b25DaGVja0F1ZGlvU3RhdHVzKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKCFtQXVkaW9TdGF0dXNFdmVudFBlbmRpbmcpIHsKLSAgICAgICAgLy8gRXZlbnQgd2FzIGRpc3BhdGNoZWQgYW5kIHdoaWxlIHdlIHdlcmUgYmxvY2tpbmcgb24gdGhlIG11dGV4LAotICAgICAgICAvLyBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGxlZC4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZyA9IGZhbHNlOwotCi0gICAgaWYgKG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlICYmICFtQXVkaW9QbGF5ZXItPmlzU2Vla2luZygpKSB7Ci0gICAgICAgIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCFtU2Vla05vdGlmaWNhdGlvblNlbnQpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfU0VFS19DT01QTEVURSk7Ci0gICAgICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNlZWtpbmcgPSBOT19TRUVLOwotICAgIH0KLQotICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOwotICAgIGlmIChtV2F0Y2hGb3JBdWRpb0VPUyAmJiBtQXVkaW9QbGF5ZXItPnJlYWNoZWRFT1MoJmZpbmFsU3RhdHVzKSkgewotICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IGZhbHNlOwotICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7Ci0gICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChmaW5hbFN0YXR1cyk7Ci0gICAgfQotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnBvc3RWaWRlb0V2ZW50X2woaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgaWYgKG1WaWRlb0V2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVZpZGVvRXZlbnRQZW5kaW5nID0gdHJ1ZTsKLSAgICBtUXVldWUucG9zdEV2ZW50V2l0aERlbGF5KG1WaWRlb0V2ZW50LCBkZWxheVVzIDwgMCA/IDEwMDAwIDogZGVsYXlVcyk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdFN0cmVhbURvbmVFdmVudF9sKHN0YXR1c190IHN0YXR1cykgewotICAgIGlmIChtU3RyZWFtRG9uZUV2ZW50UGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1TdHJlYW1Eb25lRXZlbnRQZW5kaW5nID0gdHJ1ZTsKLQotICAgIG1TdHJlYW1Eb25lU3RhdHVzID0gc3RhdHVzOwotICAgIG1RdWV1ZS5wb3N0RXZlbnQobVN0cmVhbURvbmVFdmVudCk7Ci19Ci0KLXZvaWQgUHJldmlld1BsYXllcjo6cG9zdFZpZGVvTGFnRXZlbnRfbCgpIHsKLSAgICBpZiAobVZpZGVvTGFnRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVZpZGVvTGFnRXZlbnRQZW5kaW5nID0gdHJ1ZTsKLSAgICBtUXVldWUucG9zdEV2ZW50V2l0aERlbGF5KG1WaWRlb0xhZ0V2ZW50LCAxMDAwMDAwbGwpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbChpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBpZiAobUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbUF1ZGlvU3RhdHVzRXZlbnRQZW5kaW5nID0gdHJ1ZTsKLSAgICBtUXVldWUucG9zdEV2ZW50V2l0aERlbGF5KG1DaGVja0F1ZGlvU3RhdHVzRXZlbnQsIGRlbGF5VXMpOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OmFib3J0UHJlcGFyZShzdGF0dXNfdCBlcnIpIHsKLSAgICBDSEVDSyhlcnIgIT0gT0spOwotCi0gICAgaWYgKG1Jc0FzeW5jUHJlcGFyZSkgewotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOwotICAgIH0KLQotICAgIG1QcmVwYXJlUmVzdWx0ID0gZXJyOwotICAgIG1GbGFncyAmPSB+KFBSRVBBUklOR3xQUkVQQVJFX0NBTkNFTExFRHxQUkVQQVJJTkdfQ09OTkVDVEVEKTsKLSAgICBtQXN5bmNQcmVwYXJlRXZlbnQgPSBOVUxMOwotICAgIG1QcmVwYXJlZENvbmRpdGlvbi5icm9hZGNhc3QoKTsKLX0KLQotdWludDMyX3QgUHJldmlld1BsYXllcjo6Z2V0U291cmNlU2Vla0ZsYWdzKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gbUV4dHJhY3RvckZsYWdzOwotfQotCi12b2lkIFByZXZpZXdQbGF5ZXI6OnBvc3RBdWRpb0VPUyhpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHBvc3RDaGVja0F1ZGlvU3RhdHVzRXZlbnRfbChkZWxheVVzKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjpwb3N0QXVkaW9TZWVrQ29tcGxldGUoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBwb3N0Q2hlY2tBdWRpb1N0YXR1c0V2ZW50X2woMCAvKiBkZWxheVVzICovKTsKLX0KLQotdm9pZCBQcmV2aWV3UGxheWVyOjp1cGRhdGVCYXR0ZXJ5VXNhZ2VfbCgpIHsKLSAgICB1aW50MzJfdCBwYXJhbXMgPSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFUcmFja0RlY29kZXI7Ci0gICAgaWYgKChtQXVkaW9Tb3VyY2UgIT0gTlVMTCkgJiYgKG1BdWRpb1NvdXJjZSAhPSBtQXVkaW9UcmFjaykpIHsKLSAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVRyYWNrQXVkaW87Ci0gICAgfQotICAgIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhVHJhY2tWaWRlbzsKLSAgICB9Ci0gICAgYWRkQmF0dGVyeURhdGEocGFyYW1zKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1BsYXllci5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UGxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhMTNiNTguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UGxheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgUFJFVklFV19QTEFZRVJfSF8KLQotI2RlZmluZSBQUkVWSUVXX1BMQVlFUl9IXwotCi0jaW5jbHVkZSAiVGltZWRFdmVudFF1ZXVlLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9UaW1lU291cmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgIk5hdGl2ZVdpbmRvd1JlbmRlcmVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI7Ci1zdHJ1Y3QgTWVkaWFFeHRyYWN0b3I7Ci0KLXN0cnVjdCBQcmV2aWV3UGxheWVyIHsKLSAgICBQcmV2aWV3UGxheWVyKE5hdGl2ZVdpbmRvd1JlbmRlcmVyKiByZW5kZXJlcik7Ci0gICAgflByZXZpZXdQbGF5ZXIoKTsKLQotICAgIHZvaWQgc2V0TGlzdGVuZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXJCYXNlPiAmbGlzdGVuZXIpOwotICAgIHZvaWQgcmVzZXQoKTsKLQotICAgIHN0YXR1c190IHBsYXkoKTsKLSAgICBzdGF0dXNfdCBwYXVzZSgpOwotCi0gICAgYm9vbCBpc1BsYXlpbmcoKSBjb25zdDsKLSAgICB2b2lkIHNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOwotICAgIHZvaWQgc2V0U3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmJ1ZmZlclByb2R1Y2VyKTsKLSAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCB0aW1lVXMpOwotCi0gICAgc3RhdHVzX3QgZ2V0VmlkZW9EaW1lbnNpb25zKGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIGNvbnN0OwotCi0KLSAgICAvLyBGSVhNRTogU3luYyBiZXR3ZWVuIC4uLgotICAgIHZvaWQgYWNxdWlyZUxvY2soKTsKLSAgICB2b2lkIHJlbGVhc2VMb2NrKCk7Ci0KLSAgICBzdGF0dXNfdCBwcmVwYXJlKCk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCk7Ci0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICpwYXRoKTsKLSAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmspOwotICAgIHN0YXR1c190IHNldExvb3BpbmcoYm9vbCBzaG91bGRMb29wKTsKLSAgICBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKLSAgICBzdGF0dXNfdCBnZXRQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvblVzKTsKLQotICAgIHVpbnQzMl90IGdldFNvdXJjZVNlZWtGbGFncygpIGNvbnN0OwotCi0gICAgdm9pZCBwb3N0QXVkaW9FT1MoaW50NjRfdCBkZWxheVVzID0gMGxsKTsKLSAgICB2b2lkIHBvc3RBdWRpb1NlZWtDb21wbGV0ZSgpOwotCi0gICAgc3RhdHVzX3QgbG9hZEVmZmVjdHNTZXR0aW5ncyhNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3RTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRWZmZWN0cyk7Ci0gICAgc3RhdHVzX3QgbG9hZEF1ZGlvTWl4U2V0dGluZ3MoTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIHBBdWRpb01peFNldHRpbmdzKTsKLSAgICBzdGF0dXNfdCBzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoTTRPU0FfQ29udGV4dCBwQXVkaW9NaXhQQ01GaWxlSGFuZGxlKTsKLSAgICBzdGF0dXNfdCBzZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbShNNE9TQV9VSW50MzIgYXVkaW9NaXhTdG9yeUJvYXJkVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgY3VycmVudE1lZGlhVm9sdW1lVm9sKTsKLQotICAgIHN0YXR1c190IHNldFBsYXliYWNrQmVnaW5UaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHN0YXR1c190IHNldFBsYXliYWNrRW5kVGltZSh1aW50MzJfdCBtc2VjKTsKLSAgICBzdGF0dXNfdCBzZXRTdG9yeWJvYXJkU3RhcnRUaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHN0YXR1c190IHNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCh1aW50MzJfdCBjYkludGVydmFsKTsKLSAgICBzdGF0dXNfdCBzZXRNZWRpYVJlbmRlcmluZ01vZGUoTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgb3V0cHV0VmlkZW9TaXplKTsKLQotICAgIHN0YXR1c190IHJlc2V0Sm5pQ2FsbGJhY2tUaW1lU3RhbXAoKTsKLSAgICBzdGF0dXNfdCBzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwotICAgIHN0YXR1c190IHJlYWRGaXJzdFZpZGVvRnJhbWUoKTsKLSAgICBzdGF0dXNfdCBnZXRMYXN0UmVuZGVyZWRUaW1lTXModWludDMyX3QgKmxhc3RSZW5kZXJlZFRpbWVNcyk7Ci0gICAgc3RhdHVzX3Qgc2V0QXVkaW9QbGF5ZXIoVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqYXVkaW9QbGF5ZXIpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBQTEFZSU5HICAgICAgICAgICAgID0gMSwKLSAgICAgICAgTE9PUElORyAgICAgICAgICAgICA9IDIsCi0gICAgICAgIEZJUlNUX0ZSQU1FICAgICAgICAgPSA0LAotICAgICAgICBQUkVQQVJJTkcgICAgICAgICAgID0gOCwKLSAgICAgICAgUFJFUEFSRUQgICAgICAgICAgICA9IDE2LAotICAgICAgICBBVF9FT1MgICAgICAgICAgICAgID0gMzIsCi0gICAgICAgIFBSRVBBUkVfQ0FOQ0VMTEVEICAgPSA2NCwKLSAgICAgICAgQ0FDSEVfVU5ERVJSVU4gICAgICA9IDEyOCwKLSAgICAgICAgQVVESU9fQVRfRU9TICAgICAgICA9IDI1NiwKLSAgICAgICAgVklERU9fQVRfRU9TICAgICAgICA9IDUxMiwKLSAgICAgICAgQVVUT19MT09QSU5HICAgICAgICA9IDEwMjQsCi0gICAgICAgIElORk9STUVEX0FWX0VPUyAgICAgPSAyMDQ4LAotCi0gICAgICAgIC8vIFdlIGFyZSBiYXNpY2FsbHkgZG9uZSBwcmVwYXJpbmcgYnV0IGFyZSBjdXJyZW50bHkgYnVmZmVyaW5nCi0gICAgICAgIC8vIHN1ZmZpY2llbnQgZGF0YSB0byBiZWdpbiBwbGF5YmFjayBhbmQgZmluaXNoIHRoZSBwcmVwYXJhdGlvbiBwaGFzZQotICAgICAgICAvLyBmb3IgZ29vZC4KLSAgICAgICAgUFJFUEFSSU5HX0NPTk5FQ1RFRCA9IDIwNDgsCi0KLSAgICAgICAgLy8gV2UncmUgdHJpZ2dlcmluZyBhIHNpbmdsZSB2aWRlbyBldmVudCB0byBkaXNwbGF5IHRoZSBmaXJzdCBmcmFtZQotICAgICAgICAvLyBhZnRlciB0aGUgc2Vla3BvaW50LgotICAgICAgICBTRUVLX1BSRVZJRVcgICAgICAgID0gNDA5NiwKLQotICAgICAgICBBVURJT19SVU5OSU5HICAgICAgID0gODE5MiwKLSAgICAgICAgQVVESU9QTEFZRVJfU1RBUlRFRCA9IDE2Mzg0LAotCi0gICAgICAgIElOQ09HTklUTyAgICAgICAgICAgPSAzMjc2OCwKLSAgICB9OwotCi0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLQotICAgIE9NWENsaWVudCBtQ2xpZW50OwotICAgIFRpbWVkRXZlbnRRdWV1ZSBtUXVldWU7Ci0gICAgYm9vbCBtUXVldWVTdGFydGVkOwotICAgIHdwPE1lZGlhUGxheWVyQmFzZT4gbUxpc3RlbmVyOwotCi0gICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gbU5hdGl2ZVdpbmRvdzsKLSAgICBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKLQotICAgIFN5c3RlbVRpbWVTb3VyY2UgbVN5c3RlbVRpbWVTb3VyY2U7Ci0gICAgVGltZVNvdXJjZSAqbVRpbWVTb3VyY2U7Ci0KLSAgICBTdHJpbmc4IG1Vcmk7Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbVZpZGVvVHJhY2s7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IG1WaWRlb1NvdXJjZTsKLSAgICBib29sIG1WaWRlb1JlbmRlcmVySXNQcmV2aWV3OwotCi0gICAgc3A8TWVkaWFTb3VyY2U+IG1BdWRpb1RyYWNrOwotICAgIHNwPE1lZGlhU291cmNlPiBtQXVkaW9Tb3VyY2U7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqbUF1ZGlvUGxheWVyOwotICAgIGludDY0X3QgbUR1cmF0aW9uVXM7Ci0KLSAgICBpbnQzMl90IG1EaXNwbGF5V2lkdGg7Ci0gICAgaW50MzJfdCBtRGlzcGxheUhlaWdodDsKLQotICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICB1aW50MzJfdCBtRXh0cmFjdG9yRmxhZ3M7Ci0KLSAgICBpbnQ2NF90IG1UaW1lU291cmNlRGVsdGFVczsKLSAgICBpbnQ2NF90IG1WaWRlb1RpbWVVczsKLQotICAgIGVudW0gU2Vla1R5cGUgewotICAgICAgICBOT19TRUVLLAotICAgICAgICBTRUVLLAotICAgICAgICBTRUVLX1ZJREVPX09OTFkKLSAgICB9OwotICAgIFNlZWtUeXBlIG1TZWVraW5nOwotCi0gICAgYm9vbCBtU2Vla05vdGlmaWNhdGlvblNlbnQ7Ci0gICAgaW50NjRfdCBtU2Vla1RpbWVVczsKLQotICAgIGludDY0X3QgbUJpdHJhdGU7ICAvLyB0b3RhbCBiaXRyYXRlIG9mIHRoZSBmaWxlIChpbiBicHMpIG9yIC0xIGlmIHVua25vd24uCi0KLSAgICBib29sIG1XYXRjaEZvckF1ZGlvU2Vla0NvbXBsZXRlOwotICAgIGJvb2wgbVdhdGNoRm9yQXVkaW9FT1M7Ci0KLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtVmlkZW9FdmVudDsKLSAgICBib29sIG1WaWRlb0V2ZW50UGVuZGluZzsKLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtU3RyZWFtRG9uZUV2ZW50OwotICAgIGJvb2wgbVN0cmVhbURvbmVFdmVudFBlbmRpbmc7Ci0gICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbUNoZWNrQXVkaW9TdGF0dXNFdmVudDsKLSAgICBib29sIG1BdWRpb1N0YXR1c0V2ZW50UGVuZGluZzsKLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtVmlkZW9MYWdFdmVudDsKLSAgICBib29sIG1WaWRlb0xhZ0V2ZW50UGVuZGluZzsKLQotICAgIHNwPFRpbWVkRXZlbnRRdWV1ZTo6RXZlbnQ+IG1Bc3luY1ByZXBhcmVFdmVudDsKLSAgICBDb25kaXRpb24gbVByZXBhcmVkQ29uZGl0aW9uOwotICAgIGJvb2wgbUlzQXN5bmNQcmVwYXJlOwotICAgIHN0YXR1c190IG1QcmVwYXJlUmVzdWx0OwotICAgIHN0YXR1c190IG1TdHJlYW1Eb25lU3RhdHVzOwotCi0gICAgTWVkaWFCdWZmZXIgKm1WaWRlb0J1ZmZlcjsKLSAgICBpbnQ2NF90IG1MYXN0VmlkZW9UaW1lVXM7Ci0gICAgQVJlY3QgbUNyb3BSZWN0OwotICAgIGludDMyX3QgbUdpdmVuV2lkdGgsIG1HaXZlbkhlaWdodDsKLQotCi0gICAgYm9vbCBtSXNDaGFuZ2VTb3VyY2VSZXF1aXJlZDsKLQotICAgIE5hdGl2ZVdpbmRvd1JlbmRlcmVyICptTmF0aXZlV2luZG93UmVuZGVyZXI7Ci0gICAgUmVuZGVySW5wdXQgKm1WaWRlb1JlbmRlcmVyOwotCi0gICAgaW50MzJfdCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0OwotCi0gICAgLy9EYXRhIHN0cnVjdHVyZXMgdXNlZCBmb3IgYXVkaW8gYW5kIHZpZGVvIGVmZmVjdHMKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIG1FZmZlY3RzU2V0dGluZ3M7Ci0gICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIG1QcmV2aWV3UGxheWVyQXVkaW9NaXhTZXR0aW5nczsKLSAgICBNNE9TQV9Db250ZXh0IG1BdWRpb01peFBDTUZpbGVIYW5kbGU7Ci0gICAgTTRPU0FfVUludDMyIG1BdWRpb01peFN0b3J5Qm9hcmRUUzsKLSAgICBNNE9TQV9VSW50MzIgbUN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZTsKLSAgICBNNE9TQV9VSW50MzIgbUN1cnJlbnRNZWRpYVZvbHVtZVZhbHVlOwotICAgIE00T1NBX1VJbnQzMiBtQ3VyckZyYW1pbmdFZmZlY3RJbmRleDsKLQotICAgIHVpbnQzMl90IG1OdW1iZXJFZmZlY3RzOwotICAgIHVpbnQzMl90IG1QbGF5QmVnaW5UaW1lTXNlYzsKLSAgICB1aW50MzJfdCBtUGxheUVuZFRpbWVNc2VjOwotICAgIHVpbnQ2NF90IG1EZWNvZGVkVmlkZW9UczsgLy8gdGltZXN0YW1wIG9mIGN1cnJlbnQgZGVjb2RlZCB2aWRlbyBmcmFtZSBidWZmZXIKLSAgICB1aW50NjRfdCBtRGVjVmlkZW9Uc1N0b3J5Qm9hcmQ7IC8vIHRpbWVzdGFtcCBvZiBmcmFtZSByZWxhdGl2ZSB0byBzdG9yeWJvYXJkCi0gICAgdWludDMyX3QgbUN1cnJlbnRWaWRlb0VmZmVjdDsKLSAgICB1aW50MzJfdCBtUHJvZ3Jlc3NDYkludGVydmFsOwotICAgIHVpbnQzMl90IG1OdW1iZXJEZWNWaWRlb0ZyYW1lczsgLy8gQ291bnRlciBvZiBudW1iZXIgb2YgdmlkZW8gZnJhbWVzIGRlY29kZWQKLSAgICBzcDxUaW1lZEV2ZW50UXVldWU6OkV2ZW50PiBtUHJvZ3Jlc3NDYkV2ZW50OwotICAgIGJvb2wgbVByb2dyZXNzQ2JFdmVudFBlbmRpbmc7Ci0gICAgc3A8VGltZWRFdmVudFF1ZXVlOjpFdmVudD4gbU92ZXJsYXlVcGRhdGVFdmVudDsKLSAgICBib29sIG1PdmVybGF5VXBkYXRlRXZlbnRQZW5kaW5nOwotICAgIGJvb2wgbU92ZXJsYXlVcGRhdGVFdmVudFBvc3RlZDsKLQotICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyBtUmVuZGVyaW5nTW9kZTsKLSAgICB1aW50MzJfdCBtT3V0cHV0VmlkZW9XaWR0aDsKLSAgICB1aW50MzJfdCBtT3V0cHV0VmlkZW9IZWlnaHQ7Ci0KLSAgICB1aW50MzJfdCBtU3Rvcnlib2FyZFN0YXJ0VGltZU1zZWM7Ci0KLSAgICBib29sIG1Jc1ZpZGVvU291cmNlSnBnOwotICAgIGJvb2wgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQ7Ci0gICAgaW50NjRfdCBtSW1hZ2VGcmFtZVRpbWVVczsKLSAgICBib29sIG1TdGFydE5leHRQbGF5ZXI7Ci0gICAgbXV0YWJsZSBNdXRleCBtTG9ja0NvbnRyb2w7Ci0KLSAgICBNNFZJRklfVUludDgqICBtRnJhbWVSR0JCdWZmZXI7Ci0gICAgTTRWSUZJX1VJbnQ4KiAgbUZyYW1lWVVWQnVmZmVyOwotCi0gICAgdm9pZCBjYW5jZWxQbGF5ZXJFdmVudHNfbChib29sIHVwZGF0ZVByb2dyZXNzQ2IgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZV9sKGNvbnN0IHNwPE1lZGlhRXh0cmFjdG9yPiAmZXh0cmFjdG9yKTsKLSAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlX2woY29uc3QgY2hhciAqcGF0aCk7Ci0gICAgdm9pZCBzZXROYXRpdmVXaW5kb3dfbChjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlKTsKLSAgICB2b2lkIHJlc2V0X2woKTsKLSAgICB2b2lkIGNsZWFyX2woKTsKLSAgICBzdGF0dXNfdCBwbGF5X2woKTsKLSAgICBzdGF0dXNfdCBwYXVzZV9sKGJvb2wgYXRfZW9zID0gZmFsc2UpOwotICAgIHN0YXR1c190IGluaXRSZW5kZXJlcl9sKCk7Ci0gICAgc3RhdHVzX3QgaW5pdEF1ZGlvRGVjb2Rlcl9sKCk7Ci0gICAgc3RhdHVzX3QgaW5pdFZpZGVvRGVjb2Rlcl9sKHVpbnQzMl90IGZsYWdzID0gMCk7Ci0gICAgdm9pZCBub3RpZnlWaWRlb1NpemVfbCgpOwotICAgIHZvaWQgbm90aWZ5TGlzdGVuZXJfbChpbnQgbXNnLCBpbnQgZXh0MSA9IDAsIGludCBleHQyID0gMCk7Ci0gICAgdm9pZCBvblZpZGVvRXZlbnQoKTsKLSAgICB2b2lkIG9uVmlkZW9MYWdVcGRhdGUoKTsKLSAgICB2b2lkIG9uU3RyZWFtRG9uZSgpOwotICAgIHZvaWQgb25DaGVja0F1ZGlvU3RhdHVzKCk7Ci0gICAgdm9pZCBvblByZXBhcmVBc3luY0V2ZW50KCk7Ci0KLSAgICB2b2lkIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7Ci0gICAgdm9pZCBhYm9ydFByZXBhcmUoc3RhdHVzX3QgZXJyKTsKLQotICAgIHN0YXR1c190IHN0YXJ0QXVkaW9QbGF5ZXJfbCgpOwotICAgIHZvaWQgc2V0VmlkZW9Tb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpOwotICAgIHN0YXR1c190IGZpbmlzaFNldERhdGFTb3VyY2VfbCgpOwotICAgIHZvaWQgc2V0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpOwotCi0gICAgc3RhdHVzX3Qgc2Vla1RvX2woaW50NjRfdCB0aW1lVXMpOwotICAgIHZvaWQgc2Vla0F1ZGlvSWZOZWNlc3NhcnlfbCgpOwotICAgIHZvaWQgZmluaXNoU2Vla0lmTmVjZXNzYXJ5KGludDY0X3QgdmlkZW9UaW1lVXMpOwotCi0gICAgdm9pZCBwb3N0Q2hlY2tBdWRpb1N0YXR1c0V2ZW50X2woaW50NjRfdCBkZWxheVVzKTsKLSAgICB2b2lkIHBvc3RWaWRlb0xhZ0V2ZW50X2woKTsKLSAgICB2b2lkIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChzdGF0dXNfdCBzdGF0dXMpOwotICAgIHZvaWQgcG9zdFZpZGVvRXZlbnRfbChpbnQ2NF90IGRlbGF5VXMgPSAtMSk7Ci0gICAgdm9pZCBzZXRWaWRlb1Bvc3RQcm9jZXNzaW5nTm9kZSgKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSB0eXBlLCBNNE9TQV9Cb29sIGVuYWJsZSk7Ci0gICAgdm9pZCBwb3N0UHJvZ3Jlc3NDYWxsYmFja0V2ZW50X2woKTsKLSAgICB2b2lkIHNodXRkb3duVmlkZW9EZWNvZGVyX2woKTsKLSAgICB2b2lkIG9uUHJvZ3Jlc3NDYkV2ZW50KCk7Ci0KLSAgICB2b2lkIHBvc3RPdmVybGF5VXBkYXRlRXZlbnRfbCgpOwotICAgIHZvaWQgb25VcGRhdGVPdmVybGF5RXZlbnQoKTsKLQotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2VfbF9qcGcoKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlX2woKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlQXN5bmNfbCgpOwotICAgIHZvaWQgdXBkYXRlQmF0dGVyeVVzYWdlX2woKTsKLSAgICB2b2lkIHVwZGF0ZVNpemVUb1JlbmRlcihzcDxNZXRhRGF0YT4gbWV0YSk7Ci0KLSAgICB2b2lkIHNldER1cmF0aW9uX2woaW50NjRfdCBkdXJhdGlvblVzKTsKLSAgICB2b2lkIHNldFBvc2l0aW9uX2woaW50NjRfdCB0aW1lVXMpOwotCi0gICAgUHJldmlld1BsYXllcihjb25zdCBQcmV2aWV3UGxheWVyICYpOwotICAgIFByZXZpZXdQbGF5ZXIgJm9wZXJhdG9yPShjb25zdCBQcmV2aWV3UGxheWVyICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBQUkVWSUVXX1BMQVlFUl9IXwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdSZW5kZXJlci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdSZW5kZXJlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGIxY2ZjOGUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9QcmV2aWV3UmVuZGVyZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlByZXZpZXdSZW5kZXJlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIlByZXZpZXdSZW5kZXJlci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVByZXZpZXdSZW5kZXJlciogUHJldmlld1JlbmRlcmVyOjpDcmVhdGVQcmV2aWV3UmVuZGVyZXIgKAotICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7Ci0KLSAgICBQcmV2aWV3UmVuZGVyZXIqIHJlbmRlcmVyID0gbmV3IFByZXZpZXdSZW5kZXJlcihzdXJmYWNlLCB3aWR0aCwgaGVpZ2h0KTsKLQotICAgIGlmIChyZW5kZXJlci0+aW5pdCgpICE9IDApIHsKLSAgICAgICAgZGVsZXRlIHJlbmRlcmVyOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVuZGVyZXI7Ci19Ci0KLVByZXZpZXdSZW5kZXJlcjo6UHJldmlld1JlbmRlcmVyKAotICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKLSAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KQotICAgIDogbVN1cmZhY2Uoc3VyZmFjZSksCi0gICAgICBtV2lkdGgod2lkdGgpLAotICAgICAgbUhlaWdodChoZWlnaHQpIHsKLX0KLQotaW50IFByZXZpZXdSZW5kZXJlcjo6aW5pdCgpIHsKLSAgICBpbnQgZXJyID0gMDsKLSAgICBBTmF0aXZlV2luZG93KiBhbncgPSBtU3VyZmFjZS5nZXQoKTsKLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QoYW53LCBOQVRJVkVfV0lORE9XX0FQSV9DUFUpOwotICAgIGlmIChlcnIpIGdvdG8gZmFpbDsKLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKAotICAgICAgICAgICAgYW53LCBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOKTsKLSAgICBpZiAoZXJyKSBnb3RvIGZhaWw7Ci0KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoYW53LCAzKTsKLSAgICBpZiAoZXJyKSBnb3RvIGZhaWw7Ci0KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9zY2FsaW5nX21vZGUoCi0gICAgICAgICAgICBhbncsIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyk7Ci0gICAgaWYgKGVycikgZ290byBmYWlsOwotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeSgKLSAgICAgICAgICAgIGFudywgbVdpZHRoLCBtSGVpZ2h0LCBIQUxfUElYRUxfRk9STUFUX1lWMTIpOwotICAgIGlmIChlcnIpIGdvdG8gZmFpbDsKLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtKGFudywgMCk7Ci0gICAgaWYgKGVycikgZ290byBmYWlsOwotCi1mYWlsOgotICAgIHJldHVybiBlcnI7Ci19Ci0KLVByZXZpZXdSZW5kZXJlcjo6flByZXZpZXdSZW5kZXJlcigpIHsKLSAgICBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1TdXJmYWNlLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9DUFUpOwotfQotCi0KLS8vCi0vLyBQcm92aWRlcyBhIGJ1ZmZlciBhbmQgYXNzb2NpYXRlZCBzdHJpZGUKLS8vIFRoaXMgYnVmZmVyIGlzIGFsbG9jYXRlZCBieSB0aGUgU3VyZmFjZUZsaW5nZXIKLS8vCi0vLyBGb3Igb3B0aW1hbCBkaXNwbGF5IHBlcmZvcm1hbmNlcywgeW91IHNob3VsZCA6Ci0vLyAxKSBjYWxsIGdldEJ1ZmZlcllWMTIoKQotLy8gMikgZmlsbCB0aGUgYnVmZmVyIHdpdGggeW91ciBkYXRhCi0vLyAzKSBjYWxsIHJlbmRlcllWMTIoKSB0byB0YWtlIHRoZXNlIGNoYW5nZXMgaW50byBhY2NvdW50Ci0vLwotLy8gRm9yIGVhY2ggY2FsbCB0byBnZXRCdWZmZXJZVjEyKCksIHlvdSBtdXN0IGFsc28gY2FsbCByZW5kZXJZVjEyKCkKLS8vIEV4cGVjdGVkIGZvcm1hdCBpbiB0aGUgYnVmZmVyIGlzIFlWMTIgZm9ybWF0cyAoc2ltaWxhciB0byBZVVY0MjAgcGxhbmFyIGZyb21hdCkKLS8vIGZvciBtb3JlIGRldGFpbHMgb24gdGhpcyBZVjEyIGNmIGhhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUvaGFyZHdhcmUvaGFyZHdhcmUuaAotLy8KLXZvaWQgUHJldmlld1JlbmRlcmVyOjpnZXRCdWZmZXJZVjEyKHVpbnQ4X3QgKipkYXRhLCBzaXplX3QgKnN0cmlkZSkgewotICAgIGludCBlcnIgPSBPSzsKLQotICAgIGlmICgoZXJyID0gbmF0aXZlX3dpbmRvd19kZXF1ZXVlX2J1ZmZlcl9hbmRfd2FpdChtU3VyZmFjZS5nZXQoKSwKLSAgICAgICAgICAgICZtQnVmKSkgIT0gMCkgewotICAgICAgICBBTE9HVygibmF0aXZlX3dpbmRvd19kZXF1ZXVlX2J1ZmZlcl9hbmRfd2FpdCByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBHcmFwaGljQnVmZmVyTWFwcGVyICZtYXBwZXIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKTsKLQotICAgIFJlY3QgYm91bmRzKG1XaWR0aCwgbUhlaWdodCk7Ci0KLSAgICB2b2lkICpkc3Q7Ci0gICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLmxvY2sobUJ1Zi0+aGFuZGxlLAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwKLSAgICAgICAgICAgIGJvdW5kcywgJmRzdCkpOwotCi0gICAgKmRhdGEgICA9ICh1aW50OF90Kilkc3Q7Ci0gICAgKnN0cmlkZSA9IG1CdWYtPnN0cmlkZTsKLX0KLQotCi0vLwotLy8gRGlzcGxheSB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyIHByb3ZpZGVkIGJ5IGxhc3QgY2FsbCB0byBnZXRCdWZmZXJZVjEyKCkKLS8vCi0vLyBTZWUgZ2V0QnVmZmVyWVYxMigpIGZvciBkZXRhaWxzLgotLy8KLXZvaWQgUHJldmlld1JlbmRlcmVyOjpyZW5kZXJZVjEyKCkgewotICAgIGludCBlcnIgPSBPSzsKLQotICAgIEdyYXBoaWNCdWZmZXJNYXBwZXIgJm1hcHBlciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpOwotCi0gICAgaWYgKG1CdWYhPSBOVUxMKSB7Ci0gICAgICAgIENIRUNLX0VRKDAsIG1hcHBlci51bmxvY2sobUJ1Zi0+aGFuZGxlKSk7Ci0KLSAgICAgICAgaWYgKChlcnIgPSBtU3VyZmFjZS0+QU5hdGl2ZVdpbmRvdzo6cXVldWVCdWZmZXIobVN1cmZhY2UuZ2V0KCksIG1CdWYsIC0xKSkgIT0gMCkgewotICAgICAgICAgICAgQUxPR1coIlN1cmZhY2U6OnF1ZXVlQnVmZmVyIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtQnVmID0gTlVMTDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ByZXZpZXdSZW5kZXJlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTI4Mjc2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvUHJldmlld1JlbmRlcmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBQUkVWSUVXX1JFTkRFUkVSX0hfCi0KLSNkZWZpbmUgUFJFVklFV19SRU5ERVJFUl9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN1cmZhY2U7Ci0KLWNsYXNzIFByZXZpZXdSZW5kZXJlciB7Ci1wdWJsaWM6Ci0KLXN0YXRpYyBQcmV2aWV3UmVuZGVyZXIqIENyZWF0ZVByZXZpZXdSZW5kZXJlciAoCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAotICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpOwotCi0gICAgflByZXZpZXdSZW5kZXJlcigpOwotCi0gICAgdm9pZCBnZXRCdWZmZXJZVjEyKHVpbnQ4X3QgKipkYXRhLCBzaXplX3QgKnN0cmlkZSk7Ci0KLSAgICB2b2lkIHJlbmRlcllWMTIoKTsKLQotICAgIHN0YXRpYyBzaXplX3QgQUxJR04oc2l6ZV90IHgsIHNpemVfdCBhbGlnbm1lbnQpIHsKLSAgICAgICAgcmV0dXJuICh4ICsgYWxpZ25tZW50IC0gMSkgJiB+KGFsaWdubWVudCAtIDEpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBQcmV2aWV3UmVuZGVyZXIoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKLSAgICAgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCk7Ci0KLSAgICBpbnQgaW5pdCgpOwotCi0gICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7Ci0gICAgc2l6ZV90IG1XaWR0aCwgbUhlaWdodDsKLQotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKm1CdWY7Ci0KLSAgICBQcmV2aWV3UmVuZGVyZXIoY29uc3QgUHJldmlld1JlbmRlcmVyICYpOwotICAgIFByZXZpZXdSZW5kZXJlciAmb3BlcmF0b3I9KGNvbnN0IFByZXZpZXdSZW5kZXJlciAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gUFJFVklFV19SRU5ERVJFUl9IXwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxYTgxZDguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckF1ZGlvUGxheWVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1RyYWNrLmg+Ci0jaW5jbHVkZSA8VmlkZW9FZGl0b3JBdWRpb1BsYXllci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotI2luY2x1ZGUgIlByZXZpZXdQbGF5ZXIuaCIKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6VmlkZW9FZGl0b3JBdWRpb1BsYXllcigKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZhdWRpb1NpbmssCi0gICAgICAgIFByZXZpZXdQbGF5ZXIgKm9ic2VydmVyKQotICAgIDogbUlucHV0QnVmZmVyKE5VTEwpLAotICAgICAgbVNhbXBsZVJhdGUoMCksCi0gICAgICBtTGF0ZW5jeVVzKDApLAotICAgICAgbUZyYW1lU2l6ZSgwKSwKLSAgICAgIG1OdW1GcmFtZXNQbGF5ZWQoMCksCi0gICAgICBtUG9zaXRpb25UaW1lTWVkaWFVcygtMSksCi0gICAgICBtUG9zaXRpb25UaW1lUmVhbFVzKC0xKSwKLSAgICAgIG1TZWVraW5nKGZhbHNlKSwKLSAgICAgIG1SZWFjaGVkRU9TKGZhbHNlKSwKLSAgICAgIG1GaW5hbFN0YXR1cyhPSyksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtSXNGaXJzdEJ1ZmZlcihmYWxzZSksCi0gICAgICBtRmlyc3RCdWZmZXJSZXN1bHQoT0spLAotICAgICAgbUZpcnN0QnVmZmVyKE5VTEwpLAotICAgICAgbUF1ZGlvU2luayhhdWRpb1NpbmspLAotICAgICAgbU9ic2VydmVyKG9ic2VydmVyKSB7Ci0KLSAgICBBTE9HVigiQ29uc3RydWN0b3IiKTsKLSAgICBtQkdBdWRpb1BDTUZpbGVIYW5kbGUgPSBOVUxMOwotICAgIG1BdWRpb1Byb2Nlc3MgPSBOVUxMOwotICAgIG1CR0F1ZGlvUENNRmlsZUxlbmd0aCA9IDA7Ci0gICAgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCA9IDA7Ci0gICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSAwOwotICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCA9IDA7Ci0gICAgbUJHQXVkaW9QQ01GaWxlT3JpZ2luYWxTZWVrUG9pbnQgPSAwOwotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgPSAwOwotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYUJlZ2luQ3V0VFMgPSAwOwotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCA9IDA7Ci0gICAgbVNlZWtUaW1lVXMgPSAwOwotICAgIG1Tb3VyY2UgPSBOVUxMOwotfQotCi1WaWRlb0VkaXRvckF1ZGlvUGxheWVyOjp+VmlkZW9FZGl0b3JBdWRpb1BsYXllcigpIHsKLQotICAgIEFMT0dWKCJEZXN0cnVjdG9yIik7Ci0gICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgfQotICAgIGlmIChtQXVkaW9Qcm9jZXNzICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1BdWRpb1Byb2Nlc3M7Ci0gICAgICAgIG1BdWRpb1Byb2Nlc3MgPSBOVUxMOwotICAgIH0KLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpwYXVzZShib29sIHBsYXlQZW5kaW5nU2FtcGxlcykgewotICAgIEFMT0dWKCJwYXVzZTogcGxheVBlbmRpbmdTYW1wbGVzPSVkIiwgcGxheVBlbmRpbmdTYW1wbGVzKTsKLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0KLSAgICBpZiAocGxheVBlbmRpbmdTYW1wbGVzKSB7Ci0gICAgICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnBhdXNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6Y2xlYXIoKSB7Ci0gICAgQUxPR1YoImNsZWFyIik7Ci0gICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7Ci0gICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKLQotICAgICAgICBtQXVkaW9UcmFjay5jbGVhcigpOwotICAgIH0KLQotICAgIC8vIE1ha2Ugc3VyZSB0byByZWxlYXNlIGFueSBidWZmZXIgd2UgaG9sZCBvbnRvIHNvIHRoYXQgdGhlCi0gICAgLy8gc291cmNlIGlzIGFibGUgdG8gc3RvcCgpLgotCi0gICAgaWYgKG1GaXJzdEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtRmlyc3RCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtSW5wdXRCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigiQXVkaW9QbGF5ZXJCYXNlIHJlbGVhc2luZyBpbnB1dCBidWZmZXIuIik7Ci0KLSAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgbVNvdXJjZS0+c3RvcCgpOwotCi0gICAgLy8gVGhlIGZvbGxvd2luZyBoYWNrIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgT01YCi0gICAgLy8gY29tcG9uZW50IGlzIGNvbXBsZXRlbHkgcmVsZWFzZWQgYnkgdGhlIHRpbWUgd2UgbWF5IHRyeQotICAgIC8vIHRvIGluc3RhbnRpYXRlIGl0IGFnYWluLgotICAgIHdwPE1lZGlhU291cmNlPiB0bXAgPSBtU291cmNlOwotICAgIG1Tb3VyY2UuY2xlYXIoKTsKLSAgICB3aGlsZSAodG1wLnByb21vdGUoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHVzbGVlcCgxMDAwKTsKLSAgICB9Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotCi0gICAgbU51bUZyYW1lc1BsYXllZCA9IDA7Ci0gICAgbVBvc2l0aW9uVGltZU1lZGlhVXMgPSAtMTsKLSAgICBtUG9zaXRpb25UaW1lUmVhbFVzID0gLTE7Ci0gICAgbVNlZWtpbmcgPSBmYWxzZTsKLSAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOwotICAgIG1GaW5hbFN0YXR1cyA9IE9LOwotICAgIG1TdGFydGVkID0gZmFsc2U7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnJlc3VtZSgpIHsKLSAgICBBTE9HVigicmVzdW1lIik7Ci0KLSAgICBBdWRpb01peFNldHRpbmdzIGF1ZGlvTWl4U2V0dGluZ3M7Ci0KLSAgICAvLyBTaW5nbGUgYXVkaW8gcGxheWVyIGlzIHVzZWQ7Ci0gICAgLy8gUGFzcyBvbiB0aGUgYXVkaW8gZHVja2luZyBwYXJhbWV0ZXJzCi0gICAgLy8gd2hpY2ggbWlnaHQgaGF2ZSBjaGFuZ2VkIHdpdGggbmV3IGF1ZGlvIHNvdXJjZQotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfdGhyZXNob2xkID0KLSAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpSW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX2xvd1ZvbHVtZSA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUF1ZGlvTWl4U2V0dGluZ3MtPnVpSW5EdWNraW5nX2xvd1ZvbHVtZSkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2SW5EdWNraW5nX2VuYWJsZSA9Ci0gICAgICAgIG1BdWRpb01peFNldHRpbmdzLT5iSW5EdWNraW5nX2VuYWJsZTsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2UFRWb2xMZXZlbCA9Ci0gICAgICAgICgoTTRPU0FfRmxvYXQpbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhVm9sdW1lVmFsKSAvIDEwMC4wOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZCVFZvbExldmVsID0KLSAgICAgICAgKChNNE9TQV9GbG9hdCltQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRWb2x1bWUpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkJUQ2hhbm5lbENvdW50ID0gbUF1ZGlvTWl4U2V0dGluZ3MtPnVpQlRDaGFubmVsQ291bnQ7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdlBUQ2hhbm5lbENvdW50ID0gbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVsczsKLQotICAgIC8vIENhbGwgdG8gQXVkaW8gbWl4IHBhcmFtIHNldHRpbmcKLSAgICBtQXVkaW9Qcm9jZXNzLT5zZXRNaXhQYXJhbXMoYXVkaW9NaXhTZXR0aW5ncyk7Ci0KLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0KLSAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2Vla1RvKGludDY0X3QgdGltZV91cykgewotICAgIEFMT0dWKCJzZWVrVG86ICVsbGQiLCB0aW1lX3VzKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbVNlZWtpbmcgPSB0cnVlOwotICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMgPSBtUG9zaXRpb25UaW1lTWVkaWFVcyA9IC0xOwotICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7Ci0gICAgbVNlZWtUaW1lVXMgPSB0aW1lX3VzOwotCi0gICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5mbHVzaCgpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjppc1NlZWtpbmcoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIEFMT0dWKCJpc1NlZWtpbmc6IG1TZWVraW5nPSVkIiwgbVNlZWtpbmcpOwotICAgIHJldHVybiBtU2Vla2luZzsKLX0KLQotYm9vbCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpyZWFjaGVkRU9TKHN0YXR1c190ICpmaW5hbFN0YXR1cykgewotICAgIEFMT0dWKCJyZWFjaGVkRU9TOiBzdGF0dXM9JWQiLCBtRmluYWxTdGF0dXMpOwotICAgICpmaW5hbFN0YXR1cyA9IE9LOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAqZmluYWxTdGF0dXMgPSBtRmluYWxTdGF0dXM7Ci0gICAgcmV0dXJuIG1SZWFjaGVkRU9TOwotfQotCi1pbnQ2NF90IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OmdldFJlYWxUaW1lVXMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gZ2V0UmVhbFRpbWVVc19sKCk7Ci19Ci0KLWludDY0X3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6Z2V0UmVhbFRpbWVVc19sKCkgewotICAgIHJldHVybiAtbUxhdGVuY3lVcyArIChtTnVtRnJhbWVzUGxheWVkICogMTAwMDAwMCkgLyBtU2FtcGxlUmF0ZTsKLX0KLQotaW50NjRfdCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpnZXRNZWRpYVRpbWVVcygpIHsKLSAgICBBTE9HVigiZ2V0TWVkaWFUaW1lVXMiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1Qb3NpdGlvblRpbWVNZWRpYVVzIDwgMCB8fCBtUG9zaXRpb25UaW1lUmVhbFVzIDwgMCkgewotICAgICAgICBpZiAobVNlZWtpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBtU2Vla1RpbWVVczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGludDY0X3QgcmVhbFRpbWVPZmZzZXQgPSBnZXRSZWFsVGltZVVzX2woKSAtIG1Qb3NpdGlvblRpbWVSZWFsVXM7Ci0gICAgaWYgKHJlYWxUaW1lT2Zmc2V0IDwgMCkgewotICAgICAgICByZWFsVGltZU9mZnNldCA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1Qb3NpdGlvblRpbWVNZWRpYVVzICsgcmVhbFRpbWVPZmZzZXQ7Ci19Ci0KLWJvb2wgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6Z2V0TWVkaWFUaW1lTWFwcGluZygKLSAgICAgICAgaW50NjRfdCAqcmVhbHRpbWVfdXMsIGludDY0X3QgKm1lZGlhdGltZV91cykgewotICAgIEFMT0dWKCJnZXRNZWRpYVRpbWVNYXBwaW5nIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICpyZWFsdGltZV91cyA9IG1Qb3NpdGlvblRpbWVSZWFsVXM7Ci0gICAgKm1lZGlhdGltZV91cyA9IG1Qb3NpdGlvblRpbWVNZWRpYVVzOwotCi0gICAgcmV0dXJuIG1Qb3NpdGlvblRpbWVSZWFsVXMgIT0gLTEgJiYgbVBvc2l0aW9uVGltZU1lZGlhVXMgIT0gLTE7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0U291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIC8vIEJlZm9yZSBzZXR0aW5nIHNvdXJjZSwgc3RvcCBhbnkgZXhpc3Rpbmcgc291cmNlLgotICAgIC8vIE1ha2Ugc3VyZSB0byByZWxlYXNlIGFueSBidWZmZXIgd2UgaG9sZCBvbnRvIHNvIHRoYXQgdGhlCi0gICAgLy8gc291cmNlIGlzIGFibGUgdG8gc3RvcCgpLgotCi0gICAgaWYgKG1GaXJzdEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtRmlyc3RCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtSW5wdXRCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllciByZWxlYXNpbmcgaW5wdXQgYnVmZmVyLiIpOwotCi0gICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwotICAgICAgICBtU291cmNlLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgbVNvdXJjZSA9IHNvdXJjZTsKLSAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOwotfQotCi1zcDxNZWRpYVNvdXJjZT4gVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6Z2V0U291cmNlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIG1Tb3VyY2U7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0T2JzZXJ2ZXIoUHJldmlld1BsYXllciAqb2JzZXJ2ZXIpIHsKLSAgICBBTE9HVigic2V0T2JzZXJ2ZXIiKTsKLSAgICAvL0NIRUNLKCFtU3RhcnRlZCk7Ci0gICAgbU9ic2VydmVyID0gb2JzZXJ2ZXI7Ci19Ci0KLWJvb2wgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6aXNTdGFydGVkKCkgewotICAgIHJldHVybiBtU3RhcnRlZDsKLX0KLQotLy8gc3RhdGljCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OkF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICp1c2VyLCB2b2lkICppbmZvKSB7Ci0gICAgc3RhdGljX2Nhc3Q8VmlkZW9FZGl0b3JBdWRpb1BsYXllciAqPih1c2VyKS0+QXVkaW9DYWxsYmFjayhldmVudCwgaW5mbyk7Ci19Ci0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbykgewotICAgIGlmIChldmVudCAhPSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87Ci0gICAgc2l6ZV90IG51bUJ5dGVzV3JpdHRlbiA9IGZpbGxCdWZmZXIoYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSk7Ci0KLSAgICBidWZmZXItPnNpemUgPSBudW1CeXRlc1dyaXR0ZW47Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnN0YXJ0KGJvb2wgc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0gICAgQ0hFQ0sobVNvdXJjZSAhPSBOVUxMKTsKLSAgICBBTE9HVigiU3RhcnQiKTsKLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgTTRPU0FfRVJSIHJlc3VsdCA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIHN0YXJ0VGltZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHNlZWtUaW1lU3RhbXAgPSAwOwotICAgIE00T1NBX0Jvb2wgYlN0b3J5Qm9hcmRUU0JleW9uZEJURW5kQ3V0VGltZSA9IE00T1NBX0ZBTFNFOwotCi0gICAgaWYgKCFzb3VyY2VBbHJlYWR5U3RhcnRlZCkgewotICAgICAgICBlcnIgPSBtU291cmNlLT5zdGFydCgpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIHRoZSBCRyBBdWRpbyBoYW5kbGVyCi0gICAgbUF1ZGlvUHJvY2VzcyA9IG5ldyBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nKCk7Ci0gICAgQXVkaW9NaXhTZXR0aW5ncyBhdWRpb01peFNldHRpbmdzOwotCi0gICAgLy8gUGFzcyBvbiB0aGUgYXVkaW8gZHVja2luZyBwYXJhbWV0ZXJzCi0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkluRHVja2luZ190aHJlc2hvbGQgPQotICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlJbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfbG93Vm9sdW1lID0KLSAgICAgICAgKChNNE9TQV9GbG9hdCltQXVkaW9NaXhTZXR0aW5ncy0+dWlJbkR1Y2tpbmdfbG93Vm9sdW1lKSAvIDEwMC4wOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZJbkR1Y2tpbmdfZW5hYmxlID0KLSAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPmJJbkR1Y2tpbmdfZW5hYmxlOwotICAgIGF1ZGlvTWl4U2V0dGluZ3MubHZQVFZvbExldmVsID0KLSAgICAgICAgKChNNE9TQV9GbG9hdCltQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWwpIC8gMTAwLjA7Ci0gICAgYXVkaW9NaXhTZXR0aW5ncy5sdkJUVm9sTGV2ZWwgPQotICAgICAgICAoKE00T1NBX0Zsb2F0KW1BdWRpb01peFNldHRpbmdzLT51aUFkZFZvbHVtZSkgLyAxMDAuMDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2QlRDaGFubmVsQ291bnQgPSBtQXVkaW9NaXhTZXR0aW5ncy0+dWlCVENoYW5uZWxDb3VudDsKLSAgICBhdWRpb01peFNldHRpbmdzLmx2UFRDaGFubmVsQ291bnQgPSBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzOwotCi0gICAgLy8gQ2FsbCB0byBBdWRpbyBtaXggcGFyYW0gc2V0dGluZwotICAgIG1BdWRpb1Byb2Nlc3MtPnNldE1peFBhcmFtcyhhdWRpb01peFNldHRpbmdzKTsKLQotICAgIC8vIEdldCB0aGUgQkcgQXVkaW8gUENNIGZpbGUgZGV0YWlscwotICAgIGlmICggbUJHQXVkaW9QQ01GaWxlSGFuZGxlICkgewotCi0gICAgICAgIC8vIFRPRE8gOiAzMmJpdHMgcmVxdWlyZWQgZm9yIE9TQUwsIHRvIGJlIHVwZGF0ZWQgb25jZSBPU0FMIGlzIHVwZGF0ZWQKLSAgICAgICAgTTRPU0FfVUludDMyIHRtcDMyID0gMDsKLSAgICAgICAgcmVzdWx0ID0gTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24obUJHQXVkaW9QQ01GaWxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKiopJnRtcDMyKTsKLSAgICAgICAgbUJHQXVkaW9QQ01GaWxlTGVuZ3RoID0gdG1wMzI7Ci0gICAgICAgIG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggPSBtQkdBdWRpb1BDTUZpbGVMZW5ndGg7Ci0KLQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c3RhcnQgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemUgPSAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVMZW5ndGgpOwotCi0gICAgICAgIC8vIEdldCB0aGUgZHVyYXRpb24gaW4gdGltZSBvZiB0aGUgYXVkaW8gQlQKLSAgICAgICAgaWYgKCByZXN1bHQgPT0gTTROT19FUlJPUiApIHsKLSAgICAgICAgIEFMT0dWKCJWRUFQOiBjaGFubmVscyA9ICUiIFBSSXUzMiAiIGZyZXEgPSAlIiBQUkl1MzIsCi0gICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzLCAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotCi0gICAgICAgICAgICAvLyBObyB0cmltCi0gICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiA9ICgoCi0gICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KShtQkdBdWRpb1BDTUZpbGVMZW5ndGgvc2l6ZW9mKE00T1NBX1VJbnQxNikvCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMpKSoxMDAwICkgLwotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLQotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OiBiZWdpbkN1dE1zICVkICwgZW5kQ3V0TXMgJWQiLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KSBtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNcywKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkgbUF1ZGlvTWl4U2V0dGluZ3MtPmVuZEN1dE1zKTsKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSB0cmltIHBhcnQKLSAgICAgICAgICAgIGlmICgobUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXMgPT0gMCkgJiYKLSAgICAgICAgICAgICAgICAobUF1ZGlvTWl4U2V0dGluZ3MtPmVuZEN1dE1zICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgLy8gRW5kIHRpbWUgaXRzZWxmIHRoZSBmaWxlIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24gPSBtQXVkaW9NaXhTZXR0aW5ncy0+ZW5kQ3V0TXM7Ci0gICAgICAgICAgICAgICAgLy8gTGltaXQgdGhlIGZpbGUgbGVuZ3RoIGFsc28KLSAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoID0gKCgKLSAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KShtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiAqCi0gICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSkgKgotICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscykgKgotICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00T1NBX1VJbnQxNikpIC8gMTAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKChtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNcyAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgKG1BdWRpb01peFNldHRpbmdzLT5lbmRDdXRNcyA9PSBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAvLyBFbmQgdGltZSBpdHNlbGYgdGhlIGZpbGUgZHVyYXRpb24KLSAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiA9IG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uIC0KLSAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNczsKLSAgICAgICAgICAgICAgICAvLyBMaW1pdCB0aGUgZmlsZSBsZW5ndGggYWxzbwotICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggPSAoKAotICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKG1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uICoKLSAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5KSAqCi0gICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzKSAqCi0gICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRPU0FfVUludDE2KSkgLyAxMDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoKG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgIChtQXVkaW9NaXhTZXR0aW5ncy0+ZW5kQ3V0TXMgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICAvLyBFbmQgdGltZSBpdHNlbGYgdGhlIGZpbGUgZHVyYXRpb24KLSAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiA9IG1BdWRpb01peFNldHRpbmdzLT5lbmRDdXRNcyAtCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zOwotICAgICAgICAgICAgICAgIC8vIExpbWl0IHRoZSBmaWxlIGxlbmd0aCBhbHNvCi0gICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlVHJpbW1lZExlbmd0aCA9ICgoCi0gICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KShtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiAqCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5KSAqCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aU5iQ2hhbm5lbHMpICoKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00T1NBX1VJbnQxNikpIC8gMTAwMDsgLyptYWtlIHRvIHNlYyBmcm9tIG1zKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6IGZpbGUgZHVyYXRpb24gcmVjb3JkZWQgOiAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlRHVyYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGFzdCBwbGF5ZWQgbG9jYXRpb24gdG8gYmUgc2Vla2VkIGF0IGZvciBuZXh0IG1lZGlhIGl0ZW0KLSAgICAgICAgaWYgKCByZXN1bHQgPT0gTTROT19FUlJPUiApIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjptQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wICVsbGQiLAotICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wKTsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjp1aUFkZEN0cyAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aUFkZEN0cyk7Ci0gICAgICAgICAgICBpZiAobUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCA+PSBtQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRDdHMpIHsKLSAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSAobUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCAtCi0gICAgICAgICAgICAgICAgIG1BdWRpb01peFNldHRpbmdzLT51aUFkZEN0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvUGxheWVyOjpzdGFydFRpbWUgJSIgUFJJdTMyLCBzdGFydFRpbWUpOwotICAgICAgICAgICAgc2Vla1RpbWVTdGFtcCA9IDA7Ci0gICAgICAgICAgICBpZiAoc3RhcnRUaW1lKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0VGltZSA+PSBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQkcgdHJhY2sgc2hvdWxkIGJlIGxvb3BlZCBhbmQgc3RhcnRlZCBhZ2FpbgotICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvTWl4U2V0dGluZ3MtPmJMb29wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgYmVnaW4gY3V0IHRpbWUgdG8gdGhlIG1vZCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVTdGFtcCA9ICgoc3RhcnRUaW1lJW1CR0F1ZGlvUENNRmlsZUR1cmF0aW9uKSArCi0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNcyk7Ci0gICAgICAgICAgICAgICAgICAgIH1lbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvb3BpbmcgZGlzYWJsZWQsIGRvbm90IGRvIEJUIE1peCAsIHNldCB0byBmaWxlIGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vla1RpbWVTdGFtcCA9IChtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbiArCi0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEJUIHN0aWxsIHByZXNlbnQgLCBqdXN0IHNlZWsgdG8gc3RvcnkgYm9hcmQgdGltZQotICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVN0YW1wID0gc3RhcnRUaW1lICsgbUF1ZGlvTWl4U2V0dGluZ3MtPmJlZ2luQ3V0TXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2Vla1RpbWVTdGFtcCA9IG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBzZWVrVGltZVN0YW1wIHRvIGZpbGUgbG9jYXRpb24KLSAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50ID0gKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KShtQXVkaW9NaXhTZXR0aW5ncy0+YmVnaW5DdXRNcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1BdWRpb01peFNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtQXVkaW9NaXhTZXR0aW5ncy0+dWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDE2KSkvIDEwMDAgOyAvKm1ha2UgdG8gc2VjIGZyb20gbXMqLwotCi0gICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgPSAoKGludDY0X3QpKHNlZWtUaW1lU3RhbXApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQxNikpLyAxMDAwIDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFdlIGFsbG93IGFuIG9wdGlvbmFsIElORk9fRk9STUFUX0NIQU5HRUQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nCi0gICAgLy8gb2YgcGxheWJhY2ssIGlmIHRoZXJlIGlzIG9uZSwgZ2V0Rm9ybWF0IGJlbG93IHdpbGwgcmV0cmlldmUgdGhlCi0gICAgLy8gdXBkYXRlZCBmb3JtYXQsIGlmIHRoZXJlIGlzbid0LCB3ZSdsbCBzdGFzaCBhd2F5IHRoZSB2YWxpZCBidWZmZXIKLSAgICAvLyBvZiBkYXRhIHRvIGJlIHVzZWQgb24gdGhlIGZpcnN0IGF1ZGlvIGNhbGxiYWNrLgotCi0gICAgQ0hFQ0sobUZpcnN0QnVmZmVyID09IE5VTEwpOwotCi0gICAgbUZpcnN0QnVmZmVyUmVzdWx0ID0gbVNvdXJjZS0+cmVhZCgmbUZpcnN0QnVmZmVyKTsKLSAgICBpZiAobUZpcnN0QnVmZmVyUmVzdWx0ID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKLSAgICAgICAgQUxPR1YoIklORk9fRk9STUFUX0NIQU5HRUQhISEiKTsKLQotICAgICAgICBDSEVDSyhtRmlyc3RCdWZmZXIgPT0gTlVMTCk7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlclJlc3VsdCA9IE9LOwotICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1Jc0ZpcnN0QnVmZmVyID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBib29sIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOwotICAgIENIRUNLKHN1Y2Nlc3MpOwotICAgIENIRUNLKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpOwotCi0gICAgc3VjY2VzcyA9IGZvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmbVNhbXBsZVJhdGUpOwotICAgIENIRUNLKHN1Y2Nlc3MpOwotCi0gICAgaW50MzJfdCBudW1DaGFubmVsczsKLSAgICBzdWNjZXNzID0gZm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKLQotICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+b3BlbigKLSAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMsIENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCi0gICAgICAgICAgICAgICAgREVGQVVMVF9BVURJT1NJTktfQlVGRkVSQ09VTlQsCi0gICAgICAgICAgICAgICAgJlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OkF1ZGlvU2lua0NhbGxiYWNrLCB0aGlzKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKG1GaXJzdEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFzb3VyY2VBbHJlYWR5U3RhcnRlZCkgewotICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIG1MYXRlbmN5VXMgPSAoaW50NjRfdCltQXVkaW9TaW5rLT5sYXRlbmN5KCkgKiAxMDAwOwotICAgICAgICBtRnJhbWVTaXplID0gbUF1ZGlvU2luay0+ZnJhbWVTaXplKCk7Ci0KLSAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgbVNhbXBsZVJhdGUsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAotICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChudW1DaGFubmVscyksCi0gICAgICAgICAgICAgICAgMCAvKmZyYW1lQ291bnQqLywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJkF1ZGlvQ2FsbGJhY2ssIHRoaXMsCi0gICAgICAgICAgICAgICAgMCAvKm5vdGlmaWNhdGlvbkZyYW1lcyovKTsKLQotICAgICAgICBpZiAoKGVyciA9IG1BdWRpb1RyYWNrLT5pbml0Q2hlY2soKSkgIT0gT0spIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtTGF0ZW5jeVVzID0gKGludDY0X3QpbUF1ZGlvVHJhY2stPmxhdGVuY3koKSAqIDEwMDA7Ci0gICAgICAgIG1GcmFtZVNpemUgPSBtQXVkaW9UcmFjay0+ZnJhbWVTaXplKCk7Ci0KLSAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6cmVzZXQoKSB7Ci0KLSAgICBBTE9HVigicmVzZXQiKTsKLSAgICBjbGVhcigpOwotCi0gICAgLy8gQ2FwdHVyZSB0aGUgY3VycmVudCBzZWVrIHBvaW50Ci0gICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gMDsKLSAgICBtQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wID0wOwotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYUJlZ2luQ3V0VFM9MDsKLX0KLQotc2l6ZV90IFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OkF1ZGlvU2lua0NhbGxiYWNrKAotICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luayAqYXVkaW9TaW5rLAotICAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCB2b2lkICpjb29raWUsCi0gICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KSB7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqbWUgPSAoVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqKWNvb2tpZTsKLQotICAgIGlmIChldmVudCA9PSBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfRklMTF9CVUZGRVIgKSB7Ci0gICAgICAgIHJldHVybiBtZS0+ZmlsbEJ1ZmZlcihidWZmZXIsIHNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotCi1zaXplX3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6ZmlsbEJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotCi0gICAgaWYgKG1SZWFjaGVkRU9TKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHNpemVfdCBzaXplX2RvbmUgPSAwOwotICAgIHNpemVfdCBzaXplX3JlbWFpbmluZyA9IHNpemU7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNEFNX0J1ZmZlcjE2IGJnRnJhbWUgPSB7TlVMTCwgMH07Ci0gICAgTTRBTV9CdWZmZXIxNiBtaXhGcmFtZSA9IHtOVUxMLCAwfTsKLSAgICBNNEFNX0J1ZmZlcjE2IHB0RnJhbWUgPSB7TlVMTCwgMH07Ci0gICAgaW50NjRfdCBjdXJyZW50U3RlYW1UUyA9IDA7Ci0gICAgaW50NjRfdCBzdGFydFRpbWVGb3JCVCA9IDA7Ci0gICAgTTRPU0FfRmxvYXQgZlBUVm9sTGV2ZWwgPQotICAgICAoKE00T1NBX0Zsb2F0KW1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYVZvbHVtZVZhbCkvMTAwOwotICAgIE00T1NBX0ludDE2ICAgICAqcFBUTWRhdGE9TlVMTDsKLSAgICBNNE9TQV9VSW50MzIgICAgIHVpUENNc2l6ZSA9IDA7Ci0KLSAgICBib29sIHBvc3RTZWVrQ29tcGxldGUgPSBmYWxzZTsKLSAgICBib29sIHBvc3RFT1MgPSBmYWxzZTsKLQotICAgIHdoaWxlICgoc2l6ZV9yZW1haW5pbmcgPiAwKSYmKGVycj09TTROT19FUlJPUikpIHsKLSAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgIGlmIChtU2Vla2luZykgewotICAgICAgICAgICAgICAgIGlmIChtSXNGaXJzdEJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKLQotICAgICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU2Vla2luZyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgaWYgKG1PYnNlcnZlcikgewotICAgICAgICAgICAgICAgICAgICBwb3N0U2Vla0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlucHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOwotCi0gICAgICAgICAgICBpZiAobUlzRmlyc3RCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBtRmlyc3RCdWZmZXI7Ci0gICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBtRmlyc3RCdWZmZXJSZXN1bHQ7Ci0KLSAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIERhdGEgaXMgUHJpbWFyeSBUcmFjaywgbWl4IHdpdGggYmFja2dyb3VuZCB0cmFjawotICAgICAgICAgICAgICAgIC8vIGFmdGVyIHJlYWRpbmcgc2FtZSBzaXplIGZyb20gQmFja2dyb3VuZCB0cmFjayBQQ00gZmlsZQotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBNaXggb25seSB3aGVuIHNraW0gcG9pbnQgaXMgYWZ0ZXIgc3RhcnRUaW1lIG9mIEJUCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAqIDEwMDApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Qb3NpdGlvblRpbWVNZWRpYVVzIC0gbVNlZWtUaW1lVXMpKSA+PQotICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkobUF1ZGlvTWl4U2V0dGluZ3MtPnVpQWRkQ3RzICogMTAwMCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OklOU0lERSBNSVhJTkciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDaGVja2luZyAlbGxkIDw9ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludC1tQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVUcmltbWVkTGVuZ3RoKTsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWludGVycHJldF9jYXN0PE00T1NBX1ZvaWQqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KG1JbnB1dEJ1ZmZlci0+ZGF0YSgpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGVuID0gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgZnAgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB1aVBDTXNpemUgPSAobUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkvMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQVE1kYXRhID0gKE00T1NBX0ludDE2KikgKCh1aW50OF90KikgbUlucHV0QnVmZmVyLT5kYXRhKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1peCB3aXRoIGJhY2tncm91bmQgbWFsbG9jIHRvIGRvIGxlbiAlZCIsIGxlbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJnRnJhbWUubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9VSW50MTYqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggbGVuLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiYmdGcmFtZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmdGcmFtZS5tX2J1ZmZlclNpemUgPSBsZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1peEZyYW1lLm1fZGF0YUFkZHJlc3MgPSAoTTRPU0FfVUludDE2KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikibWl4RnJhbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1peEZyYW1lLm1fYnVmZmVyU2l6ZSA9IGxlbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1peCB3aXRoIGJnbSB3aXRoIHNpemUgJWxsZCIsIG1CR0F1ZGlvUENNRmlsZUxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Qb3NpdGlvblRpbWVNZWRpYVVzKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVPcmlnaW5hbFNlZWtQb2ludCA8PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGggLSBsZW4pKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiQ2hlY2tpbmcgbUJHQXVkaW9QQ01GaWxlSGFuZGxlICVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVIYW5kbGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CR0F1ZGlvUENNRmlsZUhhbmRsZSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsQnVmZmVyIHNlZWtpbmcgZmlsZSB0byAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogMzJiaXRzIHJlcXVpcmVkIGZvciBPU0FMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0bXAzMiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKW1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfZmlsZVJlYWRTZWVrKG1CR0F1ZGlvUENNRmlsZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9GaWxlUG9zaXRpb24qKSZ0bXAzMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ID0gdG1wMzI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJNNE9TQV9maWxlUmVhZFNlZWsgZXJyICVkIiwoaW50KWVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9maWxlUmVhZERhdGEobUJHQXVkaW9QQ01GaWxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDgqKWJnRnJhbWUubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE00V0FSX05PX0RBVEFfWUVUICkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmlsbEJ1ZmZlciBFbmQgb2YgZmlsZSByZWFjaGVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSByZWFjaGVkIHRoZSBlbmQgb2YgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB0byBiZWdpbiBjdXQgdGltZSBlcXVhbCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb01peFNldHRpbmdzLT5iTG9vcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGludDY0X3QpKG1BdWRpb01peFNldHRpbmdzLT5iZWdpbkN1dE1zKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4U2V0dGluZ3MtPnVpTmJDaGFubmVscyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00T1NBX1VJbnQxNikpIC8gMTAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmlsbEJ1ZmZlciBMb29waW5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1peGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIHZvbHVtZSBvZiBwcmltYXJ5IHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZQVFZvbExldmVsIDwgMS4wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByaW1hcnlUcmFja1ZvbHVtZShwUFRNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpUENNc2l6ZSwgZlBUVm9sTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gTTROT19FUlJPUiApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmlsZVJlYWREYXRhIGZvciBhdWRpbyBlcnIgJWQiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJHQXVkaW9QQ01GaWxlU2Vla1BvaW50ICs9IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsQnVmZmVyIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVsbGQiLCBtQkdBdWRpb1BDTUZpbGVTZWVrUG9pbnQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBc3NpZ24gdGhlIHB0ciBkYXRhIHRvIHByaW1hcnkgdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0RnJhbWUubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9VSW50MTYqKXB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0RnJhbWUubV9idWZmZXJTaXplID0gbGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHRvIG1peCBhbmQgZHVjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUHJvY2Vzcy0+bWl4QW5kRHVjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0RnJhbWUsICZiZ0ZyYW1lLCAmbWl4RnJhbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIHRoZSBkZWNvZGVkIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1peEZyYW1lLm1fZGF0YUFkZHJlc3MsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdWRpb01peFNldHRpbmdzLT5iTG9vcCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSB0byBiZWdpbiBjdXQgdGltZSBlcXVhbCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBtaXhpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIHZvbHVtZSBsZXZlbCBvZiBwcmltYXJ5IHRyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZlBUVm9sTGV2ZWwgPCAxLjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJpbWFyeVRyYWNrVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUFRNZGF0YSwgdWlQQ01zaXplLCBmUFRWb2xMZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJnRnJhbWUubV9kYXRhQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoYmdGcmFtZS5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaXhGcmFtZS5tX2RhdGFBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtaXhGcmFtZS5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1peGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgY2FyZSBvZiB2b2x1bWUgbGV2ZWwgb2YgcHJpbWFyeSB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZlBUVm9sTGV2ZWwgPCAxLjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcmltYXJ5VHJhY2tWb2x1bWUocFBUTWRhdGEsIHVpUENNc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUFRWb2xMZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKChzdGF0dXMgPT0gT0sgJiYgbUlucHV0QnVmZmVyICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgfHwgKHN0YXR1cyAhPSBPSyAmJiBtSW5wdXRCdWZmZXIgPT0gTlVMTCkpOwotCi0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImZpbGxCdWZmZXI6IG1Tb3VyY2UtPnJlYWQgcmV0dXJuZWQgZXJyICVkIiwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBpZiAobU9ic2VydmVyICYmICFtUmVhY2hlZEVPUykgewotICAgICAgICAgICAgICAgICAgICBwb3N0RU9TID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUZpbmFsU3RhdHVzID0gc3RhdHVzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgJm1Qb3NpdGlvblRpbWVNZWRpYVVzKSk7Ci0KLSAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMgPQotICAgICAgICAgICAgICAgICgobU51bUZyYW1lc1BsYXllZCArIHNpemVfZG9uZSAvIG1GcmFtZVNpemUpICogMTAwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgLyBtU2FtcGxlUmF0ZTsKLQotICAgICAgICAgICAgQUxPR1YoImJ1ZmZlci0+c2l6ZSgpID0gJWQsICIKLSAgICAgICAgICAgICAgICAgICAgICJtUG9zaXRpb25UaW1lTWVkaWFVcz0lLjJmIG1Qb3NpdGlvblRpbWVSZWFsVXM9JS4yZiIsCi0gICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzIC8gMUU2LCBtUG9zaXRpb25UaW1lUmVhbFVzIC8gMUU2KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgY29weSA9IHNpemVfcmVtYWluaW5nOwotICAgICAgICBpZiAoY29weSA+IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIGNvcHkgPSBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtY3B5KChjaGFyICopZGF0YSArIHNpemVfZG9uZSwKLSAgICAgICAgICAgKGNvbnN0IGNoYXIgKiltSW5wdXRCdWZmZXItPmRhdGEoKSArIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICBjb3B5KTsKLQotICAgICAgICBtSW5wdXRCdWZmZXItPnNldF9yYW5nZShtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpICsgY29weSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gY29weSk7Ci0KLSAgICAgICAgc2l6ZV9kb25lICs9IGNvcHk7Ci0gICAgICAgIHNpemVfcmVtYWluaW5nIC09IGNvcHk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBtTnVtRnJhbWVzUGxheWVkICs9IHNpemVfZG9uZSAvIG1GcmFtZVNpemU7Ci0gICAgfQotCi0gICAgaWYgKHBvc3RFT1MpIHsKLSAgICAgICAgbU9ic2VydmVyLT5wb3N0QXVkaW9FT1MoKTsKLSAgICB9Ci0KLSAgICBpZiAocG9zdFNlZWtDb21wbGV0ZSkgewotICAgICAgICBtT2JzZXJ2ZXItPnBvc3RBdWRpb1NlZWtDb21wbGV0ZSgpOwotICAgIH0KLQotICAgIHJldHVybiBzaXplX2RvbmU7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0QXVkaW9NaXhTZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpIHsKLSAgICBtQXVkaW9NaXhTZXR0aW5ncyA9IHBBdWRpb01peFNldHRpbmdzOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldEF1ZGlvTWl4UENNRmlsZUhhbmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IHBCR0F1ZGlvUENNRmlsZUhhbmRsZSl7Ci0gICAgbUJHQXVkaW9QQ01GaWxlSGFuZGxlID0gcEJHQXVkaW9QQ01GaWxlSGFuZGxlOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXI6OnNldEF1ZGlvTWl4U3RvcnlCb2FyZFNraW1UaW1lU3RhbXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHBCR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHBCR0F1ZGlvQ3VycmVudE1lZGlhQmVnaW5DdXRUUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9DdXJyZW50TWVkaWFWb2x1bWVWYWwpIHsKLQotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZFNraW1UaW1lU3RhbXAgPSBwQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wOwotICAgIG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYUJlZ2luQ3V0VFMgPSBwQkdBdWRpb0N1cnJlbnRNZWRpYUJlZ2luQ3V0VFM7Ci0gICAgbUJHQXVkaW9TdG9yeUJvYXJkQ3VycmVudE1lZGlhVm9sdW1lVmFsID0gcEJHQXVkaW9DdXJyZW50TWVkaWFWb2x1bWVWYWw7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JBdWRpb1BsYXllcjo6c2V0UHJpbWFyeVRyYWNrVm9sdW1lKAotICAgIE00T1NBX0ludDE2ICpkYXRhLCBNNE9TQV9VSW50MzIgc2l6ZSwgTTRPU0FfRmxvYXQgdm9sTGV2ZWwpIHsKLQotICAgIHdoaWxlKHNpemUtLSA+IDApIHsKLSAgICAgICAgKmRhdGEgPSAoTTRPU0FfSW50MTYpKCgqZGF0YSkqdm9sTGV2ZWwpOwotICAgICAgICBkYXRhKys7Ci0gICAgfQotfQotCi19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyY2FmNWU4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JBdWRpb1BsYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFZFX0FVRElPX1BMQVlFUl9IXwotI2RlZmluZSBWRV9BVURJT19QTEFZRVJfSF8KLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9UaW1lU291cmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSAiTTR4VlNTX0FQSS5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yTWFpbi5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZWRpYVNvdXJjZTsKLWNsYXNzIEF1ZGlvVHJhY2s7Ci1jbGFzcyBQcmV2aWV3UGxheWVyOwotCi1jbGFzcyBWaWRlb0VkaXRvckF1ZGlvUGxheWVyIDogcHVibGljIFRpbWVTb3VyY2UgewotcHVibGljOgotICAgIGVudW0gewotICAgICAgICBSRUFDSEVEX0VPUywKLSAgICAgICAgU0VFS19DT01QTEVURQotICAgIH07Ci0KLSAgICBWaWRlb0VkaXRvckF1ZGlvUGxheWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rLAotICAgICAgICBQcmV2aWV3UGxheWVyICphdWRpb09ic2VydmVyID0gTlVMTCk7Ci0KLSAgICB+VmlkZW9FZGl0b3JBdWRpb1BsYXllcigpOwotCi0gICAgLy8gUmV0dXJuIHRpbWUgaW4gdXMuCi0gICAgaW50NjRfdCBnZXRSZWFsVGltZVVzKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgYnVmZmVyIHBsYXllZCAoaW4gdXMpLgotICAgIGludDY0X3QgZ2V0TWVkaWFUaW1lVXMoKTsKLQotICAgIC8vIFJldHVybnMgdHJ1ZSBpZmYgYSBtYXBwaW5nIGlzIGVzdGFibGlzaGVkLCBpLmUuIHRoZSBBdWRpb1BsYXllckJhc2UKLSAgICAvLyBoYXMgcGxheWVkIGF0IGxlYXN0IG9uZSBmcmFtZSBvZiBhdWRpby4KLSAgICBib29sIGdldE1lZGlhVGltZU1hcHBpbmcoaW50NjRfdCAqcmVhbHRpbWVfdXMsIGludDY0X3QgKm1lZGlhdGltZV91cyk7Ci0KLSAgICBzdGF0dXNfdCBzdGFydChib29sIHNvdXJjZUFscmVhZHlTdGFydGVkID0gZmFsc2UpOwotICAgIHZvaWQgcGF1c2UoYm9vbCBwbGF5UGVuZGluZ1NhbXBsZXMgPSBmYWxzZSk7Ci0gICAgc3RhdHVzX3QgcmVzdW1lKCk7Ci0gICAgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3QgdGltZV91cyk7Ci0gICAgYm9vbCBpc1NlZWtpbmcoKTsKLSAgICBib29sIHJlYWNoZWRFT1Moc3RhdHVzX3QgKmZpbmFsU3RhdHVzKTsKLQotICAgIHZvaWQgc2V0QXVkaW9NaXhTZXR0aW5ncyhNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpOwotICAgIHZvaWQgc2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKE00T1NBX0NvbnRleHQgcEJHQXVkaW9QQ01GaWxlSGFuZGxlKTsKLSAgICB2b2lkIHNldEF1ZGlvTWl4U3RvcnlCb2FyZFNraW1UaW1lU3RhbXAoCi0gICAgICAgIE00T1NBX1VJbnQzMiBwQkdBdWRpb1N0b3J5Qm9hcmRTa2ltVGltZVN0YW1wLAotICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9DdXJyZW50TWVkaWFCZWdpbkN1dFRTLAotICAgICAgICBNNE9TQV9VSW50MzIgcEJHQXVkaW9DdXJyZW50TWVkaWFWb2x1bWVWYWwpOwotCi0gICAgdm9pZCBzZXRPYnNlcnZlcihQcmV2aWV3UGxheWVyICpvYnNlcnZlcik7Ci0gICAgdm9pZCBzZXRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwotICAgIHNwPE1lZGlhU291cmNlPiBnZXRTb3VyY2UoKTsKLQotICAgIGJvb2wgaXNTdGFydGVkKCk7Ci1wcml2YXRlOgotCi0gICAgTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MgKm1BdWRpb01peFNldHRpbmdzOwotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcgKm1BdWRpb1Byb2Nlc3M7Ci0KLSAgICBNNE9TQV9Db250ZXh0IG1CR0F1ZGlvUENNRmlsZUhhbmRsZTsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZUxlbmd0aDsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZVRyaW1tZWRMZW5ndGg7Ci0gICAgaW50NjRfdCBtQkdBdWRpb1BDTUZpbGVEdXJhdGlvbjsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZVNlZWtQb2ludDsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvUENNRmlsZU9yaWdpbmFsU2Vla1BvaW50OwotICAgIGludDY0X3QgbUJHQXVkaW9TdG9yeUJvYXJkU2tpbVRpbWVTdGFtcDsKLSAgICBpbnQ2NF90IG1CR0F1ZGlvU3RvcnlCb2FyZEN1cnJlbnRNZWRpYUJlZ2luQ3V0VFM7Ci0gICAgaW50NjRfdCBtQkdBdWRpb1N0b3J5Qm9hcmRDdXJyZW50TWVkaWFWb2x1bWVWYWw7Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKLSAgICBzcDxBdWRpb1RyYWNrPiBtQXVkaW9UcmFjazsKLQotICAgIE1lZGlhQnVmZmVyICptSW5wdXRCdWZmZXI7Ci0KLSAgICBpbnQgbVNhbXBsZVJhdGU7Ci0gICAgaW50NjRfdCBtTGF0ZW5jeVVzOwotICAgIHNpemVfdCBtRnJhbWVTaXplOwotCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgaW50NjRfdCBtTnVtRnJhbWVzUGxheWVkOwotCi0gICAgaW50NjRfdCBtUG9zaXRpb25UaW1lTWVkaWFVczsKLSAgICBpbnQ2NF90IG1Qb3NpdGlvblRpbWVSZWFsVXM7Ci0KLSAgICBib29sIG1TZWVraW5nOwotICAgIGJvb2wgbVJlYWNoZWRFT1M7Ci0gICAgc3RhdHVzX3QgbUZpbmFsU3RhdHVzOwotICAgIGludDY0X3QgbVNlZWtUaW1lVXM7Ci0KLSAgICBib29sIG1TdGFydGVkOwotCi0gICAgYm9vbCBtSXNGaXJzdEJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBtRmlyc3RCdWZmZXJSZXN1bHQ7Ci0gICAgTWVkaWFCdWZmZXIgKm1GaXJzdEJ1ZmZlcjsKLQotICAgIHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwotICAgIFByZXZpZXdQbGF5ZXIgKm1PYnNlcnZlcjsKLQotICAgIHN0YXRpYyB2b2lkIEF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICp1c2VyLCB2b2lkICppbmZvKTsKLSAgICB2b2lkIEF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKTsKLSAgICBzaXplX3QgZmlsbEJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdGljIHNpemVfdCBBdWRpb1NpbmtDYWxsYmFjaygKLSAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rICphdWRpb1NpbmssCi0gICAgICAgICAgICB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgdm9pZCAqbWUsCi0gICAgICAgICAgICBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Y2JfZXZlbnRfdCBldmVudCk7Ci0KLSAgICB2b2lkIHJlc2V0KCk7Ci0gICAgdm9pZCBjbGVhcigpOwotICAgIGludDY0X3QgZ2V0UmVhbFRpbWVVc19sKCk7Ci0gICAgdm9pZCBzZXRQcmltYXJ5VHJhY2tWb2x1bWUoCi0gICAgICAgICAgICBNNE9TQV9JbnQxNiAqZGF0YSwgTTRPU0FfVUludDMyIHNpemUsIE00T1NBX0Zsb2F0IHZvbExldmVsKTsKLQotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIoY29uc3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAmKTsKLSAgICBWaWRlb0VkaXRvckF1ZGlvUGxheWVyICZvcGVyYXRvcj0oY29uc3QgVmlkZW9FZGl0b3JBdWRpb1BsYXllciAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gVkVfQVVESU9fUExBWUVSX0hfCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuY3BwIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGMxMmFhYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjpWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nKCkgewotICAgIEFMT0dWKCJDb25zdHJ1Y3RvciIpOwotCi0gICAgbUF1ZFZvbEFyckluZGV4ID0gMDsKLSAgICBtRG9EdWNraW5nID0gMDsKLSAgICBtRHVja2luZ19lbmFibGUgPSAwOwotICAgIG1EdWNraW5nX2xvd1ZvbHVtZSA9IDA7Ci0gICAgbUR1Y2tpbmdfdGhyZXNob2xkID0gMDsKLSAgICBtRHVja2luZ0ZhY3RvciA9IDA7Ci0KLSAgICBtQlRWb2xMZXZlbCA9IDA7Ci0gICAgbVBUVm9sTGV2ZWwgPSAwOwotCi0gICAgbUlzU1NSQ25lZWRlZCA9IDA7Ci0gICAgbUNoYW5uZWxDb252ZXJzaW9uID0gMDsKLQotICAgIG1CVEZvcm1hdCA9IE1PTk9fMTZfQklUOwotCi0gICAgbUluU2FtcGxlUmF0ZSA9IDgwMDA7Ci0gICAgbU91dFNhbXBsZVJhdGUgPSAxNjAwMDsKLSAgICBtUFRDaGFubmVsQ291bnQgPSAyOwotICAgIG1CVENoYW5uZWxDb3VudCA9IDE7Ci19Ci0KLU00T1NBX0ludDMyIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6Om1peEFuZER1Y2soCi0gICAgICAgIHZvaWQgKnByaW1hcnlUcmFja0J1ZmZlciwKLSAgICAgICAgdm9pZCAqYmFja2dyb3VuZFRyYWNrQnVmZmVyLAotICAgICAgICB2b2lkICpvdXRCdWZmZXIpIHsKLQotICAgIEFMT0dWKCJtaXhBbmREdWNrOiB0cmFjayBidWZmZXJzIChwcmltYXJ5OiAlcCBhbmQgYmFja2dyb3VuZDogJXApICIKLSAgICAgICAgICAgICJhbmQgb3V0IGJ1ZmZlciAlcCIsCi0gICAgICAgICAgICBwcmltYXJ5VHJhY2tCdWZmZXIsIGJhY2tncm91bmRUcmFja0J1ZmZlciwgb3V0QnVmZmVyKTsKLQotICAgIE00QU1fQnVmZmVyMTYqIHBQcmltYXJ5VHJhY2sgICA9IChNNEFNX0J1ZmZlcjE2KilwcmltYXJ5VHJhY2tCdWZmZXI7Ci0gICAgTTRBTV9CdWZmZXIxNiogcEJhY2tncm91bmRUcmFjayA9IChNNEFNX0J1ZmZlcjE2KiliYWNrZ3JvdW5kVHJhY2tCdWZmZXI7Ci0gICAgTTRBTV9CdWZmZXIxNiogcE1peGVkT3V0QnVmZmVyICA9IChNNEFNX0J1ZmZlcjE2KilvdXRCdWZmZXI7Ci0KLSAgICAvLyBPdXRwdXQgc2l6ZSBpZiBzYW1lIGFzIFBUIHNpemUKLSAgICBwTWl4ZWRPdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSA9IHBQcmltYXJ5VHJhY2stPm1fYnVmZmVyU2l6ZTsKLQotICAgIC8vIEJlZm9yZSBtaXhpbmcsIHdlIG5lZWQgdG8gaGF2ZSBvbmx5IFBUIGFzIG91dCBidWZmZXIKLSAgICBtZW1jcHkoKHZvaWQgKilwTWl4ZWRPdXRCdWZmZXItPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICh2b2lkICopcFByaW1hcnlUcmFjay0+bV9kYXRhQWRkcmVzcywgcE1peGVkT3V0QnVmZmVyLT5tX2J1ZmZlclNpemUpOwotCi0gICAgLy8gSW5pdGlhbGl6ZSBkdWNraW5nIHZhcmlhYmxlcwotICAgIC8vIEluaXRpYWxseSBjb250YWlucyB0aGUgaW5wdXQgcHJpbWFyeSB0cmFjawotICAgIE00T1NBX0ludDE2ICpwUFRNZGF0YTIgPSAoTTRPU0FfSW50MTYqKXBNaXhlZE91dEJ1ZmZlci0+bV9kYXRhQWRkcmVzczsKLQotICAgIC8vIENvbnRhaW5zIEJHIHRyYWNrIHByb2Nlc3NlZCBkYXRhKGxpa2UgY2hhbm5lbCBjb252ZXJzaW9uIGV0Yy4uCi0gICAgTTRPU0FfSW50MTYgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNiopIHBCYWNrZ3JvdW5kVHJhY2stPm1fZGF0YUFkZHJlc3M7Ci0KLSAgICAvLyBTaW5jZSB3ZSBuZWVkIHRvIGdpdmUgc2FtcGxlIGNvdW50IGFuZCBub3QgYnVmZmVyIHNpemUKLSAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplID0gcE1peGVkT3V0QnVmZmVyLT5tX2J1ZmZlclNpemUgLyAyIDsKLQotICAgIGlmICgobUR1Y2tpbmdfZW5hYmxlKSAmJiAobVBUVm9sTGV2ZWwgIT0gMC4wKSkgewotICAgICAgICBNNE9TQV9JbnQzMiBwZWFrRGJWYWx1ZSA9IDA7Ci0gICAgICAgIE00T1NBX0ludDMyIHByZXZpb3VzRGJWYWx1ZSA9IDA7Ci0gICAgICAgIE00T1NBX0ludDE2ICpwUENNMTZTYW1wbGUgPSAoTTRPU0FfSW50MTYqKXBQcmltYXJ5VHJhY2stPm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBuID0gcFByaW1hcnlUcmFjay0+bV9idWZmZXJTaXplIC8gc2l6ZW9mKE00T1NBX0ludDE2KTsKLQotICAgICAgICBmb3IgKHNpemVfdCBsb29wSW5kZXggPSAwOyBsb29wSW5kZXggPCBuOyArK2xvb3BJbmRleCkgewotICAgICAgICAgICAgaWYgKHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdID49IDApIHsKLSAgICAgICAgICAgICAgICBwZWFrRGJWYWx1ZSA9IHByZXZpb3VzRGJWYWx1ZSA+IHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdID8KLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZSA6IHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdOwotICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwZWFrRGJWYWx1ZSA9IHByZXZpb3VzRGJWYWx1ZSA+IC1wUENNMTZTYW1wbGVbbG9vcEluZGV4XSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWU6IC1wUENNMTZTYW1wbGVbbG9vcEluZGV4XTsKLSAgICAgICAgICAgICAgICBwcmV2aW91c0RiVmFsdWUgPSBwZWFrRGJWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1BdWRpb1ZvbHVtZUFycmF5W21BdWRWb2xBcnJJbmRleF0gPSBnZXREZWNpYmVsU291bmQocGVha0RiVmFsdWUpOwotCi0gICAgICAgIC8vIENoZWNrIGZvciB0aHJlc2hvbGQgaXMgZG9uZSBhZnRlciBrUHJvY2Vzc2luZ1dpbmRvd1NpemUgY3ljbGVzCi0gICAgICAgIGlmIChtQXVkVm9sQXJySW5kZXggPj0ga1Byb2Nlc3NpbmdXaW5kb3dTaXplIC0gMSkgewotICAgICAgICAgICAgbURvRHVja2luZyA9IGlzVGhyZXNob2xkQnJlYWNoZWQoCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1ZvbHVtZUFycmF5LCBtQXVkVm9sQXJySW5kZXgsIG1EdWNraW5nX3RocmVzaG9sZCk7Ci0KLSAgICAgICAgICAgIG1BdWRWb2xBcnJJbmRleCA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXVkVm9sQXJySW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEJlbG93IGxvZ2ljIGNvbnRyb2xzIHRoZSBtaXhpbmcgd2VpZ2h0YWdlCi0gICAgICAgIC8vIGZvciBCYWNrZ3JvdW5kIGFuZCBQcmltYXJ5IFRyYWNrcwotICAgICAgICAvLyBmb3IgdGhlIGR1cmF0aW9uIG9mIHdpbmRvdyB1bmRlciBhbmFseXNpcywKLSAgICAgICAgLy8gdG8gZ2l2ZSBmYWRlLW91dCBmb3IgQmFja2dyb3VuZCBhbmQgZmFkZS1pbiBmb3IgcHJpbWFyeQotICAgICAgICAvLyBDdXJyZW50IGZhZGluZyBmYWN0b3IgaXMgZGlzdHJpYnV0ZWQgaW4gZXF1YWwgcmFuZ2Ugb3ZlcgotICAgICAgICAvLyB0aGUgZGVmaW5lZCB3aW5kb3cgc2l6ZS4KLSAgICAgICAgLy8gRm9yIGEgd2luZG93IHNpemUgPSAyNQotICAgICAgICAvLyAoNTAwIG1zICh3aW5kb3cgdW5kZXIgYW5hbHlzaXMpIC8gMjAgbXMgKHNhbXBsZSBkdXJhdGlvbikpCi0gICAgICAgIC8vCi0KLSAgICAgICAgaWYgKG1Eb0R1Y2tpbmcpIHsKLSAgICAgICAgICAgIGlmIChtRHVja2luZ0ZhY3RvciA+IG1EdWNraW5nX2xvd1ZvbHVtZSkgewotICAgICAgICAgICAgICAgIC8vIEZBREUgT1VUIEJHIFRyYWNrCi0gICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGR1Y2tpbmcgZmFjdG9yIGluIHRvdGFsIHN0ZXBzIGluIGZhY3RvcgotICAgICAgICAgICAgICAgIC8vIG9mIGxvdyB2b2x1bWUgc3RlcHMgdG8gcmVhY2ggbG93IHZvbHVtZSBsZXZlbAotICAgICAgICAgICAgICAgIG1EdWNraW5nRmFjdG9yIC09IG1EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUR1Y2tpbmdGYWN0b3IgPSBtRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobUR1Y2tpbmdGYWN0b3IgPCAxLjAgKSB7Ci0gICAgICAgICAgICAgICAgLy8gRkFERSBJTiBCRyBUcmFjawotICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBkdWNraW5nIGZhY3RvciBpbiB0b3RhbCBzdGVwcyBvZgotICAgICAgICAgICAgICAgIC8vIGxvdyB2b2x1bWUgZmFjdG9yIHRvIHJlYWNoIG9yaWcudm9sdW1lIGxldmVsCi0gICAgICAgICAgICAgICAgbUR1Y2tpbmdGYWN0b3IgKz0gbUR1Y2tpbmdfbG93Vm9sdW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRHVja2luZ0ZhY3RvciA9IDEuMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gLy8gZW5kIGlmIC0gbUR1Y2tpbmdfZW5hYmxlCi0KLQotICAgIC8vIE1peGluZyBsb2dpYwotICAgIEFMT0dWKCJPdXQgb2YgRHVja2luZyBhbmFseXNpcyB1aVBDTXNpemUgJWQgJWYgJWYiLAotICAgICAgICAgICAgbURvRHVja2luZywgbUR1Y2tpbmdGYWN0b3IsIG1CVFZvbExldmVsKTsKLSAgICB3aGlsZSAodWlQQ01zaXplLS0gPiAwKSB7Ci0KLSAgICAgICAgLy8gU2V0IHZvbCBmYWN0b3IgZm9yIEJUIGFuZCBQVAotICAgICAgICAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KSgqcEJUTWRhdGExKm1CVFZvbExldmVsKTsKLSAgICAgICAgKnBQVE1kYXRhMiA9IChNNE9TQV9JbnQxNikoKnBQVE1kYXRhMiptUFRWb2xMZXZlbCk7Ci0KLSAgICAgICAgLy8gTWl4IHRoZSB0d28gc2FtcGxlcwotICAgICAgICBpZiAobURvRHVja2luZykgewotCi0gICAgICAgICAgICAvLyBEdWNrIHRoZSBCRyB0cmFjayB0byBkdWNraW5nIGZhY3RvciB2YWx1ZSBiZWZvcmUgbWl4aW5nCi0gICAgICAgICAgICAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KSgoKnBCVE1kYXRhMSkqKG1EdWNraW5nRmFjdG9yKSk7Ci0KLSAgICAgICAgICAgIC8vIG1peCBhcyBub3JtYWwgY2FzZQotICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoKnBCVE1kYXRhMSAvMiArICpwUFRNZGF0YTIgLzIpOwotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KSgoKnBCVE1kYXRhMSkqKG1EdWNraW5nRmFjdG9yKSk7Ci0gICAgICAgICAgICAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KSgqcEJUTWRhdGExIC8yICsgKnBQVE1kYXRhMiAvMik7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9JbnQzMiB0ZW1wOwotICAgICAgICBpZiAoKnBCVE1kYXRhMSA8IDApIHsKLSAgICAgICAgICAgIHRlbXAgPSAtKCpwQlRNZGF0YTEpICogMjsgLy8gYnJpbmcgdG8gb3JpZ2luYWwgQW1wbGl0dWRlIGxldmVsCi0KLSAgICAgICAgICAgIGlmICh0ZW1wID4gMzI3NjcpIHsKLSAgICAgICAgICAgICAgICAqcEJUTWRhdGExID0gLTMyNzY2OyAvLyBsZXNzIHRoZW4gbWF4IGFsbG93ZWQgdmFsdWUKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnBCVE1kYXRhMSA9IChNNE9TQV9JbnQxNikoLXRlbXApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGVtcCA9ICgqcEJUTWRhdGExKSAqIDI7IC8vIGJyaW5nIHRvIG9yaWdpbmFsIEFtcGxpdHVkZSBsZXZlbAotICAgICAgICAgICAgaWYgKCB0ZW1wID4gMzI3NjgpIHsKLSAgICAgICAgICAgICAgICAqcEJUTWRhdGExID0gMzI3Njc7IC8vIGxlc3MgdGhhbiBtYXggYWxsb3dlZCB2YWx1ZQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqcEJUTWRhdGExID0gKE00T1NBX0ludDE2KXRlbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwQlRNZGF0YTErKzsKLSAgICAgICAgcFBUTWRhdGEyKys7Ci0gICAgfQotCi0gICAgbWVtY3B5KCh2b2lkICopcE1peGVkT3V0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAodm9pZCAqKXBCYWNrZ3JvdW5kVHJhY2stPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgIHBCYWNrZ3JvdW5kVHJhY2stPm1fYnVmZmVyU2l6ZSk7Ci0KLSAgICBBTE9HVigibWl4QW5kRHVjazogWCIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9JbnQzMiBWaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nOjpjYWxjdWxhdGVPdXRSZXNhbXBsZUJ1ZlNpemUoKSB7Ci0KLSAgICAvLyBUaGlzIGFscmVhZHkgdGFrZXMgY2FyZSBvZiBjaGFubmVsIGNvdW50IGluIG1CVEJ1ZmZlci5tX2J1ZmZlclNpemUKLSAgICByZXR1cm4gKG1PdXRTYW1wbGVSYXRlIC8gbUluU2FtcGxlUmF0ZSkgKiBtQlRCdWZmZXIubV9idWZmZXJTaXplOwotfQotCi12b2lkIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6OnNldE1peFBhcmFtcygKLSAgICAgICAgY29uc3QgQXVkaW9NaXhTZXR0aW5ncyYgc2V0dGluZykgewotICAgIEFMT0dWKCJzZXRNaXhQYXJhbXMiKTsKLQotICAgIG1EdWNraW5nX2VuYWJsZSAgICAgICA9IHNldHRpbmcubHZJbkR1Y2tpbmdfZW5hYmxlOwotICAgIG1EdWNraW5nX2xvd1ZvbHVtZSAgICA9IHNldHRpbmcubHZJbkR1Y2tpbmdfbG93Vm9sdW1lOwotICAgIG1EdWNraW5nX3RocmVzaG9sZCAgICA9IHNldHRpbmcubHZJbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIG1QVFZvbExldmVsICAgICAgICAgICA9IHNldHRpbmcubHZQVFZvbExldmVsOwotICAgIG1CVFZvbExldmVsICAgICAgICAgICA9IHNldHRpbmcubHZCVFZvbExldmVsIDsKLSAgICBtQlRDaGFubmVsQ291bnQgICAgICAgPSBzZXR0aW5nLmx2QlRDaGFubmVsQ291bnQ7Ci0gICAgbVBUQ2hhbm5lbENvdW50ICAgICAgID0gc2V0dGluZy5sdlBUQ2hhbm5lbENvdW50OwotICAgIG1CVEZvcm1hdCAgICAgICAgICAgICA9IHNldHRpbmcubHZCVEZvcm1hdDsKLSAgICBtSW5TYW1wbGVSYXRlICAgICAgICAgPSBzZXR0aW5nLmx2SW5TYW1wbGVSYXRlOwotICAgIG1PdXRTYW1wbGVSYXRlICAgICAgICA9IHNldHRpbmcubHZPdXRTYW1wbGVSYXRlOwotCi0gICAgLy8gUmVzZXQgdGhlIGZvbGxvd2luZyBwYXJhbXMgdG8gZGVmYXVsdCB2YWx1ZXMKLSAgICBtQXVkVm9sQXJySW5kZXggICAgICAgPSAwOwotICAgIG1Eb0R1Y2tpbmcgICAgICAgICAgICA9IDA7Ci0gICAgbUR1Y2tpbmdGYWN0b3IgICAgICAgID0gMS4wOwotCi0gICAgQUxPR1YoImR1Y2tpbmcgZW5hYmxlIDB4JXggbG93Vm9sdW1lICVmIHRocmVzaG9sZCAlIiBQUkl1MzIgIiAiCi0gICAgICAgICAgICAiZlBUVm9sTGV2ZWwgJWYgQlRWb2xMZXZlbCAlZiIsCi0gICAgICAgICAgICBtRHVja2luZ19lbmFibGUsIG1EdWNraW5nX2xvd1ZvbHVtZSwgbUR1Y2tpbmdfdGhyZXNob2xkLAotICAgICAgICAgICAgbVBUVm9sTGV2ZWwsIG1QVFZvbExldmVsKTsKLQotICAgIC8vIERlY2lkZXMgaWYgU1NSQyBzdXBwb3J0IGlzIG5lZWRlZCBmb3IgdGhpcyBtaXhpbmcKLSAgICBtSXNTU1JDbmVlZGVkID0gKHNldHRpbmcubHZJblNhbXBsZVJhdGUgIT0gc2V0dGluZy5sdk91dFNhbXBsZVJhdGUpOwotICAgIGlmIChzZXR0aW5nLmx2QlRDaGFubmVsQ291bnQgIT0gc2V0dGluZy5sdlBUQ2hhbm5lbENvdW50KXsKLSAgICAgICAgaWYgKHNldHRpbmcubHZCVENoYW5uZWxDb3VudCA9PSAyKXsKLSAgICAgICAgICAgIG1DaGFubmVsQ29udmVyc2lvbiA9IDE7IC8vIGNvbnZlcnQgdG8gTU9OTwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNoYW5uZWxDb252ZXJzaW9uID0gMjsgLy8gQ29udmVydCB0byBTVEVSRU8KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1DaGFubmVsQ29udmVyc2lvbiA9IDA7Ci0gICAgfQotfQotCi0vLyBGYXN0IHdheSB0byBjb21wdXRlIDEwICogbG9nKHZhbHVlKQotTTRPU0FfSW50MzIgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZzo6Z2V0RGVjaWJlbFNvdW5kKE00T1NBX1VJbnQzMiB2YWx1ZSkgewotICAgIEFMT0dWKCJnZXREZWNpYmVsU291bmQ6ICVsZCIsIHZhbHVlKTsKLQotICAgIGlmICh2YWx1ZSA8PSAwIHx8IHZhbHVlID4gMHg4MDAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDQwMDApIHsgLy8gMzI3NjgKLSAgICAgICAgcmV0dXJuIDkwOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDIwMDApIHsgLy8gMTYzODQKLSAgICAgICAgcmV0dXJuIDg0OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDEwMDApIHsgLy8gODE5MgotICAgICAgICByZXR1cm4gNzg7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDgwMCkgeyAvLyA0MDI4Ci0gICAgICAgIHJldHVybiA3MjsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwNDAwKSB7IC8vIDIwNDgKLSAgICAgICAgcmV0dXJuIDY2OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAyMDApIHsgLy8gMTAyNAotICAgICAgICByZXR1cm4gNjA7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDEwMCkgeyAvLyA1MTIKLSAgICAgICAgcmV0dXJuIDU0OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwODApIHsgLy8gMjU2Ci0gICAgICAgIHJldHVybiA0ODsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDQwKSB7IC8vIDEyOAotICAgICAgICByZXR1cm4gNDI7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDAyMCkgeyAvLyA2NAotICAgICAgICByZXR1cm4gMzY7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDAxMCkgeyAvLyAzMgotICAgICAgICByZXR1cm4gMzA7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDAwOCkgeyAvLyAxNgotICAgICAgICByZXR1cm4gMjQ7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA+IDB4MDAwNykgeyAvLyA4Ci0gICAgICAgIHJldHVybiAyNDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID4gMHgwMDAzKSB7IC8vIDQKLSAgICAgICAgcmV0dXJuIDE4OwotICAgIH0gZWxzZSBpZiAodmFsdWUgPiAweDAwMDEpIHsgLy8gMgotICAgICAgICByZXR1cm4gMTI7Ci0gICAgfSBlbHNlICB7IC8vIDEKLSAgICAgICAgcmV0dXJuIDY7Ci0gICAgfQotfQotCi1NNE9TQV9Cb29sIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3Npbmc6OmlzVGhyZXNob2xkQnJlYWNoZWQoCi0gICAgICAgIE00T1NBX0ludDMyKiBhdmVyYWdlVmFsdWUsCi0gICAgICAgIE00T1NBX0ludDMyIHN0b3JlQ291bnQsCi0gICAgICAgIE00T1NBX0ludDMyIHRocmVzaG9sZFZhbHVlKSB7Ci0KLSAgICBBTE9HVigiaXNUaHJlc2hvbGRCcmVhY2hlZCIpOwotCi0gICAgaW50IHRvdGFsVmFsdWUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RvcmVDb3VudDsgKytpKSB7Ci0gICAgICAgIHRvdGFsVmFsdWUgKz0gYXZlcmFnZVZhbHVlW2ldOwotICAgIH0KLSAgICByZXR1cm4gKHRvdGFsVmFsdWUgLyBzdG9yZUNvdW50ID4gdGhyZXNob2xkVmFsdWUpOwotfQotCi19Ly9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2I3YTY5Zi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBWRV9CQUNLR1JPVU5EX0FVRElPX1BST0NfSAotI2RlZmluZSBWRV9CQUNLR1JPVU5EX0FVRElPX1BST0NfSAotCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0V4cG9ydC5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1VJbnQxNiogICBtX2RhdGFBZGRyZXNzOyAvLyBBbmRyb2lkIFNSQyBuZWVkcyBhIEludDE2IHBvaW50ZXIKLSAgICBNNE9TQV9VSW50MzIgICAgbV9idWZmZXJTaXplOwotfSBNNEFNX0J1ZmZlcjE2OyAgICAvLyBTdHJ1Y3R1cmUgY29udGFpbnMgSW50MTZfdCBwb2ludGVyCi0KLWVudW0gQXVkaW9Gb3JtYXQgewotICAgIE1PTk9fMTZfQklULAotICAgIFNURVJFT18xNl9CSVQKLX07Ci0KLS8vIEZvbGxvd2luZyBzdHJ1Y3Qgd2lsbCBiZSB1c2VkIGJ5IGFwcCB0byBzdXBwbHkgdGhlIFBUIGFuZCBCVCBwcm9wZXJ0aWVzCi0vLyBhbG9uZyB3aXRoIGR1Y2tpbmcgdmFsdWVzCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfSW50MzIgbHZJblNhbXBsZVJhdGU7IC8vIFNhbXBsaW5nIGF1ZGlvIGZyZXEgKDgwMDAsMTYwMDAgb3IgbW9yZSApCi0gICAgTTRPU0FfSW50MzIgbHZPdXRTYW1wbGVSYXRlOyAvL1NhbXBsaW5nIGF1ZGlvIGZyZXEgKDgwMDAsMTYwMDAgb3IgbW9yZSApCi0gICAgQXVkaW9Gb3JtYXQgbHZCVEZvcm1hdDsKLQotICAgIE00T1NBX0ludDMyIGx2SW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBNNE9TQV9GbG9hdCBsdkluRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgTTRPU0FfQm9vbCBsdkluRHVja2luZ19lbmFibGU7Ci0gICAgTTRPU0FfRmxvYXQgbHZQVFZvbExldmVsOwotICAgIE00T1NBX0Zsb2F0IGx2QlRWb2xMZXZlbDsKLSAgICBNNE9TQV9JbnQzMiBsdkJUQ2hhbm5lbENvdW50OwotICAgIE00T1NBX0ludDMyIGx2UFRDaGFubmVsQ291bnQ7Ci19IEF1ZGlvTWl4U2V0dGluZ3M7Ci0KLS8vIFRoaXMgY2xhc3MgaXMgZGVmaW5lZCB0byBnZXQgU0YgU1JDIGFjY2VzcwotY2xhc3MgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyB7Ci1wdWJsaWM6Ci0gICAgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZygpOwotICAgIH5WaWRlb0VkaXRvckJHQXVkaW9Qcm9jZXNzaW5nKCkge30KLQotICAgIHZvaWQgc2V0TWl4UGFyYW1zKGNvbnN0IEF1ZGlvTWl4U2V0dGluZ3MmIHBhcmFtcyk7Ci0KLSAgICBNNE9TQV9JbnQzMiBtaXhBbmREdWNrKAotICAgICAgICAgICAgICAgICAgICB2b2lkKiBwcmltYXJ5VHJhY2tCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqIGJhY2tncm91bmRUcmFja0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogbWl4ZWRPdXRwdXRCdWZmZXIpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrUHJvY2Vzc2luZ1dpbmRvd1NpemUgPSAxMCwKLSAgICB9OwotCi0gICAgTTRPU0FfSW50MzIgbUluU2FtcGxlUmF0ZTsKLSAgICBNNE9TQV9JbnQzMiBtT3V0U2FtcGxlUmF0ZTsKLSAgICBBdWRpb0Zvcm1hdCBtQlRGb3JtYXQ7Ci0KLSAgICBNNE9TQV9Cb29sIG1Jc1NTUkNuZWVkZWQ7Ci0gICAgTTRPU0FfSW50MzIgbUJUQ2hhbm5lbENvdW50OwotICAgIE00T1NBX0ludDMyIG1QVENoYW5uZWxDb3VudDsKLSAgICBNNE9TQV9VSW50OCBtQ2hhbm5lbENvbnZlcnNpb247Ci0KLSAgICBNNE9TQV9VSW50MzIgbUR1Y2tpbmdfdGhyZXNob2xkOwotICAgIE00T1NBX0Zsb2F0IG1EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICBNNE9TQV9GbG9hdCBtRHVja2luZ0ZhY3RvciA7Ci0gICAgTTRPU0FfQm9vbCBtRHVja2luZ19lbmFibGU7Ci0gICAgTTRPU0FfSW50MzIgbUF1ZGlvVm9sdW1lQXJyYXlba1Byb2Nlc3NpbmdXaW5kb3dTaXplXTsKLSAgICBNNE9TQV9JbnQzMiBtQXVkVm9sQXJySW5kZXg7Ci0gICAgTTRPU0FfQm9vbCBtRG9EdWNraW5nOwotICAgIE00T1NBX0Zsb2F0IG1QVFZvbExldmVsOwotICAgIE00T1NBX0Zsb2F0IG1CVFZvbExldmVsOwotCi0gICAgTTRBTV9CdWZmZXIxNiBtQlRCdWZmZXI7Ci0KLSAgICBNNE9TQV9JbnQzMiBnZXREZWNpYmVsU291bmQoTTRPU0FfVUludDMyIHZhbHVlKTsKLSAgICBNNE9TQV9Cb29sICBpc1RocmVzaG9sZEJyZWFjaGVkKE00T1NBX0ludDMyKiBhdmVyYWdlVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHN0b3JlQ291bnQsIE00T1NBX0ludDMyIHRocmVzaG9sZFZhbHVlKTsKLQotICAgIC8vIFRoaXMgcmV0dXJucyB0aGUgc2l6ZSBvZiBidWZmZXIgd2hpY2ggbmVlZHMgdG8gYWxsb2NhdGVkCi0gICAgLy8gYmVmb3JlIHJlc2FtcGxpbmcgaXMgY2FsbGVkCi0gICAgTTRPU0FfSW50MzIgY2FsY3VsYXRlT3V0UmVzYW1wbGVCdWZTaXplKCk7Ci0KLSAgICAvLyBEb24ndCBjYWxsIG1lLgotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcoY29uc3QgVmlkZW9FZGl0b3JCR0F1ZGlvUHJvY2Vzc2luZyYpOwotICAgIFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcmIG9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yQkdBdWRpb1Byb2Nlc3NpbmcmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBWRV9CQUNLR1JPVU5EX0FVRElPX1BST0NfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclBsYXllci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjljMzg3OS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNkZWZpbmUgTE9HX1RBRyAiVmlkZW9FZGl0b3JQbGF5ZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJWaWRlb0VkaXRvclBsYXllci5oIgotI2luY2x1ZGUgIlByZXZpZXdQbGF5ZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVZpZGVvRWRpdG9yUGxheWVyOjpWaWRlb0VkaXRvclBsYXllcihOYXRpdmVXaW5kb3dSZW5kZXJlciogcmVuZGVyZXIpCi0gICAgOiBtUGxheWVyKG5ldyBQcmV2aWV3UGxheWVyKHJlbmRlcmVyKSkgewotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yUGxheWVyIik7Ci0gICAgbVBsYXllci0+c2V0TGlzdGVuZXIodGhpcyk7Ci19Ci0KLVZpZGVvRWRpdG9yUGxheWVyOjp+VmlkZW9FZGl0b3JQbGF5ZXIoKSB7Ci0gICAgQUxPR1YoIn5WaWRlb0VkaXRvclBsYXllciIpOwotCi0gICAgcmVzZXQoKTsKLSAgICBtVmVBdWRpb1NpbmsuY2xlYXIoKTsKLQotICAgIGRlbGV0ZSBtUGxheWVyOwotICAgIG1QbGF5ZXIgPSBOVUxMOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6aW5pdENoZWNrKCkgewotICAgIEFMT0dWKCJpbml0Q2hlY2siKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldEF1ZGlvUGxheWVyKFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKmF1ZGlvUGxheWVyKSB7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldEF1ZGlvUGxheWVyKGF1ZGlvUGxheWVyKTsKLX0KLQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewotICAgIEFMT0dJKCJzZXREYXRhU291cmNlKCclcycpIiwgdXJsKTsKLSAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJIZWFkZXJzIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVBsYXllci0+c2V0RGF0YVNvdXJjZSh1cmwpOwotfQotCi0vL1dlIGRvbm90IHVzZSB0aGlzIGluIHByZXZpZXcsIGR1bW15IGltcGxpbWVudGF0aW9uIGFzIHRoaXMgaXMgcHVyZSB2aXJ0dWFsCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LAotICAgIGludDY0X3QgbGVuZ3RoKSB7Ci0gICAgQUxPR0UoInNldERhdGFTb3VyY2UoJWQsICVsbGQsICVsbGQpIE5vdCBzdXBwb3J0ZWQiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIHJldHVybiAoIU9LKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgewotICAgIEFMT0dWKCJzZXRWaWRlb1N1cmZhY2UiKTsKLQotICAgIG1QbGF5ZXItPnNldFN1cmZhY2Uoc3VyZmFjZSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0VmlkZW9TdXJmYWNlVGV4dHVyZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYnVmZmVyUHJvZHVjZXIpIHsKLSAgICBBTE9HVigic2V0VmlkZW9TdXJmYWNlVGV4dHVyZSIpOwotCi0gICAgbVBsYXllci0+c2V0U3VyZmFjZVRleHR1cmUoYnVmZmVyUHJvZHVjZXIpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnByZXBhcmUoKSB7Ci0gICAgQUxPR1YoInByZXBhcmUiKTsKLSAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZSgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cHJlcGFyZUFzeW5jKCkgewotICAgIHJldHVybiBtUGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnN0YXJ0KCkgewotICAgIEFMT0dWKCJzdGFydCIpOwotICAgIHJldHVybiBtUGxheWVyLT5wbGF5KCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzdG9wKCkgewotICAgIEFMT0dWKCJzdG9wIik7Ci0gICAgcmV0dXJuIHBhdXNlKCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpwYXVzZSgpIHsKLSAgICBBTE9HVigicGF1c2UiKTsKLSAgICByZXR1cm4gbVBsYXllci0+cGF1c2UoKTsKLX0KLQotYm9vbCBWaWRlb0VkaXRvclBsYXllcjo6aXNQbGF5aW5nKCkgewotICAgIEFMT0dWKCJpc1BsYXlpbmciKTsKLSAgICByZXR1cm4gbVBsYXllci0+aXNQbGF5aW5nKCk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZWVrVG8oaW50IG1zZWMpIHsKLSAgICBBTE9HVigic2Vla1RvIik7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+c2Vla1RvKChpbnQ2NF90KW1zZWMgKiAxMDAwKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6Z2V0Q3VycmVudFBvc2l0aW9uKGludCAqbXNlYykgewotICAgIEFMT0dWKCJnZXRDdXJyZW50UG9zaXRpb24iKTsKLSAgICBpbnQ2NF90IHBvc2l0aW9uVXM7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+Z2V0UG9zaXRpb24oJnBvc2l0aW9uVXMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICptc2VjID0gKHBvc2l0aW9uVXMgKyA1MDApIC8gMTAwMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpnZXREdXJhdGlvbihpbnQgKm1zZWMpIHsKLSAgICBBTE9HVigiZ2V0RHVyYXRpb24iKTsKLQotICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5nZXREdXJhdGlvbigmZHVyYXRpb25Vcyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICptc2VjID0gMDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgICptc2VjID0gKGR1cmF0aW9uVXMgKyA1MDApIC8gMTAwMDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpyZXNldCgpIHsKLSAgICBBTE9HVigicmVzZXQiKTsKLSAgICBtUGxheWVyLT5yZXNldCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldExvb3BpbmcoaW50IGxvb3ApIHsKLSAgICBBTE9HVigic2V0TG9vcGluZyIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRMb29waW5nKGxvb3ApOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgewotICAgIEFMT0dFKCJzZXRQYXJhbWV0ZXIgbm90IGltcGxlbWVudGVkIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKLSAgICBBTE9HRSgiZ2V0UGFyYW1ldGVyIG5vdCBpbXBsZW1lbnRlZCIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotcGxheWVyX3R5cGUgVmlkZW9FZGl0b3JQbGF5ZXI6OnBsYXllclR5cGUoKSB7Ci0gICAgQUxPR1YoInBsYXllclR5cGUiKTsKLSAgICByZXR1cm4gU1RBR0VGUklHSFRfUExBWUVSOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjphY3F1aXJlTG9jaygpIHsKLSAgICBBTE9HVigiYWNxdWlyZUxvY2siKTsKLSAgICBtUGxheWVyLT5hY3F1aXJlTG9jaygpOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpyZWxlYXNlTG9jaygpIHsKLSAgICBBTE9HVigicmVsZWFzZUxvY2siKTsKLSAgICBtUGxheWVyLT5yZWxlYXNlTG9jaygpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6aW52b2tlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6c2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luaykgewotICAgIE1lZGlhUGxheWVySW50ZXJmYWNlOjpzZXRBdWRpb1NpbmsoYXVkaW9TaW5rKTsKLQotICAgIG1QbGF5ZXItPnNldEF1ZGlvU2luayhhdWRpb1NpbmspOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6Z2V0TWV0YWRhdGEoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3JkcykgewotICAgIHVzaW5nIG1lZGlhOjpNZXRhZGF0YTsKLQotICAgIHVpbnQzMl90IGZsYWdzID0gbVBsYXllci0+Z2V0U291cmNlU2Vla0ZsYWdzKCk7Ci0KLSAgICBNZXRhZGF0YSBtZXRhZGF0YShyZWNvcmRzKTsKLQotICAgIG1ldGFkYXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1BhdXNlQXZhaWxhYmxlLAotICAgICAgICAgICAgZmxhZ3MgJiBNZWRpYUV4dHJhY3Rvcjo6Q0FOX1BBVVNFKTsKLQotICAgIG1ldGFkYXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtCYWNrd2FyZEF2YWlsYWJsZSwKLSAgICAgICAgICAgIGZsYWdzICYgTWVkaWFFeHRyYWN0b3I6OkNBTl9TRUVLX0JBQ0tXQVJEKTsKLQotICAgIG1ldGFkYXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtGb3J3YXJkQXZhaWxhYmxlLAotICAgICAgICAgICAgZmxhZ3MgJiBNZWRpYUV4dHJhY3Rvcjo6Q0FOX1NFRUtfRk9SV0FSRCk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrQXZhaWxhYmxlLAotICAgICAgICAgICAgZmxhZ3MgJiBNZWRpYUV4dHJhY3Rvcjo6Q0FOX1NFRUspOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6bG9hZEVmZmVjdHNTZXR0aW5ncygKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3RTZXR0aW5ncywgaW50IG5FZmZlY3RzKSB7Ci0gICAgQUxPR1YoImxvYWRFZmZlY3RzU2V0dGluZ3MiKTsKLSAgICByZXR1cm4gbVBsYXllci0+bG9hZEVmZmVjdHNTZXR0aW5ncyhwRWZmZWN0U2V0dGluZ3MsIG5FZmZlY3RzKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OmxvYWRBdWRpb01peFNldHRpbmdzKAotICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBwQXVkaW9NaXhTZXR0aW5ncykgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvclBsYXllcjogbG9hZEF1ZGlvTWl4U2V0dGluZ3MiKTsKLSAgICByZXR1cm4gbVBsYXllci0+bG9hZEF1ZGlvTWl4U2V0dGluZ3MocEF1ZGlvTWl4U2V0dGluZ3MpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0QXVkaW9NaXhQQ01GaWxlSGFuZGxlKAotICAgIE00T1NBX0NvbnRleHQgcEF1ZGlvTWl4UENNRmlsZUhhbmRsZSkgewotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yUGxheWVyOiBsb2FkQXVkaW9NaXhTZXR0aW5ncyIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRBdWRpb01peFBDTUZpbGVIYW5kbGUocEF1ZGlvTWl4UENNRmlsZUhhbmRsZSk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRBdWRpb01peFN0b3J5Qm9hcmRQYXJhbSgKLSAgICBNNE9TQV9VSW50MzIgYXVkaW9NaXhTdG9yeUJvYXJkVFMsCi0gICAgTTRPU0FfVUludDMyIGN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSwKLSAgICBNNE9TQV9VSW50MzIgcHJpbWFyeVRyYWNrVm9sVmFsdWUpIHsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclBsYXllcjogbG9hZEF1ZGlvTWl4U2V0dGluZ3MiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oYXVkaW9NaXhTdG9yeUJvYXJkVFMsCi0gICAgIGN1cnJlbnRNZWRpYUJlZ2luQ3V0VGltZSwgcHJpbWFyeVRyYWNrVm9sVmFsdWUpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0UGxheWJhY2tCZWdpblRpbWUodWludDMyX3QgbXNlYykgewotICAgIEFMT0dWKCJzZXRQbGF5YmFja0JlZ2luVGltZSIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRQbGF5YmFja0JlZ2luVGltZShtc2VjKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldFBsYXliYWNrRW5kVGltZSh1aW50MzJfdCBtc2VjKSB7Ci0gICAgQUxPR1YoInNldFBsYXliYWNrRW5kVGltZSIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRQbGF5YmFja0VuZFRpbWUobXNlYyk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpzZXRTdG9yeWJvYXJkU3RhcnRUaW1lKHVpbnQzMl90IG1zZWMpIHsKLSAgICBBTE9HVigic2V0U3Rvcnlib2FyZFN0YXJ0VGltZSIpOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRTdG9yeWJvYXJkU3RhcnRUaW1lKG1zZWMpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6c2V0UHJvZ3Jlc3NDYWxsYmFja0ludGVydmFsKHVpbnQzMl90IGNiSW50ZXJ2YWwpIHsKLSAgICBBTE9HVigic2V0UHJvZ3Jlc3NDYWxsYmFja0ludGVydmFsIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbChjYkludGVydmFsKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldE1lZGlhUmVuZGVyaW5nTW9kZSgKLSAgICBNNHhWU1NfTWVkaWFSZW5kZXJpbmcgbW9kZSwKLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpIHsKLQotICAgIEFMT0dWKCJzZXRNZWRpYVJlbmRlcmluZ01vZGUiKTsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0TWVkaWFSZW5kZXJpbmdNb2RlKG1vZGUsIG91dHB1dFZpZGVvU2l6ZSk7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpyZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCkgewotICAgIEFMT0dWKCJyZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wIik7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnJlc2V0Sm5pQ2FsbGJhY2tUaW1lU3RhbXAoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OnNldEltYWdlQ2xpcFByb3BlcnRpZXMoCi0gICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotICAgIHJldHVybiBtUGxheWVyLT5zZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKHdpZHRoLCBoZWlnaHQpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6cmVhZEZpcnN0VmlkZW9GcmFtZSgpIHsKLSAgICByZXR1cm4gbVBsYXllci0+cmVhZEZpcnN0VmlkZW9GcmFtZSgpOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6Z2V0TGFzdFJlbmRlcmVkVGltZU1zKHVpbnQzMl90ICpsYXN0UmVuZGVyZWRUaW1lTXMpIHsKLSAgICBtUGxheWVyLT5nZXRMYXN0UmVuZGVyZWRUaW1lTXMobGFzdFJlbmRlcmVkVGltZU1zKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qIEltcGxlbWVudGF0aW9uIG9mIEF1ZGlvU2luayBpbnRlcmZhY2UgKi8KLSN1bmRlZiBMT0dfVEFHCi0jZGVmaW5lIExPR19UQUcgIlZlQXVkaW9TaW5rIgotCi1pbnQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6Om1NaW5CdWZmZXJDb3VudCA9IDQ7Ci1ib29sIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjptSXNPbkVtdWxhdG9yID0gZmFsc2U7Ci0KLVZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpWZUF1ZGlvT3V0cHV0KCkKLSAgICA6IG1DYWxsYmFjayhOVUxMKSwKLSAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSB7Ci0gICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgbUxlZnRWb2x1bWUgPSAxLjA7Ci0gICAgbVJpZ2h0Vm9sdW1lID0gMS4wOwotICAgIG1MYXRlbmN5ID0gMDsKLSAgICBtTXNlY3NQZXJGcmFtZSA9IDA7Ci0gICAgbU51bUZyYW1lc1dyaXR0ZW4gPSAwOwotICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7Ci19Ci0KLVZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0Ojp+VmVBdWRpb091dHB1dCgpIHsKLSAgICBjbG9zZSgpOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpzZXRNaW5CdWZmZXJDb3VudCgpIHsKLQotICAgIG1Jc09uRW11bGF0b3IgPSBmYWxzZTsKLSAgICBtTWluQnVmZmVyQ291bnQgPSA0OwotfQotCi1ib29sIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0Ojppc09uRW11bGF0b3IoKSB7Ci0KLSAgICBzZXRNaW5CdWZmZXJDb3VudCgpOwotICAgIHJldHVybiBtSXNPbkVtdWxhdG9yOwotfQotCi1pbnQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmdldE1pbkJ1ZmZlckNvdW50KCkgewotCi0gICAgc2V0TWluQnVmZmVyQ291bnQoKTsKLSAgICByZXR1cm4gbU1pbkJ1ZmZlckNvdW50OwotfQotCi1zc2l6ZV90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpidWZmZXJTaXplKCkgY29uc3QgewotCi0gICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gbVRyYWNrLT5mcmFtZUNvdW50KCkgKiBmcmFtZVNpemUoKTsKLX0KLQotc3NpemVfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6ZnJhbWVDb3VudCgpIGNvbnN0IHsKLQotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVDb3VudCgpOwotfQotCi1zc2l6ZV90IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpjaGFubmVsQ291bnQoKSBjb25zdAotewotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIG1UcmFjay0+Y2hhbm5lbENvdW50KCk7Ci19Ci0KLXNzaXplX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmZyYW1lU2l6ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gbVRyYWNrLT5mcmFtZVNpemUoKTsKLX0KLQotdWludDMyX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmxhdGVuY3kgKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbUxhdGVuY3k7Ci19Ci0KLWZsb2F0IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0Ojptc2Vjc1BlckZyYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbU1zZWNzUGVyRnJhbWU7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0IHsKLQotICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0UG9zaXRpb24ocG9zaXRpb24pOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqd3JpdHRlbikgY29uc3QgewotCi0gICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqd3JpdHRlbiA9IG1OdW1GcmFtZXNXcml0dGVuOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6Om9wZW4oCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgQXVkaW9DYWxsYmFjayBjYiwgdm9pZCAqY29va2llLCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKSB7Ci0KLSAgICBtQ2FsbGJhY2sgPSBjYjsKLSAgICBtQ2FsbGJhY2tDb29raWUgPSBjb29raWU7Ci0KLSAgICAvLyBDaGVjayBhcmd1bWVudCAiYnVmZmVyQ291bnQiIGFnYWluc3QgdGhlIG1pbmludW0gYnVmZmVyIGNvdW50Ci0gICAgaWYgKGJ1ZmZlckNvdW50IDwgbU1pbkJ1ZmZlckNvdW50KSB7Ci0gICAgICAgIEFMT0dWKCJidWZmZXJDb3VudCAoJWQpIGlzIHRvbyBzbWFsbCBhbmQgaW5jcmVhc2VkIHRvICVkIiwKLSAgICAgICAgICAgIGJ1ZmZlckNvdW50LCBtTWluQnVmZmVyQ291bnQpOwotICAgICAgICBidWZmZXJDb3VudCA9IG1NaW5CdWZmZXJDb3VudDsKLQotICAgIH0KLSAgICBBTE9HVigib3BlbigldSwgJWQsICVkLCAlZCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGZvcm1hdCwgYnVmZmVyQ291bnQpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgY2xvc2UoKTsKLSAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICBpbnQgZnJhbWVDb3VudDsKLQotICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBtU3RyZWFtVHlwZSkgIT0KLSAgICAgTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIG1TdHJlYW1UeXBlKSAhPQotICAgICBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBmcmFtZUNvdW50ID0gKHNhbXBsZVJhdGUqYWZGcmFtZUNvdW50KmJ1ZmZlckNvdW50KS9hZlNhbXBsZVJhdGU7Ci0KLSAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7Ci0gICAgICAgIHN3aXRjaChjaGFubmVsQ291bnQpIHsKLSAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX01PTk87Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNwPEF1ZGlvVHJhY2s+IHQ7Ci0gICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKLSAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgIENhbGxiYWNrV3JhcHBlciwKLSAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCi0gICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBmbGFncyk7Ci0gICAgfQotCi0gICAgaWYgKCh0ID09IDApIHx8ICh0LT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgYXVkaW8gdHJhY2siKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgQUxPR1YoInNldFZvbHVtZSIpOwotICAgIHQtPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKLSAgICBtTXNlY3NQZXJGcmFtZSA9IDEuZTMgLyAoZmxvYXQpIHNhbXBsZVJhdGU7Ci0gICAgbUxhdGVuY3kgPSB0LT5sYXRlbmN5KCk7Ci0gICAgbVRyYWNrID0gdDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpzdGFydCgpIHsKLQotICAgIEFMT0dWKCJzdGFydCIpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVRyYWNrLT5zdGFydCgpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtVHJhY2stPmdldFBvc2l0aW9uKCZtTnVtRnJhbWVzV3JpdHRlbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OnNub29wV3JpdGUoCi0gICAgY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewotICAgIC8vIFZpc3VhbGl6YXRpb24gYnVmZmVycyBub3Qgc3VwcG9ydGVkCi0gICAgcmV0dXJuOwotCi19Ci0KLXNzaXplX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OndyaXRlKAotICAgICBjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7Ci0KLSAgICBMT0dfRkFUQUxfSUYobUNhbGxiYWNrICE9IE5VTEwsICJEb24ndCBjYWxsIHdyaXRlIGlmIHN1cHBseWluZyBhIGNhbGxiYWNrLiIpOwotCi0gICAgLy9BTE9HVigid3JpdGUoJXAsICV1KSIsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHNub29wV3JpdGUoYnVmZmVyLCBzaXplKTsKLSAgICAgICAgc3NpemVfdCByZXQgPSBtVHJhY2stPndyaXRlKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIG1OdW1GcmFtZXNXcml0dGVuICs9IHJldCAvIDQ7IC8vIGFzc3VtZSAxNiBiaXQgc3RlcmVvCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpzdG9wKCkgewotCi0gICAgQUxPR1YoInN0b3AiKTsKLSAgICBpZiAobVRyYWNrICE9IDApIG1UcmFjay0+c3RvcCgpOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpmbHVzaCgpIHsKLQotICAgIEFMT0dWKCJmbHVzaCIpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgbVRyYWNrLT5mbHVzaCgpOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpwYXVzZSgpIHsKLQotICAgIEFMT0dWKCJWZUF1ZGlvT3V0cHV0OjpwYXVzZSIpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgbVRyYWNrLT5wYXVzZSgpOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpjbG9zZSgpIHsKLQotICAgIEFMT0dWKCJjbG9zZSIpOwotICAgIG1UcmFjay5jbGVhcigpOwotfQotCi12b2lkIFZpZGVvRWRpdG9yUGxheWVyOjpWZUF1ZGlvT3V0cHV0OjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLQotICAgIEFMT0dWKCJzZXRWb2x1bWUoJWYsICVmKSIsIGxlZnQsIHJpZ2h0KTsKLSAgICBtTGVmdFZvbHVtZSA9IGxlZnQ7Ci0gICAgbVJpZ2h0Vm9sdW1lID0gcmlnaHQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Q2FsbGJhY2tXcmFwcGVyKAotICAgICAgICBpbnQgZXZlbnQsIHZvaWQgKmNvb2tpZSwgdm9pZCAqaW5mbykgewotICAgIC8vQUxPR1YoIlZlQXVkaW9PdXRwdXQ6OmNhbGxiYWNrd3JhcHBlciIpOwotICAgIGlmIChldmVudCAhPSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFZlQXVkaW9PdXRwdXQgKm1lID0gKFZlQXVkaW9PdXRwdXQgKiljb29raWU7Ci0gICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKLQotICAgIHNpemVfdCBhY3R1YWxTaXplID0gKCptZS0+bUNhbGxiYWNrKSgKLSAgICAgICAgICAgIG1lLCBidWZmZXItPnJhdywgYnVmZmVyLT5zaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAotICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX0ZJTExfQlVGRkVSKTsKLQotICAgIGJ1ZmZlci0+c2l6ZSA9IGFjdHVhbFNpemU7Ci0KLSAgICBpZiAoYWN0dWFsU2l6ZSA+IDApIHsKLSAgICAgICAgbWUtPnNub29wV3JpdGUoYnVmZmVyLT5yYXcsIGFjdHVhbFNpemUpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgcmVzdWx0LmFwcGVuZCgiIFZlQXVkaW9PdXRwdXRcbiIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRS0xLCAiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwKLSAgICAgICAgICAgIG1TdHJlYW1UeXBlLCBtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLTEsICIgIG1zZWMgcGVyIGZyYW1lKCVmKSwgbGF0ZW5jeSAoJWQpXG4iLAotICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWUsIG1MYXRlbmN5KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5kdW1wKGZkLCBhcmdzKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1pbnQgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQ6OmdldFNlc3Npb25JZCgpIGNvbnN0IHsKLQotICAgIHJldHVybiBtU2Vzc2lvbklkOwotfQotCi11aW50MzJfdCBWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dDo6Z2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsKLSAgICBpZiAobU1zZWNzUGVyRnJhbWUgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuICh1aW50MzJfdCkoMS5lMyAvIG1Nc2Vjc1BlckZyYW1lKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQbGF5ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQbGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzgxZTRiYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUGxheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9WSURFT0VESVRPUl9QTEFZRVJfSAotI2RlZmluZSBBTkRST0lEX1ZJREVPRURJVE9SX1BMQVlFUl9ICi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JNYWluLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaCIKLSNpbmNsdWRlICJOYXRpdmVXaW5kb3dSZW5kZXJlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBQcmV2aWV3UGxheWVyOwotCi1jbGFzcyBWaWRlb0VkaXRvclBsYXllciA6IHB1YmxpYyBNZWRpYVBsYXllckludGVyZmFjZSB7Ci0gICAgcHVibGljOgotICAgIGNsYXNzIFZlQXVkaW9PdXRwdXQ6IHB1YmxpYyBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luawotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlQXVkaW9PdXRwdXQoKTsKLSAgICAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgflZlQXVkaW9PdXRwdXQoKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICByZWFkeSgpIGNvbnN0IHsgcmV0dXJuIG1UcmFjayAhPSBOVUxMOyB9Ci0gICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIHJlYWx0aW1lKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICBidWZmZXJTaXplKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGZyYW1lQ291bnQoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgY2hhbm5lbENvdW50KCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIGZyYW1lU2l6ZSgpIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBsYXRlbmN5KCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgZmxvYXQgICAgICAgICAgIG1zZWNzUGVyRnJhbWUoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCopIGNvbnN0OwotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBnZXRTZXNzaW9uSWQoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIG9wZW4oCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCi0gICAgICAgICAgICAgICAgQXVkaW9DYWxsYmFjayBjYiwgdm9pZCAqY29va2llLCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGZsdXNoKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHBhdXNlKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIHZvaWQgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgeyBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7IH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1UeXBlOyB9Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwotCi0gICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIGlzT25FbXVsYXRvcigpOwotICAgICAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICBnZXRNaW5CdWZmZXJDb3VudCgpOwotICAgIHByaXZhdGU6Ci0gICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7Ci0gICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIENhbGxiYWNrV3JhcHBlcigKLSAgICAgICAgICAgICAgICBpbnQgZXZlbnQsIHZvaWQgKm1lLCB2b2lkICppbmZvKTsKLQotICAgICAgICBzcDxBdWRpb1RyYWNrPiAgICAgICAgICBtVHJhY2s7Ci0gICAgICAgIEF1ZGlvQ2FsbGJhY2sgICAgICAgICAgIG1DYWxsYmFjazsKLSAgICAgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29va2llOwotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKLSAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7Ci0gICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKLSAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWU7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1MYXRlbmN5OwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwotICAgICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBtSXNPbkVtdWxhdG9yOwotICAgICAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICBtTWluQnVmZmVyQ291bnQ7IC8vIDEyIGZvciBlbXVsYXRvcjsgb3RoZXJ3aXNlIDQKLQotICAgICAgICBwdWJsaWM6Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuOwotICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBzbm9vcFdyaXRlKGNvbnN0IHZvaWQqLCBzaXplX3QpOwotICAgIH07Ci0KLXB1YmxpYzoKLSAgICBWaWRlb0VkaXRvclBsYXllcihOYXRpdmVXaW5kb3dSZW5kZXJlciogcmVuZGVyZXIpOwotICAgIHZpcnR1YWwgflZpZGVvRWRpdG9yUGxheWVyKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcik7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotICAgIHZpcnR1YWwgYm9vbCBpc1BsYXlpbmcoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbyhpbnQgbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50ICptc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludCAqbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG9vcGluZyhpbnQgbG9vcCk7Ci0gICAgdmlydHVhbCBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luayk7Ci0gICAgdmlydHVhbCB2b2lkIGFjcXVpcmVMb2NrKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VMb2NrKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YWRhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkRWZmZWN0c1NldHRpbmdzKAotICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdFNldHRpbmdzLCBpbnQgbkVmZmVjdHMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkQXVkaW9NaXhTZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogcEF1ZGlvTWl4U2V0dGluZ3MpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb01peFBDTUZpbGVIYW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBwQXVkaW9NaXhQQ01GaWxlSGFuZGxlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9NaXhTdG9yeUJvYXJkUGFyYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHgsIE00T1NBX1VJbnQzMiB5LCBNNE9TQV9VSW50MzIgeik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrQmVnaW5UaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tFbmRUaW1lKHVpbnQzMl90IG1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3Rvcnlib2FyZFN0YXJ0VGltZSh1aW50MzJfdCBtc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCh1aW50MzJfdCBjYkludGVydmFsKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFSZW5kZXJpbmdNb2RlKE00eFZTU19NZWRpYVJlbmRlcmluZyBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXNldEpuaUNhbGxiYWNrVGltZVN0YW1wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbWFnZUNsaXBQcm9wZXJ0aWVzKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZpcnN0VmlkZW9GcmFtZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGFzdFJlbmRlcmVkVGltZU1zKHVpbnQzMl90ICpsYXN0UmVuZGVyZWRUaW1lTXMpOwotCi0gICAgc3RhdHVzX3Qgc2V0QXVkaW9QbGF5ZXIoVmlkZW9FZGl0b3JBdWRpb1BsYXllciAqYXVkaW9QbGF5ZXIpOwotcHJpdmF0ZToKLSAgICBQcmV2aWV3UGxheWVyICAgICAgICptUGxheWVyOwotICAgIHNwPFZlQXVkaW9PdXRwdXQ+ICAgIG1WZUF1ZGlvU2luazsKLQotICAgIFZpZGVvRWRpdG9yUGxheWVyKGNvbnN0IFZpZGVvRWRpdG9yUGxheWVyICYpOwotICAgIFZpZGVvRWRpdG9yUGxheWVyICZvcGVyYXRvcj0oY29uc3QgVmlkZW9FZGl0b3JQbGF5ZXIgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfVklERU9FRElUT1JfUExBWUVSX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTNmMzVhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJQcmV2aWV3Q29udHJvbGxlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KLQotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIuaCIKLSNpbmNsdWRlICJQcmV2aWV3UmVuZGVyZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNpbmNsdWRlICJNNE9TQV9UaHJlYWQuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotCi1WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyKCkKLSAgICA6IG1DdXJyZW50UGxheWVyKDApLAotICAgICAgbVRocmVhZENvbnRleHQoTlVMTCksCi0gICAgICBtUGxheWVyU3RhdGUoVmVQbGF5ZXJJZGxlKSwKLSAgICAgIG1QcmVwYXJlUmVxZXN0KE00T1NBX0ZBTFNFKSwKLSAgICAgIG1DbGlwTGlzdChOVUxMKSwKLSAgICAgIG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZCgwKSwKLSAgICAgIG1OdW1iZXJDbGlwc1RvUHJldmlldygwKSwKLSAgICAgIG1TdGFydGluZ0NsaXBJbmRleCgwKSwKLSAgICAgIG1QcmV2aWV3TG9vcGluZyhNNE9TQV9GQUxTRSksCi0gICAgICBtQ2FsbEJhY2tBZnRlckZyYW1lQ250KDApLAotICAgICAgbUVmZmVjdHNTZXR0aW5ncyhOVUxMKSwKLSAgICAgIG1OdW1iZXJFZmZlY3RzKDApLAotICAgICAgbUN1cnJlbnRDbGlwTnVtYmVyKC0xKSwKLSAgICAgIG1DbGlwVG90YWxEdXJhdGlvbigwKSwKLSAgICAgIG1DdXJyZW50VmlkZW9FZmZlY3QoVklERU9fRUZGRUNUX05PTkUpLAotICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmcoTlVMTCksCi0gICAgICBtQXVkaW9NaXhQQ01GaWxlSGFuZGxlKE5VTEwpLAotICAgICAgbVRhcmdldChOVUxMKSwKLSAgICAgIG1KbmlDb29raWUoTlVMTCksCi0gICAgICBtSm5pQ2FsbGJhY2soTlVMTCksCi0gICAgICBtQ3VycmVudFBsYXllZER1cmF0aW9uKDApLAotICAgICAgbUN1cnJlbnRDbGlwRHVyYXRpb24oMCksCi0gICAgICBtVmlkZW9TdG9yeUJvYXJkVGltZU1zVXB0b0ZpcnN0UHJldmlld0NsaXAoMCksCi0gICAgICBtT3ZlcmxheVN0YXRlKE9WRVJMQVlfQ0xFQVIpLAotICAgICAgbUFjdGl2ZVBsYXllckluZGV4KDApLAotICAgICAgbU91dHB1dFZpZGVvV2lkdGgoMCksCi0gICAgICBtT3V0cHV0VmlkZW9IZWlnaHQoMCksCi0gICAgICBiU3RvcFRocmVhZEluUHJvZ3Jlc3MoZmFsc2UpLAotICAgICAgbVNlbVRocmVhZFdhaXQoTlVMTCkgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyIik7Ci0gICAgbVJlbmRlcmluZ01vZGUgPSBNNHhWU1Nfa0JsYWNrQm9yZGVyczsKLSAgICBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCA9IGZhbHNlOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7ICsraSkgewotICAgICAgICBtVmVQbGF5ZXJbaV0gPSBOVUxMOwotICAgIH0KLX0KLQotVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6flZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIoKSB7Ci0gICAgQUxPR1YoIn5WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyIik7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwOwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gU3RvcCB0aGUgdGhyZWFkIGlmIGl0cyBzdGlsbCBydW5uaW5nCi0gICAgaWYobVRocmVhZENvbnRleHQgIT0gTlVMTCkgewotICAgICAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jU3RvcChtVGhyZWFkQ29udGV4dCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVigiflZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6IGVycm9yIDB4JXggXAotICAgICAgICAgICAgaW4gdHJ5aW5nIHRvIHN0b3AgdGhyZWFkIiwgZXJyKTsKLSAgICAgICAgICAgIC8vIENvbnRpbnVlIGV2ZW4gaWYgZXJyb3IKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNDbG9zZShtVGhyZWFkQ29udGV4dCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiflZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6IGVycm9yIDB4JXggXAotICAgICAgICAgICAgaW4gdHJ5aW5nIHRvIGNsb3NlIHRocmVhZCIsICh1bnNpZ25lZCBpbnQpIGVycik7Ci0gICAgICAgICAgICAvLyBDb250aW51ZSBldmVuIGlmIGVycm9yCi0gICAgICAgIH0KLQotICAgICAgICBtVGhyZWFkQ29udGV4dCA9IE5VTEw7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgcGxheWVySW5zdD0wOyBwbGF5ZXJJbnN0PGtUb3RhbE51bVBsYXllckluc3RhbmNlczsKLSAgICAgICAgIHBsYXllckluc3QrKykgewotICAgICAgICBpZihtVmVQbGF5ZXJbcGxheWVySW5zdF0gIT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1YoImNsZWFyaW5nIG1WZVBsYXllciAlZCIsIHBsYXllckluc3QpOwotICAgICAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihtQ2xpcExpc3QgIT0gTlVMTCkgewotICAgICAgICAvLyBDbGVhbiB1cAotICAgICAgICBmb3IoaT0wO2k8bU51bWJlckNsaXBzSW5TdG9yeUJvYXJkO2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYobUNsaXBMaXN0W2ldLT5wRmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShtQ2xpcExpc3RbaV0tPnBGaWxlKTsKLSAgICAgICAgICAgICAgICBtQ2xpcExpc3RbaV0tPnBGaWxlID0gTlVMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJlZShtQ2xpcExpc3RbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUobUNsaXBMaXN0KTsKLSAgICAgICAgbUNsaXBMaXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZihtRWZmZWN0c1NldHRpbmdzKSB7Ci0gICAgICAgIGZvcihpPTA7aTxtTnVtYmVyRWZmZWN0cztpKyspIHsKLSAgICAgICAgICAgIGlmKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnBhY19kYXRhKTsKLQotICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyKTsKLQotICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzKTsKLSAgICAgICAgbUVmZmVjdHNTZXR0aW5ncyA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpIHsKLSAgICAgICAgZXJyID0gTTRPU0FfZmlsZVJlYWRDbG9zZSAobUF1ZGlvTWl4UENNRmlsZUhhbmRsZSk7Ci0gICAgICAgIG1BdWRpb01peFBDTUZpbGVIYW5kbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUJhY2tncm91bmRBdWRpb1NldHRpbmcpOwotICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYobVRhcmdldCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBtT3ZlcmxheVN0YXRlID0gT1ZFUkxBWV9DTEVBUjsKLQotICAgIEFMT0dWKCJ+VmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciByZXR1cm5zIik7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpsb2FkRWRpdFNldHRpbmdzKAotICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncyxNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogYmdtU2V0dGluZ3MpIHsKLQotICAgIE00T1NBX1VJbnQzMiBpID0gMCwgaUNsaXBEdXJhdGlvbiA9IDAsIHJnYlNpemUgPSAwOwotICAgIE00VklGSV9VSW50OCAqdG1wID0gTlVMTDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJsb2FkRWRpdFNldHRpbmdzIik7Ci0gICAgQUxPR1YoImxvYWRFZGl0U2V0dGluZ3MgQ2hhbm5lbHMgPSAlZCwgc2FtcGxpbmcgRnJlcSAlZCIsCi0gICAgICAgICAgYmdtU2V0dGluZ3MtPnVpTmJDaGFubmVscywgYmdtU2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kgICk7Ci0gICAgICAgICAgYmdtU2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAzMjAwMDsKLQotICAgIEFMT0dWKCJsb2FkRWRpdFNldHRpbmdzIENoYW5uZWxzID0gJWQsIHNhbXBsaW5nIEZyZXEgJWQiLAotICAgICAgICAgIGJnbVNldHRpbmdzLT51aU5iQ2hhbm5lbHMsIGJnbVNldHRpbmdzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICApOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvLyBDbGVhbiB1cCBhbnkgcHJldmlvdXMgRWRpdCBzZXR0aW5ncyBiZWZvcmUgbG9hZGluZyBuZXcgb25lcwotICAgIG1DdXJyZW50VmlkZW9FZmZlY3QgPSBWSURFT19FRkZFQ1RfTk9ORTsKLQotICAgIGlmKG1BdWRpb01peFBDTUZpbGVIYW5kbGUpIHsKLSAgICAgICAgZXJyID0gTTRPU0FfZmlsZVJlYWRDbG9zZSAobUF1ZGlvTWl4UENNRmlsZUhhbmRsZSk7Ci0gICAgICAgIG1BdWRpb01peFBDTUZpbGVIYW5kbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyk7Ci0gICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZihtQ2xpcExpc3QgIT0gTlVMTCkgewotICAgICAgICAvLyBDbGVhbiB1cAotICAgICAgICBmb3IoaT0wO2k8bU51bWJlckNsaXBzSW5TdG9yeUJvYXJkO2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYobUNsaXBMaXN0W2ldLT5wRmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShtQ2xpcExpc3RbaV0tPnBGaWxlKTsKLSAgICAgICAgICAgICAgICBtQ2xpcExpc3RbaV0tPnBGaWxlID0gTlVMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJlZShtQ2xpcExpc3RbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUobUNsaXBMaXN0KTsKLSAgICAgICAgbUNsaXBMaXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZihtRWZmZWN0c1NldHRpbmdzKSB7Ci0gICAgICAgIGZvcihpPTA7aTxtTnVtYmVyRWZmZWN0cztpKyspIHsKLSAgICAgICAgICAgIGlmKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnBhY19kYXRhKTsKLQotICAgICAgICAgICAgICAgIGZyZWUobUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyKTsKLQotICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzKTsKLSAgICAgICAgbUVmZmVjdHNTZXR0aW5ncyA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYobUNsaXBMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgbU51bWJlckNsaXBzSW5TdG9yeUJvYXJkID0gcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0gICAgICAgIEFMT0dWKCJsb2FkRWRpdFNldHRpbmdzOiAjIG9mIENsaXBzID0gJWQiLCBtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQpOwotCi0gICAgICAgIG1DbGlwTGlzdCA9IChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MqKSpwU2V0dGluZ3MtPnVpQ2xpcE51bWJlciwgTTRWUywKLSAgICAgICAgIChNNE9TQV9DaGFyKikiTHZQUCwgY29weSBvZiBwQ2xpcExpc3QiKTsKLQotICAgICAgICBpZihOVUxMID09IG1DbGlwTGlzdCkgewotICAgICAgICAgICAgQUxPR0UoImxvYWRFZGl0U2V0dGluZ3M6IE1hbGxvYyBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKW1DbGlwTGlzdCwwLAotICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MqKSpwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcik7Ci0KLSAgICAgICAgZm9yKGk9MDtpPHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyO2krKykgewotCi0gICAgICAgICAgICAvLyBBbGxvY2F0ZSBjdXJyZW50IGNsaXAKLSAgICAgICAgICAgIG1DbGlwTGlzdFtpXSA9Ci0gICAgICAgICAgICAgKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MpLE00VlMsKE00T1NBX0NoYXIqKSJjbGlwIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgIGlmKG1DbGlwTGlzdFtpXSA9PSBOVUxMKSB7Ci0KLSAgICAgICAgICAgICAgICBBTE9HRSgibG9hZEVkaXRTZXR0aW5nczogQWxsb2NhdGlvbiBlcnJvciBmb3IgbUNsaXBMaXN0WyVkXSIsIChpbnQpaSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ29weSBwbGFpbiBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1DbGlwTGlzdFtpXSwKLSAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLAotICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSk7Ci0KLSAgICAgICAgICAgIGlmKE5VTEwgIT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlKSB7Ci0gICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT5wRmlsZSA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPmZpbGVQYXRoU2l6ZSwgTTRWUywKLSAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopInBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSIpOwotCi0gICAgICAgICAgICAgICAgaWYoTlVMTCA9PSBtQ2xpcExpc3RbaV0tPnBGaWxlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImxvYWRFZGl0U2V0dGluZ3MgOiBFUlJPUiBhbGxvY2F0aW5nIGZpbGVuYW1lIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPmZpbGVQYXRoU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiTlVMTCBmaWxlIHBhdGgiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdG90YWwgZHVyYXRpb24gb2YgYWxsIGNsaXBzCi0gICAgICAgICAgICBpQ2xpcER1cmF0aW9uID0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSAtCi0gICAgICAgICAgICAgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgICAgICBtQ2xpcFRvdGFsRHVyYXRpb24gPSBtQ2xpcFRvdGFsRHVyYXRpb24raUNsaXBEdXJhdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKG1FZmZlY3RzU2V0dGluZ3MgPT0gTlVMTCkgewotICAgICAgICBtTnVtYmVyRWZmZWN0cyA9IHBTZXR0aW5ncy0+bmJFZmZlY3RzOwotICAgICAgICBBTE9HVigibG9hZEVkaXRTZXR0aW5nczogbU51bWJlckVmZmVjdHMgPSAlZCIsIG1OdW1iZXJFZmZlY3RzKTsKLQotICAgICAgICBpZihtTnVtYmVyRWZmZWN0cyAhPSAwKSB7Ci0gICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzID0gKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgIG1OdW1iZXJFZmZlY3RzKnNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpLAotICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiZWZmZWN0cyBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibG9hZEVmZmVjdHNTZXR0aW5nczogQWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopbUVmZmVjdHNTZXR0aW5ncywwLAotICAgICAgICAgICAgIG1OdW1iZXJFZmZlY3RzKnNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLQotICAgICAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJFZmZlY3RzO2krKykgewotCi0gICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggPSBOVUxMOwotICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBUZXh0QnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSYobUVmZmVjdHNTZXR0aW5nc1tpXSksCi0gICAgICAgICAgICAgICAgICh2b2lkICopJihwU2V0dGluZ3MtPkVmZmVjdHNbaV0pLAotICAgICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSk7Ci0KLSAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgdGhlIHBGcmFtaW5nIFJHQiBidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgKE00VklGSV9JbWFnZVBsYW5lICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImx2cHAgZnJhbWluZyBidWZmZXIiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZihtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImxvYWRFZmZlY3RzU2V0dGluZ3M6QWxsb2MgZXJyb3IgZm9yIHBGcmFtaW5nQnVmIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5ncyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgcGFjX2RhdGEgKFJHQikKLSAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucmdiVHlwZSA9PSBNNFZTUzNHUFBfa1JHQjU2NSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZ2JTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfaGVpZ2h0KjI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigKLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnJnYlR5cGUgPT0gTTRWU1MzR1BQX2tSR0I4ODgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJnYlNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV9oZWlnaHQqMzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWZmZWN0c1NldHRpbmdzOiB3cm9uZyBSR0IgdHlwZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtRWZmZWN0c1NldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3MgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHRtcCA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocmdiU2l6ZSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiZnJhbWluZyBidWZmZXIgcGFjX2RhdGEiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZih0bXAgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImxvYWRFZmZlY3RzU2V0dGluZ3M6QWxsb2MgZXJyb3IgcEZyYW1pbmdCdWYgcGFjIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5ncyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcEZyYW1pbmdCdWZmZXIqLwotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnBhY19kYXRhID0gdG1wOwotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X2hlaWdodDsKLQotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3N0cmlkZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+dV9zdHJpZGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyLT51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnVfdG9wbGVmdDsKLQotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nU3RhcnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZCA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZTsKLSAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNTZXR0aW5nc1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdGhlIHBGcmFtaW5nIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopCi0gICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlci0+cGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXItPnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICByZ2JTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1NldHRpbmdzW2ldLnhWU1MucmdiVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5yZ2JUeXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyA9PSBOVUxMKSB7Ci0KLSAgICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmcgPSAoTTR4VlNTX0F1ZGlvTWl4aW5nU2V0dGluZ3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgc2l6ZW9mKE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKSwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIqKSJMdlBQLCBjb3B5IG9mIGJnbVNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoTlVMTCA9PSBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZykgewotICAgICAgICAgICAgQUxPR0UoImxvYWRFZGl0U2V0dGluZ3M6IG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nIE1hbGxvYyBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbXNldCgodm9pZCAqKW1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLCAwLHNpemVvZihNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyopKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopbUJhY2tncm91bmRBdWRpb1NldHRpbmcsICh2b2lkICopYmdtU2V0dGluZ3MsIHNpemVvZihNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncykpOwotCi0gICAgICAgIGlmICggbUJhY2tncm91bmRBdWRpb1NldHRpbmctPnBGaWxlICE9IE00T1NBX05VTEwgKSB7Ci0KLSAgICAgICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLT5wRmlsZSA9IChNNE9TQV9Wb2lkKikgYmdtU2V0dGluZ3MtPnBQQ01GaWxlUGF0aDsKLSAgICAgICAgICAgIG1CYWNrZ3JvdW5kQXVkaW9TZXR0aW5nLT51aU5iQ2hhbm5lbHMgPSAyOwotICAgICAgICAgICAgbUJhY2tncm91bmRBdWRpb1NldHRpbmctPnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAzMjAwMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE9wZW4gdGhlIEJHIGZpbGUKLSAgICAgICAgaWYgKCBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZy0+cEZpbGUgIT0gTTRPU0FfTlVMTCApIHsKLSAgICAgICAgICAgIGVyciA9IE00T1NBX2ZpbGVSZWFkT3BlbigmbUF1ZGlvTWl4UENNRmlsZUhhbmRsZSwKLSAgICAgICAgICAgICBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZy0+cEZpbGUsIE00T1NBX2tGaWxlUmVhZCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJsb2FkRWRpdFNldHRpbmdzOiBtQmFja2dyb3VuZEF1ZGlvIFBDTSBGaWxlIG9wZW4gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIG1PdXRwdXRWaWRlb1NpemUgPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplOwotICAgIG1GcmFtZVN0ci5wQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKLSAgICBBTE9HVigic2V0U3VyZmFjZSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBtU3VyZmFjZSA9IHN1cmZhY2U7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpzdGFydFByZXZpZXcoCi0gICAgTTRPU0FfVUludDMyIGZyb21NUywgTTRPU0FfSW50MzIgdG9NcywgTTRPU0FfVUludDE2IGNhbGxCYWNrQWZ0ZXJGcmFtZUNvdW50LAotICAgIE00T1NBX0Jvb2wgbG9vcCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwLCBpSW5jcmVtZW50ZWREdXJhdGlvbiA9IDA7Ci0gICAgQUxPR1YoInN0YXJ0UHJldmlldyIpOwotCi0gICAgaWYoZnJvbU1TID4gKE00T1NBX1VJbnQzMil0b01zKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFByZXZpZXc6IGZyb21NUyA+IHRvTXMiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZih0b01zID09IDApIHsKLSAgICAgICAgQUxPR0UoInN0YXJ0UHJldmlldzogdG9NcyBpcyAwIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLy8gSWYgYWxyZWFkeSBzdGFydGVkLCB0aGVuIHN0b3AgcHJldmlldyBmaXJzdAotICAgIGZvcihpbnQgcGxheWVySW5zdD0wOyBwbGF5ZXJJbnN0PGtUb3RhbE51bVBsYXllckluc3RhbmNlczsgcGxheWVySW5zdCsrKSB7Ci0gICAgICAgIGlmKG1WZVBsYXllcltwbGF5ZXJJbnN0XSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBzdG9wcGluZyBwcmV2aW91c2x5IHN0YXJ0ZWQgcHJldmlldyBwbGF5YmFjayIpOwotICAgICAgICAgICAgc3RvcFByZXZpZXcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgcmVuZGVyUHJldmlldyB3YXMgY2FsbGVkIHByZXZpb3VzbHksIHRoZW4gZGVsZXRlIFJlbmRlcmVyIG9iamVjdCBmaXJzdAotICAgIGlmKG1UYXJnZXQgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBkZWxldGUgcHJldmlvdXMgUHJldmlld1JlbmRlcmVyIik7Ci0gICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgQXVkaW8gcGxheWVyIHRvIGJlIHVzZWQgZm9yIGVudGlyZQotICAgIC8vIHN0b3J5Ym9hcmQgZHVyYXRpb24KLSAgICBtVkVBdWRpb1NpbmsgPSBuZXcgVmlkZW9FZGl0b3JQbGF5ZXI6OlZlQXVkaW9PdXRwdXQoKTsKLSAgICBtVkVBdWRpb1BsYXllciA9IG5ldyBWaWRlb0VkaXRvckF1ZGlvUGxheWVyKG1WRUF1ZGlvU2luayk7Ci0gICAgbVZFQXVkaW9QbGF5ZXItPnNldEF1ZGlvTWl4U2V0dGluZ3MobUJhY2tncm91bmRBdWRpb1NldHRpbmcpOwotICAgIG1WRUF1ZGlvUGxheWVyLT5zZXRBdWRpb01peFBDTUZpbGVIYW5kbGUobUF1ZGlvTWl4UENNRmlsZUhhbmRsZSk7Ci0KLSAgICAvLyBDcmVhdGUgVmlkZW8gUmVuZGVyZXIgdG8gYmUgdXNlZCBmb3IgdGhlIGVudGlyZSBzdG9yeWJvYXJkIGR1cmF0aW9uLgotICAgIHVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgZ2V0VmlkZW9TaXplQnlSZXNvbHV0aW9uKG1PdXRwdXRWaWRlb1NpemUsICZ3aWR0aCwgJmhlaWdodCk7Ci0gICAgbU5hdGl2ZVdpbmRvd1JlbmRlcmVyID0gbmV3IE5hdGl2ZVdpbmRvd1JlbmRlcmVyKG1TdXJmYWNlLCB3aWR0aCwgaGVpZ2h0KTsKLQotICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IGxvb3AgPSAlZCIsIGxvb3ApOwotICAgIG1QcmV2aWV3TG9vcGluZyA9IGxvb3A7Ci0KLSAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBjYWxsQmFja0FmdGVyRnJhbWVDb3VudCA9ICVkIiwgY2FsbEJhY2tBZnRlckZyYW1lQ291bnQpOwotICAgIG1DYWxsQmFja0FmdGVyRnJhbWVDbnQgPSBjYWxsQmFja0FmdGVyRnJhbWVDb3VudDsKLQotICAgIGZvciAoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7IHBsYXllckluc3QrKykgewotICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0gPSBuZXcgVmlkZW9FZGl0b3JQbGF5ZXIobU5hdGl2ZVdpbmRvd1JlbmRlcmVyKTsKLSAgICAgICAgaWYobVZlUGxheWVyW3BsYXllckluc3RdID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGFydFByZXZpZXc6RXJyb3IgY3JlYXRpbmcgVmlkZW9FZGl0b3JQbGF5ZXIgJWQiLHBsYXllckluc3QpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IG9iamVjdCBjcmVhdGVkIik7Ci0KLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5zZXROb3RpZnlDYWxsYmFjayh0aGlzLChub3RpZnlfY2FsbGJhY2tfZilub3RpZnkpOwotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBub3RpZnkgY2FsbGJhY2sgc2V0Iik7Ci0KLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5sb2FkRWZmZWN0c1NldHRpbmdzKG1FZmZlY3RzU2V0dGluZ3MsCi0gICAgICAgICBtTnVtYmVyRWZmZWN0cyk7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IGVmZmVjdHMgc2V0dGluZ3MgbG9hZGVkIik7Ci0KLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5sb2FkQXVkaW9NaXhTZXR0aW5ncyhtQmFja2dyb3VuZEF1ZGlvU2V0dGluZyk7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IEF1ZGlvTWl4U2V0dGluZ3Mgc2V0dGluZ3MgbG9hZGVkIik7Ci0KLSAgICAgICAgbVZlUGxheWVyW3BsYXllckluc3RdLT5zZXRBdWRpb01peFBDTUZpbGVIYW5kbGUobUF1ZGlvTWl4UENNRmlsZUhhbmRsZSk7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IEF1ZGlvTWl4UENNRmlsZUhhbmRsZSBzZXQiKTsKLQotICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0tPnNldFByb2dyZXNzQ2FsbGJhY2tJbnRlcnZhbCgKLSAgICAgICAgIG1DYWxsQmFja0FmdGVyRnJhbWVDbnQpOwotICAgICAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBzZXRQcm9ncmVzc0NhbGxCYWNrSW50ZXJ2YWwiKTsKLSAgICB9Ci0KLSAgICBtUGxheWVyU3RhdGUgPSBWZVBsYXllcklkbGU7Ci0gICAgbVByZXBhcmVSZXFlc3QgPSBNNE9TQV9GQUxTRTsKLQotICAgIGlmKGZyb21NUyA9PSAwKSB7Ci0gICAgICAgIG1DdXJyZW50Q2xpcE51bWJlciA9IC0xOwotICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIHZhbHVlCi0gICAgICAgIG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lID0gbUNsaXBMaXN0WzBdLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgbVZpZGVvU3RvcnlCb2FyZFRpbWVNc1VwdG9GaXJzdFByZXZpZXdDbGlwID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IGZyb21NUz0lZCIsIGZyb21NUyk7Ci0gICAgICAgIGlmKGZyb21NUyA+PSBtQ2xpcFRvdGFsRHVyYXRpb24pIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGFydFByZXZpZXc6IGZyb21NUyA+PSBtQ2xpcFRvdGFsRHVyYXRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZDtpKyspIHsKLSAgICAgICAgICAgIGlmKGZyb21NUyA8IChpSW5jcmVtZW50ZWREdXJhdGlvbiArIChtQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSAtCi0gICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IHRvIDEgaW5kZXggYmVsb3csCi0gICAgICAgICAgICAgICAgLy8gYXMgdGhyZWFkUHJvY2VzcyBmaXJzdCBpbmNyZW1lbnRzIHRoZSBjbGlwIGluZGV4Ci0gICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gcHJvY2Vzc2VzIGNsaXAgaW4gdGhyZWFkIGxvb3AKLSAgICAgICAgICAgICAgICBtQ3VycmVudENsaXBOdW1iZXIgPSBpLTE7Ci0gICAgICAgICAgICAgICAgQUxPR0QoInN0YXJ0UHJldmlldzptQ3VycmVudENsaXBOdW1iZXIgPSAlZCBmcm9tTVM9JWQiLGksZnJvbU1TKTsKLQotICAgICAgICAgICAgICAgIC8vIFNhdmUgb3JpZ2luYWwgdmFsdWUKLSAgICAgICAgICAgICAgICBtRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZSA9IG1DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBTZXQgY29ycmVjdCBiZWdpbiB0aW1lIHRvIHN0YXJ0IHBsYXliYWNrCi0gICAgICAgICAgICAgICAgaWYoKGZyb21NUyttQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSA+Ci0gICAgICAgICAgICAgICAgKGlJbmNyZW1lbnRlZER1cmF0aW9uK21DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lICsKLSAgICAgICAgICAgICAgICAgICAgIChmcm9tTVMgLSBpSW5jcmVtZW50ZWREdXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaUluY3JlbWVudGVkRHVyYXRpb24gPSBpSW5jcmVtZW50ZWREdXJhdGlvbiArCi0gICAgICAgICAgICAgICAgIChtQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSAtIG1DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1WaWRlb1N0b3J5Qm9hcmRUaW1lTXNVcHRvRmlyc3RQcmV2aWV3Q2xpcCA9IGlJbmNyZW1lbnRlZER1cmF0aW9uOwotICAgIH0KLQotICAgIGZvciAoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7IHBsYXllckluc3QrKykgewotICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0tPnNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtKGZyb21NUywKLSAgICAgICAgIG1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lLAotICAgICAgICAgbUNsaXBMaXN0W2ldLT5DbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb1ZvbHVtZVBlcmNlbnRhZ2UpOwotCi0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6c2V0QXVkaW9NaXhTdG9yeUJvYXJkU2tpbVRpbWVTdGFtcCBzZXQgJWQgY3V0dGltZSBcCi0gICAgICAgICAlZCIsIGZyb21NUywgbUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWUpOwotICAgIH0KLQotICAgIG1TdGFydGluZ0NsaXBJbmRleCA9IG1DdXJyZW50Q2xpcE51bWJlcisxOwotCi0gICAgLy8gU3RhcnQgcGxheWluZyB3aXRoIHBsYXllciBpbnN0YW5jZSAwCi0gICAgbUN1cnJlbnRQbGF5ZXIgPSAwOwotICAgIG1BY3RpdmVQbGF5ZXJJbmRleCA9IDA7Ci0KLSAgICBpZih0b01zID09IC0xKSB7Ci0gICAgICAgIEFMT0dWKCJzdGFydFByZXZpZXc6IFByZXZpZXcgdGlsbCBlbmQgb2Ygc3Rvcnlib2FyZCIpOwotICAgICAgICBtTnVtYmVyQ2xpcHNUb1ByZXZpZXcgPSBtTnVtYmVyQ2xpcHNJblN0b3J5Qm9hcmQ7Ci0gICAgICAgIC8vIFNhdmUgb3JpZ2luYWwgdmFsdWUKLSAgICAgICAgbUxhc3RQcmV2aWV3Q2xpcEVuZFRpbWUgPQotICAgICAgICAgbUNsaXBMaXN0W21OdW1iZXJDbGlwc1RvUHJldmlldy0xXS0+dWlFbmRDdXRUaW1lOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgQUxPR1YoInN0YXJ0UHJldmlldzogdG9Ncz0lZCIsIHRvTXMpOwotICAgICAgICBpZigoTTRPU0FfVUludDMyKXRvTXMgPiBtQ2xpcFRvdGFsRHVyYXRpb24pIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGFydFByZXZpZXc6IHRvTXMgPiBtQ2xpcFRvdGFsRHVyYXRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICBpSW5jcmVtZW50ZWREdXJhdGlvbiA9IDA7Ci0KLSAgICAgICAgZm9yKGk9MDtpPG1OdW1iZXJDbGlwc0luU3RvcnlCb2FyZDtpKyspIHsKLSAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpdG9NcyA8PSAoaUluY3JlbWVudGVkRHVyYXRpb24gKwotICAgICAgICAgICAgIChtQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSAtIG1DbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpKSkgewotICAgICAgICAgICAgICAgIC8vIFNhdmUgb3JpZ2luYWwgdmFsdWUKLSAgICAgICAgICAgICAgICBtTGFzdFByZXZpZXdDbGlwRW5kVGltZSA9IG1DbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lOwotICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZW5kIGN1dCB0aW1lIG9mIGNsaXAgaW5kZXggaSB0byB0b01zCi0gICAgICAgICAgICAgICAgbUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgPSB0b01zOwotCi0gICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGNsaXBzIHRvIGJlIHByZXZpZXdlZCBpcyBmcm9tIGluZGV4IDAgdG8gaQotICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCBieSAxIGFzIGkgc3RhcnRzIGZyb20gMAotICAgICAgICAgICAgICAgIG1OdW1iZXJDbGlwc1RvUHJldmlldyA9IGkrMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlJbmNyZW1lbnRlZER1cmF0aW9uID0gaUluY3JlbWVudGVkRHVyYXRpb24gKwotICAgICAgICAgICAgICAgICAobUNsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgLSBtQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE9wZW4gdGhlIHRocmVhZCBzZW1hcGhvcmUKLSAgICBNNE9TQV9zZW1hcGhvcmVPcGVuKCZtU2VtVGhyZWFkV2FpdCwgMSk7Ci0KLSAgICAvLyBPcGVuIHRoZSBwcmV2aWV3IHByb2Nlc3MgdGhyZWFkCi0gICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY09wZW4oJm1UaHJlYWRDb250ZXh0LCAoTTRPU0FfVGhyZWFkRG9JdCl0aHJlYWRQcm9jKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgQUxPR0UoIlZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6TTRPU0FfdGhyZWFkU3luY09wZW4gZXJyb3IgJWQiLCAoaW50KSBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgc3RhY2tzaXplCi0gICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbihtVGhyZWFkQ29udGV4dCwgTTRPU0FfVGhyZWFkU3RhY2tTaXplLAotICAgICAoTTRPU0FfRGF0YU9wdGlvbikga1ByZXZpZXdUaHJlYWRTdGFja1NpemUpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIEFMT0dFKCJWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOiB0aHJlYWRTeW5jU2V0T3B0aW9uIGVycm9yICVkIiwgKGludCkgZXJyKTsKLSAgICAgICAgTTRPU0FfdGhyZWFkU3luY0Nsb3NlKG1UaHJlYWRDb250ZXh0KTsKLSAgICAgICAgbVRocmVhZENvbnRleHQgPSBOVUxMOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICAvLyBTdGFydCB0aGUgdGhyZWFkCi0gICAgIGVyciA9IE00T1NBX3RocmVhZFN5bmNTdGFydChtVGhyZWFkQ29udGV4dCwgKE00T1NBX1ZvaWQqKXRoaXMpOwotICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgQUxPR0UoIlZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6IHRocmVhZFN5bmNTdGFydCBlcnJvciAlZCIsIChpbnQpIGVycik7Ci0gICAgICAgIE00T1NBX3RocmVhZFN5bmNDbG9zZShtVGhyZWFkQ29udGV4dCk7Ci0gICAgICAgIG1UaHJlYWRDb250ZXh0ID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgYlN0b3BUaHJlYWRJblByb2dyZXNzID0gZmFsc2U7Ci0KLSAgICBBTE9HVigic3RhcnRQcmV2aWV3OiBwcm9jZXNzIHRocmVhZCBzdGFydGVkIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX1VJbnQzMiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpzdG9wUHJldmlldygpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICB1aW50MzJfdCBsYXN0UmVuZGVyZWRGcmFtZVRpbWVNcyA9IDA7Ci0gICAgQUxPR1YoInN0b3BQcmV2aWV3Iik7Ci0KLSAgICAvLyBTdG9wIHRoZSB0aHJlYWQKLSAgICBpZihtVGhyZWFkQ29udGV4dCAhPSBOVUxMKSB7Ci0gICAgICAgIGJTdG9wVGhyZWFkSW5Qcm9ncmVzcyA9IHRydWU7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9ja1NlbSk7Ci0gICAgICAgICAgICBpZiAobVNlbVRocmVhZFdhaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX3NlbWFwaG9yZVBvc3QobVNlbVRocmVhZFdhaXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRPU0FfdGhyZWFkU3luY1N0b3AobVRocmVhZENvbnRleHQpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1YoInN0b3BQcmV2aWV3OiBlcnJvciAweCV4IGluIHRyeWluZyB0byBzdG9wIHRocmVhZCIsIGVycik7Ci0gICAgICAgICAgICAvLyBDb250aW51ZSBldmVuIGlmIGVycm9yCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNE9TQV90aHJlYWRTeW5jQ2xvc2UobVRocmVhZENvbnRleHQpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoInN0b3BQcmV2aWV3OiBlcnJvciAweCV4IGluIHRyeWluZyB0byBjbG9zZSB0aHJlYWQiLCAodW5zaWduZWQgaW50KWVycik7Ci0gICAgICAgICAgICAvLyBDb250aW51ZSBldmVuIGlmIGVycm9yCi0gICAgICAgIH0KLQotICAgICAgICBtVGhyZWFkQ29udGV4dCA9IE5VTEw7Ci0gICAgfQotCi0gICAgLy8gQ2xvc2UgdGhlIHNlbWFwaG9yZSBmaXJzdAotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrU2VtKTsKLSAgICAgICAgaWYobVNlbVRocmVhZFdhaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgZXJyID0gTTRPU0Ffc2VtYXBob3JlQ2xvc2UobVNlbVRocmVhZFdhaXQpOwotICAgICAgICAgICAgQUxPR1YoInN0b3BQcmV2aWV3OiBjbG9zZSBzZW1hcGhvcmUgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIG1TZW1UaHJlYWRXYWl0ID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaW50IHBsYXllckluc3Q9MDsgcGxheWVySW5zdDxrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXM7IHBsYXllckluc3QrKykgewotICAgICAgICBpZihtVmVQbGF5ZXJbcGxheWVySW5zdF0gIT0gTlVMTCkgewotICAgICAgICAgICAgaWYobVZlUGxheWVyW3BsYXllckluc3RdLT5pc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzdG9wIHRoZSBwbGF5ZXIgZmlyc3QiKTsKLSAgICAgICAgICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0tPnN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwbGF5ZXJJbnN0ID09IG1BY3RpdmVQbGF5ZXJJbmRleCkgewotICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgbGFzdCByZW5kZXJlZCBmcmFtZSB0aW1lIHN0YW1wCi0gICAgICAgICAgICAgICAgbVZlUGxheWVyW21BY3RpdmVQbGF5ZXJJbmRleF0tPmdldExhc3RSZW5kZXJlZFRpbWVNcygmbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL1RoaXMgaXMgdXNlZCB0byBzeW5jcm9uaXplIG9uU3RyZWFtRG9uZSgpIGluIFByZXZpZXdQbGF5ZXIgYW5kCi0gICAgICAgICAgICAvL3N0b3BQcmV2aWV3KCkgaW4gUHJldmlld0NvbnRyb2xsZXIKLSAgICAgICAgICAgIHNwPFZpZGVvRWRpdG9yUGxheWVyPiB0ZW1wID0gbVZlUGxheWVyW3BsYXllckluc3RdOwotICAgICAgICAgICAgdGVtcC0+YWNxdWlyZUxvY2soKTsKLSAgICAgICAgICAgIEFMT0dWKCJzdG9wUHJldmlldzogY2xlYXJpbmcgbVZlUGxheWVyIik7Ci0gICAgICAgICAgICBtVmVQbGF5ZXJbcGxheWVySW5zdF0uY2xlYXIoKTsKLSAgICAgICAgICAgIG1WZVBsYXllcltwbGF5ZXJJbnN0XSA9IE5VTEw7Ci0gICAgICAgICAgICB0ZW1wLT5yZWxlYXNlTG9jaygpOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCJzdG9wUHJldmlldzogY2xlYXIgYXVkaW9TaW5rIGFuZCBhdWRpb1BsYXllciIpOwotICAgIG1WRUF1ZGlvU2luay5jbGVhcigpOwotICAgIGlmIChtVkVBdWRpb1BsYXllcikgewotICAgICAgICBkZWxldGUgbVZFQXVkaW9QbGF5ZXI7Ci0gICAgICAgIG1WRUF1ZGlvUGxheWVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBkZWxldGUgbU5hdGl2ZVdpbmRvd1JlbmRlcmVyOwotICAgIG1OYXRpdmVXaW5kb3dSZW5kZXJlciA9IE5VTEw7Ci0KLSAgICAvLyBJZiBpbWFnZSBmaWxlIHBsYXlpbmcsIHRoZW4gZnJlZSB0aGUgYnVmZmVyIHBvaW50ZXIKLSAgICBpZihtRnJhbWVTdHIucEJ1ZmZlciAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUobUZyYW1lU3RyLnBCdWZmZXIpOwotICAgICAgICBtRnJhbWVTdHIucEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLy8gUmVzZXQgb3JpZ2luYWwgYmVnaW4gY3V0dGltZSBvZiBmaXJzdCBwcmV2aWV3ZWQgY2xpcCovCi0gICAgbUNsaXBMaXN0W21TdGFydGluZ0NsaXBJbmRleF0tPnVpQmVnaW5DdXRUaW1lID0gbUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWU7Ci0gICAgLy8gUmVzZXQgb3JpZ2luYWwgZW5kIGN1dHRpbWUgb2YgbGFzdCBwcmV2aWV3ZWQgY2xpcCovCi0gICAgbUNsaXBMaXN0W21OdW1iZXJDbGlwc1RvUHJldmlldy0xXS0+dWlFbmRDdXRUaW1lID0gbUxhc3RQcmV2aWV3Q2xpcEVuZFRpbWU7Ci0KLSAgICBtUGxheWVyU3RhdGUgPSBWZVBsYXllcklkbGU7Ci0gICAgbVByZXBhcmVSZXFlc3QgPSBNNE9TQV9GQUxTRTsKLQotICAgIG1DdXJyZW50UGxheWVkRHVyYXRpb24gPSAwOwotICAgIG1DdXJyZW50Q2xpcER1cmF0aW9uID0gMDsKLSAgICBtUmVuZGVyaW5nTW9kZSA9IE00eFZTU19rQmxhY2tCb3JkZXJzOwotICAgIG1PdXRwdXRWaWRlb1dpZHRoID0gMDsKLSAgICBtT3V0cHV0VmlkZW9IZWlnaHQgPSAwOwotCi0gICAgQUxPR1YoInN0b3BQcmV2aWV3KCkgbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXMgJWxkIiwgbGFzdFJlbmRlcmVkRnJhbWVUaW1lTXMpOwotICAgIHJldHVybiBsYXN0UmVuZGVyZWRGcmFtZVRpbWVNczsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OmNsZWFyU3VyZmFjZSgKLSAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyKiBwRnJhbWVJbmZvKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHIqIHBGcmFtZVN0ciA9IHBGcmFtZUluZm87Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dEJ1ZmZlcldpZHRoID0wLCBvdXRwdXRCdWZmZXJIZWlnaHQ9MDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwbGFuZU91dFszXTsKLSAgICBBTE9HVigiSW5zaWRlIHByZXZpZXcgY2xlYXIgZnJhbWUiKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvLyBEZWxldGUgcHJldmlvdXMgcmVuZGVyZXIgaW5zdGFuY2UKLSAgICBpZihtVGFyZ2V0ICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1UYXJnZXQ7Ci0gICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgIH0KLQotICAgIG91dHB1dEJ1ZmZlcldpZHRoID0gcEZyYW1lU3RyLT51aUZyYW1lV2lkdGg7Ci0gICAgb3V0cHV0QnVmZmVySGVpZ2h0ID0gcEZyYW1lU3RyLT51aUZyYW1lSGVpZ2h0OwotCi0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVuZGVyZXIKLSAgICBpZihtVGFyZ2V0ID09IE5VTEwpIHsKLQotICAgICAgICBtVGFyZ2V0ID0gUHJldmlld1JlbmRlcmVyOjpDcmVhdGVQcmV2aWV3UmVuZGVyZXIoCi0gICAgICAgICAgICBzdXJmYWNlLAotICAgICAgICAgICAgb3V0cHV0QnVmZmVyV2lkdGgsIG91dHB1dEJ1ZmZlckhlaWdodCk7Ci0KLSAgICAgICAgaWYobVRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOiBjYW5ub3QgY3JlYXRlIFByZXZpZXdSZW5kZXJlciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gT3V0IHBsYW5lCi0gICAgdWludDhfdCogb3V0QnVmZmVyOwotICAgIHNpemVfdCBvdXRCdWZmZXJTdHJpZGUgPSAwOwotCi0gICAgQUxPR1YoImRvTWVkaWFSZW5kZXJpbmcgQ0FMTCBnZXRCdWZmZXIoKSIpOwotICAgIG1UYXJnZXQtPmdldEJ1ZmZlcllWMTIoJm91dEJ1ZmZlciwgJm91dEJ1ZmZlclN0cmlkZSk7Ci0KLSAgICAvLyBTZXQgdGhlIG91dHB1dCBZVVY0MjAgcGxhbmUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFlWMTIgZm9ybWF0Ci0gICAgLy9JbiBZVjEyIGZvcm1hdCwgc2l6ZXMgbXVzdCBiZSBldmVuCi0gICAgTTRPU0FfVUludDMyIHl2MTJQbGFuZVdpZHRoID0gKChvdXRwdXRCdWZmZXJXaWR0aCArMSk+PjEpPDwxOwotICAgIE00T1NBX1VJbnQzMiB5djEyUGxhbmVIZWlnaHQgPSAoKG91dHB1dEJ1ZmZlckhlaWdodCsxKT4+MSk8PDE7Ci0KLSAgICBwcmVwYXJlWVYxMkltYWdlUGxhbmUocGxhbmVPdXQsIHl2MTJQbGFuZVdpZHRoLCB5djEyUGxhbmVIZWlnaHQsCi0gICAgIChNNE9TQV9VSW50MzIpb3V0QnVmZmVyU3RyaWRlLCAoTTRWSUZJX1VJbnQ4ICopb3V0QnVmZmVyKTsKLQotICAgIC8qIEZpbGwgdGhlIHN1cmZhY2Ugd2l0aCBibGFjayBmcmFtZSAqLwotICAgIG1lbXNldCgodm9pZCAqKXBsYW5lT3V0WzBdLnBhY19kYXRhLDB4MDAscGxhbmVPdXRbMF0udV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVPdXRbMF0udV9oZWlnaHQgKiAxLjUpOwotICAgIG1lbXNldCgodm9pZCAqKXBsYW5lT3V0WzFdLnBhY19kYXRhLDEyOCxwbGFuZU91dFsxXS51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZU91dFsxXS51X2hlaWdodCk7Ci0gICAgbWVtc2V0KCh2b2lkICopcGxhbmVPdXRbMl0ucGFjX2RhdGEsMTI4LHBsYW5lT3V0WzJdLnVfd2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZU91dFsyXS51X2hlaWdodCk7Ci0KLSAgICBtVGFyZ2V0LT5yZW5kZXJZVjEyKCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXI6OnJlbmRlclByZXZpZXdGcmFtZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAotICAgICAgICAgICAgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyKiBwRnJhbWVJbmZvLAotICAgICAgICAgICAgVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyAqcEN1cnJFZGl0SW5mbykgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwLCBpSW5jcmVtZW50ZWREdXJhdGlvbiA9IDAsIHRuVGltZU1zPTAsIGZyYW1lc2l6ZSA9MDsKLSAgICBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHIqIHBGcmFtZVN0ciA9IHBGcmFtZUluZm87Ci0gICAgTTRWSUZJX1VJbnQ4ICpwaXhlbEFycmF5ID0gTlVMTDsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKHBDdXJyRWRpdEluZm8gIT0gTlVMTCkgewotICAgICAgICBwQ3VyckVkaXRJbmZvLT5vdmVybGF5U2V0dGluZ3NJbmRleCA9IC0xOwotICAgIH0KLSAgICAvLyBEZWxldGUgcHJldmlvdXMgcmVuZGVyZXIgaW5zdGFuY2UKLSAgICBpZihtVGFyZ2V0ICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1UYXJnZXQ7Ci0gICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKG1PdXRwdXRWaWRlb1dpZHRoID09IDApIHsKLSAgICAgICAgbU91dHB1dFZpZGVvV2lkdGggPSBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aDsKLSAgICB9Ci0KLSAgICBpZihtT3V0cHV0VmlkZW9IZWlnaHQgPT0gMCkgewotICAgICAgICBtT3V0cHV0VmlkZW9IZWlnaHQgPSBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQ7Ci0gICAgfQotCi0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVuZGVyZXIKLSAgICBpZihtVGFyZ2V0ID09IE5VTEwpIHsKLSAgICAgICAgIG1UYXJnZXQgPSBQcmV2aWV3UmVuZGVyZXI6OkNyZWF0ZVByZXZpZXdSZW5kZXJlcigKLSAgICAgICAgICAgIHN1cmZhY2UsCi0gICAgICAgICAgICBtT3V0cHV0VmlkZW9XaWR0aCwgbU91dHB1dFZpZGVvSGVpZ2h0KTsKLQotICAgICAgICBpZihtVGFyZ2V0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJyZW5kZXJQcmV2aWV3RnJhbWU6IGNhbm5vdCBjcmVhdGUgUHJldmlld1JlbmRlcmVyIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwaXhlbEFycmF5ID0gTlVMTDsKLQotICAgIC8vIEFwcGx5IHJvdGF0aW9uIGlmIHJlcXVpcmVkCi0gICAgaWYgKHBGcmFtZVN0ci0+dmlkZW9Sb3RhdGlvbkRlZ3JlZSAhPSAwKSB7Ci0gICAgICAgIGVyciA9IGFwcGx5VmlkZW9Sb3RhdGlvbigoTTRPU0FfVm9pZCAqKXBGcmFtZVN0ci0+cEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIHBGcmFtZVN0ci0+dWlGcmFtZVdpZHRoLCBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQsCi0gICAgICAgICAgICAgICAgICBwRnJhbWVTdHItPnZpZGVvUm90YXRpb25EZWdyZWUpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJyZW5kZXJQcmV2aWV3RnJhbWU6IGNhbm5vdCByb3RhdGUgdmlkZW8sIGVyciAweCV4IiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICAgICAgZGVsZXRlIG1UYXJnZXQ7Ci0gICAgICAgICAgICBtVGFyZ2V0ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIC8vIFZpZGVvIHJvdGF0aW9uIGRvbmUuCi0gICAgICAgICAgIC8vIFN3YXAgd2lkdGggYW5kIGhlaWdodCBpZiA5MCBvciAyNzAgZGVncmVlcwotICAgICAgICAgICBpZiAocEZyYW1lU3RyLT52aWRlb1JvdGF0aW9uRGVncmVlICE9IDE4MCkgewotICAgICAgICAgICAgICAgaW50MzJfdCB0ZW1wID0gcEZyYW1lU3RyLT51aUZyYW1lV2lkdGg7Ci0gICAgICAgICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aCA9IHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodDsKLSAgICAgICAgICAgICAgIHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodCA9IHRlbXA7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBQb3N0cHJvY2Vzc2luZyAoYXBwbHkgdmlkZW8gZWZmZWN0KQotICAgIGlmKHBGcmFtZVN0ci0+YkFwcGx5RWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLQotICAgICAgICBmb3IoaT0wO2k8bU51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiBlZmZlY3Qgc3RhcnR0aW1lIG1hdGNoZXMgdGhlIGNsaXAgYmVpbmcgcHJldmlld2VkCi0gICAgICAgICAgICBpZigobUVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSA8IHBGcmFtZVN0ci0+Y2xpcEJlZ2luQ3V0VGltZSkKLSAgICAgICAgICAgICB8fChtRWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lID49IHBGcmFtZVN0ci0+Y2xpcEVuZEN1dFRpbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBlZmZlY3QgZG9lc24ndCBiZWxvbmcgdG8gdGhpcyBjbGlwLCBjaGVjayBuZXh0IG9uZQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUgPD0gcEZyYW1lU3RyLT50aW1lTXMpICYmCi0gICAgICAgICAgICAoKG1FZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUrbUVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uKSA+PQotICAgICAgICAgICAgIHBGcmFtZVN0ci0+dGltZU1zKSAmJiAobUVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgc2V0VmlkZW9FZmZlY3RUeXBlKG1FZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlLCBUUlVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHNldFZpZGVvRWZmZWN0VHlwZShtRWZmZWN0c1NldHRpbmdzW2ldLlZpZGVvRWZmZWN0VHlwZSwgRkFMU0UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9Qcm92aWRlIHRoZSBvdmVybGF5IFVwZGF0ZSBpbmRpY2F0aW9uIHdoZW4gdGhlcmUgaXMgYW4gb3ZlcmxheSBlZmZlY3QKLSAgICAgICAgaWYgKG1DdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfRlJBTUlORykgewotICAgICAgICAgICAgTTRPU0FfVUludDMyIGluZGV4OwotICAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCAmPSB+VklERU9fRUZGRUNUX0ZSQU1JTkc7IC8vbmV2ZXIgYXBwbHkgZnJhbWluZyBoZXJlLgotCi0gICAgICAgICAgICAvLyBGaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkKLSAgICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1OdW1iZXJFZmZlY3RzOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYobUVmZmVjdHNTZXR0aW5nc1tpbmRleF0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcpIHsKLQotICAgICAgICAgICAgICAgICAgICBpZigobUVmZmVjdHNTZXR0aW5nc1tpbmRleF0udWlTdGFydFRpbWUgPD0gcEZyYW1lSW5mby0+dGltZU1zKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChtRWZmZWN0c1NldHRpbmdzW2luZGV4XS51aVN0YXJ0VGltZSsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnVpRHVyYXRpb24pID49IHBGcmFtZUluZm8tPnRpbWVNcykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChpbmRleCA8IG1OdW1iZXJFZmZlY3RzKSAmJiAocEN1cnJFZGl0SW5mbyAhPSBOVUxMKSkgewotICAgICAgICAgICAgICAgIHBDdXJyRWRpdEluZm8tPm92ZXJsYXlTZXR0aW5nc0luZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkZyYW1pbmcgaW5kZXggPSAlZCIsIGluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIk5vIGZyYW1pbmcgZWZmZWN0cyBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYobUN1cnJlbnRWaWRlb0VmZmVjdCAhPSBWSURFT19FRkZFQ1RfTk9ORSkgewotICAgICAgICAgICAgZXJyID0gYXBwbHlWaWRlb0VmZmVjdCgoTTRPU0FfVm9pZCAqKXBGcmFtZVN0ci0+cEJ1ZmZlciwKLSAgICAgICAgICAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLCBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aCwKLSAgICAgICAgICAgICBwRnJhbWVTdHItPnVpRnJhbWVIZWlnaHQsIHBGcmFtZVN0ci0+dGltZU1zLAotICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcGl4ZWxBcnJheSk7Ci0KLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoInJlbmRlclByZXZpZXdGcmFtZTogYXBwbHlWaWRlb0VmZmVjdCBlcnJvciAweCV4IiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICAgICAgICAgIG1UYXJnZXQgPSBOVUxMOwotICAgICAgICAgICAgICAgIGZyZWUocGl4ZWxBcnJheSk7Ci0gICAgICAgICAgICAgICAgcGl4ZWxBcnJheSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBtQ3VycmVudFZpZGVvRWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBBcHBseSB0aGUgcmVuZGVyaW5nIG1vZGUKLSAgICAgICAgICAgIGVyciA9IGRvSW1hZ2VSZW5kZXJpbmdNb2RlKChNNE9TQV9Wb2lkICopcEZyYW1lU3RyLT5wQnVmZmVyLAotICAgICAgICAgICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsIHBGcmFtZVN0ci0+dWlGcmFtZVdpZHRoLAotICAgICAgICAgICAgIHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodCwgKE00T1NBX1ZvaWQgKilwaXhlbEFycmF5KTsKLQotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgicmVuZGVyUHJldmlld0ZyYW1lOmRvSW1hZ2VSZW5kZXJpbmdNb2RlIGVycm9yIDB4JXgiLCAodW5zaWduZWQgaW50KWVycik7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1UYXJnZXQ7Ci0gICAgICAgICAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgZnJlZShwaXhlbEFycmF5KTsKLSAgICAgICAgICAgICAgICBwaXhlbEFycmF5ID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvLyBBcHBseSB0aGUgcmVuZGVyaW5nIG1vZGUKLSAgICAgICAgZXJyID0gZG9JbWFnZVJlbmRlcmluZ01vZGUoKE00T1NBX1ZvaWQgKilwRnJhbWVTdHItPnBCdWZmZXIsCi0gICAgICAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLCBwRnJhbWVTdHItPnVpRnJhbWVXaWR0aCwKLSAgICAgICAgIHBGcmFtZVN0ci0+dWlGcmFtZUhlaWdodCwgKE00T1NBX1ZvaWQgKilwaXhlbEFycmF5KTsKLQotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoInJlbmRlclByZXZpZXdGcmFtZTogZG9JbWFnZVJlbmRlcmluZ01vZGUgZXJyb3IgMHgleCIsICh1bnNpZ25lZCBpbnQpZXJyKTsKLSAgICAgICAgICAgIGRlbGV0ZSBtVGFyZ2V0OwotICAgICAgICAgICAgbVRhcmdldCA9IE5VTEw7Ci0gICAgICAgICAgICBmcmVlKHBpeGVsQXJyYXkpOwotICAgICAgICAgICAgcGl4ZWxBcnJheSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbVRhcmdldC0+cmVuZGVyWVYxMigpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX1ZvaWQgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6c2V0Sm5pQ2FsbGJhY2sodm9pZCogY29va2llLAotICAgIGpuaV9wcm9ncmVzc19jYWxsYmFja19mY3QgY2FsbGJhY2tGY3QpIHsKLSAgICAvL0FMT0dWKCJzZXRKbmlDYWxsYmFjayIpOwotICAgIG1KbmlDb29raWUgPSBjb29raWU7Ci0gICAgbUpuaUNhbGxiYWNrID0gY2FsbGJhY2tGY3Q7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpwcmVwYXJlUGxheWVyKAotICAgIHZvaWQqIHBhcmFtLCBpbnQgcGxheWVySW5zdGFuY2UsIGludCBpbmRleCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqcENvbnRyb2xsZXIgPQotICAgICAoVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAqKXBhcmFtOwotCi0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IGluc3RhbmNlICVkIGZpbGUgJWQiLCBwbGF5ZXJJbnN0YW5jZSwgaW5kZXgpOwotCi0gICAgY29uc3QgY2hhciogZmlsZU5hbWUgPSAoY29uc3QgY2hhciopIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5wRmlsZTsKLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIGZpbGVOYW1lLCBOVUxMKTsKLQotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBzZXREYXRhU291cmNlIGluc3RhbmNlICVzIiwKLSAgICAgKGNvbnN0IGNoYXIgKilwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+cEZpbGUpOwotCi0gICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNldFZpZGVvU3VyZmFjZSgKLSAgICAgcENvbnRyb2xsZXItPm1TdXJmYWNlKTsKLSAgICBBTE9HVigicHJlcGFyZVBsYXllcjogc2V0VmlkZW9TdXJmYWNlIik7Ci0KLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0TWVkaWFSZW5kZXJpbmdNb2RlKAotICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+eFZTUy5NZWRpYVJlbmRlcmluZywKLSAgICAgcENvbnRyb2xsZXItPm1PdXRwdXRWaWRlb1NpemUpOwotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBzZXRNZWRpYVJlbmRlcmluZ01vZGUiKTsKLQotICAgIGlmKChNNE9TQV9VSW50MzIpaW5kZXggPT0gcENvbnRyb2xsZXItPm1TdGFydGluZ0NsaXBJbmRleCkgewotICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0UGxheWJhY2tCZWdpblRpbWUoCi0gICAgICAgIHBDb250cm9sbGVyLT5tRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2V0UGxheWJhY2tCZWdpblRpbWUoCi0gICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSk7Ci0gICAgfQotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBzZXRQbGF5YmFja0JlZ2luVGltZSglZCkiLAotICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUpOwotCi0gICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNldFBsYXliYWNrRW5kVGltZSgKLSAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpRW5kQ3V0VGltZSk7Ci0gICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNldFBsYXliYWNrRW5kVGltZSglZCkiLAotICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlFbmRDdXRUaW1lKTsKLQotICAgIGlmKHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0YW5jZV0tPnNldEltYWdlQ2xpcFByb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5DbGlwUHJvcGVydGllcy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgQUxPR1YoInByZXBhcmVQbGF5ZXI6IHNldEltYWdlQ2xpcFByb3BlcnRpZXMiKTsKLSAgICB9Ci0KLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+cHJlcGFyZSgpOwotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiBwcmVwYXJlZCIpOwotCi0gICAgaWYocENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lID4gMCkgewotICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+c2Vla1RvKAotICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lKTsKLQotICAgICAgICBBTE9HVigicHJlcGFyZVBsYXllcjogc2Vla1RvKCVkKSIsCi0gICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUpOwotICAgIH0KLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BDb250cm9sbGVyLT5tQ3VycmVudFBsYXllcl0tPnNldEF1ZGlvUGxheWVyKHBDb250cm9sbGVyLT5tVkVBdWRpb1BsYXllcik7Ci0KLSAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BsYXllckluc3RhbmNlXS0+cmVhZEZpcnN0VmlkZW9GcmFtZSgpOwotICAgIEFMT0dWKCJwcmVwYXJlUGxheWVyOiByZWFkRmlyc3RWaWRlb0ZyYW1lIG9mIGNsaXAiKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjp0aHJlYWRQcm9jKE00T1NBX1ZvaWQqIHBhcmFtKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfSW50MzIgaW5kZXggPSAwOwotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgKnBDb250cm9sbGVyID0KLSAgICAgKFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgKilwYXJhbTsKLQotICAgIEFMT0dWKCJpbnNpZGUgdGhyZWFkUHJvYyIpOwotICAgIGlmKHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPT0gVmVQbGF5ZXJJZGxlKSB7Ci0gICAgICAgIChwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKSsrOwotCi0gICAgICAgIEFMT0dEKCJ0aHJlYWRQcm9jOiBwbGF5aW5nIGZpbGUgaW5kZXggJWQgdG90YWwgY2xpcHMgJWQiLAotICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciwgcENvbnRyb2xsZXItPm1OdW1iZXJDbGlwc1RvUHJldmlldyk7Ci0KLSAgICAgICAgaWYoKE00T1NBX1VJbnQzMilwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID49Ci0gICAgICAgICBwQ29udHJvbGxlci0+bU51bWJlckNsaXBzVG9QcmV2aWV3KSB7Ci0KLSAgICAgICAgICAgIEFMT0dEKCJBbGwgY2xpcHMgcHJldmlld2VkIik7Ci0KLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uID0gMDsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBEdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXIgPSAwOwotCi0gICAgICAgICAgICBpZihwQ29udHJvbGxlci0+bVByZXZpZXdMb29waW5nID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID0KLSAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1TdGFydGluZ0NsaXBJbmRleDsKLQotICAgICAgICAgICAgICAgIEFMT0dEKCJQcmV2aWV3IGxvb3BpbmcgVFJVRSwgcmVzdGFydGluZyBmcm9tIGNsaXAgaW5kZXggJWQiLAotICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBzdG9yeSBib2FyZCB0aW1lc3RhbXAgaW5zaWRlIHRoZSBwbGF5ZXIKLSAgICAgICAgICAgICAgICBmb3IgKGludCBwbGF5ZXJJbnN0PTA7IHBsYXllckluc3Q8a1RvdGFsTnVtUGxheWVySW5zdGFuY2VzOwotICAgICAgICAgICAgICAgICBwbGF5ZXJJbnN0KyspIHsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwbGF5ZXJJbnN0XS0+cmVzZXRKbmlDYWxsYmFja1RpbWVTdGFtcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBlbmRBcmdzID0gMDsKLSAgICAgICAgICAgICAgICBpZihwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ29va2llLCBNU0dfVFlQRV9QUkVWSUVXX0VORCwgJmVuZEFyZ3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bVBsYXllclN0YXRlID0gVmVQbGF5ZXJBdXRvU3RvcDsKLQotICAgICAgICAgICAgICAgIC8vIFJlc2V0IG9yaWdpbmFsIGJlZ2luIGN1dHRpbWUgb2YgZmlyc3QgcHJldmlld2VkIGNsaXAKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tU3RhcnRpbmdDbGlwSW5kZXhdLT51aUJlZ2luQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZTsKLSAgICAgICAgICAgICAgICAvLyBSZXNldCBvcmlnaW5hbCBlbmQgY3V0dGltZSBvZiBsYXN0IHByZXZpZXdlZCBjbGlwCi0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bU51bWJlckNsaXBzVG9QcmV2aWV3LTFdLT51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUxhc3RQcmV2aWV3Q2xpcEVuZFRpbWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSB3YXJuaW5nIHRvIE00T1NBIHRocmVhZCBoYW5kbGVyCi0gICAgICAgICAgICAgICAgLy8gc28gdGhhdCB0aHJlYWQgaXMgbW92ZWQgZnJvbSBleGVjdXRpbmcgc3RhdGUgdG8gb3BlbiBzdGF0ZQotICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGluZGV4PXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXI7Ci0gICAgICAgIGlmKChNNE9TQV9VSW50MzIpcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciA9PSBwQ29udHJvbGxlci0+bVN0YXJ0aW5nQ2xpcEluZGV4KSB7Ci0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZWREdXJhdGlvbiArPQotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tVmlkZW9TdG9yeUJvYXJkVGltZU1zVXB0b0ZpcnN0UHJldmlld0NsaXA7Ci0KLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgIC0gcENvbnRyb2xsZXItPm1GaXJzdFByZXZpZXdDbGlwQmVnaW5UaW1lOwotCi0gICAgICAgICAgICBwcmVwYXJlUGxheWVyKCh2b2lkKilwQ29udHJvbGxlciwgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyLCBpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZWREdXJhdGlvbiArPQotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBEdXJhdGlvbjsKLQotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcER1cmF0aW9uID0KLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXJdLT51aUVuZEN1dFRpbWUgLQotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcl0tPnVpQmVnaW5DdXRUaW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcENvbnRyb2xsZXItPm1WZVBsYXllcltwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZXJdLT5zZXRTdG9yeWJvYXJkU3RhcnRUaW1lKAotICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVkRHVyYXRpb24pOwotICAgICAgICBBTE9HVigidGhyZWFkUHJvYzogc2V0U3Rvcnlib2FyZFN0YXJ0VGltZSIpOwotCi0gICAgICAgIC8vIFNldCB0aGUgbmV4dCBjbGlwIGR1cmF0aW9uIGZvciBBdWRpbyBtaXggaGVyZQotICAgICAgICBpZigoTTRPU0FfVUludDMyKXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgIT0gcENvbnRyb2xsZXItPm1TdGFydGluZ0NsaXBJbmRleCkgewotCi0gICAgICAgICAgICBwQ29udHJvbGxlci0+bVZlUGxheWVyW3BDb250cm9sbGVyLT5tQ3VycmVudFBsYXllcl0tPnNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtKAotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uLAotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT51aUJlZ2luQ3V0VGltZSwKLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+Q2xpcFByb3BlcnRpZXMudWlDbGlwQXVkaW9Wb2x1bWVQZXJjZW50YWdlKTsKLQotICAgICAgICAgICAgQUxPR1YoInRocmVhZFByb2M6IHNldEF1ZGlvTWl4U3RvcnlCb2FyZFBhcmFtIGZyb21NUyAlZCBcCi0gICAgICAgICAgICAgQ2xpcEJlZ2luVGltZSAlZCIsIHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllZER1cmF0aW9uICsKLSAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W2luZGV4XS0+dWlCZWdpbkN1dFRpbWUsCi0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lLAotICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbaW5kZXhdLT5DbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb1ZvbHVtZVBlcmNlbnRhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENhcHR1cmUgdGhlIGFjdGl2ZSBwbGF5ZXIgYmVpbmcgdXNlZAotICAgICAgICBwQ29udHJvbGxlci0+bUFjdGl2ZVBsYXllckluZGV4ID0gcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyOwotCi0gICAgICAgIHBDb250cm9sbGVyLT5tVmVQbGF5ZXJbcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyXS0+c3RhcnQoKTsKLSAgICAgICAgQUxPR1YoInRocmVhZFByb2M6IHN0YXJ0ZWQiKTsKLQotICAgICAgICBwQ29udHJvbGxlci0+bVBsYXllclN0YXRlID0gVmVQbGF5ZXJCdXN5OwotCi0gICAgfSBlbHNlIGlmKHBDb250cm9sbGVyLT5tUGxheWVyU3RhdGUgPT0gVmVQbGF5ZXJBdXRvU3RvcCkgewotICAgICAgICBBTE9HVigiUHJldmlldyBjb21wbGV0ZWQuLmF1dG8gc3RvcCB0aGUgcGxheWVyIik7Ci0gICAgfSBlbHNlIGlmICgocENvbnRyb2xsZXItPm1QbGF5ZXJTdGF0ZSA9PSBWZVBsYXllckJ1c3kpICYmIChwQ29udHJvbGxlci0+bVByZXBhcmVSZXFlc3QpKSB7Ci0gICAgICAgIC8vIFByZXBhcmUgdGhlIHBsYXllciBoZXJlCi0gICAgICAgIHBDb250cm9sbGVyLT5tUHJlcGFyZVJlcWVzdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwcmVwYXJlUGxheWVyKCh2b2lkKilwQ29udHJvbGxlciwgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyLAotICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcisxKTsKLSAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBlcnIgPSBNNE9TQV9zZW1hcGhvcmVXYWl0KHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCwKLSAgICAgICAgICAgICAgICBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFwQ29udHJvbGxlci0+YlN0b3BUaHJlYWRJblByb2dyZXNzKSB7Ci0gICAgICAgICAgICBBTE9HVigidGhyZWFkUHJvYzogc3RhdGUgYnVzeS4uLndhaXQgZm9yIHNlbSIpOwotICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRPU0Ffc2VtYXBob3JlV2FpdChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQsCi0gICAgICAgICAgICAgICAgIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0gICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJ0aHJlYWRQcm9jOiBzZW0gd2FpdCByZXR1cm5lZCBlcnIgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICAvL0Fsd2F5cyByZXR1cm4gTTROT19FUlJPUiB0byBlbnN1cmUgdGhlIHRocmVhZCBrZWVwcyBydW5uaW5nCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6bm90aWZ5KAotICAgIHZvaWQqIGNvb2tpZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKQotewotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgKnBDb250cm9sbGVyID0KLSAgICAgKFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIgKiljb29raWU7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICB1aW50MzJfdCBjbGlwRHVyYXRpb24gPSAwOwotICAgIHN3aXRjaCAobXNnKSB7Ci0gICAgICAgIGNhc2UgTUVESUFfTk9QOiAvLyBpbnRlcmZhY2UgdGVzdCBtZXNzYWdlCi0gICAgICAgICAgICBBTE9HVigiTUVESUFfTk9QIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNRURJQV9QUkVQQVJFRDoKLSAgICAgICAgICAgIEFMT0dWKCJNRURJQV9QUkVQQVJFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUVESUFfUExBWUJBQ0tfQ09NUExFVEU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dEKCJub3RpZnk6TUVESUFfUExBWUJBQ0tfQ09NUExFVEUsIG1DdXJyZW50Q2xpcE51bWJlciA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcik7Ci0gICAgICAgICAgICBwQ29udHJvbGxlci0+bVBsYXllclN0YXRlID0gVmVQbGF5ZXJJZGxlOwotCi0gICAgICAgICAgICAvL3NlbmQgcHJvZ3Jlc3MgY2FsbGJhY2sgd2l0aCBsYXN0IGZyYW1lIHRpbWVzdGFtcAotICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMilwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyID09Ci0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1TdGFydGluZ0NsaXBJbmRleCkgewotICAgICAgICAgICAgICAgIGNsaXBEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tQ2xpcExpc3RbcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcl0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgLSBwQ29udHJvbGxlci0+bUZpcnN0UHJldmlld0NsaXBCZWdpblRpbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbGlwRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bUNsaXBMaXN0W3BDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXJdLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgIC0gcENvbnRyb2xsZXItPm1DbGlwTGlzdFtwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyXS0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwbGF5ZWREdXJhdGlvbiA9IGNsaXBEdXJhdGlvbitwQ29udHJvbGxlci0+bUN1cnJlbnRQbGF5ZWREdXJhdGlvbjsKLSAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ29va2llLCBNU0dfVFlQRV9QUk9HUkVTU19JTkRJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAmcGxheWVkRHVyYXRpb24pOwotCi0gICAgICAgICAgICBpZiAoKHBDb250cm9sbGVyLT5tT3ZlcmxheVN0YXRlID09IE9WRVJMQVlfVVBEQVRFKSAmJgotICAgICAgICAgICAgICAgICgoTTRPU0FfVUludDMyKXBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXIgIT0KLSAgICAgICAgICAgICAgICAocENvbnRyb2xsZXItPm1OdW1iZXJDbGlwc1RvUHJldmlldy0xKSkpIHsKLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvICpwRWRpdEluZm8gPQotICAgICAgICAgICAgICAgICAgICAoVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihWaWRlb0VkaXRvckN1cnJldEVkaXRJbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJDdXJyZW50IEVkaXQgaW5mbyIpOwotICAgICAgICAgICAgICAgIHBFZGl0SW5mby0+b3ZlcmxheVNldHRpbmdzSW5kZXggPSBleHQyOwotICAgICAgICAgICAgICAgIHBFZGl0SW5mby0+Y2xpcEluZGV4ID0gcENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcjsKLSAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bU92ZXJsYXlTdGF0ZSA9PSBPVkVSTEFZX0NMRUFSOwotICAgICAgICAgICAgICAgIGlmIChwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2socENvbnRyb2xsZXItPm1KbmlDb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHX1RZUEVfT1ZFUkxBWV9DTEVBUiwgcEVkaXRJbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnJlZShwRWRpdEluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhwQ29udHJvbGxlci0+bUxvY2tTZW0pOwotICAgICAgICAgICAgICAgIGlmIChwQ29udHJvbGxlci0+bVNlbVRocmVhZFdhaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBDb250cm9sbGVyLT5tU2VtVGhyZWFkV2FpdCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTUVESUFfRVJST1I6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBlcnJfdmFsID0gZXh0MTsKLSAgICAgICAgICAvLyBBbHdheXMgbG9nIGVycm9ycy4KLSAgICAgICAgICAvLyBleHQxOiBNZWRpYSBmcmFtZXdvcmsgZXJyb3IgY29kZS4KLSAgICAgICAgICAvLyBleHQyOiBJbXBsZW1lbnRhdGlvbiBkZXBlbmRhbnQgZXJyb3IgY29kZS4KLSAgICAgICAgICAgIEFMT0dFKCJNRURJQV9FUlJPUjsgZXJyb3IgKCVkLCAlZCkiLCBleHQxLCBleHQyKTsKLSAgICAgICAgICAgIGlmKHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2socENvbnRyb2xsZXItPm1KbmlDb29raWUsCi0gICAgICAgICAgICAgICAgIE1TR19UWVBFX1BMQVlFUl9FUlJPUiwgJmVycl92YWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNRURJQV9JTkZPOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaW5mb192YWwgPSBleHQyOwotICAgICAgICAgICAgLy8gZXh0MTogTWVkaWEgZnJhbWV3b3JrIGVycm9yIGNvZGUuCi0gICAgICAgICAgICAvLyBleHQyOiBJbXBsZW1lbnRhdGlvbiBkZXBlbmRhbnQgZXJyb3IgY29kZS4KLSAgICAgICAgICAgIC8vQUxPR1coIk1FRElBX0lORk87IGluZm8vd2FybmluZyAoJWQsICVkKSIsIGV4dDEsIGV4dDIpOwotICAgICAgICAgICAgaWYocENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1KbmlDYWxsYmFjayhwQ29udHJvbGxlci0+bUpuaUNvb2tpZSwKLSAgICAgICAgICAgICAgICAgTVNHX1RZUEVfUFJPR1JFU1NfSU5ESUNBVElPTiwgJmluZm9fdmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTUVESUFfU0VFS19DT01QTEVURToKLSAgICAgICAgICAgIEFMT0dWKCJNRURJQV9TRUVLX0NPTVBMRVRFOyBSZWNlaXZlZCBzZWVrIGNvbXBsZXRlIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNRURJQV9CVUZGRVJJTkdfVVBEQVRFOgotICAgICAgICAgICAgQUxPR1YoIk1FRElBX0JVRkZFUklOR19VUERBVEU7IGJ1ZmZlcmluZyAlZCIsIGV4dDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUVESUFfU0VUX1ZJREVPX1NJWkU6Ci0gICAgICAgICAgICBBTE9HVigiTUVESUFfU0VUX1ZJREVPX1NJWkU7IE5ldyB2aWRlbyBzaXplICVkIHggJWQiLCBleHQxLCBleHQyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHN0YXRpY19jYXN0PGludD4oMHhBQUFBQUFBQSk6Ci0gICAgICAgICAgICBBTE9HVigiVklERU8gUExBWUJBQ0sgQUxNT1NUIG92ZXIsIHByZXBhcmUgbmV4dCBwbGF5ZXIiKTsKLSAgICAgICAgICAgIC8vIFNlbGVjdCBuZXh0IHBsYXllciBhbmQgcHJlcGFyZSBpdAotICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBjbGlwIGFmdGVyIHRoaXMgb25lCi0gICAgICAgICAgICBpZiAoKE00T1NBX1VJbnQzMikocENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlcisxKSA8Ci0gICAgICAgICAgICAgcENvbnRyb2xsZXItPm1OdW1iZXJDbGlwc1RvUHJldmlldykgewotICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tUHJlcGFyZVJlcWVzdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyKys7Ci0gICAgICAgICAgICAgICAgaWYgKHBDb250cm9sbGVyLT5tQ3VycmVudFBsYXllciA+PSBrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcENvbnRyb2xsZXItPm1DdXJyZW50UGxheWVyID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgZmlyc3QgY2xpcCB0byBiZSBwbGF5ZWQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhwQ29udHJvbGxlci0+bUxvY2tTZW0pOwotICAgICAgICAgICAgICAgICAgICBpZiAocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocENvbnRyb2xsZXItPm1TZW1UaHJlYWRXYWl0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHN0YXRpY19jYXN0PGludD4oMHhCQkJCQkJCQik6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJWSURFTyBQTEFZQkFDSywgVXBkYXRlIE92ZXJsYXkiKTsKLSAgICAgICAgICAgIGludCBvdmVybGF5SW5kZXggPSBleHQyOwotICAgICAgICAgICAgVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyAqcEVkaXRJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgKFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm8qKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiQ3VycmVudCBFZGl0IGluZm8iKTsKLSAgICAgICAgICAgIC8vZXh0MSA9IDE7IHN0YXJ0IHRoZSBvdmVybGF5IGRpc3BsYXkKLSAgICAgICAgICAgIC8vICAgICA9IDI7IENsZWFyIHRoZSBvdmVybGF5LgotICAgICAgICAgICAgcEVkaXRJbmZvLT5vdmVybGF5U2V0dGluZ3NJbmRleCA9IGV4dDI7Ci0gICAgICAgICAgICBwRWRpdEluZm8tPmNsaXBJbmRleCA9IHBDb250cm9sbGVyLT5tQ3VycmVudENsaXBOdW1iZXI7Ci0gICAgICAgICAgICBBTE9HVigicENvbnRyb2xsZXItPm1DdXJyZW50Q2xpcE51bWJlciA9ICVkIixwQ29udHJvbGxlci0+bUN1cnJlbnRDbGlwTnVtYmVyKTsKLSAgICAgICAgICAgIGlmIChwQ29udHJvbGxlci0+bUpuaUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXh0MSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tT3ZlcmxheVN0YXRlID0gT1ZFUkxBWV9VUERBVEU7Ci0gICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2socENvbnRyb2xsZXItPm1KbmlDb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNU0dfVFlQRV9PVkVSTEFZX1VQREFURSwgcEVkaXRJbmZvKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwQ29udHJvbGxlci0+bU92ZXJsYXlTdGF0ZSA9IE9WRVJMQVlfQ0xFQVI7Ci0gICAgICAgICAgICAgICAgICAgIHBDb250cm9sbGVyLT5tSm5pQ2FsbGJhY2socENvbnRyb2xsZXItPm1KbmlDb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNU0dfVFlQRV9PVkVSTEFZX0NMRUFSLCBwRWRpdEluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUocEVkaXRJbmZvKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigidW5yZWNvZ25pemVkIG1lc3NhZ2U6ICglZCwgJWQsICVkKSIsIG1zZywgZXh0MSwgZXh0Mik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6c2V0VmlkZW9FZmZlY3RUeXBlKAotICAgIE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdHlwZSwgTTRPU0FfQm9vbCBlbmFibGUpIHsKLQotICAgIE00T1NBX1VJbnQzMiBlZmZlY3QgPSBWSURFT19FRkZFQ1RfTk9ORTsKLQotICAgIC8vIG1hcCBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHRvIGxvY2FsIGVudW0KLSAgICBzd2l0Y2godHlwZSkgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVGcm9tQmxhY2s6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRkFERUZST01CTEFDSzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2s6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRkFERVRPQkxBQ0s7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGU6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfQkxBQ0tBTkRXSElURTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluazoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9QSU5LOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbjoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9HUkVFTjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWE6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfU0VQSUE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX05FR0FUSVZFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nOgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX0ZSQU1JTkc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXM6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfRklGVElFUzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNjoKLSAgICAgICAgICAgIGVmZmVjdCA9IFZJREVPX0VGRkVDVF9DT0xPUl9SR0IxNjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQ6Ci0gICAgICAgICAgICBlZmZlY3QgPSBWSURFT19FRkZFQ1RfR1JBRElFTlQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZWZmZWN0ID0gVklERU9fRUZGRUNUX05PTkU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZihlbmFibGUgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAvLyBJZiBhbHJlYWR5IHNldCwgdGhlbiBubyBuZWVkIHRvIHNldCBhZ2FpbgotICAgICAgICBpZighKG1DdXJyZW50VmlkZW9FZmZlY3QgJiBlZmZlY3QpKQotICAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCB8PSBlZmZlY3Q7Ci0gICAgICAgICAgICBpZihlZmZlY3QgPT0gVklERU9fRUZGRUNUX0ZJRlRJRVMpIHsKLSAgICAgICAgICAgICAgICBtSXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgIHsKLSAgICAgICAgLy8gUmVzZXQgb25seSBpZiBhbHJlYWR5IHNldAotICAgICAgICBpZihtQ3VycmVudFZpZGVvRWZmZWN0ICYgZWZmZWN0KQotICAgICAgICAgICAgbUN1cnJlbnRWaWRlb0VmZmVjdCAmPSB+ZWZmZWN0OwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6YXBwbHlWaWRlb0VmZmVjdCgKLSAgICBNNE9TQV9Wb2lkICogZGF0YVB0ciwgTTRPU0FfVUludDMyIGNvbG9yRm9ybWF0LCBNNE9TQV9VSW50MzIgdmlkZW9XaWR0aCwKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9IZWlnaHQsIE00T1NBX1VJbnQzMiB0aW1lTXMsIE00T1NBX1ZvaWQqIG91dFB0cikgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgdmVQb3N0UHJvY2Vzc1BhcmFtcyBwb3N0UHJvY2Vzc1BhcmFtczsKLQotICAgIHBvc3RQcm9jZXNzUGFyYW1zLnZpZEJ1ZmZlciA9IChNNFZJRklfVUludDgqKWRhdGFQdHI7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMudmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMudmlkZW9IZWlnaHQgPSB2aWRlb0hlaWdodDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy50aW1lTXMgPSB0aW1lTXM7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMudGltZU9mZnNldCA9IDA7IC8vU2luY2UgdGltZU1TIGFscmVhZHkgdGFrZXMgY2FyZSBvZiBvZmZzZXQgaW4gdGhpcyBjYXNlCi0gICAgcG9zdFByb2Nlc3NQYXJhbXMuZWZmZWN0c1NldHRpbmdzID0gbUVmZmVjdHNTZXR0aW5nczsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5udW1iZXJFZmZlY3RzID0gbU51bWJlckVmZmVjdHM7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMub3V0VmlkZW9XaWR0aCA9IG1PdXRwdXRWaWRlb1dpZHRoOwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLm91dFZpZGVvSGVpZ2h0ID0gbU91dHB1dFZpZGVvSGVpZ2h0OwotICAgIHBvc3RQcm9jZXNzUGFyYW1zLmN1cnJlbnRWaWRlb0VmZmVjdCA9IG1DdXJyZW50VmlkZW9FZmZlY3Q7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMucmVuZGVyaW5nTW9kZSA9IG1SZW5kZXJpbmdNb2RlOwotICAgIGlmKG1Jc0ZpZnRpZXNFZmZlY3RTdGFydGVkID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgcG9zdFByb2Nlc3NQYXJhbXMuaXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIG1Jc0ZpZnRpZXNFZmZlY3RTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgIHBvc3RQcm9jZXNzUGFyYW1zLmlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgLy9wb3N0UHJvY2Vzc1BhcmFtcy5yZW5kZXJlciA9IG1UYXJnZXQ7Ci0gICAgcG9zdFByb2Nlc3NQYXJhbXMub3ZlcmxheUZyYW1lUkdCQnVmZmVyID0gTlVMTDsKLSAgICBwb3N0UHJvY2Vzc1BhcmFtcy5vdmVybGF5RnJhbWVZVVZCdWZmZXIgPSBOVUxMOwotCi0gICAgbVRhcmdldC0+Z2V0QnVmZmVyWVYxMigmKHBvc3RQcm9jZXNzUGFyYW1zLnBPdXRCdWZmZXIpLCAmKHBvc3RQcm9jZXNzUGFyYW1zLm91dEJ1ZmZlclN0cmlkZSkpOwotCi0gICAgZXJyID0gYXBwbHlFZmZlY3RzQW5kUmVuZGVyaW5nTW9kZSgmcG9zdFByb2Nlc3NQYXJhbXMsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0KTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyOjpzZXRQcmV2aWV3RnJhbWVSZW5kZXJpbmdNb2RlKAotICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyBtb2RlLCBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBvdXRwdXRWaWRlb1NpemUpIHsKLQotICAgIEFMT0dWKCJzZXRNZWRpYVJlbmRlcmluZ01vZGU6IG91dHB1dFZpZGVvU2l6ZSA9ICVkIiwgb3V0cHV0VmlkZW9TaXplKTsKLSAgICBtUmVuZGVyaW5nTW9kZSA9IG1vZGU7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAvKiBnZXQgdGhlIHZpZGVvIHdpZHRoIGFuZCBoZWlnaHQgYnkgcmVzb2x1dGlvbiAqLwotICAgIGVyciA9IGdldFZpZGVvU2l6ZUJ5UmVzb2x1dGlvbihvdXRwdXRWaWRlb1NpemUsCi0gICAgICAgICAgICAgICZtT3V0cHV0VmlkZW9XaWR0aCwgJm1PdXRwdXRWaWRlb0hlaWdodCk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcjo6ZG9JbWFnZVJlbmRlcmluZ01vZGUoCi0gICAgTTRPU0FfVm9pZCAqIGRhdGFQdHIsIE00T1NBX1VJbnQzMiBjb2xvckZvcm1hdCwgTTRPU0FfVUludDMyIHZpZGVvV2lkdGgsCi0gICAgTTRPU0FfVUludDMyIHZpZGVvSGVpZ2h0LCBNNE9TQV9Wb2lkKiBvdXRQdHIpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBsYW5lSW5bM10sIHBsYW5lT3V0WzNdOwotICAgIE00VklGSV9VSW50OCAqaW5CdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBvdXRwdXRCdWZmZXJXaWR0aCA9MCwgb3V0cHV0QnVmZmVySGVpZ2h0PTA7Ci0KLSAgICAvL2ZyYW1lU2l6ZSA9ICh2aWRlb1dpZHRoKnZpZGVvSGVpZ2h0KjMpID4+IDE7Ci0gICAgaW5CdWZmZXIgPSAoTTRPU0FfVUludDggKilkYXRhUHRyOwotCi0gICAgLy8gSW4gcGxhbmUKLSAgICBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShwbGFuZUluLCB2aWRlb1dpZHRoLAotICAgICAgdmlkZW9IZWlnaHQsIChNNFZJRklfVUludDggKilpbkJ1ZmZlciwgdmlkZW9XaWR0aCwgdmlkZW9IZWlnaHQpOwotCi0gICAgb3V0cHV0QnVmZmVyV2lkdGggPSBtT3V0cHV0VmlkZW9XaWR0aDsKLSAgICBvdXRwdXRCdWZmZXJIZWlnaHQgPSBtT3V0cHV0VmlkZW9IZWlnaHQ7Ci0KLSAgICAvLyBPdXQgcGxhbmUKLSAgICB1aW50OF90KiBvdXRCdWZmZXI7Ci0gICAgc2l6ZV90IG91dEJ1ZmZlclN0cmlkZSA9IDA7Ci0KLSAgICBBTE9HVigiZG9NZWRpYVJlbmRlcmluZyBDQUxMIGdldEJ1ZmZlcigpIik7Ci0gICAgbVRhcmdldC0+Z2V0QnVmZmVyWVYxMigmb3V0QnVmZmVyLCAmb3V0QnVmZmVyU3RyaWRlKTsKLQotICAgIC8vIFNldCB0aGUgb3V0cHV0IFlVVjQyMCBwbGFuZSB0byBiZSBjb21wYXRpYmxlIHdpdGggWVYxMiBmb3JtYXQKLSAgICAvL0luIFlWMTIgZm9ybWF0LCBzaXplcyBtdXN0IGJlIGV2ZW4KLSAgICBNNE9TQV9VSW50MzIgeXYxMlBsYW5lV2lkdGggPSAoKG1PdXRwdXRWaWRlb1dpZHRoICsxKT4+MSk8PDE7Ci0gICAgTTRPU0FfVUludDMyIHl2MTJQbGFuZUhlaWdodCA9ICgobU91dHB1dFZpZGVvSGVpZ2h0KzEpPj4xKTw8MTsKLQotICAgIHByZXBhcmVZVjEySW1hZ2VQbGFuZShwbGFuZU91dCwgeXYxMlBsYW5lV2lkdGgsIHl2MTJQbGFuZUhlaWdodCwKLSAgICAgKE00T1NBX1VJbnQzMilvdXRCdWZmZXJTdHJpZGUsIChNNFZJRklfVUludDggKilvdXRCdWZmZXIpOwotCi0gICAgZXJyID0gYXBwbHlSZW5kZXJpbmdNb2RlKHBsYW5lSW4sIHBsYW5lT3V0LCBtUmVuZGVyaW5nTW9kZSk7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImRvSW1hZ2VSZW5kZXJpbmdNb2RlOiBhcHBseVJlbmRlcmluZ01vZGUgcmV0dXJuZWQgZXJyPTB4JXgiLCAodW5zaWduZWQgaW50KWVycik7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLX0gLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTc1NmYzMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1ZFX1BSRVZJRVdDT05UUk9MTEVSX0gKLSNkZWZpbmUgQU5EUk9JRF9WRV9QUkVWSUVXQ09OVFJPTExFUl9ICi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvclBsYXllci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVG9vbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBDYWxsYmFjayBtZWNoYW5pc20gZnJvbSBQcmV2aWV3Q29udHJvbGxlciB0byBKbmkgICovCi10eXBlZGVmIHZvaWQgKCpqbmlfcHJvZ3Jlc3NfY2FsbGJhY2tfZmN0KSh2b2lkKiBjb29raWUsIE00T1NBX1VJbnQzMiBtc2dUeXBlLCB2b2lkICphcmdjKTsKLQotc3RydWN0IFN1cmZhY2U7Ci1zdHJ1Y3QgUHJldmlld1JlbmRlcmVyOwotCi1jbGFzcyBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyIHsKLQotcHVibGljOgotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIoKTsKLSAgICB+VmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlcigpOwotCi0gICAgTTRPU0FfRVJSIGxvYWRFZGl0U2V0dGluZ3MoCi0gICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MsCi0gICAgICAgICAgICBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5ncyogYmdtU2V0dGluZ3MpOwotCi0gICAgTTRPU0FfRVJSIHNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpOwotCi0gICAgTTRPU0FfRVJSIHN0YXJ0UHJldmlldygKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmcm9tTVMsIE00T1NBX0ludDMyIHRvTXMsCi0gICAgICAgICAgICBNNE9TQV9VSW50MTYgY2FsbEJhY2tBZnRlckZyYW1lQ291bnQsCi0gICAgICAgICAgICBNNE9TQV9Cb29sIGxvb3ApIDsKLQotICAgIE00T1NBX1VJbnQzMiBzdG9wUHJldmlldygpOwotCi0gICAgTTRPU0FfRVJSIHJlbmRlclByZXZpZXdGcmFtZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlLAotICAgICAgICAgICAgVmlkZW9FZGl0b3JfcmVuZGVyUHJldmlld0ZyYW1lU3RyKiBwRnJhbWVJbmZvLAotICAgICAgICAgICAgVmlkZW9FZGl0b3JDdXJyZXRFZGl0SW5mbyAqcEN1cnJFZGl0SW5mbyk7Ci0KLSAgICBNNE9TQV9FUlIgY2xlYXJTdXJmYWNlKAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UsCi0gICAgICAgICAgICBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHIqIHBGcmFtZUluZm8pOwotCi0gICAgTTRPU0FfVm9pZCBzZXRKbmlDYWxsYmFjaygKLSAgICAgICAgICAgIHZvaWQqIGNvb2tpZSwKLSAgICAgICAgICAgIGpuaV9wcm9ncmVzc19jYWxsYmFja19mY3QgY2FsbGJhY2tGY3QpOwotCi0gICAgc3RhdHVzX3Qgc2V0UHJldmlld0ZyYW1lUmVuZGVyaW5nTW9kZSgKLSAgICAgICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyBtb2RlLAotICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgb3V0cHV0VmlkZW9TaXplKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga1RvdGFsTnVtUGxheWVySW5zdGFuY2VzID0gMiwKLSAgICAgICAga1ByZXZpZXdUaHJlYWRTdGFja1NpemUgPSA2NTUzNiwKLSAgICB9OwotCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgVmVQbGF5ZXJJZGxlID0gMCwKLSAgICAgICAgVmVQbGF5ZXJCdXN5LAotICAgICAgICBWZVBsYXllckF1dG9TdG9wCi0gICAgfSBQbGF5ZXJTdGF0ZTsKLQotICAgIHR5cGVkZWYgZW51bSB7Ci0gICAgICAgIE9WRVJMQVlfVVBEQVRFID0gMCwKLSAgICAgICAgT1ZFUkxBWV9DTEVBUgotICAgIH0gT3ZlcmxheVN0YXRlOwotCi0gICAgc3A8VmlkZW9FZGl0b3JQbGF5ZXI+IG1WZVBsYXllcltrVG90YWxOdW1QbGF5ZXJJbnN0YW5jZXNdOwotICAgIGludCBtQ3VycmVudFBsYXllcjsgIC8vIHBsYXllciBpbnN0YW5jZSBjdXJyZW50bHkgYmVpbmcgdXNlZAotICAgIHNwPFN1cmZhY2U+ICBtU3VyZmFjZTsKLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgIE00T1NBX0NvbnRleHQgbVRocmVhZENvbnRleHQ7Ci0gICAgUGxheWVyU3RhdGUgbVBsYXllclN0YXRlOwotICAgIE00T1NBX0Jvb2wgICAgbVByZXBhcmVSZXFlc3Q7Ci0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqKm1DbGlwTGlzdDsKLSAgICBNNE9TQV9VSW50MzIgbU51bWJlckNsaXBzSW5TdG9yeUJvYXJkOwotICAgIE00T1NBX1VJbnQzMiBtTnVtYmVyQ2xpcHNUb1ByZXZpZXc7Ci0gICAgTTRPU0FfVUludDMyIG1TdGFydGluZ0NsaXBJbmRleDsKLSAgICBNNE9TQV9Cb29sIG1QcmV2aWV3TG9vcGluZzsKLSAgICBNNE9TQV9VSW50MzIgbUNhbGxCYWNrQWZ0ZXJGcmFtZUNudDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIG1FZmZlY3RzU2V0dGluZ3M7Ci0gICAgTTRPU0FfVUludDMyIG1OdW1iZXJFZmZlY3RzOwotICAgIE00T1NBX0ludDMyIG1DdXJyZW50Q2xpcE51bWJlcjsKLSAgICBNNE9TQV9VSW50MzIgbUNsaXBUb3RhbER1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiBtQ3VycmVudFZpZGVvRWZmZWN0OwotICAgIE00eFZTU19BdWRpb01peGluZ1NldHRpbmdzKiBtQmFja2dyb3VuZEF1ZGlvU2V0dGluZzsKLSAgICBNNE9TQV9Db250ZXh0IG1BdWRpb01peFBDTUZpbGVIYW5kbGU7Ci0gICAgUHJldmlld1JlbmRlcmVyICptVGFyZ2V0OwotICAgIE00T1NBX0NvbnRleHQgbUpuaUNvb2tpZTsKLSAgICBqbmlfcHJvZ3Jlc3NfY2FsbGJhY2tfZmN0IG1KbmlDYWxsYmFjazsKLSAgICBWaWRlb0VkaXRvcl9yZW5kZXJQcmV2aWV3RnJhbWVTdHIgbUZyYW1lU3RyOwotICAgIE00T1NBX1VJbnQzMiBtQ3VycmVudFBsYXllZER1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiBtQ3VycmVudENsaXBEdXJhdGlvbjsKLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBtT3V0cHV0VmlkZW9TaXplOwotICAgIE00T1NBX1VJbnQzMiBtRmlyc3RQcmV2aWV3Q2xpcEJlZ2luVGltZTsKLSAgICBNNE9TQV9VSW50MzIgbUxhc3RQcmV2aWV3Q2xpcEVuZFRpbWU7Ci0gICAgTTRPU0FfVUludDMyIG1WaWRlb1N0b3J5Qm9hcmRUaW1lTXNVcHRvRmlyc3RQcmV2aWV3Q2xpcDsKLSAgICBPdmVybGF5U3RhdGUgbU92ZXJsYXlTdGF0ZTsKLSAgICBpbnQgbUFjdGl2ZVBsYXllckluZGV4OwotCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIG1SZW5kZXJpbmdNb2RlOwotICAgIHVpbnQzMl90IG1PdXRwdXRWaWRlb1dpZHRoOwotICAgIHVpbnQzMl90IG1PdXRwdXRWaWRlb0hlaWdodDsKLSAgICBib29sIGJTdG9wVGhyZWFkSW5Qcm9ncmVzczsKLSAgICBNNE9TQV9Db250ZXh0IG1TZW1UaHJlYWRXYWl0OwotICAgIGJvb2wgbUlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQ7Ci0KLSAgICBzcDxWaWRlb0VkaXRvclBsYXllcjo6VmVBdWRpb091dHB1dD4gbVZFQXVkaW9TaW5rOwotICAgIFZpZGVvRWRpdG9yQXVkaW9QbGF5ZXIgKm1WRUF1ZGlvUGxheWVyOwotICAgIE5hdGl2ZVdpbmRvd1JlbmRlcmVyKiBtTmF0aXZlV2luZG93UmVuZGVyZXI7Ci0KLSAgICBNNFZJRklfVUludDgqICBtRnJhbWVSR0JCdWZmZXI7Ci0gICAgTTRWSUZJX1VJbnQ4KiAgbUZyYW1lWVVWQnVmZmVyOwotICAgIG11dGFibGUgTXV0ZXggbUxvY2tTZW07Ci0KLQotICAgIHN0YXRpYyBNNE9TQV9FUlIgcHJlcGFyZVBsYXllcih2b2lkKiBwYXJhbSwgaW50IHBsYXllckluc3RhbmNlLCBpbnQgaW5kZXgpOwotICAgIHN0YXRpYyBNNE9TQV9FUlIgdGhyZWFkUHJvYyhNNE9TQV9Wb2lkKiBwYXJhbSk7Ci0gICAgc3RhdGljIHZvaWQgbm90aWZ5KHZvaWQqIGNvb2tpZSwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKTsKLQotICAgIHZvaWQgc2V0VmlkZW9FZmZlY3RUeXBlKE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdHlwZSwgTTRPU0FfQm9vbCBlbmFibGUpOwotCi0gICAgTTRPU0FfRVJSIGFwcGx5VmlkZW9FZmZlY3QoCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICogZGF0YVB0ciwgTTRPU0FfVUludDMyIGNvbG9yRm9ybWF0LAotICAgICAgICAgICAgTTRPU0FfVUludDMyIHZpZGVvV2lkdGgsIE00T1NBX1VJbnQzMiB2aWRlb0hlaWdodCwKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0aW1lTXMsIE00T1NBX1ZvaWQqIG91dFB0cik7Ci0KLSAgICBNNE9TQV9FUlIgZG9JbWFnZVJlbmRlcmluZ01vZGUoCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICogZGF0YVB0ciwKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBjb2xvckZvcm1hdCwgTTRPU0FfVUludDMyIHZpZGVvV2lkdGgsCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdmlkZW9IZWlnaHQsIE00T1NBX1ZvaWQqIG91dFB0cik7Ci0KLSAgICAvLyBEb24ndCBjYWxsIG1lIQotICAgIFZpZGVvRWRpdG9yUHJldmlld0NvbnRyb2xsZXIoY29uc3QgVmlkZW9FZGl0b3JQcmV2aWV3Q29udHJvbGxlciAmKTsKLSAgICBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyICZvcGVyYXRvcj0oCi0gICAgICAgICAgICBjb25zdCBWaWRlb0VkaXRvclByZXZpZXdDb250cm9sbGVyICYpOwotfTsKLQotfQotCi0jZW5kaWYgLy8gQU5EUk9JRF9WRV9QUkVWSUVXQ09OVFJPTExFUl9ICmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yU1JDLmNwcCBiL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YmVhYmZhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlZpZGVvRWRpdG9yU1JDIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yU1JDLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1WaWRlb0VkaXRvclNSQzo6VmlkZW9FZGl0b3JTUkMoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JTUkMgJXAoJXApIiwgdGhpcywgc291cmNlLmdldCgpKTsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRGVmYXVsdFNhbXBsaW5nRnJlcWVuY3lIeiA9IGtGcmVxMzIwMDBIejsKLSAgICBtU291cmNlID0gc291cmNlOwotICAgIG1SZXNhbXBsZXIgPSBOVUxMOwotICAgIG1DaGFubmVsQ250ID0gMDsKLSAgICBtU2FtcGxlUmF0ZSA9IDA7Ci0gICAgbU91dHB1dFNhbXBsZVJhdGUgPSBrRGVmYXVsdFNhbXBsaW5nRnJlcWVuY3lIejsKLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIG1Jbml0aWFsVGltZVN0YW1wVXMgPSAtMTsKLSAgICBtQWNjdU91dEJ1ZmZlclNpemUgID0gMDsKLSAgICBtU2Vla1RpbWVVcyA9IC0xOwotICAgIG1CdWZmZXIgPSBOVUxMOwotICAgIG1MZWZ0b3ZlciA9IDA7Ci0gICAgbUZvcm1hdENoYW5nZWQgPSBmYWxzZTsKLSAgICBtU3RvcFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtU2Vla01vZGUgPSBSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOwotCi0gICAgLy8gSW5wdXQgU291cmNlIHZhbGlkYXRpb24KLSAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLSAgICBDSEVDSyghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKTsKLQotICAgIC8vIFNldCB0aGUgbWV0YWRhdGEgb2YgdGhlIG91dHB1dCBhZnRlciByZXNhbXBsaW5nLgotICAgIG1PdXRwdXRGb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgbU91dHB1dEZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGtEZWZhdWx0U2FtcGxpbmdGcmVxZW5jeUh6KTsKLSAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAyKTsgIC8vIGFsd2F5cyBzdGVyZW8KLX0KLQotVmlkZW9FZGl0b3JTUkM6On5WaWRlb0VkaXRvclNSQygpIHsKLSAgICBBTE9HVigiflZpZGVvRWRpdG9yU1JDICVwKCVwKSIsIHRoaXMsIG1Tb3VyY2UuZ2V0KCkpOwotICAgIHN0b3AoKTsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JTUkM6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBBTE9HVigic3RhcnQgJXAoJXApIiwgdGhpcywgbVNvdXJjZS5nZXQoKSk7Ci0gICAgQ0hFQ0soIW1TdGFydGVkKTsKLQotICAgIC8vIFNldCByZXNhbXBsZXIgaWYgcmVxdWlyZWQKLSAgICBjaGVja0FuZFNldFJlc2FtcGxlcigpOwotCi0gICAgbVNlZWtUaW1lVXMgPSAtMTsKLSAgICBtU2Vla01vZGUgPSBSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOwotICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICBtU291cmNlLT5zdGFydCgpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclNSQzo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCAlcCglcCkiLCB0aGlzLCBtU291cmNlLmdldCgpKTsKLSAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAobUJ1ZmZlcikgewotICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgIH0KLSAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgaWYgKG1SZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbVJlc2FtcGxlcjsKLSAgICAgICAgbVJlc2FtcGxlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICBtSW5pdGlhbFRpbWVTdGFtcFVzID0gLTE7Ci0gICAgbUFjY3VPdXRCdWZmZXJTaXplID0gMDsKLSAgICBtTGVmdG92ZXIgPSAwOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxNZXRhRGF0YT4gVmlkZW9FZGl0b3JTUkM6OmdldEZvcm1hdCgpIHsKLSAgICBBTE9HVigiZ2V0Rm9ybWF0Iik7Ci0gICAgcmV0dXJuIG1PdXRwdXRGb3JtYXQ7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yU1JDOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlcl9vdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgQUxPR1YoInJlYWQgJXAoJXApIiwgdGhpcywgbVNvdXJjZS5nZXQoKSk7Ci0gICAgKmJ1ZmZlcl9vdXQgPSBOVUxMOwotCi0gICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBpZiAobVJlc2FtcGxlcikgewotICAgICAgICAvLyBTdG9yZSB0aGUgc2VlayBwYXJhbWV0ZXJzCi0gICAgICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUgPSBSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOwotICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewotICAgICAgICAgICAgQUxPR1YoInJlYWQgU2VlayAlbGxkIiwgc2Vla1RpbWVVcyk7Ci0gICAgICAgICAgICBtU2Vla1RpbWVVcyA9IHNlZWtUaW1lVXM7Ci0gICAgICAgICAgICBtU2Vla01vZGUgPSBtb2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2UgYXNrIGZvciAxMDI0IGZyYW1lcyBpbiBvdXRwdXQKLSAgICAgICAgLy8gcmVzYW1wbGVyIG91dHB1dCBpcyBhbHdheXMgMiBjaGFubmVscyBhbmQgMzIgYml0cwotICAgICAgICBjb25zdCBzaXplX3Qga091dHB1dEZyYW1lQ291bnQgPSAxMDI0OwotICAgICAgICBjb25zdCBzaXplX3Qga0J5dGVzID0ga091dHB1dEZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDMyX3QpOwotICAgICAgICBpbnQzMl90ICpwVG1wQnVmZmVyID0gKGludDMyX3QgKiljYWxsb2MoMSwga0J5dGVzKTsKLSAgICAgICAgaWYgKCFwVG1wQnVmZmVyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY2FsbG9jIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnk6ICVkIGJ5dGVzIiwga0J5dGVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXNhbXBsZSB0byB0YXJnZXQgcXVhbGl0eQotICAgICAgICBtUmVzYW1wbGVyLT5yZXNhbXBsZShwVG1wQnVmZmVyLCBrT3V0cHV0RnJhbWVDb3VudCwgdGhpcyk7Ci0KLSAgICAgICAgaWYgKG1TdG9wUGVuZGluZykgewotICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgbVN0b3BQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGFuZ2UgcmVzYW1wbGVyIGFuZCByZXRyeSBpZiBmb3JtYXQgY2hhbmdlIGhhcHBlbmVkCi0gICAgICAgIGlmIChtRm9ybWF0Q2hhbmdlZCkgewotICAgICAgICAgICAgbUZvcm1hdENoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGNoZWNrQW5kU2V0UmVzYW1wbGVyKCk7Ci0gICAgICAgICAgICBmcmVlKHBUbXBCdWZmZXIpOwotICAgICAgICAgICAgcmV0dXJuIHJlYWQoYnVmZmVyX291dCwgTlVMTCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVkaWFCdWZmZXIKLSAgICAgICAgaW50MzJfdCBvdXRCdWZmZXJTaXplID0ga091dHB1dEZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDE2X3QpOwotICAgICAgICBNZWRpYUJ1ZmZlciogb3V0QnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKG91dEJ1ZmZlclNpemUpOwotCi0gICAgICAgIC8vIENvbnZlcnQgYmFjayB0byAyIGNoYW5uZWxzIGFuZCAxNiBiaXRzCi0gICAgICAgIGRpdGhlckFuZENsYW1wKAotICAgICAgICAgICAgICAgIChpbnQzMl90ICopKCh1aW50OF90KilvdXRCdWZmZXItPmRhdGEoKSArIG91dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAotICAgICAgICAgICAgICAgIHBUbXBCdWZmZXIsIGtPdXRwdXRGcmFtZUNvdW50KTsKLSAgICAgICAgZnJlZShwVG1wQnVmZmVyKTsKLQotICAgICAgICAvLyBDb21wdXRlIGFuZCBzZXQgdGhlIG5ldyB0aW1lc3RhbXAKLSAgICAgICAgc3A8TWV0YURhdGE+IHRvID0gb3V0QnVmZmVyLT5tZXRhX2RhdGEoKTsKLSAgICAgICAgaW50NjRfdCB0b3RhbE91dER1cmF0aW9uVXMgPSAobUFjY3VPdXRCdWZmZXJTaXplICogMTAwMDAwMCkgLyAobU91dHB1dFNhbXBsZVJhdGUgKiAyICogMik7Ci0gICAgICAgIGludDY0X3QgdGltZVVzID0gbUluaXRpYWxUaW1lU3RhbXBVcyArIHRvdGFsT3V0RHVyYXRpb25VczsKLSAgICAgICAgdG8tPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgYWNjdW11bGF0ZSBzaXplCi0gICAgICAgIG1BY2N1T3V0QnVmZmVyU2l6ZSArPSBvdXRCdWZmZXJTaXplOwotICAgICAgICAqYnVmZmVyX291dCA9IG91dEJ1ZmZlcjsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBSZXNhbXBsaW5nIG5vdCByZXF1aXJlZC4gUmVhZCBhbmQgcGFzcy10aHJvdWdoLgotICAgICAgICBNZWRpYUJ1ZmZlciAqYUJ1ZmZlcjsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmYUJ1ZmZlciwgb3B0aW9ucyk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dWKCJyZWFkIHJldHVybnMgZXJyID0gJWQiLCBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgICAgICBjaGVja0FuZFNldFJlc2FtcGxlcigpOwotICAgICAgICAgICAgcmV0dXJuIHJlYWQoYnVmZmVyX291dCwgTlVMTCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFT1Mgb3Igc29tZSBvdGhlciBlcnJvcgotICAgICAgICBpZihlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHN0b3AoKTsKLSAgICAgICAgICAgICpidWZmZXJfb3V0ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgKmJ1ZmZlcl9vdXQgPSBhQnVmZmVyOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JTUkM6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyLCBpbnQ2NF90IHB0cykgewotICAgIEFMT0dWKCJnZXROZXh0QnVmZmVyICVkLCBjaGFuID0gJWQiLCBwQnVmZmVyLT5mcmFtZUNvdW50LCBtQ2hhbm5lbENudCk7Ci0gICAgdWludDMyX3QgZG9uZSA9IDA7Ci0gICAgdWludDMyX3Qgd2FudCA9IHBCdWZmZXItPmZyYW1lQ291bnQgKiBtQ2hhbm5lbENudCAqIDI7Ci0gICAgcEJ1ZmZlci0+cmF3ID0gbWFsbG9jKHdhbnQpOwotCi0gICAgd2hpbGUgKG1TdGFydGVkICYmIHdhbnQgPiAwKSB7Ci0gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IGRhdGEgbGVmdCwgcmVhZCBhIG5ldyBidWZmZXIuCi0gICAgICAgIGlmICghbUJ1ZmZlcikgewotICAgICAgICAgICAgLy8gaWYgd2Ugc2VlaywgcmVzZXQgdGhlIGluaXRpYWwgdGltZSBzdGFtcCBhbmQgYWNjdW11bGF0ZWQgdGltZQotICAgICAgICAgICAgUmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgICAgIGlmIChtU2Vla1RpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVwIGNhY2hlTW9yZV9sIFNlZWsgcmVxdWVzdGVkID0gJWxsZCIsIHRoaXMsIG1TZWVrVGltZVVzKTsKLSAgICAgICAgICAgICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSA9IG1TZWVrTW9kZTsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhtU2Vla1RpbWVVcywgbW9kZSk7Ci0gICAgICAgICAgICAgICAgbVNlZWtUaW1lVXMgPSAtMTsKLSAgICAgICAgICAgICAgICBtSW5pdGlhbFRpbWVTdGFtcFVzID0gLTE7Ci0gICAgICAgICAgICAgICAgbUFjY3VPdXRCdWZmZXJTaXplID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmbUJ1ZmZlciwgJm9wdGlvbnMpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQnVmZmVyLT5yYXcpOwotICAgICAgICAgICAgICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJnZXROZXh0QnVmZmVyOiBzb3VyY2UgcmVhZCByZXR1cm5lZCBJTkZPX0ZPUk1BVF9DSEFOR0VEIik7Ci0gICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBjYW5ub3Qgc3dpdGNoIHRvIGEgbmV3IEF1ZGlvUmVzYW1wbGVyIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgaW4gYSBjYWxsYmFjayBjYWxsZWQgYnkgdGhlIEF1ZGlvUmVzYW1wbGVyIGl0c2VsZi4gU28KLSAgICAgICAgICAgICAgICAvLyBqdXN0IHJlbWVtYmVyIHRoZSBmYWN0IHRoYXQgdGhlIGZvcm1hdCBoYXMgY2hhbmdlZCwgYW5kIGxldAotICAgICAgICAgICAgICAgIC8vIHJlYWQoKSBoYW5kbGVzIHRoaXMuCi0gICAgICAgICAgICAgICAgbUZvcm1hdENoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEVPUyBvciBzb21lIG90aGVyIGVycm9yCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkVPUyBvciBzb21lIGVycjogJWQiLCBlcnIpOwotICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBjYWxsIHN0b3AoKSBoZXJlIGJlY2F1c2Ugc3RvcCgpIHdpbGwgcmVsZWFzZSB0aGUKLSAgICAgICAgICAgICAgICAvLyBBdWRpb1Jlc2FtcGxlciwgYW5kIHdlIGFyZSBpbiBhIGNhbGxiYWNrIG9mIHRoZSBBdWRpb1Jlc2FtcGxlci4KLSAgICAgICAgICAgICAgICAvLyBTbyBqdXN0IHJlbWVtYmVyIHRoZSBmYWN0IGFuZCBsZXQgcmVhZCgpIGNhbGwgc3RvcCgpLgotICAgICAgICAgICAgICAgIG1TdG9wUGVuZGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlcik7Ci0gICAgICAgICAgICBtTGVmdG92ZXIgPSBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChtSW5pdGlhbFRpbWVTdGFtcFVzID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBjdXJUUzsKLSAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gZnJvbSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOwotICAgICAgICAgICAgICAgIGZyb20tPmZpbmRJbnQ2NChrS2V5VGltZSwgJmN1clRTKTsKLSAgICAgICAgICAgICAgICBBTE9HVigic2V0dGluZyBtSW5pdGlhbFRpbWVTdGFtcFVzIHRvICVsbGQiLCBtSW5pdGlhbFRpbWVTdGFtcFVzKTsKLSAgICAgICAgICAgICAgICBtSW5pdGlhbFRpbWVTdGFtcFVzID0gY3VyVFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgY29weSBkYXRhIHRvIHRoZSBkZXN0aW5hdGlvbgotICAgICAgICB1aW50MzJfdCB0b2RvID0gbUxlZnRvdmVyOwotICAgICAgICBpZiAodG9kbyA+IHdhbnQpIHsKLSAgICAgICAgICAgIHRvZG8gPSB3YW50OwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDhfdCogZW5kID0gKHVpbnQ4X3QqKW1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnJhbmdlX29mZnNldCgpCi0gICAgICAgICAgICAgICAgKyBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgbWVtY3B5KCh1aW50OF90KilwQnVmZmVyLT5yYXcgKyBkb25lLCBlbmQgLSBtTGVmdG92ZXIsIHRvZG8pOwotICAgICAgICBkb25lICs9IHRvZG87Ci0gICAgICAgIHdhbnQgLT0gdG9kbzsKLSAgICAgICAgbUxlZnRvdmVyIC09IHRvZG87Ci0KLSAgICAgICAgLy8gUmVsZWFzZSBNZWRpYUJ1ZmZlciBhcyBzb29uIGFzIHBvc3NpYmxlLgotICAgICAgICBpZiAobUxlZnRvdmVyID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IGRvbmUgLyAobUNoYW5uZWxDbnQgKiAyKTsKLSAgICBBTE9HVigiZ2V0TmV4dEJ1ZmZlciBkb25lICVkIiwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLXZvaWQgVmlkZW9FZGl0b3JTUkM6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyKSB7Ci0gICAgQUxPR1YoInJlbGVhc2VCdWZmZXI6ICVwIiwgcEJ1ZmZlcik7Ci0gICAgZnJlZShwQnVmZmVyLT5yYXcpOwotICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7Ci0gICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci19Ci0KLXZvaWQgVmlkZW9FZGl0b3JTUkM6OmNoZWNrQW5kU2V0UmVzYW1wbGVyKCkgewotICAgIEFMT0dWKCJjaGVja0FuZFNldFJlc2FtcGxlciIpOwotCi0gICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IGtVbml0eUdhaW4gPSAweDEwMDA7Ci0gICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0gICAgQ0hFQ0soIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSk7Ci0KLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKSk7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1DaGFubmVsQ250KSk7Ci0KLSAgICAvLyBJZiBhIHJlc2FtcGxlciBleGlzdHMsIGRlbGV0ZSBpdCBmaXJzdAotICAgIGlmIChtUmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1SZXNhbXBsZXI7Ci0gICAgICAgIG1SZXNhbXBsZXIgPSBOVUxMOwotICAgIH0KLQotICAgIC8vIENsZWFyIHByZXZpb3VzIGJ1ZmZlcgotICAgIGlmIChtQnVmZmVyKSB7Ci0gICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1TYW1wbGVSYXRlICE9IG1PdXRwdXRTYW1wbGVSYXRlIHx8IG1DaGFubmVsQ250ICE9IDIpIHsKLSAgICAgICAgQUxPR1YoIlJlc2FtcGxpbmcgcmVxdWlyZWQgKCVkID0+ICVkIEh6LCAjIGNoYW5uZWxzID0gJWQpIiwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtT3V0cHV0U2FtcGxlUmF0ZSwgbUNoYW5uZWxDbnQpOwotCi0gICAgICAgIG1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgMTYgLyogYml0IGRlcHRoICovLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U2FtcGxlUmF0ZSk7Ci0gICAgICAgIENIRUNLKG1SZXNhbXBsZXIpOwotICAgICAgICBtUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKG1TYW1wbGVSYXRlKTsKLSAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKGtVbml0eUdhaW4sIGtVbml0eUdhaW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJSZXNhbXBsaW5nIG5vdCByZXF1aXJlZCAoJWQgPT4gJWQgSHosICMgY2hhbm5lbHMgPSAlZCkiLAotICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1PdXRwdXRTYW1wbGVSYXRlLCBtQ2hhbm5lbENudCk7Ci0gICAgfQotfQotCi19IC8vbmFtZXNwY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5oIGIvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclNSQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNzA3ZDRkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JTUkMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KLSNpbmNsdWRlICJBdWRpb1Jlc2FtcGxlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBNZWRpYUJ1ZmZlcjsKLQotY2xhc3MgVmlkZW9FZGl0b3JTUkMgOiBwdWJsaWMgTWVkaWFTb3VyY2UgLCBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7Ci0KLXB1YmxpYzoKLSAgICBWaWRlb0VkaXRvclNSQyhjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0IChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkICgKLSAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKTsKLQotICAgIC8vIFNhbXBsaW5nIGZyZXFlbmNpZXMKLSAgICBlbnVtIHsKLSAgICAgICAga0ZyZXE4MDAwSHogID0gODAwMCwKLSAgICAgICAga0ZyZXExMTAyNUh6ID0gMTEwMjUsCi0gICAgICAgIGtGcmVxMTIwMDBIeiA9IDEyMDAwLAotICAgICAgICBrRnJlcTE2MDAwSHogPSAxNjAwMCwKLSAgICAgICAga0ZyZXEyMjA1MEh6ID0gMjIwNTAsCi0gICAgICAgIGtGcmVxMjQwMDBIeiA9IDI0MDAwLAotICAgICAgICBrRnJlcTMyMDAwSHogPSAzMjAwMCwKLSAgICAgICAga0ZyZXE0NDEwMEh6ID0gNDQxMDAsCi0gICAgICAgIGtGcmVxNDgwMDBIeiA9IDQ4MDAwLAotICAgIH07Ci0KLXByb3RlY3RlZCA6Ci0gICAgdmlydHVhbCB+VmlkZW9FZGl0b3JTUkMoKTsKLQotcHJpdmF0ZToKLSAgICBBdWRpb1Jlc2FtcGxlciAqbVJlc2FtcGxlcjsKLSAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKLSAgICBpbnQgbUNoYW5uZWxDbnQ7Ci0gICAgaW50IG1TYW1wbGVSYXRlOwotICAgIGludDMyX3QgbU91dHB1dFNhbXBsZVJhdGU7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLSAgICBzcDxNZXRhRGF0YT4gbU91dHB1dEZvcm1hdDsKLQotICAgIE1lZGlhQnVmZmVyKiBtQnVmZmVyOwotICAgIGludDMyX3QgbUxlZnRvdmVyOwotICAgIGJvb2wgbUZvcm1hdENoYW5nZWQ7Ci0gICAgYm9vbCBtU3RvcFBlbmRpbmc7Ci0KLSAgICBpbnQ2NF90IG1Jbml0aWFsVGltZVN0YW1wVXM7Ci0gICAgaW50NjRfdCBtQWNjdU91dEJ1ZmZlclNpemU7Ci0KLSAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtU2Vla01vZGU7Ci0KLSAgICBWaWRlb0VkaXRvclNSQygpOwotICAgIHZvaWQgY2hlY2tBbmRTZXRSZXNhbXBsZXIoKTsKLQotICAgIC8vIERvbid0IGNhbGwgbWUKLSAgICBWaWRlb0VkaXRvclNSQyhjb25zdCBWaWRlb0VkaXRvclNSQyYpOwotICAgIFZpZGVvRWRpdG9yU1JDICZvcGVyYXRvcj0oY29uc3QgVmlkZW9FZGl0b3JTUkMgJik7Ci0KLX07Ci0KLX0gLy9uYW1lc3BjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JUb29scy5jcHAgYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYjlmZDYwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL2x2cHAvVmlkZW9FZGl0b3JUb29scy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JUb29scy5oIgotI2luY2x1ZGUgIlByZXZpZXdSZW5kZXJlci5oIgotLyorIEhhbmRsZSB0aGUgaW1hZ2UgZmlsZXMgaGVyZSAqLwotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotLyotIEhhbmRsZSB0aGUgaW1hZ2UgZmlsZXMgaGVyZSAqLwotCi1jb25zdCBNNFZJRklfVUludDggICBNNFZJRklfQ2xpcFRhYmxlWzEyNTZdCi09IHsKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywKLTB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsCi0weDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLAotMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwKLTB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsCi0weDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDJiLAotMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywKLTB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsCi0weDNjLCAweDNkLCAweDNlLCAweDNmLCAweDQwLCAweDQxLCAweDQyLCAweDQzLAotMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwKLTB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsCi0weDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDViLAotMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywKLTB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsCi0weDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLCAweDcxLCAweDcyLCAweDczLAotMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwKLTB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsCi0weDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDhiLAotMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywKLTB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsCi0weDljLCAweDlkLCAweDllLCAweDlmLCAweGEwLCAweGExLCAweGEyLCAweGEzLAotMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwKLTB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIDB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsCi0weGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGJiLAotMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywKLTB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsCi0weGNjLCAweGNkLCAweGNlLCAweGNmLCAweGQwLCAweGQxLCAweGQyLCAweGQzLAotMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwKLTB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIDB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsCi0weGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGViLAotMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywKLTB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsCi0weGZjLCAweGZkLCAweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKLX07Ci0KLS8qIERpdmlzaW9uIHRhYmxlIGZvciAoIDY1NTM1L3ggKTsgeCA9IDAgdG8gNTEyICovCi1jb25zdCBNNFZJRklfVUludDE2ICBNNFZJRklfRGl2VGFibGVbNTEyXQotPSB7Ci0wLCA2NTUzNSwgMzI3NjgsIDIxODQ1LCAxNjM4NCwgMTMxMDcsIDEwOTIyLCA5MzYyLAotODE5MiwgNzI4MSwgNjU1MywgNTk1NywgNTQ2MSwgNTA0MSwgNDY4MSwgNDM2OSwKLTQwOTYsIDM4NTUsIDM2NDAsIDM0NDksIDMyNzYsIDMxMjAsIDI5NzgsIDI4NDksCi0yNzMwLCAyNjIxLCAyNTIwLCAyNDI3LCAyMzQwLCAyMjU5LCAyMTg0LCAyMTE0LAotMjA0OCwgMTk4NSwgMTkyNywgMTg3MiwgMTgyMCwgMTc3MSwgMTcyNCwgMTY4MCwKLTE2MzgsIDE1OTgsIDE1NjAsIDE1MjQsIDE0ODksIDE0NTYsIDE0MjQsIDEzOTQsCi0xMzY1LCAxMzM3LCAxMzEwLCAxMjg1LCAxMjYwLCAxMjM2LCAxMjEzLCAxMTkxLAotMTE3MCwgMTE0OSwgMTEyOSwgMTExMCwgMTA5MiwgMTA3NCwgMTA1NywgMTA0MCwKLTEwMjQsIDEwMDgsIDk5MiwgOTc4LCA5NjMsIDk0OSwgOTM2LCA5MjMsCi05MTAsIDg5NywgODg1LCA4NzMsIDg2MiwgODUxLCA4NDAsIDgyOSwKLTgxOSwgODA5LCA3OTksIDc4OSwgNzgwLCA3NzEsIDc2MiwgNzUzLAotNzQ0LCA3MzYsIDcyOCwgNzIwLCA3MTIsIDcwNCwgNjk3LCA2ODksCi02ODIsIDY3NSwgNjY4LCA2NjEsIDY1NSwgNjQ4LCA2NDIsIDYzNiwKLTYzMCwgNjI0LCA2MTgsIDYxMiwgNjA2LCA2MDEsIDU5NSwgNTkwLAotNTg1LCA1NzksIDU3NCwgNTY5LCA1NjQsIDU2MCwgNTU1LCA1NTAsCi01NDYsIDU0MSwgNTM3LCA1MzIsIDUyOCwgNTI0LCA1MjAsIDUxNiwKLTUxMiwgNTA4LCA1MDQsIDUwMCwgNDk2LCA0OTIsIDQ4OSwgNDg1LAotNDgxLCA0NzgsIDQ3NCwgNDcxLCA0NjgsIDQ2NCwgNDYxLCA0NTgsCi00NTUsIDQ1MSwgNDQ4LCA0NDUsIDQ0MiwgNDM5LCA0MzYsIDQzNCwKLTQzMSwgNDI4LCA0MjUsIDQyMiwgNDIwLCA0MTcsIDQxNCwgNDEyLAotNDA5LCA0MDcsIDQwNCwgNDAyLCAzOTksIDM5NywgMzk0LCAzOTIsCi0zOTAsIDM4NywgMzg1LCAzODMsIDM4MSwgMzc4LCAzNzYsIDM3NCwKLTM3MiwgMzcwLCAzNjgsIDM2NiwgMzY0LCAzNjIsIDM2MCwgMzU4LAotMzU2LCAzNTQsIDM1MiwgMzUwLCAzNDgsIDM0NiwgMzQ0LCAzNDMsCi0zNDEsIDMzOSwgMzM3LCAzMzYsIDMzNCwgMzMyLCAzMzAsIDMyOSwKLTMyNywgMzI2LCAzMjQsIDMyMiwgMzIxLCAzMTksIDMxOCwgMzE2LAotMzE1LCAzMTMsIDMxMiwgMzEwLCAzMDksIDMwNywgMzA2LCAzMDQsCi0zMDMsIDMwMiwgMzAwLCAyOTksIDI5NywgMjk2LCAyOTUsIDI5MywKLTI5MiwgMjkxLCAyODksIDI4OCwgMjg3LCAyODYsIDI4NCwgMjgzLAotMjgyLCAyODEsIDI4MCwgMjc4LCAyNzcsIDI3NiwgMjc1LCAyNzQsCi0yNzMsIDI3MSwgMjcwLCAyNjksIDI2OCwgMjY3LCAyNjYsIDI2NSwKLTI2NCwgMjYzLCAyNjIsIDI2MSwgMjYwLCAyNTksIDI1OCwgMjU3LAotMjU2LCAyNTUsIDI1NCwgMjUzLCAyNTIsIDI1MSwgMjUwLCAyNDksCi0yNDgsIDI0NywgMjQ2LCAyNDUsIDI0NCwgMjQzLCAyNDIsIDI0MSwKLTI0MCwgMjQwLCAyMzksIDIzOCwgMjM3LCAyMzYsIDIzNSwgMjM0LAotMjM0LCAyMzMsIDIzMiwgMjMxLCAyMzAsIDIyOSwgMjI5LCAyMjgsCi0yMjcsIDIyNiwgMjI1LCAyMjUsIDIyNCwgMjIzLCAyMjIsIDIyMiwKLTIyMSwgMjIwLCAyMTksIDIxOSwgMjE4LCAyMTcsIDIxNywgMjE2LAotMjE1LCAyMTQsIDIxNCwgMjEzLCAyMTIsIDIxMiwgMjExLCAyMTAsCi0yMTAsIDIwOSwgMjA4LCAyMDgsIDIwNywgMjA2LCAyMDYsIDIwNSwKLTIwNCwgMjA0LCAyMDMsIDIwMiwgMjAyLCAyMDEsIDIwMSwgMjAwLAotMTk5LCAxOTksIDE5OCwgMTk3LCAxOTcsIDE5NiwgMTk2LCAxOTUsCi0xOTUsIDE5NCwgMTkzLCAxOTMsIDE5MiwgMTkyLCAxOTEsIDE5MSwKLTE5MCwgMTg5LCAxODksIDE4OCwgMTg4LCAxODcsIDE4NywgMTg2LAotMTg2LCAxODUsIDE4NSwgMTg0LCAxODQsIDE4MywgMTgzLCAxODIsCi0xODIsIDE4MSwgMTgxLCAxODAsIDE4MCwgMTc5LCAxNzksIDE3OCwKLTE3OCwgMTc3LCAxNzcsIDE3NiwgMTc2LCAxNzUsIDE3NSwgMTc0LAotMTc0LCAxNzMsIDE3MywgMTcyLCAxNzIsIDE3MiwgMTcxLCAxNzEsCi0xNzAsIDE3MCwgMTY5LCAxNjksIDE2OCwgMTY4LCAxNjgsIDE2NywKLTE2NywgMTY2LCAxNjYsIDE2NSwgMTY1LCAxNjUsIDE2NCwgMTY0LAotMTYzLCAxNjMsIDE2MywgMTYyLCAxNjIsIDE2MSwgMTYxLCAxNjEsCi0xNjAsIDE2MCwgMTU5LCAxNTksIDE1OSwgMTU4LCAxNTgsIDE1NywKLTE1NywgMTU3LCAxNTYsIDE1NiwgMTU2LCAxNTUsIDE1NSwgMTU0LAotMTU0LCAxNTQsIDE1MywgMTUzLCAxNTMsIDE1MiwgMTUyLCAxNTIsCi0xNTEsIDE1MSwgMTUxLCAxNTAsIDE1MCwgMTQ5LCAxNDksIDE0OSwKLTE0OCwgMTQ4LCAxNDgsIDE0NywgMTQ3LCAxNDcsIDE0NiwgMTQ2LAotMTQ2LCAxNDUsIDE0NSwgMTQ1LCAxNDQsIDE0NCwgMTQ0LCAxNDQsCi0xNDMsIDE0MywgMTQzLCAxNDIsIDE0MiwgMTQyLCAxNDEsIDE0MSwKLTE0MSwgMTQwLCAxNDAsIDE0MCwgMTQwLCAxMzksIDEzOSwgMTM5LAotMTM4LCAxMzgsIDEzOCwgMTM3LCAxMzcsIDEzNywgMTM3LCAxMzYsCi0xMzYsIDEzNiwgMTM1LCAxMzUsIDEzNSwgMTM1LCAxMzQsIDEzNCwKLTEzNCwgMTM0LCAxMzMsIDEzMywgMTMzLCAxMzIsIDEzMiwgMTMyLAotMTMyLCAxMzEsIDEzMSwgMTMxLCAxMzEsIDEzMCwgMTMwLCAxMzAsCi0xMzAsIDEyOSwgMTI5LCAxMjksIDEyOSwgMTI4LCAxMjgsIDEyOAotfTsKLQotY29uc3QgTTRWSUZJX0ludDMyICBjb25zdF9zdG9yYWdlMVs4XQotPSB7Ci0weDAwMDAyNTY4LCAweDAwMDAzMzQzLDB4MDAwMDA2NDksMHgwMDAwMGQwZiwgMHgwMDAwRDg2QywgMHgwMDAwRDgzQiwgMHgwMDAxMDAwMCwgMHgwMDAxMDAwMAotfTsKLQotY29uc3QgTTRWSUZJX0ludDMyICBjb25zdF9zdG9yYWdlWzhdCi09IHsKLTB4MDAwMDI1NjgsIDB4MDAwMDMzNDMsIDB4MUJGODAwLCAweDAwMDAwNjQ5LCAweDAwMDAwZDBmLCAweDExMDE4MCwgMHg0MGNmLCAweDIyQkUwMAotfTsKLQotCi1jb25zdCBNNFZJRklfVUludDE2ICAqTTRWSUZJX0RpdlRhYmxlX3plcm8KLSA9ICZNNFZJRklfRGl2VGFibGVbMF07Ci0KLWNvbnN0IE00VklGSV9VSW50OCAgICpNNFZJRklfQ2xpcFRhYmxlX3plcm8KLSA9ICZNNFZJRklfQ2xpcFRhYmxlWzUwMF07Ci0KLU00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFyVG9ZVVY0MjBTZW1pcGxhbmFyKHZvaWQgKnVzZXJfZGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0ICkgewotCi0gICAgTTRWSUZJX1VJbnQzMiBpOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdCwgKnBfYnVmX3NyY191LCAqcF9idWZfc3JjX3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgIHJldHVybl9jb2RlID0gTTRWSUZJX09LOwotCi0gICAgLyogdGhlIGZpbHRlciBpcyBpbXBsZW1lbnRlZCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHdpZHRoIGlzIGVxdWFsIHRvIHN0cmlkZSAqLwotICAgIGlmKFBsYW5lSW5bMF0udV93aWR0aCAhPSBQbGFuZUluWzBdLnVfc3RyaWRlKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lOVkFMSURfUEFSQU07Ci0KLSAgICAvKiBUaGUgaW5wdXQgWSBQbGFuZSBpcyB0aGUgc2FtZSBhcyB0aGUgb3V0cHV0IFkgUGxhbmUgKi8KLSAgICBwX2J1Zl9zcmMgPSAmKFBsYW5lSW5bMF0ucGFjX2RhdGFbUGxhbmVJblswXS51X3RvcGxlZnRdKTsKLSAgICBwX2J1Zl9kZXN0ID0gJihQbGFuZU91dFswXS5wYWNfZGF0YVtQbGFuZU91dFswXS51X3RvcGxlZnRdKTsKLSAgICBtZW1jcHkoKHZvaWQgKilwX2J1Zl9kZXN0LCh2b2lkICopcF9idWZfc3JjICwKLSAgICAgICAgUGxhbmVPdXRbMF0udV93aWR0aCAqIFBsYW5lT3V0WzBdLnVfaGVpZ2h0KTsKLQotICAgIC8qIFRoZSBVIGFuZCBWIGNvbXBvbmVudHMgYXJlIHBsYW5hci4gVGhlIG5lZWQgdG8gYmUgbWFkZSBpbnRlcmxlYXZlZCAqLwotICAgIHBfYnVmX3NyY191ID0gJihQbGFuZUluWzFdLnBhY19kYXRhW1BsYW5lSW5bMV0udV90b3BsZWZ0XSk7Ci0gICAgcF9idWZfc3JjX3YgPSAmKFBsYW5lSW5bMl0ucGFjX2RhdGFbUGxhbmVJblsyXS51X3RvcGxlZnRdKTsKLSAgICBwX2J1Zl9kZXN0ICA9ICYoUGxhbmVPdXRbMV0ucGFjX2RhdGFbUGxhbmVPdXRbMV0udV90b3BsZWZ0XSk7Ci0KLSAgICBmb3IoaSA9IDA7IGkgPCBQbGFuZU91dFsxXS51X3dpZHRoKlBsYW5lT3V0WzFdLnVfaGVpZ2h0OyBpKyspCi0gICAgewotICAgICAgICAqcF9idWZfZGVzdCsrID0gKnBfYnVmX3NyY191Kys7Ci0gICAgICAgICpwX2J1Zl9kZXN0KysgPSAqcF9idWZfc3JjX3YrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHJldHVybl9jb2RlOwotfQotCi1NNFZJRklfVUludDggTTRWSUZJX1NlbWlwbGFuYXJZVVY0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApIHsKLQotICAgICBNNFZJRklfVUludDMyIGk7Ci0gICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdCwgKnBfYnVmX3NyY191LCAqcF9idWZfc3JjX3Y7Ci0gICAgIE00VklGSV9VSW50OCAqcF9idWZfZGVzdF91LCpwX2J1Zl9kZXN0X3YsKnBfYnVmX3NyY191djsKLSAgICAgTTRWSUZJX1VJbnQ4ICAgICByZXR1cm5fY29kZSA9IE00VklGSV9PSzsKLQotICAgICAvKiB0aGUgZmlsdGVyIGlzIGltcGxlbWVudGVkIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgd2lkdGggaXMgZXF1YWwgdG8gc3RyaWRlICovCi0gICAgIGlmKFBsYW5lSW5bMF0udV93aWR0aCAhPSBQbGFuZUluWzBdLnVfc3RyaWRlKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lOVkFMSURfUEFSQU07Ci0KLSAgICAgLyogVGhlIGlucHV0IFkgUGxhbmUgaXMgdGhlIHNhbWUgYXMgdGhlIG91dHB1dCBZIFBsYW5lICovCi0gICAgIHBfYnVmX3NyYyA9ICYoUGxhbmVJblswXS5wYWNfZGF0YVtQbGFuZUluWzBdLnVfdG9wbGVmdF0pOwotICAgICBwX2J1Zl9kZXN0ID0gJihQbGFuZU91dFswXS5wYWNfZGF0YVtQbGFuZU91dFswXS51X3RvcGxlZnRdKTsKLSAgICAgbWVtY3B5KCh2b2lkICopcF9idWZfZGVzdCwodm9pZCAqKXBfYnVmX3NyYyAsCi0gICAgICAgICBQbGFuZU91dFswXS51X3dpZHRoICogUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotCi0gICAgIC8qIFRoZSBVIGFuZCBWIGNvbXBvbmVudHMgYXJlIHBsYW5hci4gVGhlIG5lZWQgdG8gYmUgbWFkZSBpbnRlcmxlYXZlZCAqLwotICAgICBwX2J1Zl9zcmNfdXYgPSAmKFBsYW5lSW5bMV0ucGFjX2RhdGFbUGxhbmVJblsxXS51X3RvcGxlZnRdKTsKLSAgICAgcF9idWZfZGVzdF91ICA9ICYoUGxhbmVPdXRbMV0ucGFjX2RhdGFbUGxhbmVPdXRbMV0udV90b3BsZWZ0XSk7Ci0gICAgIHBfYnVmX2Rlc3RfdiAgPSAmKFBsYW5lT3V0WzJdLnBhY19kYXRhW1BsYW5lT3V0WzJdLnVfdG9wbGVmdF0pOwotCi0gICAgIGZvcihpID0gMDsgaSA8IFBsYW5lT3V0WzFdLnVfd2lkdGgqUGxhbmVPdXRbMV0udV9oZWlnaHQ7IGkrKykKLSAgICAgewotICAgICAgICAqcF9idWZfZGVzdF91KysgPSAqcF9idWZfc3JjX3V2Kys7Ci0gICAgICAgICpwX2J1Zl9kZXN0X3YrKyA9ICpwX2J1Zl9zcmNfdXYrKzsKLSAgICAgfQotICAgICByZXR1cm4gcmV0dXJuX2NvZGU7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggY29sb3IgdG8gYXBwbHkgKG5vdCB2ZXJ5IGNsZWFuIC4uLikKLSAqIEBwYXJhbSAgIFBsYW5lSW4gICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgTTRWSUZJX09LOiAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpIHsKLQotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpLGo7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotICAgIE00eFZTU19Db2xvclN0cnVjdCogQ29sb3JDb250ZXh0ID0gKE00eFZTU19Db2xvclN0cnVjdCopcEZ1bmN0aW9uQ29udGV4dDsKLQotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwX2J1Zl9zcmMgPQotICAgICAgICAgJihQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotCi0gICAgICAgIHBfYnVmX2Rlc3QgPQotICAgICAgICAgJihQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW1BsYW5lT3V0W3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2hyb21pbmFuY2UgKi8KLSAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSB8fCBwbGFuZV9udW1iZXI9PTIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9zd2l0Y2ggKChNNE9TQV9VSW50MzIpcEZ1bmN0aW9uQ29udGV4dCkgLy8gY29tbWVudGVkIGJlY2F1c2UgYSBzdHJ1Y3R1cmUgZm9yIHRoZSBlZmZlY3RzIGNvbnRleHQgZXhpc3QKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKENvbG9yQ29udGV4dC0+Y29sb3JFZmZlY3RUeXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGU6Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTI4LAotICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1Bpbms6Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMjU1LAotICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuOgotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDAsCi0gICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWE6Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwxMTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwxMzksCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTY6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBnZXQgdGhlIHIsIGcsIGIqLwotICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4MDAxZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweGY4MDApPj4xMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyprZWVwIHksIGJ1dCByZXBsYWNlIHUgYW5kIHYqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBVMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGhlbiBjb252ZXJ0IHRvIHYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQ6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBnZXQgdGhlIHIsIGcsIGIqLwotICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChDb2xvckNvbnRleHQtPnJnYjE2Q29sb3JEYXRhICYgIDB4MDAxZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweGY4MDApPj4xMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypmb3IgY29sb3IgZ3JhZGF0aW9uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoTTRPU0FfVUludDE2KSggYiAtICgoYippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAoTTRPU0FfVUludDE2KShnIC0gKChnKmkpL1BsYW5lSW5bcGxhbmVfbnVtYmVyXS51X2hlaWdodCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgciA9IChNNE9TQV9VSW50MTYpKHIgLSAoKHIqaSkvUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gVTE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gVjE2KHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWSUZJX0lOVkFMSURfUEFSQU07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBMdW1pbmFuY2UgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KS8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0W2pdID0gMjU1IC0gcF9idWZfc3JjW2pdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9idWZfc3JjICs9IFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0gUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQpCi0gKgotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhZGQgYSBmaXhlZCBvciBhbmltYXRlZCBpbWFnZSBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgcEZ1bmN0aW9uQ29udGV4dChJTikgQ29udGFpbnMgd2hpY2ggY29sb3IgdG8gYXBwbHkgKG5vdCB2ZXJ5IGNsZWFuIC4uLikKLSAqIEBwYXJhbSAgIFBsYW5lSW4gICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgTTRWSUZJX09LOiAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nKAotICAgICAgICAgICAgTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkgewotCi0gICAgTTRWSUZJX1VJbnQzMiB4LHk7Ci0KLSAgICBNNFZJRklfVUludDggKnBfaW5fWSA9IFBsYW5lSW5bMF0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luX1UgPSBQbGFuZUluWzFdLnBhY19kYXRhOwotICAgIE00VklGSV9VSW50OCAqcF9pbl9WID0gUGxhbmVJblsyXS5wYWNfZGF0YTsKLQotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBGcmFtaW5nID0gTTRPU0FfTlVMTDsKLSAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogY3VycmVudEZyYW1pbmcgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9VSW50OCAqRnJhbWluZ1JHQiA9IE00T1NBX05VTEw7Ci0KLSAgICBNNFZJRklfVUludDggKnBfb3V0MDsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MTsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MjsKLQotICAgIE00VklGSV9VSW50MzIgdG9wbGVmdFsyXTsKLQotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MSA9Ci0gICAgIChNNE9TQV9VSW50OCkoKFRSQU5TUEFSRU5UX0NPTE9SICYgMHhGRjAwKT4+OCk7Ci0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQyID0gKE00T1NBX1VJbnQ4KVRSQU5TUEFSRU5UX0NPTE9SOwotCi0jaWZuZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgRnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKXVzZXJEYXRhOwotICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZy0+cEN1cnJlbnQ7Ci0gICAgRnJhbWluZ1JHQiA9IEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIEZyYW1pbmcgPQotICAgICAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKikoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hRnJhbWluZ0N0eDsKLSAgICBpZihGcmFtaW5nID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUYodXNlckRhdGEpOwotICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZzogXAotICAgICAgICAgICAgICAgIEVycm9yIGluIE00eFZTU19pbnRlcm5hbERlY29kZUdJRjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIEZyYW1pbmcgPQotICAgICAgICAgKE00eFZTU19GcmFtaW5nU3RydWN0ICopKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKS0+YUZyYW1pbmdDdHg7Ci0gICAgICAgIC8qIEluaXRpYWxpemVzIGZpcnN0IEdJRiB0aW1lICovCi0gICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmN1cnJlbnRfZ2lmX3RpbWUgPQotICAgICAgICAgIHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLSAgICBjdXJyZW50RnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKUZyYW1pbmc7Ci0gICAgRnJhbWluZ1JHQiA9IEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBpbnB1dCAvIG91dHB1dCBwbGFuZSBwb2ludGVycyAqLwotICAgIHBfaW5fWSArPSBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwX2luX1UgKz0gUGxhbmVJblsxXS51X3RvcGxlZnQ7Ci0gICAgcF9pbl9WICs9IFBsYW5lSW5bMl0udV90b3BsZWZ0OwotCi0gICAgcF9vdXQwID0gUGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0gICAgcF9vdXQxID0gUGxhbmVPdXRbMV0ucGFjX2RhdGE7Ci0gICAgcF9vdXQyID0gUGxhbmVPdXRbMl0ucGFjX2RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBEZXBlbmRpbmcgb24gdGltZSwgaW5pdGlhbGl6ZSBGcmFtaW5nIGZyYW1lIHRvIHVzZSAqLwotICAgIGlmKEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPT0gLTEpCi0gICAgewotICAgICAgICBGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgY2xpcCB0aW1lIGhhcyByZWFjaCB0aGUgZHVyYXRpb24gb2Ygb25lIGZyYW1lIG9mIHRoZSBmcmFtaW5nIHBpY3R1cmUKLSAgICAgKiB3ZSBuZWVkIHRvIHN0ZXAgdG8gbmV4dCBmcmFtaW5nIHBpY3R1cmUgKi8KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgIGlmKCgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmJfYW5pbWF0ZWQgPT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIHdoaWxlKCgoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jdXJyZW50X2dpZl90aW1lICsgY3VycmVudEZyYW1pbmctPmR1cmF0aW9uKSA8IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jbGlwVGltZSA9Ci0gICAgICAgICAgICAgcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0KLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbERlY29kZUdJRih1c2VyRGF0YSk7Ci0gICAgICAgICAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nOiBFcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihjdXJyZW50RnJhbWluZy0+ZHVyYXRpb24gIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jdXJyZW50X2dpZl90aW1lICs9IGN1cnJlbnRGcmFtaW5nLT5kdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5jdXJyZW50X2dpZl90aW1lICs9Ci0gICAgICAgICAgICAgICAgIHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lIC0gRnJhbWluZy0+cHJldmlvdXNDbGlwVGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKikoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZzsKLSAgICAgICAgICAgIEZyYW1pbmdSR0IgPSBGcmFtaW5nLT5GcmFtaW5nUmdiLT5wYWNfZGF0YTsKLSAgICAgICAgfQotICAgIH0KLSNlbHNlCi0gICAgICAgICAgICBGcmFtaW5nLT5wQ3VycmVudCA9IGN1cnJlbnRGcmFtaW5nLT5wTmV4dDsKLSAgICAgICAgICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0KilGcmFtaW5nLT5wQ3VycmVudDsKLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotICAgIEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICBGcmFtaW5nUkdCID0gY3VycmVudEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotICAgIHRvcGxlZnRbMF0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF94OwotICAgIHRvcGxlZnRbMV0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF95OwotCi0gICAgZm9yKCB4PTAgO3ggPCBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgZm9yKCB5PTAgO3kgPCBQbGFuZUluWzBdLnVfd2lkdGggOyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVG8gaGFuZGxlIGZyYW1pbmcgd2l0aCBpbnB1dCBzaXplICE9IG91dHB1dCBzaXplCi0gICAgICAgICAgICAgKiBGcmFtaW5nIGlzIGFwcGx5ZWQgaWYgY29vcmRpbmF0ZXMgbWF0Y2hlcyBiZXR3ZWVuIGZyYW1pbmcvdG9wbGVmdCBhbmQgaW5wdXQgcGxhbmUgKi8KLSAgICAgICAgICAgIGlmKCB5IDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAgJiYKLSAgICAgICAgICAgICAgICB5ID49IHRvcGxlZnRbMF0gJiYKLSAgICAgICAgICAgICAgICB4IDwgKHRvcGxlZnRbMV0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X2hlaWdodCkgJiYKLSAgICAgICAgICAgICAgICB4ID49IHRvcGxlZnRbMV0pCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKkFscGhhIGJsZW5kaW5nIHN1cHBvcnQqLwotICAgICAgICAgICAgICAgIE00T1NBX0Zsb2F0IGFscGhhQmxlbmRpbmcgPSAxOwotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqIGFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqKSgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFscGhhQmxlbmRpbmdTdHJ1Y3Q7Ci0jZWxzZQotICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKiBhbHBoYUJsZW5kaW5nU3RydWN0ID0KLSAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKikoKE00eFZTU19GcmFtaW5nU3RydWN0Kil1c2VyRGF0YSktPmFscGhhQmxlbmRpbmdTdHJ1Y3Q7Ci0jZW5kaWYgLy8jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA8IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoKE00T1NBX0Zsb2F0KShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZSAtIGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQpKnBQcm9ncmVzcy0+dWlQcm9ncmVzcy8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nICs9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nIC89IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA+PSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWUqMTApICYmIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyA8IDEwMDAgLSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lKjEwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IChNNE9TQV9GbG9hdCkoKE00T1NBX0Zsb2F0KWFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlLzEwMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPj0gMTAwMCAtIChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUqMTApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nID0gKChNNE9TQV9GbG9hdCkoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgLSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCkpKigxMDAwIC0gcFByb2dyZXNzLT51aVByb2dyZXNzKS8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nICs9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyAvPSAxMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiovCi0KLSAgICAgICAgICAgICAgICBpZigoKihGcmFtaW5nUkdCKT09dHJhbnNwYXJlbnQxKSAmJiAoKihGcmFtaW5nUkdCKzEpPT10cmFuc3BhcmVudDIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KCoocF9pbl9ZK3kreCpQbGFuZUluWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0oKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0oKihwX2luX1YrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzJdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSgqKGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKyh5LXRvcGxlZnRbMF0pKyh4LXRvcGxlZnRbMV0pKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnVfc3RyaWRlKSkqYWxwaGFCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSkrPSgqKHBfaW5fWSt5K3gqUGxhbmVJblswXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9KCooY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGErKCh5LXRvcGxlZnRbMF0pPj4xKSsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlKSkqYWxwaGFCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQxKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpKz0oKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKSkqKDEtYWxwaGFCbGVuZGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0oKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpKygoeC10b3BsZWZ0WzFdKT4+MSkqY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMl0udV9zdHJpZGUpKSphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSkrPSgqKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpKSooMS1hbHBoYUJsZW5kaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoIFBsYW5lSW5bMF0udV93aWR0aCA8ICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCkgJiYKLSAgICAgICAgICAgICAgICAgICAgeSA9PSBQbGFuZUluWzBdLnVfd2lkdGgtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSR0IgPSBGcmFtaW5nUkdCICsgMiAqICh0b3BsZWZ0WzBdICsgY3VycmVudEZyYW1pbmctPkZyYW1pbmdZdXZbMF0udV93aWR0aCAtIFBsYW5lSW5bMF0udV93aWR0aCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcmFtaW5nUkdCID0gRnJhbWluZ1JHQiArIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBKdXN0IGNvcHkgaW5wdXQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luX1kreSt4KlBsYW5lSW5bMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0qKHBfaW5fVSsoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MisoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0qKHBfaW5fVisoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBpZihwUHJvZ3Jlc3MtPmJJc0xhc3QgPT0gTTRPU0FfVFJVRQotICAgICAgICAmJiAoTTRPU0FfQm9vbCkoKE00eFZTU19GcmFtaW5nQ29udGV4dCopdXNlckRhdGEpLT5iX0lzRmlsZUdpZiA9PSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGX0NsZWFuaW5nKChNNHhWU1NfRnJhbWluZ0NvbnRleHQqKXVzZXJEYXRhKTsKLSAgICB9Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMoTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gbWFrZSBhIHZpZGVvIGxvb2sgYXMgaWYgaXQgd2FzIHRha2VuIGluIHRoZSBmaWZ0aWVzCi0gKiBAbm90ZQotICogQHBhcmFtICAgcFVzZXJEYXRhICAgICAgIChJTikgQ29udGV4dAotICogQHBhcmFtICAgcFBsYW5lSW4gICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgcFBsYW5lT3V0ICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6ICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBGaWZ0aWVzRGF0YSwgcFBsYW5lT3V0IG9yIHBQcm9ncmVzcyBhcmUgTlVMTCAoREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKAotICAgIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApCi17Ci0gICAgTTRWSUZJX1VJbnQzMiB4LCB5LCB4U2hpZnQ7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwSW5ZID0gcFBsYW5lSW5bMF0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwT3V0WSwgKnBJblliZWdpbjsKLSAgICBNNFZJRklfVUludDggKnBJbkNyLCogcE91dENyOwotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0KLSAgICAvKiBJbnRlcm5hbCBjb250ZXh0Ki8KLSAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCogcF9GaWZ0aWVzRGF0YSA9IChNNHhWU1NfRmlmdGllc1N0cnVjdCAqKXBVc2VyRGF0YTsKLQotICAgIC8qIEluaXRpYWxpemUgaW5wdXQgLyBvdXRwdXQgcGxhbmUgcG9pbnRlcnMgKi8KLSAgICBwSW5ZICs9IHBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwT3V0WSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwSW5ZYmVnaW4gID0gcEluWTsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIHJhbmRvbSAqLwotICAgIGlmKHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPCAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfcmFuZEluaXQoKTsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIqKSYocF9GaWZ0aWVzRGF0YS0+c2hpZnRSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X2hlaWdodCkgPj4gNCk7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyKikmKHBfRmlmdGllc0RhdGEtPnN0cmlwZVJhbmRvbVZhbHVlKSwgKHBQbGFuZUluWzBdLnVfd2lkdGgpPDwgMik7Ci0gICAgICAgIHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICB9Ci0KLSAgICAvKiBDaG9vc2UgcmFuZG9tIHZhbHVlcyBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGR1cmF0aW9uIG9mIGEgcGFydGlhbCBlZmZlY3QgKi8KLSAgICBlbHNlIGlmKCAocFByb2dyZXNzLT51aU91dHB1dFRpbWUgLSBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lKSA+IHBfRmlmdGllc0RhdGEtPmZpZnRpZXNFZmZlY3REdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyKikmKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV9oZWlnaHQpID4+IDQpOwotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiopJihwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X3dpZHRoKTw8IDIpOwotICAgICAgICBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyogUHV0IGluIFNlcGlhIHRoZSBjaHJvbWluYW5jZSAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMTsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwSW5DciAgPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnBhY19kYXRhICArIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0OwotICAgICAgICBwT3V0Q3IgPSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YSArIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdDsKLQotICAgICAgICBmb3IgKHggPSAwOyB4IDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKDEgPT0gcGxhbmVfbnVtYmVyKQotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRDciwgMTE3LHBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7IC8qIFUgdmFsdWUgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0Q3IsIDEzOSxwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOyAvKiBWIHZhbHVlICovCi0KLSAgICAgICAgICAgIHBJbkNyICArPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAgICAgcE91dENyICs9IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB0aGUgbmV3IHBpeGVscyB2YWx1ZXMgKi8KLSAgICBmb3IoIHggPSAwIDsgeCA8IHBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQ4ICpwX291dFl0bXAsICpwX2luWXRtcDsKLQotICAgICAgICAvKiBDb21wdXRlIHRoZSB4U2hpZnQgKHJhbmRvbSB2YWx1ZSkgKi8KLSAgICAgICAgaWYgKDAgPT0gKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgJSA1ICkpCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgKSAlIChwUGxhbmVJblswXS51X2hlaWdodCAtIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIChwUGxhbmVJblswXS51X2hlaWdodCAtIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpICkgJSAocFBsYW5lSW5bMF0udV9oZWlnaHQgLSAxKTsKLQotICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwb2ludGVycyAqLwotICAgICAgICBwX291dFl0bXAgPSBwT3V0WSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogeVNoaWZ0IG9mIDEgcGl4ZWwgKi8KLSAgICAgICAgcF9pbll0bXAgID0gcEluWWJlZ2luICsgKHhTaGlmdCAqIHBQbGFuZUluWzBdLnVfc3RyaWRlKTsgIC8qIEFwcGx5IHRoZSB4U2hpZnQgKi8KLQotICAgICAgICBmb3IoIHkgPSAwIDsgeSA8IHBQbGFuZUluWzBdLnVfd2lkdGggOyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNldCBZIHZhbHVlICovCi0gICAgICAgICAgICBpZiAoeFNoaWZ0ID4gKHBQbGFuZUluWzBdLnVfaGVpZ2h0IC0gNCkpCi0gICAgICAgICAgICAgICAgKnBfb3V0WXRtcCA9IDQwOyAgICAgICAgLyogQWRkIHNvbWUgaG9yaXpvbnRhbCBibGFjayBsaW5lcyBiZXR3ZWVuIHRoZSB0d28gcGFydHMgb2YgdGhlIGltYWdlICovCi0gICAgICAgICAgICBlbHNlIGlmICggeSA9PSBwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSkKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gOTA7ICAgICAgICAvKiBBZGQgYSByYW5kb20gdmVydGljYWwgbGluZSBmb3IgdGhlIGJ1bGsgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gKnBfaW5ZdG1wOwotCi0KLSAgICAgICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IHBpeGVsICovCi0gICAgICAgICAgICBwX291dFl0bXArKzsKLSAgICAgICAgICAgIHBfaW5ZdG1wKys7Ci0KLSAgICAgICAgICAgIC8qIFJlc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBmb3IgdGhlIGxhc3QgcGl4ZWwqLwotICAgICAgICAgICAgaWYgKHkgPT0gKHBQbGFuZUluWzBdLnVfd2lkdGggLSAyKSkKLSAgICAgICAgICAgICAgICBwX291dFl0bXAgPSBwT3V0WTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IGxpbmUgKi8KLSAgICAgICAgcE91dFkgKz0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZShNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGx1bV9mYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQotewotICAgIHVuc2lnbmVkIHNob3J0ICpwX3NyYywgKnBfZGVzdCwgKnBfc3JjX2xpbmUsICpwX2Rlc3RfbGluZTsKLSAgICB1bnNpZ25lZCBjaGFyICpwX2NzcmMsICpwX2NkZXN0LCAqcF9jc3JjX2xpbmUsICpwX2NkZXN0X2xpbmU7Ci0gICAgdW5zaWduZWQgbG9uZyBwaXhfc3JjOwotICAgIHVuc2lnbmVkIGxvbmcgdV9vdXRweCwgdV9vdXRweDI7Ci0gICAgdW5zaWduZWQgbG9uZyB1X3dpZHRoLCB1X3N0cmlkZSwgdV9zdHJpZGVfb3V0LHVfaGVpZ2h0LCBwaXg7Ci0gICAgbG9uZyBpLCBqOwotCi0gICAgLyogY29weSBvciBmaWx0ZXIgY2hyb21hICovCi0gICAgdV93aWR0aCA9IHBsYW5lX2luWzFdLnVfd2lkdGg7Ci0gICAgdV9oZWlnaHQgPSBwbGFuZV9pblsxXS51X2hlaWdodDsKLSAgICB1X3N0cmlkZSA9IHBsYW5lX2luWzFdLnVfc3RyaWRlOwotICAgIHVfc3RyaWRlX291dCA9IHBsYW5lX291dFsxXS51X3N0cmlkZTsKLSAgICBwX2NkZXN0X2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzFdLnBhY19kYXRhW3BsYW5lX291dFsxXS51X3RvcGxlZnRdOwotICAgIHBfY3NyY19saW5lID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX2luWzFdLnBhY19kYXRhW3BsYW5lX2luWzFdLnVfdG9wbGVmdF07Ci0KLSAgICBpZiAobHVtX2ZhY3RvciA+IDI1NikKLSAgICB7Ci0gICAgICAgIHBfY2Rlc3QgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzJdLnBhY19kYXRhW3BsYW5lX291dFsyXS51X3RvcGxlZnRdOwotICAgICAgICBwX2NzcmMgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfaW5bMl0ucGFjX2RhdGFbcGxhbmVfaW5bMl0udV90b3BsZWZ0XTsKLSAgICAgICAgLyogY29weSBjaHJvbWEgKi8KLSAgICAgICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSB1X3dpZHRoOyBpICE9IDA7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2NkZXN0X2xpbmUsICh2b2lkICopcF9jc3JjX2xpbmUsIHVfd2lkdGgpOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfY2Rlc3QsICh2b2lkICopcF9jc3JjLCB1X3dpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NkZXN0ICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgICAgICAgICAgcF9jc3JjICs9IHVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIGZpbHRlciBjaHJvbWEgKi8KLSAgICAgICAgcGl4ID0gKDEwMjQgLSBsdW1fZmFjdG9yKSA8PCA3OwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfY2Rlc3QgPSBwX2NkZXN0X2xpbmU7Ci0gICAgICAgICAgICBwX2NzcmMgPSBwX2NzcmNfbGluZTsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2NkZXN0KysgPSAoKHBpeCArICgqcF9jc3JjKysgJiAweEZGKSAqIGx1bV9mYWN0b3IpID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBfY2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NzcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICAgICAgfQotICAgICAgICBwX2NkZXN0X2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfb3V0WzJdLnBhY19kYXRhW3BsYW5lX291dFsyXS51X3RvcGxlZnRdOwotICAgICAgICBwX2NzcmNfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9pblsyXS5wYWNfZGF0YVtwbGFuZV9pblsyXS51X3RvcGxlZnRdOwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfY2Rlc3QgPSBwX2NkZXN0X2xpbmU7Ci0gICAgICAgICAgICBwX2NzcmMgPSBwX2NzcmNfbGluZTsKLSAgICAgICAgICAgIGZvciAoaSA9IHVfd2lkdGg7IGkgIT0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2NkZXN0KysgPSAoKHBpeCArICgqcF9jc3JjICYgMHhGRikgKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX2NkZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgcF9jc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogYXBwbHkgbHVtYSBmYWN0b3IgKi8KLSAgICB1X3dpZHRoID0gcGxhbmVfaW5bMF0udV93aWR0aDsKLSAgICB1X2hlaWdodCA9IHBsYW5lX2luWzBdLnVfaGVpZ2h0OwotICAgIHVfc3RyaWRlID0gKHBsYW5lX2luWzBdLnVfc3RyaWRlID4+IDEpOwotICAgIHVfc3RyaWRlX291dCA9IChwbGFuZV9vdXRbMF0udV9zdHJpZGUgPj4gMSk7Ci0gICAgcF9kZXN0ID0gKHVuc2lnbmVkIHNob3J0ICopICZwbGFuZV9vdXRbMF0ucGFjX2RhdGFbcGxhbmVfb3V0WzBdLnVfdG9wbGVmdF07Ci0gICAgcF9zcmMgPSAodW5zaWduZWQgc2hvcnQgKikgJnBsYW5lX2luWzBdLnBhY19kYXRhW3BsYW5lX2luWzBdLnVfdG9wbGVmdF07Ci0gICAgcF9kZXN0X2xpbmUgPSBwX2Rlc3Q7Ci0gICAgcF9zcmNfbGluZSA9IHBfc3JjOwotCi0gICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgIHsKLSAgICAgICAgcF9kZXN0ID0gcF9kZXN0X2xpbmU7Ci0gICAgICAgIHBfc3JjID0gcF9zcmNfbGluZTsKLSAgICAgICAgZm9yIChpID0gKHVfd2lkdGggPj4gMSk7IGkgIT0gMDsgaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwaXhfc3JjID0gKHVuc2lnbmVkIGxvbmcpICpwX3NyYysrOwotICAgICAgICAgICAgcGl4ID0gcGl4X3NyYyAmIDB4RkY7Ci0gICAgICAgICAgICB1X291dHB4ID0gKChwaXggKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICBwaXggPSAoKHBpeF9zcmMgJiAweEZGMDApID4+IDgpOwotICAgICAgICAgICAgdV9vdXRweDIgPSAoKChwaXggKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk8PCA4KSA7Ci0gICAgICAgICAgICAqcF9kZXN0KysgPSAodW5zaWduZWQgc2hvcnQpICh1X291dHB4MiB8IHVfb3V0cHgpOwotICAgICAgICB9Ci0gICAgICAgIHBfZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgcF9zcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIFJHQjU2NSBwbGFuZSB0byBZVVY0MjAgcGxhbmFyCi0gKiBAbm90ZSAgICBJdCBpcyB1c2VkIG9ubHkgZm9yIGZyYW1pbmcgZWZmZWN0Ci0gKiAgICAgICAgICBJdCBhbGxvY2F0ZXMgb3V0cHV0IFlVViBwbGFuZXMKLSAqIEBwYXJhbSAgIGZyYW1pbmdDdHggIChJTikgVGhlIGZyYW1pbmcgc3RydWN0IGNvbnRhaW5pbmcgaW5wdXQgUkdCNTY1IHBsYW5lCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgWVVWIHBsYW5lcyAqLwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KjMpPj4xLCBNNFZTLCAoTTRPU0FfQ2hhciopIkFsbG9jIGZvciB0aGUgQ29udmVydGlvbiBvdXRwdXQgWVVWIik7OwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVViIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSArIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodDsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgaW5wdXQgUkdCIDU2NSB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZyBlZmZlY3QgKi8KLSAgICBlcnIgPSBNNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IGVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQiB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgfQotCi0gICAgZnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgIGZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aWV3T2Zmc2V0Q2xpcFRpbWUgPSAtMTsKLQotICAgIC8qKgotICAgICAqIE9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGNoYWluZWQgbGlzdCAobm8gYW5pbWF0ZWQgaW1hZ2Ugd2l0aCBSR0IgYnVmZmVyLi4uKSAqLwotICAgIGZyYW1pbmdDdHgtPnBDdXJyZW50ID0gZnJhbWluZ0N0eDsKLSAgICBmcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHg7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCODg4dG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIFJHQjg4OCBwbGFuZSB0byBZVVY0MjAgcGxhbmFyCi0gKiBAbm90ZSAgICBJdCBpcyB1c2VkIG9ubHkgZm9yIGZyYW1pbmcgZWZmZWN0Ci0gKiAgICAgICAgICBJdCBhbGxvY2F0ZXMgb3V0cHV0IFlVViBwbGFuZXMKLSAqIEBwYXJhbSAgIGZyYW1pbmdDdHggIChJTikgVGhlIGZyYW1pbmcgc3RydWN0IGNvbnRhaW5pbmcgaW5wdXQgUkdCODg4IHBsYW5lCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQjg4OHRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgWVVWIHBsYW5lcyAqLwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyKikiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOiBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KjMpPj4xLCBNNFZTLCAoTTRPU0FfQ2hhciopIkFsbG9jIGZvciB0aGUgQ29udmVydGlvbiBvdXRwdXQgWVVWIik7OwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVViIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSArIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQ7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodDsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgaW5wdXQgUkdCODg4IHRvIFlVViA0MjAgdG8gYmUgYWJsZSB0byBtZXJnZSBpdCB3aXRoIG91dHB1dCB2aWRlbyBpbiBmcmFtaW5nIGVmZmVjdCAqLwotICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IGVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQiB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgfQotCi0gICAgZnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgIGZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aWV3T2Zmc2V0Q2xpcFRpbWUgPSAtMTsKLQotICAgIC8qKgotICAgICAqIE9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGNoYWluZWQgbGlzdCAobm8gYW5pbWF0ZWQgaW1hZ2Ugd2l0aCBSR0IgYnVmZmVyLi4uKSAqLwotICAgIGZyYW1pbmdDdHgtPnBDdXJyZW50ID0gZnJhbWluZ0N0eDsKLSAgICBmcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHg7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYXV0aG9yICBQYXRyaWNlIE1hcnRpbmV6IC8gUGhpbGlwcyBEaWdpdGFsIE5ldHdvcmtzIC0gTVA0TmV0Ci0gKiBAYnJpZWYgICB0cmFuc2Zvcm0gUkdCNTY1IGltYWdlIHRvIGEgWVVWNDIwIGltYWdlLgotICogQG5vdGUgICAgQ29udmVydCBSR0I1NjUgdG8gWVVWNDIwLAotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoIDIgcm93cyBieSAyIHJvd3MgKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKCAyIGNvbCBieSAyIGNvbCApCi0gKiAgICAgICAgICAgICAgICAgIEdldCA0IFJHQiBzYW1wbGVzIGZyb20gaW5wdXQgZGF0YSBhbmQgYnVpbGQgNCBvdXRwdXQgWSBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIGFuZCBlYWNoIHNpbmdsZSBVICYgViBkYXRhCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3Agb24gY29sCi0gKiAgICAgICAgICBlbmQgbG9vcCBvbiByb3cKLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEKLSAqIEBwYXJhbSAgIHBQbGFuZUluOiAoSU4pIFBvaW50ZXIgdG8gUkdCNTY1IFBsYW5lCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gIFlVVjQyMCBidWZmZXIgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogWVVWIFBsYW5lIGhlaWdodCBpcyBPREQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgWVVWIFBsYW5lIHdpZHRoIGlzIE9ERAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00VklGSV9VSW50OCAgICBNNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi17Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9ZLCB1MzJfc3RyaWRlMl9ZLCB1MzJfc3RyaWRlX1UsIHUzMl9zdHJpZGVfVjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9yZ2IsIHUzMl9zdHJpZGVfMnJnYjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX2NvbCwgdTMyX3JvdzsKLQotICAgIE00VklGSV9JbnQzMiAgICBpMzJfcjAwLCBpMzJfcjAxLCBpMzJfcjEwLCBpMzJfcjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfZzAwLCBpMzJfZzAxLCBpMzJfZzEwLCBpMzJfZzExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfYjAwLCBpMzJfYjAxLCBpMzJfYjEwLCBpMzJfYjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfeTAwLCBpMzJfeTAxLCBpMzJfeTEwLCBpMzJfeTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdTAwLCBpMzJfdTAxLCBpMzJfdTEwLCBpMzJfdTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdjAwLCBpMzJfdjAxLCBpMzJfdjEwLCBpMzJfdjExOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3luLCAqcHU4X3lzLCAqcHU4X3UsICpwdThfdjsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95X2RhdGEsICpwdThfdV9kYXRhLCAqcHU4X3ZfZGF0YTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9yZ2JuX2RhdGEsICpwdThfcmdibjsKLSAgICBNNFZJRklfVUludDE2ICAgdTE2X3BpeDEsIHUxNl9waXgyLCB1MTZfcGl4MywgdTE2X3BpeDQ7Ci0gICAgTTRWSUZJX1VJbnQ4IGNvdW50X251bGw9MDsKLQotICAgIC8qIENoZWNrIHBsYW5lcyBoZWlnaHQgYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYoIChwUGxhbmVJbi0+dV9oZWlnaHQgIT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAgICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzFdLnVfaGVpZ2h0PDwxKSkgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcGxhbmVzIHdpZHRoIGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfd2lkdGggIT0gcFBsYW5lT3V0WzBdLnVfd2lkdGgpICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMV0udV93aWR0aDw8MSkpIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzJdLnVfd2lkdGg8PDEpKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF95X2RhdGEgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMF0udV90b3BsZWZ0OwotICAgIHB1OF91X2RhdGEgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHB1OF92X2RhdGEgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF9yZ2JuX2RhdGEgICA9IHBQbGFuZUluLT5wYWNfZGF0YSArIHBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgIHUzMl9oZWlnaHQgPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGVhY2ggb3V0cHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZID0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1kgPSB1MzJfc3RyaWRlX1kgPDwgMTsKLSAgICB1MzJfc3RyaWRlX1UgPSBwUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WID0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBpbnB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfcmdiID0gcFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMnJnYiA9IHUzMl9zdHJpZGVfcmdiIDw8IDE7Ci0KLQotICAgIC8qIExvb3Agb24gZWFjaCByb3cgb2YgdGhlIG91dHB1dCBpbWFnZSwgaW5wdXQgY29vcmRpbmF0ZXMgYXJlIGVzdGltYXRlZCBmcm9tIG91dHB1dCBvbmVzICovCi0gICAgLyogVHdvIFlVViByb3dzIGFyZSBjb21wdXRlZCBhdCBlYWNoIHBhc3MgKi8KLSAgICBmb3IgKHUzMl9yb3cgPSB1MzJfaGVpZ2h0IDt1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0yKQotICAgIHsKLSAgICAgICAgLyogQ3VycmVudCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeW4gPSBwdThfeV9kYXRhOwotICAgICAgICAvKiBOZXh0IFkgcGxhbmUgcm93IHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95cyA9IHB1OF95biArIHUzMl9zdHJpZGVfWTsKLSAgICAgICAgLyogQ3VycmVudCBVIHBsYW5lIHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF91ID0gcHU4X3VfZGF0YTsKLSAgICAgICAgLyogQ3VycmVudCBWIHBsYW5lIHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF92ID0gcHU4X3ZfZGF0YTsKLQotICAgICAgICBwdThfcmdibiA9IHB1OF9yZ2JuX2RhdGE7Ci0KLSAgICAgICAgLyogTG9vcCBvbiBlYWNoIGNvbHVtbiBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aDsgdTMyX2NvbCAhPSAwIDsgdTMyX2NvbCAtPTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEdldCBmb3VyIFJHQiA1NjUgc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgKi8KLSAgICAgICAgICAgIHUxNl9waXgxID0gKiggKE00VklGSV9VSW50MTYgKikgcHU4X3JnYm4pOwotICAgICAgICAgICAgdTE2X3BpeDIgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X3JnYm4gKyBDU1RfUkdCXzE2X1NJWkUpKTsKLSAgICAgICAgICAgIHUxNl9waXgzID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgdTMyX3N0cmlkZV9yZ2IpKTsKLSAgICAgICAgICAgIHUxNl9waXg0ID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgdTMyX3N0cmlkZV9yZ2IgKyBDU1RfUkdCXzE2X1NJWkUpKTsKLQotICAgICAgICAgICAgLyogVW5wYWNrIFJHQjU2NSB0byA4Yml0IFIsIEcsIEIgKi8KLSAgICAgICAgICAgIC8qICh4LHkpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLHUxNl9waXgxKTsKLSAgICAgICAgICAgIC8qICh4KzEseSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IxMCxpMzJfZzEwLGkzMl9yMTAsdTE2X3BpeDIpOwotICAgICAgICAgICAgLyogKHgseSsxKSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAxLGkzMl9nMDEsaTMyX3IwMSx1MTZfcGl4Myk7Ci0gICAgICAgICAgICAvKiAoeCsxLHkrMSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IxMSxpMzJfZzExLGkzMl9yMTEsdTE2X3BpeDQpOwotICAgICAgICAgICAgLyogSWYgUkdCIGlzIHRyYW5zcGFyZW50IGNvbG9yICgwLCA2MywgMCksIHdlIHRyYW5zZm9ybSBpdCB0byB3aGl0ZSAoMzEsNjMsMzEpICovCi0gICAgICAgICAgICBpZihpMzJfYjAwID09IDAgJiYgaTMyX2cwMCA9PSA2MyAmJiBpMzJfcjAwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IwMCA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMDAgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGkzMl9iMTAgPT0gMCAmJiBpMzJfZzEwID09IDYzICYmIGkzMl9yMTAgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjEwID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IxMCA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaTMyX2IwMSA9PSAwICYmIGkzMl9nMDEgPT0gNjMgJiYgaTMyX3IwMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDEgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAxID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpMzJfYjExID09IDAgJiYgaTMyX2cxMSA9PSA2MyAmJiBpMzJfcjExID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IxMSA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMTEgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgUkdCIHZhbHVlIHRvIFlVViAqLwotICAgICAgICAgICAgaTMyX3UwMCA9IFUxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl92MDAgPSBWMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDAgPSBZMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MTAgPSBVMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBpMzJfdjEwID0gVjE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTEwID0gWTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotCi0gICAgICAgICAgICBpMzJfdTAxID0gVTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgaTMyX3YwMSA9IFYxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMSA9IFkxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLQotICAgICAgICAgICAgaTMyX3UxMSA9IFUxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIGkzMl92MTEgPSBWMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTEgPSBZMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGx1bWluYW5jZSBkYXRhICovCi0gICAgICAgICAgICBwdThfeW5bMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDA7Ci0gICAgICAgICAgICBwdThfeW5bMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTA7Ci0gICAgICAgICAgICBwdThfeXNbMF0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0gICAgICAgICAgICBwdThfeXNbMV0gPSAoTTRWSUZJX1VJbnQ4KWkzMl95MTE7Ci0gICAgICAgICAgICAqcHU4X3UgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3UwMCArIGkzMl91MDEgKyBpMzJfdTEwICsgaTMyX3UxMSArIDIpID4+IDIpOwotICAgICAgICAgICAgKnB1OF92ID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgIC8qIFByZXBhcmUgZm9yIG5leHQgY29sdW1uICovCi0gICAgICAgICAgICBwdThfcmdibiArPSAoQ1NUX1JHQl8xNl9TSVpFPDwxKTsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBjdXJyZW50IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF95biArPSAyOwotICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgWSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3lzICs9IDI7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgVSBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3UgKys7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgViBwbGFuZSBsaW5lIHBvaW50ZXIqLwotICAgICAgICAgICAgcHU4X3YgKys7Ci0gICAgICAgIH0gLyogRW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICAvKiBQcmVwYXJlIHBvaW50ZXJzIGZvciB0aGUgbmV4dCByb3cgKi8KLSAgICAgICAgcHU4X3lfZGF0YSArPSB1MzJfc3RyaWRlMl9ZOwotICAgICAgICBwdThfdV9kYXRhICs9IHUzMl9zdHJpZGVfVTsKLSAgICAgICAgcHU4X3ZfZGF0YSArPSB1MzJfc3RyaWRlX1Y7Ci0gICAgICAgIHB1OF9yZ2JuX2RhdGEgKz0gdTMyX3N0cmlkZV8ycmdiOwotCi0KLSAgICB9IC8qIEVuZCBvZiB2ZXJ0aWNhbCBzY2FubmluZyAqLwotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUHJvdG86Ci1NNFZJRklfVUludDggICAgTTRWSUZJX1JHQjg4OHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lT3V0WzNdKTsKLUF1dGhvcjogICAgIFBhdHJpY2UgTWFydGluZXogLyBQaGlsaXBzIERpZ2l0YWwgTmV0d29ya3MgLSBNUDROZXQKLVB1cnBvc2U6ICAgIGZpbGxpbmcgb2YgdGhlIFlVVjQyMCBwbGFuZSBmcm9tIGEgQkdSMjQgcGxhbmUKLUFic3RyYWN0OiAgIExvb3Agb24gZWFjaCByb3cgKCAyIHJvd3MgYnkgMiByb3dzICkKLSAgICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uICggMiBjb2wgYnkgMiBjb2wgKQotICAgICAgICAgICAgICAgICAgICBHZXQgNCBCR1Igc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgYW5kIGJ1aWxkIDQgb3V0cHV0IFkgc2FtcGxlcyBhbmQgZWFjaCBzaW5nbGUgVSAmIFYgZGF0YQotICAgICAgICAgICAgICAgIGVuZCBsb29wIG9uIGNvbAotICAgICAgICAgICAgZW5kIGxvb3Agb24gcm93Ci0KLUluOiAgICAgICAgIFJHQjI0IHBsYW5lCi1Jbk91dDogICAgICBub25lCi1PdXQ6ICAgICAgICBhcnJheSBvZiAzIE00VklGSV9JbWFnZVBsYW5lIHN0cnVjdHVyZXMKLU1vZGlmaWVkOiAgIE1MOiBSR0IgZnVuY3Rpb24gbW9kaWZpZWQgdG8gQkdSLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSkKLXsKLQotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1YsIHUzMl9zdHJpZGVfcmdiLCB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0KLSAgICAvKiBjaGVjayBzaXplcyAqLwotICAgIGlmKCAoUGxhbmVJbi0+dV9oZWlnaHQgIT0gUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpIHx8Ci0gICAgICAgIChQbGFuZU91dFswXS51X2hlaWdodCAhPSAoUGxhbmVPdXRbMl0udV9oZWlnaHQ8PDEpKSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLQotICAgIGlmKCAoUGxhbmVJbi0+dV93aWR0aCAhPSBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICB8fAotICAgICAgICAoUGxhbmVPdXRbMF0udV93aWR0aCAhPSAoUGxhbmVPdXRbMV0udV93aWR0aDw8MSkpICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKFBsYW5lT3V0WzJdLnVfd2lkdGg8PDEpKSkKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotCi0KLSAgICAvKiBzZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IGRhdGEgYnVmZmVycyAqLwotICAgIHB1OF95X2RhdGEgID0gUGxhbmVPdXRbMF0ucGFjX2RhdGEgKyBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3VfZGF0YSAgPSBQbGFuZU91dFsxXS5wYWNfZGF0YSArIFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhICA9IFBsYW5lT3V0WzJdLnBhY19kYXRhICsgUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogaWRlbSBmb3IgaW5wdXQgYnVmZmVyICovCi0gICAgcHU4X3JnYm5fZGF0YSAgID0gUGxhbmVJbi0+cGFjX2RhdGEgKyBQbGFuZUluLT51X3RvcGxlZnQ7Ci0KLSAgICAvKiBnZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl93aWR0aCAgID0gUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0ICA9IFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogc2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGUyX1k9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgLyogaWRlbSBmb3IgaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IFBsYW5lSW4tPnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfMnJnYiA9IHUzMl9zdHJpZGVfcmdiIDw8IDE7Ci0KLSAgICAvKiBsb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIHR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIHVwZGF0ZSB3b3JraW5nIHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95biAgPSBwdThfeV9kYXRhOwotICAgICAgICBwdThfeXMgID0gcHU4X3luICsgdTMyX3N0cmlkZV9ZOwotCi0gICAgICAgIHB1OF91ICAgPSBwdThfdV9kYXRhOwotICAgICAgICBwdThfdiAgID0gcHU4X3ZfZGF0YTsKLQotICAgICAgICBwdThfcmdibj0gcHU4X3JnYm5fZGF0YTsKLQotICAgICAgICAvKiBsb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBnZXQgUkdCIHNhbXBsZXMgb2YgNCBwaXhlbHMgKi8KLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwLCBwdThfcmdibiwgMCk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCwgcHU4X3JnYm4sIENTVF9SR0JfMjRfU0laRSk7Ci0gICAgICAgICAgICBHRVRfUkdCMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSwgcHU4X3JnYm4sIHUzMl9zdHJpZGVfcmdiKTsKLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExLCBwdThfcmdibiwgdTMyX3N0cmlkZV9yZ2IgKyBDU1RfUkdCXzI0X1NJWkUpOwotCi0gICAgICAgICAgICBpMzJfdTAwID0gVTI0KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3YwMCA9IFYyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIGkzMl95MDAgPSBZMjQoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7ICAgICAgIC8qIG1hdHJpeCBsdW1pbmFuY2UgKi8KLSAgICAgICAgICAgIHB1OF95blswXT0gKE00VklGSV9VSW50OClpMzJfeTAwOwotCi0gICAgICAgICAgICBpMzJfdTEwID0gVTI0KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3YxMCA9IFYyNChpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl95MTAgPSBZMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBwdThfeW5bMV09IChNNFZJRklfVUludDgpaTMyX3kxMDsKLQotICAgICAgICAgICAgaTMyX3UwMSA9IFUyNChpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl92MDEgPSBWMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfeTAxID0gWTI0KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgcHU4X3lzWzBdPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0KLSAgICAgICAgICAgIGkzMl91MTEgPSBVMjQoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfdjExID0gVjI0KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3kxMSA9IFkyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIHB1OF95c1sxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMTsKLQotICAgICAgICAgICAgKnB1OF91ICA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAqcHU4X3YgID0gKE00VklGSV9VSW50OCkoKGkzMl92MDAgKyBpMzJfdjAxICsgaTMyX3YxMCArIGkzMl92MTEgKyAyKSA+PiAyKTsKLQotICAgICAgICAgICAgcHU4X3JnYm4gICAgKz0gIChDU1RfUkdCXzI0X1NJWkU8PDEpOwotICAgICAgICAgICAgcHU4X3luICAgICAgKz0gMjsKLSAgICAgICAgICAgIHB1OF95cyAgICAgICs9IDI7Ci0KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgcHU4X3YgKys7Ci0gICAgICAgIH0gLyogZW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICBwdThfeV9kYXRhICAgICAgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVTsKLSAgICAgICAgcHU4X3ZfZGF0YSAgICAgICs9IHUzMl9zdHJpZGVfVjsKLSAgICAgICAgcHU4X3JnYm5fZGF0YSAgICs9IHUzMl9zdHJpZGVfMnJnYjsKLQotCi0gICAgfSAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKiBZVVY0MjAgdG8gWVVWNDIwICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgVHJhbnNmb3JtIFlVVjQyMCBpbWFnZSB0byBhIFlVVjQyMCBpbWFnZS4KLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSBVc2VyIFNwZWNpZmljIERhdGEgKFVudXNlZCAtIGNvdWxkIGJlIE5VTEwpCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFlVViBwbGFuZSBidWZmZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBZVVYgUGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogRXJyb3IgaW4gcGxhbmUgaGVpZ2h0Ci0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIEVycm9yIGluIHBsYW5lIHdpZHRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQgKQotewotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdDsKLQotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwX2J1Zl9zcmMgPSAmKFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHBfYnVmX2Rlc3QgPSAmKFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9idWZfZGVzdCwgKHZvaWQgKilwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICBwX2J1Zl9zcmMgKz0gUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAgICAgcF9idWZfZGVzdCArPSBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYXV0aG9yICBEYXZpZCBEYW5hIChQSElMSVBTIFNvZnR3YXJlKQotICogQGJyaWVmICAgUmVzaXplcyBZVVY0MjAgUGxhbmFyIHBsYW5lLgotICogQG5vdGUgICAgQmFzaWMgc3RydWN0dXJlIG9mIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoc3RlcCAyKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKHN0ZXAgMikKLSAqICAgICAgICAgICAgICAgICAgR2V0IGZvdXIgWSBzYW1wbGVzIGFuZCAxIFUgJiBWIHNhbXBsZQotICogICAgICAgICAgICAgICAgICBSZXNpemUgdGhlIFkgd2l0aCBjb3JyZXNwb25pbmcgVSBhbmQgViBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIFBsYWNlIHRoZSBZVVYgaW4gdGhlIG91cHV0IHBsYW5lCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3AgY29sdW1uCi0gKiAgICAgICAgICBlbmQgbG9vcCByb3cKLSAqICAgICAgICAgIEZvciByZXNpemluZyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZwotICogICAgICAgICAgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdCByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb3duIGVhY2ggY29sdW1uLgotICogICAgICAgICAgRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkCi0gKiAgICAgICAgICBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzLiBUaGUgcmF0aW8gb2YgY29tcHJlc3Npb24KLSAqICAgICAgICAgIG9yIGRpbGF0YXRpb24gaXMgZXN0aW1hdGVkIHVzaW5nIGlucHV0IGFuZCBvdXRwdXQgc2l6ZXMuCi0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBEYXRhCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFlVVjQyMCAoUGxhbmFyKSBwbGFuZSBidWZmZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBZVVY0MjAgKFBsYW5hcikgcGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogRXJyb3IgaW4gaGVpZ2h0Ci0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIEVycm9yIGluIHdpZHRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfaW4sICpwdThfZGF0YV9vdXQsICpwdThkdW07Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9wbGFuZTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoX2luLCB1MzJfd2lkdGhfb3V0LCB1MzJfaGVpZ2h0X2luLCB1MzJfaGVpZ2h0X291dDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9pbiwgdTMyX3N0cmlkZV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2luYywgdTMyX3lfaW5jOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9hY2N1bSwgdTMyX3lfYWNjdW0sIHUzMl94X2FjY3VtX3N0YXJ0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl95X2ZyYWM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl94X2ZyYWM7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl90ZW1wX3ZhbHVlOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY190b3A7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbTsKLQotICAgIE00VklGSV9VSW50OCAgICB1OFdmbGFnID0gMDsKLSAgICBNNFZJRklfVUludDggICAgdThIZmxhZyA9IDA7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIGxvb3AgPSAwOwotCi0KLSAgICAvKgotICAgICBJZiBpbnB1dCB3aWR0aCBpcyBlcXVhbCB0byBvdXRwdXQgd2lkdGggYW5kIGlucHV0IGhlaWdodCBlcXVhbCB0bwotICAgICBvdXRwdXQgaGVpZ2h0IHRoZW4gTTRWSUZJX1lVVjQyMHRvWVVWNDIwIGlzIGNhbGxlZC4KLSAgICAqLwotICAgIGlmICgocFBsYW5lSW5bMF0udV9oZWlnaHQgPT0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSAmJgotICAgICAgICAgICAgICAocFBsYW5lSW5bMF0udV93aWR0aCA9PSBwUGxhbmVPdXRbMF0udV93aWR0aCkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX1lVVjQyMHRvWVVWNDIwKHBVc2VyRGF0YSwgcFBsYW5lSW4sIHBQbGFuZU91dCk7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBZVVYgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgIGlmICgoSVNfRVZFTihwUGxhbmVJblswXS51X2hlaWdodCkgPT0gRkFMU0UpICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dFswXS51X2hlaWdodCkgPT0gRkFMU0UpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW5bMF0udV93aWR0aCkgPT0gRkFMU0UpIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dFswXS51X3dpZHRoKSA9PSBGQUxTRSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0gICAgLyogTG9vcCBvbiBwbGFuZXMgKi8KLSAgICBmb3IodTMyX3BsYW5lID0gMDt1MzJfcGxhbmUgPCBQTEFORVM7dTMyX3BsYW5lKyspCi0gICAgewotICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICAgICAgcHU4X2RhdGFfaW4gICAgID0gcFBsYW5lSW5bdTMyX3BsYW5lXS5wYWNfZGF0YSArIHBQbGFuZUluW3UzMl9wbGFuZV0udV90b3BsZWZ0OwotICAgICAgICBwdThfZGF0YV9vdXQgICAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS5wYWNfZGF0YSArIHBQbGFuZU91dFt1MzJfcGxhbmVdLnVfdG9wbGVmdDsKLQotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgICAgICB1MzJfc3RyaWRlX2luICAgPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfc3RyaWRlOwotICAgICAgICB1MzJfc3RyaWRlX291dCAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS51X3N0cmlkZTsKLQotICAgICAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgICAgIHUzMl93aWR0aF9pbiAgICA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9pbiAgID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X2hlaWdodDsKLQotICAgICAgICB1MzJfd2lkdGhfb3V0ICAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS51X3dpZHRoOwotICAgICAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXRbdTMyX3BsYW5lXS51X2hlaWdodDsKLQotICAgICAgICAvKgotICAgICAgICBGb3IgdGhlIGNhc2UgLCB3aWR0aF9vdXQgPSB3aWR0aF9pbiAsIHNldCB0aGUgZmxhZyB0byBhdm9pZAotICAgICAgICBhY2Nlc3Npbmcgb25lIGNvbHVtbiBiZXlvbmQgdGhlIGlucHV0IHdpZHRoLkluIHRoaXMgY2FzZSB0aGUgbGFzdAotICAgICAgICBjb2x1bW4gaXMgcmVwbGljYXRlZCBmb3IgcHJvY2Vzc2luZwotICAgICAgICAqLwotICAgICAgICBpZiAodTMyX3dpZHRoX291dCA9PSB1MzJfd2lkdGhfaW4pIHsKLSAgICAgICAgICAgIHUzMl93aWR0aF9vdXQgPSB1MzJfd2lkdGhfb3V0LTE7Ci0gICAgICAgICAgICB1OFdmbGFnID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGguKi8KLSAgICAgICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9pbmMgICA9ICgodTMyX3dpZHRoX2luLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0LTEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfaW5jICAgPSAodTMyX3dpZHRoX2luICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgIEZvciB0aGUgY2FzZSAsIGhlaWdodF9vdXQgPSBoZWlnaHRfaW4gLCBzZXQgdGhlIGZsYWcgdG8gYXZvaWQKLSAgICAgICAgYWNjZXNzaW5nIG9uZSByb3cgYmV5b25kIHRoZSBpbnB1dCBoZWlnaHQuSW4gdGhpcyBjYXNlIHRoZSBsYXN0Ci0gICAgICAgIHJvdyBpcyByZXBsaWNhdGVkIGZvciBwcm9jZXNzaW5nCi0gICAgICAgICovCi0gICAgICAgIGlmICh1MzJfaGVpZ2h0X291dCA9PSB1MzJfaGVpZ2h0X2luKSB7Ci0gICAgICAgICAgICB1MzJfaGVpZ2h0X291dCA9IHUzMl9oZWlnaHRfb3V0LTE7Ci0gICAgICAgICAgICB1OEhmbGFnID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodC4qLwotICAgICAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbikKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfaW5jICAgPSAoKHUzMl9oZWlnaHRfaW4gLSAxKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9pbmMgPSAodTMyX2hlaWdodF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeV9hY2N1bV9zdGFydC4KLSAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZQotICAgICAgICBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAqLwotICAgICAgICBpZiAodTMyX3lfaW5jID49IE1BWF9TSE9SVCkKLSAgICAgICAgewotICAgICAgICAvKgotICAgICAgICBLZWVwIHRoZSBmcmFjdGlvbm5hbCBwYXJ0LCBhc3NpbXVuZyB0aGF0IGludGVnZXIgIHBhcnQgaXMgY29kZWQKLSAgICAgICAgb24gdGhlIDE2IGhpZ2ggYml0cyBhbmQgdGhlIGZyYWN0aW9uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICovCi0gICAgICAgICAgICB1MzJfeV9hY2N1bSA9IHUzMl95X2luYyAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgaWYgKCF1MzJfeV9hY2N1bSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSA9IE1BWF9TSE9SVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdTMyX3lfYWNjdW0gPj49IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bSA9IDA7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUKLSAgICAgICAgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHUzMl94X2luYyA+PSBNQVhfU0hPUlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gdTMyX3hfaW5jICYgMHhmZmZmOwotCi0gICAgICAgICAgICBpZiAoIXUzMl94X2FjY3VtX3N0YXJ0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA+Pj0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHUzMl9oZWlnaHQgPSB1MzJfaGVpZ2h0X291dDsKLQotICAgICAgICAvKgotICAgICAgICBCaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZyBlYWNoIHJvdywgYW5kCi0gICAgICAgIHRoZW4gdXNlcyB0aGF0IHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvbncgZWFjaCBjb2x1bW4uCi0gICAgICAgIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZSBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZCBjb21iaW5hdGlvbgotICAgICAgICBvZiBpdHMgZm91ciBuZWlnaGJvdXJzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYToKLSAgICAgICAgRihwJyxxJyk9ZihwLHEpUigtYSlSKGIpK2YocCxxLTEpUigtYSlSKGItMSkrZihwKzEscSlSKDEtYSlSKGIpKwotICAgICAgICBmKHArJixxKzEpUigxLWEpUihiLTEpIHdpdGggIFIoeCkgPSAvIHgrMSAgLTEgPTwgeCA9PCAwIFwgMS14Ci0gICAgICAgIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKXdlaWdodGluZyBjb2VmZmljaWVudCBpcyB0aGUgZGlzdGFuY2UKLSAgICAgICAgZnJvbSB0aGUgbmVhcmVzdCBuZWlnaGJvciBpbiB0aGUgcCAocmVzcC4gcSkgZGlyZWN0aW9uCi0gICAgICAgICovCi0KLSAgICAgICAgZG8geyAvKiBTY2FuIGFsbCB0aGUgcm93ICovCi0KLSAgICAgICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0+PjEyKSYxNTsKLQotICAgICAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICB1MzJfeF9hY2N1bSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotCi0gICAgICAgICAgICB1MzJfd2lkdGggPSB1MzJfd2lkdGhfb3V0OwotCi0gICAgICAgICAgICBkbyB7IC8qIFNjYW4gYWxvbmcgZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLSAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgdTMyX3N0cmlkZV9pbjsKLSAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gdTMyX3hfaW5jOwotICAgICAgICAgICAgfSB3aGlsZSgtLXUzMl93aWR0aCk7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICBUaGlzIHU4V2ZsYWcgZmxhZyBnZXRzIGluIHRvIGVmZmVjdCBpZiBpbnB1dCBhbmQgb3V0cHV0Ci0gICAgICAgICAgICAgICB3aWR0aCBpcyBzYW1lLCBhbmQgaGVpZ2h0IG1heSBiZSBkaWZmZXJlbnQuIFNvIHByZXZpb3VzCi0gICAgICAgICAgICAgICBwaXhlbCBpcyByZXBsaWNhdGVkIGhlcmUKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAodThXZmxhZykgewotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdThkdW0gPSAocHU4X2RhdGFfb3V0LXUzMl93aWR0aF9vdXQpOwotICAgICAgICAgICAgcHU4X2RhdGFfb3V0ID0gcHU4X2RhdGFfb3V0ICsgdTMyX3N0cmlkZV9vdXQgLSB1MzJfd2lkdGhfb3V0OwotCi0gICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHUzMl95X2luYzsKLSAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIHUzMl9zdHJpZGVfaW47Ci0gICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlKC0tdTMyX2hlaWdodCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgVGhpcyB1OEhmbGFnIGZsYWcgZ2V0cyBpbiB0byBlZmZlY3QgaWYgaW5wdXQgYW5kIG91dHB1dCBoZWlnaHQKLSAgICAgICAgaXMgc2FtZSwgYW5kIHdpZHRoIG1heSBiZSBkaWZmZXJlbnQuIFNvIHByZXZpb3VzIHBpeGVsIHJvdyBpcwotICAgICAgICByZXBsaWNhdGVkIGhlcmUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHU4SGZsYWcpIHsKLSAgICAgICAgICAgIGZvcihsb29wID0wOyBsb29wIDwgKHUzMl93aWR0aF9vdXQrdThXZmxhZyk7IGxvb3ArKykgewotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpKnB1OGR1bSsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotTTRPU0FfRVJSIGFwcGx5UmVuZGVyaW5nTW9kZShNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQsIE00eFZTU19NZWRpYVJlbmRlcmluZyBtZWRpYVJlbmRlcmluZykKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmKG1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbCB0aGUgcmVzaXplIGZpbHRlci4gRnJvbSB0aGUgaW50ZXJtZWRpYXRlIGZyYW1lIHRvIHRoZSBlbmNvZGVyIGltYWdlIHBsYW5lICovCi0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsIHBQbGFuZUluLCBwUGxhbmVPdXQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJhcHBseVJlbmRlcmluZ01vZGU6IE00VmlGaWxSZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNEFJUl9QYXJhbXMgUGFyYW1zOwotICAgICAgICBNNE9TQV9Db250ZXh0IG1fYWlyX2NvbnRleHQ7Ci0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lIHBJbWFnZVBsYW5lc1RlbXBbM107Ci0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVUZW1wOwotICAgICAgICBNNE9TQV9VSW50OCogcE91dFBsYW5lWSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YSArIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVVID0gcFBsYW5lT3V0WzFdLnBhY19kYXRhICsgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVYgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVZID0gTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lVSA9IE5VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVYgPSBOVUxMOwotICAgICAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgICAgICAvKnRvIGtlZXAgbWVkaWEgYXNwZWN0IHJhdGlvKi8KLSAgICAgICAgLypJbml0aWFsaXplIEFJUiBQYXJhbXMqLwotICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lSW4tPnVfaGVpZ2h0OwotICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBQbGFuZUluLT51X3dpZHRoOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotICAgICAgICBQYXJhbXMubV9iT3V0cHV0U3RyaXBlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIFBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLQotICAgICAgICAvKioKLSAgICAgICAgTWVkaWEgcmVuZGVyaW5nOiBCbGFjayBib3JkZXJzKi8KLSAgICAgICAgaWYobWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFswXS5wYWNfZGF0YSxZX1BMQU5FX0JPUkRFUl9WQUxVRSwocFBsYW5lT3V0WzBdLnVfaGVpZ2h0KnBQbGFuZU91dFswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLChwUGxhbmVPdXRbMV0udV9oZWlnaHQqcFBsYW5lT3V0WzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsKHBQbGFuZU91dFsyXS51X2hlaWdodCpwUGxhbmVPdXRbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCA9IHBQbGFuZU91dFsxXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IHBQbGFuZU91dFsxXS51X2hlaWdodDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGUgPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPSBwUGxhbmVPdXRbMl0udV9oZWlnaHQ7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlID0gcFBsYW5lT3V0WzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogQWxsb2NhdGVzIHBsYW4gaW4gbG9jYWwgaW1hZ2UgcGxhbmUgc3RydWN0dXJlICovCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCwgTTRWUywgKE00T1NBX0NoYXIqKSJhcHBseVJlbmRlcmluZ01vZGU6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJZIikgOwotICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciBhbGxvYyBpbiBhcHBseVJlbmRlcmluZ01vZGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCwgTTRWUywgKE00T1NBX0NoYXIqKSJhcHBseVJlbmRlcmluZ01vZGU6IHRlbXBvcmFyeSBwbGFuZSBidWZmZXJVIikgOwotICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIGFsbG9jIGluIGFwcGx5UmVuZGVyaW5nTW9kZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0LCBNNFZTLCAoTTRPU0FfQ2hhciopImFwcGx5UmVuZGVyaW5nTW9kZTogdGVtcG9yYXJ5IHBsYW5lIGJ1ZmZlclYiKSA7Ci0gICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gYXBwbHlSZW5kZXJpbmdNb2RlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwSW5QbGFuZVkgPSBwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhIDsKLSAgICAgICAgICAgIHBJblBsYW5lVSA9IHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgOwotICAgICAgICAgICAgcEluUGxhbmVWID0gcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA7Ci0KLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEsWV9QTEFORV9CT1JERVJfVkFMVUUsKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQqcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSxVX1BMQU5FX0JPUkRFUl9WQUxVRSwocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhLFZfUExBTkVfQk9SREVSX1ZBTFVFLChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBQbGFuZUluLT51X2hlaWdodCAqIHBQbGFuZU91dC0+dV93aWR0aCkgL3BQbGFuZUluLT51X3dpZHRoKSA8PSBwUGxhbmVPdXQtPnVfaGVpZ2h0KS8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0IDwgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyppdCBpcyBoZWlnaHQgc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIG9uIHRoZSBib3R0b20gc2lkZSovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSAoTTRPU0FfVUludDMyKSgocFBsYW5lSW4tPnVfaGVpZ2h0ICogcFBsYW5lT3V0LT51X3dpZHRoKSAvcFBsYW5lSW4tPnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIC8qbnVtYmVyIG9mIGxpbmVzIGF0IHRoZSB0b3AqLwotICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0gKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0LVBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpPj4xKSkqcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzVGVtcFsyXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKml0IGlzIHdpZHRoIHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gKE00T1NBX1VJbnQzMikoKHBQbGFuZUluLT51X3dpZHRoICogcFBsYW5lT3V0LT51X2hlaWdodCkgL3BQbGFuZUluLT51X2hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfdG9wbGVmdCA9IChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPSAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPSAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qV2lkdGggYW5kIGhlaWdodCBoYXZlIHRvIGJlIGV2ZW4qLwotICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSAocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgPSAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodD4+MSk8PDE7Ci0KLSAgICAgICAgICAgIC8qQ2hlY2sgdGhhdCB2YWx1ZXMgYXJlIGNvaGVyZW50Ki8KLSAgICAgICAgICAgIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwSW1hZ2VQbGFuZXNUZW1wOwotCi0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICBNZWRpYSByZW5kZXJpbmc6IENyb3BwaW5nKi8KLSAgICAgICAgaWYobWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tDcm9wcGluZykKLSAgICAgICAgewotICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgICAgICBpZigoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKmhlaWdodCB3aWxsIGJlIGNyb3BwZWQqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IChNNE9TQV9VSW50MzIpKChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ICogUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpIC9QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpKChwUGxhbmVJbi0+dV9oZWlnaHQgLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKT4+MSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyp3aWR0aCB3aWxsIGJlIGNyb3BwZWQqLwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkgL1BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKSgocFBsYW5lSW4tPnVfd2lkdGggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQbGFuZVRlbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbCBBSVIgZnVuY3Rpb25zICovCi0gICAgICAgIGVyciA9IE00QUlSX2NyZWF0ZSgmbV9haXJfY29udGV4dCwgTTRBSVJfa1lVVjQyMFApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiYXBwbHlSZW5kZXJpbmdNb2RlOiBFcnJvciB3aGVuIGluaXRpYWxpemluZyBBSVI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKG1fYWlyX2NvbnRleHQsICZQYXJhbXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiYXBwbHlSZW5kZXJpbmdNb2RlOiBFcnJvciB3aGVuIGNvbmZpZ3VyaW5nIEFJUjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICBNNEFJUl9jbGVhblVwKG1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2dldChtX2Fpcl9jb250ZXh0LCBwUGxhbmVJbiwgcFBsYW5lVGVtcCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiYXBwbHlSZW5kZXJpbmdNb2RlOiBFcnJvciB3aGVuIGdldHRpbmcgQUlSIHBsYW5lOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAobV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPDM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYobWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihpPTA7IGk8cFBsYW5lT3V0WzBdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dFBsYW5lWSwgKHZvaWQgKilwSW5QbGFuZVksIHBQbGFuZU91dFswXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBwSW5QbGFuZVkgKz0gcFBsYW5lT3V0WzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcE91dFBsYW5lWSArPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPHBQbGFuZU91dFsxXS51X2hlaWdodDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRQbGFuZVUsICh2b2lkICopcEluUGxhbmVVLCBwUGxhbmVPdXRbMV0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgcEluUGxhbmVVICs9IHBQbGFuZU91dFsxXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHBPdXRQbGFuZVUgKz0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKGk9MDsgaTxwUGxhbmVPdXRbMl0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0UGxhbmVWLCAodm9pZCAqKXBJblBsYW5lViwgcFBsYW5lT3V0WzJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIHBJblBsYW5lViArPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwT3V0UGxhbmVWICs9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fYWlyX2NvbnRleHQgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChtX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgIG1fYWlyX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLy9UT0RPOiByZW1vdmUgdGhpcyBjb2RlIGFmdGVyIGxpbmsgd2l0aCB2aWRlb2FydGlzdCBsaWIKLS8qIE00QUlSIGNvZGUqLwotI2RlZmluZSBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAotI2RlZmluZSBNNEFJUl9ZVVY0MjBBX0ZPUk1BVF9TVVBQT1JURUQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUElMQVRJT04gQ0hFQ0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgTTRBSVJfWVVWNDIwX0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfQkdSNTY1X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfUkdCNTY1X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfQkdSODg4X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfUkdCODg4X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfSlBHX0ZPUk1BVF9TVVBQT1JURUQKLQotI2Vycm9yICJQbGVhc2UgZGVmaW5lIGF0IGxlYXN0IG9uZSBpbnB1dCBmb3JtYXQgZm9yIHRoZSBBSVIgY29tcG9uZW50IgotCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiogTTRBSVIgSU5URVJOQUwgVFlQRVMgREVGSU5JVElPTlMgKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgIE00QUlSX1N0YXRlcwotICogQGJyaWVmICAgICAgIFRoZSBmb2xsb3dpbmcgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBBSVIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRBSVJfa0NyZWF0ZWQsICAgICAgICAgLyoqPCBTdGF0ZSBhZnRlciBNNEFJUl9jcmVhdGUgaGFzIGJlZW4gY2FsbGVkICovCi0gICAgTTRBSVJfa0NvbmZpZ3VyZWQgICAgICAgICAgIC8qKjwgU3RhdGUgYWZ0ZXIgTTRBSVJfY29uZmlndXJlIGhhcyBiZWVuIGNhbGxlZCAqLwotfU00QUlSX1N0YXRlczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQKLSAqIEBicmllZiAgICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB0aGUgaW50ZXJuYWwgY29udGV4dCBvZiB0aGUgQUlSLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRBSVJfU3RhdGVzICAgICAgICAgICAgICAgIG1fc3RhdGU7ICAgICAgICAgICAgLyoqPCBJbnRlcm5hbCBzdGF0ZSAqLwotICAgIE00QUlSX0lucHV0Rm9ybWF0VHlwZSAgIG1faW5wdXRGb3JtYXQ7ICAgICAgLyoqPCBJbnB1dCBmb3JtYXQgbGlrZSBZVVY0MjBQbGFuYXIsIFJHQjU2NSwgSlBHLCBldGMgLi4uICovCi0gICAgTTRBSVJfUGFyYW1zICAgICAgICAgICAgbV9wYXJhbXM7ICAgICAgICAgICAvKio8IEN1cnJlbnQgaW5wdXQgUGFyYW1ldGVyIG9mICB0aGUgcHJvY2Vzc2luZyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl94X2luY1s0XTsgICAgICAgLyoqPCByYXRpbyBiZXR3ZWVuIGlucHV0IGFuZCBvdXB1dCB3aWR0aCBmb3IgWVVWICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3lfaW5jWzRdOyAgICAgICAvKio8IHJhdGlvIGJldHdlZW4gaW5wdXQgYW5kIG91cHV0IGhlaWdodCBmb3IgWVVWICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnRbNF07ICAgLyoqPCBob3Jpem9udGFsIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeV9hY2N1bV9zdGFydFs0XTsgICAvKio8IFZlcnRpY2FsIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeF9hY2N1bVs0XTsgICAgIC8qKjwgc2F2ZSBvZiBob3Jpem9udGFsIGFjY3VtdWxhdG9yIHZhbHVlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdTMyX3lfYWNjdW1bNF07ICAgICAvKio8IHNhdmUgb2YgdmVydGljYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50OCogICAgICAgICAgICBwdThfZGF0YV9pbls0XTsgICAgICAgICAvKio8IFNhdmUgb2YgaW5wdXQgcGxhbmUgcG9pbnRlcnMgaW4gY2FzZSBvZiBzdHJpcGUgbW9kZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fcHJvY1Jvd3M7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgcHJvY2Vzc2VkIHJvd3MsIHVzZWQgaW4gc3RyaXBlIG1vZGUgb25seSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1fYk9ubHlDb3B5OyAgICAgICAgICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGp1c3QgcGVyZm9ybSBhIGNvcHkgb3IgYSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbV9iRmxpcFg7ICAgICAgICAgICAgICAgLyoqPCBEZXBlbmQgb24gb3V0cHV0IG9yaWVudGF0aW9uLCB1c2VkIGR1cmluZyBwcm9jZXNzaW5nIHRvIHJldmVydCBwcm9jZXNzaW5nIG9yZGVyIGluIFggY29vcmRpbmF0ZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtX2JGbGlwWTsgICAgICAgICAgICAgICAvKio8IERlcGVuZCBvbiBvdXRwdXQgb3JpZW50YXRpb24sIHVzZWQgZHVyaW5nIHByb2Nlc3NpbmcgdG8gcmV2ZXJ0IHByb2Nlc3Npbmcgb3JkZXIgaW4gWSBjb29yZGluYXRlcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG1fYlJldmVydFhZOyAgICAgICAgICAgIC8qKjwgRGVwZW5kIG9uIG91dHB1dCBvcmllbnRhdGlvbiwgdXNlZCBkdXJpbmcgcHJvY2Vzc2luZyB0byByZXZlcnQgWCBhbmQgWSBwcm9jZXNzaW5nIG9yZGVyICgrLTkwwrAgcm90YXRpb24pICovCi19TTRBSVJfSW50ZXJuYWxDb250ZXh0OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShyZXR2YWwsIHBvaW50ZXIpIGlmICgocG9pbnRlcikgPT0gTTRPU0FfTlVMTCkgcmV0dXJuICgoTTRPU0FfRVJSKShyZXR2YWwpKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBNNEFJUiBQVUJMSUMgQVBJIElNUExFTUVOVEFUSU9OICoqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfY3JlYXRlKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LE00QUlSX0lucHV0Rm9ybWF0VHlwZSBpbnB1dEZvcm1hdCkKLSAqIEBhdXRob3IgIEFybmF1ZCBDb2xsYXJkCi0gKiBAYnJpZWYgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAoSU4vT1VUKSBBZGRyZXNzIG9mIHRoZSBjb250ZXh0IHRvIGNyZWF0ZQotICogQHBhcmFtICAgaW5wdXRGb3JtYXQ6ICAgIChJTikgaW5wdXQgZm9ybWF0IHR5cGUuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4gSW52YWxpZCBmb3JtYXRUeXBlCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgaXMgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1IgOwotICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSBNNE9TQV9OVUxMIDsKLSAgICAvKiBDaGVjayB0aGF0IHRoZSBhZGRyZXNzIG9uIHRoZSBjb250ZXh0IGlzIG5vdCBOVUxMICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTCA7Ci0KLSAgICAvKiBJbnRlcm5hbCBDb250ZXh0IGNyZWF0aW9uICovCi0gICAgcEMgPSAoTTRBSVJfSW50ZXJuYWxDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00QUlSX0ludGVybmFsQ29udGV4dCksIE00QUlSLCAoTTRPU0FfQ2hhciopIkFJUiBpbnRlcm5hbCBjb250ZXh0IikgOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0FMTE9DLCBwQykgOwotCi0KLSAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgZm9ybWF0IGlzIHN1cHBvcnRlZCAqLwotICAgIHN3aXRjaChpbnB1dEZvcm1hdCkKLSAgICB7Ci0jaWZkZWYgTTRBSVJfWVVWNDIwX0ZPUk1BVF9TVVBQT1JURUQKLSAgICAgICAgY2FzZSBNNEFJUl9rWVVWNDIwUDoKLSAgICAgICAgYnJlYWsgOwotI2VuZGlmCi0jaWZkZWYgTTRBSVJfWVVWNDIwQV9GT1JNQVRfU1VQUE9SVEVECi0gICAgICAgIGNhc2UgTTRBSVJfa1lVVjQyMEFQOgotICAgICAgICBicmVhayA7Ci0jZW5kaWYKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRDsKLSAgICAgICAgICAgIGdvdG8gTTRBSVJfY3JlYXRlX2NsZWFudXAgOwotICAgIH0KLQotICAgIC8qKjwgU2F2ZSBpbnB1dCBmb3JtYXQgYW5kIHVwZGF0ZSBzdGF0ZSAqLwotICAgIHBDLT5tX2lucHV0Rm9ybWF0ID0gaW5wdXRGb3JtYXQ7Ci0gICAgcEMtPm1fc3RhdGUgPSBNNEFJUl9rQ3JlYXRlZDsKLQotICAgIC8qIFJldHVybiB0aGUgY29udGV4dCB0byB0aGUgY2FsbGVyICovCi0gICAgKnBDb250ZXh0ID0gcEMgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotCi1NNEFJUl9jcmVhdGVfY2xlYW51cDoKLSAgICAvKiBFcnJvciBtYW5hZ2VtZW50IDogd2UgZGVzdHJveSB0aGUgY29udGV4dCBpZiBuZWVkZWQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDKQotICAgIHsKLSAgICAgICAgZnJlZShwQykgOwotICAgIH0KLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotCi0gICAgcmV0dXJuIGVyciA7Ci19Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYXV0aG9yICBBcm5hdWQgQ29sbGFyZAotICogQGJyaWVmICAgICAgIFRoaXMgZnVuY3Rpb24gZGVzdHJveXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEFJUiBjb21wb25lbnQKLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UgdG8gZGVzdHJveQotICogQHJldHVybiAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogSW50ZXJuYWwgc3RhdGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhpcyBmdW5jdGlvbiBjYWxsLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKChNNEFJUl9rQ3JlYXRlZCAhPSBwQy0+bV9zdGF0ZSkmJihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotICAgIGZyZWUocEMpIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLQotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpCi0gKiBAYnJpZWYgICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGNvbmZpZ3VyZSB0aGUgQUlSLgotICogQG5vdGUgICAgSXQgd2lsbCBzZXQgdGhlIGlucHV0IGFuZCBvdXRwdXQgY29vcmRpbmF0ZXMgYW5kIHNpemVzLAotICogICAgICAgICAgYW5kIGluZGljYXRlcyBpZiB3ZSB3aWxsIHByb2NlZWQgaW4gc3RyaXBlIG9yIG5vdC4KLSAqICAgICAgICAgIEluIGNhc2UgYSBNNEFJUl9nZXQgaW4gc3RyaXBlIG1vZGUgd2FzIG9uIGdvaW5nLCBpdCB3aWxsIGNhbmNlbCB0aGlzIHByZXZpb3VzIHByb2Nlc3NpbmcKLSAqICAgICAgICAgIGFuZCByZXNldCB0aGUgZ2V0IHByb2Nlc3MuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgICAgICAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCi0gKiBAcGFyYW0gICBwUGFyYW1zLT5tX2JPdXRwdXRTdHJpcGU6KElOKSBTdHJpcGUgbW9kZS4KLSAqIEBwYXJhbSAgIHBQYXJhbXMtPm1faW5wdXRDb29yZDogIChJTikgWCxZIGNvb3JkaW5hdGVzIG9mIHRoZSBmaXJzdCB2YWxpZCBwaXhlbCBpbiBpbnB1dC4KLSAqIEBwYXJhbSAgIHBQYXJhbXMtPm1faW5wdXRTaXplOiAgIChJTikgaW5wdXQgUk9JIHNpemUuCi0gKiBAcGFyYW0gICBwUGFyYW1zLT5tX291dHB1dFNpemU6ICAoSU4pIG91dHB1dCBzaXplLgotICogQHJldHVybiAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBzcGFjZSB0byBhZGQgYSBuZXcgZWZmZWN0LgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gIE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRDogdGhlIHJlcXVlc3RlZCBpbnB1dCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfY29uZmlndXJlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00QUlSX1BhcmFtcyogcFBhcmFtcykKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotICAgIE00T1NBX1VJbnQzMiAgICBpLHUzMl93aWR0aF9pbiwgdTMyX3dpZHRoX291dCwgdTMyX2hlaWdodF9pbiwgdTMyX2hlaWdodF9vdXQ7Ci0gICAgTTRPU0FfVUludDMyICAgIG5iX3BsYW5lczsKLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIGlmKE00QUlSX2tZVVY0MjBBUCA9PSBwQy0+bV9pbnB1dEZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG5iX3BsYW5lcyA9IDM7Ci0gICAgfQotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKChNNEFJUl9rQ3JlYXRlZCAhPSBwQy0+bV9zdGF0ZSkmJihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqIFNhdmUgcGFyYW1ldGVycyAqLwotICAgIHBDLT5tX3BhcmFtcyA9ICpwUGFyYW1zOwotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBpbnB1dCZvdXRwdXQgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgICAgICBpZiggKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpJjB4MSkgICAgfHwKLSAgICAgICAgICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSYweDEpKQotICAgICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRFUlJfQUlSX0lMTEVHQUxfRlJBTUVfU0laRTsKLSAgICAgICAgfQotCi0gICAgaWYoICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpJjB4MSkgICAgfHwKLSAgICAgICAgICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpJjB4MSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BSVJfSUxMRUdBTF9GUkFNRV9TSVpFOwotICAgICAgICB9Ci0gICAgaWYoKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkgPT0gKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkpCi0gICAgICAgICYmKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpID09IChwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KSkpCi0gICAgewotICAgICAgICAvKio8IE5vIHJlc2l6ZSBpbiB0aGlzIGNhc2UsIHdlIHdpbGwganVzdCBjb3B5IGlucHV0IGluIG91dHB1dCAqLwotICAgICAgICBwQy0+bV9iT25seUNvcHkgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+bV9iT25seUNvcHkgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAvKio8IEluaXRpYWxpemUgaW50ZXJuYWwgdmFyaWFibGVzIHVzZWQgZm9yIHJlc2l6ZSBmaWx0ZXIgKi8KLSAgICAgICAgZm9yKGk9MDtpPG5iX3BsYW5lcztpKyspCi0gICAgICAgIHsKLQotICAgICAgICAgICAgdTMyX3dpZHRoX2luID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aDoocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgrMSk+PjE7Ci0gICAgICAgICAgICB1MzJfaGVpZ2h0X2luID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ6KHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCsxKT4+MTsKLSAgICAgICAgICAgIHUzMl93aWR0aF9vdXQgPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDoocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKzEpPj4xOwotICAgICAgICAgICAgdTMyX2hlaWdodF9vdXQgPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ6KHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQrMSk+PjE7Ci0KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgICAgICAgICAgICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2luY1tpXSAgID0gKCh1MzJfd2lkdGhfaW4tMSkgKiAweDEwMDAwKSAvICh1MzJfd2lkdGhfb3V0LTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfaW5jW2ldICAgPSAodTMyX3dpZHRoX2luICogMHgxMDAwMCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0LiovCi0gICAgICAgICAgICAgICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfaW5jW2ldICAgPSAoKHUzMl9oZWlnaHRfaW4gLSAxKSAqIDB4MTAwMDApIC8gKHUzMl9oZWlnaHRfb3V0LTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfaW5jW2ldID0gKHUzMl9oZWlnaHRfaW4gKiAweDEwMDAwKSAvICh1MzJfaGVpZ2h0X291dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl95X2FjY3VtX3N0YXJ0LgotICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfaW5jW2ldID49IDB4MTAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgMTYgaGlnaCBiaXRzIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IHBDLT51MzJfeV9pbmNbaV0gJiAweGZmZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IDB4MTAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gPj49IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKjwgVGFrZSBpbnRvIGFjY291bnQgdGhhdCBZIGNvb3JkaW5hdGUgY2FuIGJlIG9kZAotICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBwdXQgYSAwLjUgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgIGZvciBVIGFuZCBWIHBsYW5lIGFzIHRoZXJlIGEgMiB0aW1lcyBzdWItc2FtcGxlZCB2cyBZKi8KLSAgICAgICAgICAgICAgICBpZigocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3kmMHgxKSYmKChpPT0xKXx8KGk9PTIpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSArPSAweDgwMDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeF9hY2N1bV9zdGFydC4KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICBpZiAocEMtPnUzMl94X2luY1tpXSA+PSAweDEwMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gcEMtPnUzMl94X2luY1tpXSAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gMHgxMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSA+Pj0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqPCBUYWtlIGludG8gYWNjb3VudCB0aGF0IFggY29vcmRpbmF0ZSBjYW4gYmUgb2RkCi0gICAgICAgICAgICAgICAgICAgIGluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHB1dCBhIDAuNSBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgZm9yIFUgYW5kIFYgcGxhbmUgYXMgdGhlcmUgYSAyIHRpbWVzIHN1Yi1zYW1wbGVkIHZzIFkqLwotICAgICAgICAgICAgICAgIGlmKChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feCYweDEpJiYoKGk9PTEpfHwoaT09MikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldICs9IDB4ODAwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKio8IFJlc2V0IHZhcmlhYmxlIHVzZWQgZm9yIHN0cmlwZSBtb2RlICovCi0gICAgcEMtPm1fcHJvY1Jvd3MgPSAwOwotCi0gICAgLyoqPCBJbml0aWFsaXplIHZhciBmb3IgWC9ZIHByb2Nlc3Npbmcgb3JkZXIgYWNjb3JkaW5nIHRvIG9yaWVudGF0aW9uICovCi0gICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfRkFMU0U7Ci0gICAgc3dpdGNoKHBQYXJhbXMtPm1fb3V0cHV0T3JpZW50YXRpb24pCi0gICAgewotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BSaWdodDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tTGVmdDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0VG9wOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0VG9wOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbToKLSAgICAgICAgICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIC8qKjwgVXBkYXRlIHN0YXRlICovCi0gICAgcEMtPm1fc3RhdGUgPSBNNEFJUl9rQ29uZmlndXJlZDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJvdmlkZSB0aGUgcmVxdWVzdGVkIHJlc2l6ZWQgYXJlYSBvZiBpbnRlcmVzdCBhY2NvcmRpbmcgdG8gc2V0dGluZ3MKLSAqICAgICAgICAgIHByb3ZpZGVkIGluIE00QUlSX2NvbmZpZ3VyZS4KLSAqIEBub3RlICAgIEluIGNhc2UgdGhlIGlucHV0IGZvcm1hdCB0eXBlIGlzIEpQRUcsIGlucHV0IHBsYW5lKHMpCi0gKiAgICAgICAgICBpbiBwSW4gaXMgbm90IHVzZWQuIEluIG5vcm1hbCBtb2RlLCBkaW1lbnNpb24gc3BlY2lmaWVkIGluIG91dHB1dCBwbGFuZShzKSBzdHJ1Y3R1cmUgbXVzdCBiZSB0aGUKLSAqICAgICAgICAgIHNhbWUgdGhhbiB0aGUgb25lIHNwZWNpZmllZCBpbiBNNEFJUl9jb25maWd1cmUuIEluIHN0cmlwZSBtb2RlLCBvbmx5IHRoZSB3aWR0aCB3aWxsIGJlIHRoZSBzYW1lLAotICogICAgICAgICAgaGVpZ2h0IHdpbGwgYmUgdGFrZW4gYXMgdGhlIHN0cmlwZSBoZWlnaHQgKHR5cGljYWxseSAxNikuCi0gKiAgICAgICAgICBJbiBub3JtYWwgbW9kZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsIG9uY2UgdG8gZ2V0IHRoZSBmdWxsIG91dHB1dCBwaWN0dXJlLiBJbiBzdHJpcGUgbW9kZSwgaXQgaXMgY2FsbGVkCi0gKiAgICAgICAgICBmb3IgZWFjaCBzdHJpcGUgdGlsbCB0aGUgd2hvbGUgcGljdHVyZSBoYXMgYmVlbiByZXRyaWV2ZWQsYW5kICB0aGUgcG9zaXRpb24gb2YgdGhlIG91dHB1dCBzdHJpcGUgaW4gdGhlIG91dHB1dCBwaWN0dXJlCi0gKiAgICAgICAgICBpcyBpbnRlcm5hbGx5IGluY3JlbWVudGVkIGF0IGVhY2ggc3RlcC4KLSAqICAgICAgICAgIEFueSBjYWxsIHRvIE00QUlSX2NvbmZpZ3VyZSBkdXJpbmcgc3RyaXBlIHByb2Nlc3Mgd2lsbCByZXNldCB0aGlzIG9uZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgcGljdHVyZS4KLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UKLSAqIEBwYXJhbSAgIHBJbjogICAgICAgICAgICAoSU4pIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIGlucHV0IFBsYW5lKHMpLgotICogQHBhcmFtICAgcE91dDogICAgICAgKElOL09VVCkgIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIG91dHB1dCBQbGFuZShzKS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2dldChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcEluLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dCkKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotICAgIE00T1NBX1VJbnQzMiBpLGosayx1MzJfeF9mcmFjLHUzMl95X2ZyYWMsdTMyX3hfYWNjdW0sdTMyX3lfYWNjdW0sdTMyX3NoaWZ0OwotICAgICAgICBNNE9TQV9VSW50OCAgICAqcHU4X2RhdGFfaW4sICpwdThfZGF0YV9pbl9vcmcsICpwdThfZGF0YV9pbl90bXAsICpwdThfZGF0YV9vdXQ7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICAgICpwdThfc3JjX3RvcDsKLSAgICAgICAgTTRPU0FfVUludDggICAgKnB1OF9zcmNfYm90dG9tOwotICAgIE00T1NBX1VJbnQzMiAgICB1MzJfdGVtcF92YWx1ZTsKLSAgICBNNE9TQV9JbnQzMiBpMzJfdG1wX29mZnNldDsKLSAgICBNNE9TQV9VSW50MzIgICAgbmJfcGxhbmVzOwotCi0KLQotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpIDsKLQotICAgIC8qKjwgQ2hlY2sgc3RhdGUgKi8KLSAgICBpZihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICBpZihNNEFJUl9rWVVWNDIwQVAgPT0gcEMtPm1faW5wdXRGb3JtYXQpCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSA0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSAzOwotICAgIH0KLQotICAgIC8qKjwgTG9vcCBvbiBlYWNoIFBsYW5lICovCi0gICAgZm9yKGk9MDtpPG5iX3BsYW5lcztpKyspCi0gICAgewotCi0gICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLQotICAgICAgICB1MzJfc2hpZnQgPSAoKGk9PTApfHwoaT09MykpPzA6MTsgLyoqPCBEZXBlbmQgb24gTHVtYSBvciBDaHJvbWEgKi8KLQotICAgICAgICBpZigoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcGFyYW1zLm1fYk91dHB1dFN0cmlwZSl8fCgoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKSYmKDAgPT0gcEMtPm1fcHJvY1Jvd3MpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBGb3IgaW5wdXQsIHRha2UgY2FyZSBhYm91dCBST0kgKi8KLSAgICAgICAgICAgIHB1OF9kYXRhX2luICAgICA9IHBJbltpXS5wYWNfZGF0YSArIHBJbltpXS51X3RvcGxlZnQgKyAocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3g+PnUzMl9zaGlmdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHBDLT5tX3BhcmFtcy5tX2lucHV0Q29vcmQubV95ID4+IHUzMl9zaGlmdCkgKiBwSW5baV0udV9zdHJpZGU7Ci0KLSAgICAgICAgICAgIC8qKiBHbyBhdCBlbmQgb2YgbGluZS9jb2x1bW4gaW4gY2FzZSBYL1kgc2Nhbm5pbmcgaXMgZmxpcHBlZCAqLwotICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PnUzMl9zaGlmdCkgLTEgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ+PnUzMl9zaGlmdCkgLTEpICogcEluW2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEluaXRpYWxpemUgYWNjdW11bGF0b3JzIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGl0IChiaWxpbmVhciBpbnRlcnBvbGF0aW9uKSAqLwotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5tX2JPbmx5Q29weSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+dTMyX3hfYWNjdW1baV0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0gICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldID0gcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IEluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUgZm9yIG90aGVyIHRoYW4gZmlyc3Qgc3RyaXBlLCB3ZSBuZWVkIHRvIHJlY292ZXIgaW5wdXQgcG9pbnRlciBmcm9tIGludGVybmFsIGNvbnRleHQgKi8KLSAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcEMtPnB1OF9kYXRhX2luW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBJbiBldmVyeSBtb2RlLCBvdXRwdXQgZGF0YSBhcmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX291dCAgICA9IHBPdXRbaV0ucGFjX2RhdGEgKyBwT3V0W2ldLnVfdG9wbGVmdDsKLQotICAgICAgICAvKio8IEluaXRpYWxpemUgaW5wdXQgb2Zmc2V0IGFwcGxpZWQgYWZ0ZXIgZWFjaCBwaXhlbCAqLwotICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkzMl90bXBfb2Zmc2V0ID0gcEluW2ldLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaTMyX3RtcF9vZmZzZXQgPSAtcEluW2ldLnVfc3RyaWRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBJbiB0aGlzIGNhc2UsIG5vIGJpbGluZWFyIGludGVycG9sYXRpb24gaXMgbmVlZGVkIGFzIGlucHV0IGFuZCBvdXRwdXQgZGltZW5zaW9ucyBhcmUgdGhlIHNhbWUgKi8KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPm1fYk9ubHlDb3B5KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IE5vICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgTm8gZmxpcCBvbiBYIGFic2Npc3NhICovCi0gICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsb2NfaGVpZ2h0ID0gcE91dFtpXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsb2Nfd2lkdGggPSBwT3V0W2ldLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbG9jX3N0cmlkZSA9IHBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPGxvY19oZWlnaHQ7IGorKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb3B5IG9uZSB3aG9sZSBsaW5lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwdThfZGF0YV9vdXQsICh2b2lkICopcHU4X2RhdGFfaW4sIGxvY193aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSBsb2Nfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luIC09IGxvY19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcGl4ZWwgb2YgMSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9ICpwdThfZGF0YV9pbi0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IChwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gcE91dFtpXS51X3dpZHRoICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKjwgSGVyZSB3ZSBoYXZlIGEgKy05MMKwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl90bXAgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBwaXhlbCBvZiAxIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKnB1OF9kYXRhX2luX3RtcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgaW5wdXQgcG9pbnRlciBpbiBvcmRlciB0byBnbyB0byBuZXh0L3Bhc3QgbGluZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fdG1wICs9IGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IChwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luIC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qKjwgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiAqLwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotICAgICAgICBpZigzICE9IGkpICAvKio8IG90aGVyIHRoYW4gYWxwaGEgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqTm8gKy05MMKwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAocEMtPnUzMl95X2FjY3VtW2ldPj4xMikmMTU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogUmVpbml0IGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSA9IHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXTsKLQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gIHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAodTMyX3hfYWNjdW0gPj4gMTYpKSAtMSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfYWNjdW1baV0+PjE2KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeV9hY2N1bVtpXSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgIC8qKiArLTkwwrAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl9vcmcgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9IChwQy0+dTMyX3hfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpKSAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSBwdThfZGF0YV9pbiArIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bVtpXSArPSBwQy0+dTMyX3hfaW5jW2ldOwotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW5fb3JnOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgfS8qKiAzICE9IGkgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qKk5vICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYlJldmVydFhZKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHBDLT51MzJfeV9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gPSBwQy0+dTMyX3hfYWNjdW1fc3RhcnRbaV07Ci0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHUzMl94X2FjY3VtID4+IDE2KSkgLTEgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAodTMyX3hfYWNjdW0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMV0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9hY2N1bVtpXT4+MTYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl95X2FjY3VtW2ldID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSAvKio8IE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSAqLwotICAgICAgICAgICAgLyoqICstOTDCsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX29yZyA9IHB1OF9kYXRhX2luOwotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHBDLT51MzJfeF9hY2N1bVtpXT4+MTIpJjE1OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJlaW5pdCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSA9IHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXTsKLQotICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9UUlVFID09ICBwQy0+bV9iRmxpcFgpCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNikpIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzBdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldICs9IHBDLT51MzJfeF9pbmNbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbl9vcmc7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAvKio8IE00T1NBX1RSVUUgPT0gcEMtPm1fYlJldmVydFhZICovCi0gICAgICAgIH0vKiogMyA9PSBpICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKjwgSW4gY2FzZSBvZiBzdHJpcGUgbW9kZSwgc2F2ZSBjdXJyZW50IGlucHV0IHBvaW50ZXIgKi8KLSAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wYXJhbXMubV9iT3V0cHV0U3RyaXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+cHU4X2RhdGFfaW5baV0gPSBwdThfZGF0YV9pbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKjwgVXBkYXRlIG51bWJlciBvZiBwcm9jZXNzZWQgcm93cywgcmVzZXQgaXQgaWYgd2UgaGF2ZSBmaW5pc2hlZCB3aXRoIHRoZSB3aG9sZSBwcm9jZXNzaW5nICovCi0gICAgcEMtPm1fcHJvY1Jvd3MgKz0gcE91dFswXS51X2hlaWdodDsKLSAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iUmV2ZXJ0WFkpCi0gICAgewotICAgICAgICBpZihwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0IDw9IHBDLT5tX3Byb2NSb3dzKSAgICBwQy0+bV9wcm9jUm93cyA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA8PSBwQy0+bV9wcm9jUm93cykgcEMtPm1fcHJvY1Jvd3MgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLQotfQotLyorIEhhbmRsZSB0aGUgaW1hZ2UgZmlsZXMgaGVyZSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBMdkdldEltYWdlVGh1bWJOYWlsKE00T1NBX1VDaGFyICpmaWxlTmFtZSwgTTRPU0FfVm9pZCAqKnBCdWZmZXIpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIGdpdmVzIFlVVjQyMCBidWZmZXIgb2YgYSBnaXZlbiBpbWFnZSBmaWxlIChpbiBhcmdiODg4IGZvcm1hdCkKLSAqIEBOb3RlOiBUaGUgY2FsbGVyIG9mIHRoZSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSB0byBmcmVlIHRoZSB5dXYgYnVmZmVyIGFsbG9jYXRlZAotICogQHBhcmFtICAgZmlsZU5hbWU6ICAgICAgIChJTikgUGF0aCB0byB0aGUgZmlsZW5hbWUgb2YgdGhlIGltYWdlIGFyZ2IgZGF0YQotICogQHBhcmFtICAgaGVpZ2h0OiAgICAgKElOKSBIZWlnaHQgb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gICAgIHdpZHRoOiAgICAgICAgICAgICAoT1VUKSBwQnVmZmVyIHBvaW50ZXIgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHl1diBkYXRhIGFkZHJlc3MgbmVlZHMgdG8gYmUgcmV0dXJuZWQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IHNwYWNlIHRvIGFkZCBhIG5ldyBlZmZlY3QuCi0gKiBAcmV0dXJuICBNNEVSUl9GSUxFX05PVF9GT1VORDogaWYgdGhlIGZpbGUgcGFzc2VkIGRvZXMgbm90IGV4aXN0cy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTHZHZXRJbWFnZVRodW1iTmFpbChjb25zdCBjaGFyICpmaWxlTmFtZSwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9Wb2lkICoqcEJ1ZmZlcikgewotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcmdiUGxhbmUsICp5dXZQbGFuZTsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplX2FyZ2IgPSAod2lkdGggKiBoZWlnaHQgKiA0KTsgLy8gYXJnYiBkYXRhCi0gICAgTTRPU0FfQ29udGV4dCBsSW1hZ2VGaWxlRnAgID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1VJbnQ4ICpwVG1wRGF0YSA9IChNNE9TQV9VSW50OCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfYXJnYiwgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBhcmdiIGRhdGEiKTsKLSAgICBpZihwVG1wRGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBJbWFnZSBjbGlwIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAgICAvKiogUmVhZCB0aGUgYXJnYiBkYXRhIGZyb20gdGhlIHBhc3NlZCBmaWxlLiAqLwotICAgIE00T1NBX0VSUiBsZXJyID0gTTRPU0FfZmlsZVJlYWRPcGVuKCZsSW1hZ2VGaWxlRnAsIChNNE9TQV9Wb2lkICopIGZpbGVOYW1lLCBNNE9TQV9rRmlsZVJlYWQpOwotCi0gICAgaWYoKGxlcnIgIT0gTTROT19FUlJPUikgfHwgKGxJbWFnZUZpbGVGcCA9PSBNNE9TQV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIEFMT0dFKCJMVlByZXZpZXdDb250cm9sbGVyOiBDYW4gbm90IG9wZW4gdGhlIGZpbGUgIik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9OT1RfRk9VTkQ7Ci0gICAgfQotICAgIGxlcnIgPSBNNE9TQV9maWxlUmVhZERhdGEobEltYWdlRmlsZUZwLCAoTTRPU0FfTWVtQWRkcjgpcFRtcERhdGEsICZmcmFtZVNpemVfYXJnYik7Ci0gICAgaWYobGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgQUxPR0UoIkxWUHJldmlld0NvbnRyb2xsZXI6IGNhbiBub3QgcmVhZCB0aGUgZGF0YSAiKTsKLSAgICAgICAgTTRPU0FfZmlsZVJlYWRDbG9zZShsSW1hZ2VGaWxlRnApOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIGxlcnI7Ci0gICAgfQotICAgIE00T1NBX2ZpbGVSZWFkQ2xvc2UobEltYWdlRmlsZUZwKTsKLQotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKTsgLy9TaXplIG9mIFlVVjQyMCBkYXRhLgotICAgIHJnYlBsYW5lLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSwgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBjbGlwIFJHQjg4OCBkYXRhIik7Ci0gICAgaWYocmdiUGxhbmUucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBJbWFnZSBjbGlwIik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqIFJlbW92ZSB0aGUgYWxwaGEgY2hhbm5lbCAqLwotICAgIGZvciAoTTRPU0FfVUludDMyIGk9MCwgaiA9IDA7IGkgPCBmcmFtZVNpemVfYXJnYjsgaSsrKSB7Ci0gICAgICAgIGlmICgoaSAlIDQpID09IDApIGNvbnRpbnVlOwotICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YVtqXSA9IHBUbXBEYXRhW2ldOwotICAgICAgICBqKys7Ci0gICAgfQotICAgIGZyZWUocFRtcERhdGEpOwotCi0jaWZkZWYgRklMRV9EVU1QCi0gICAgRklMRSAqZnAgPSBmb3BlbigiL3NkY2FyZC9JbnB1dC90ZXN0X3JnYi5yYXciLCAid2IiKTsKLSAgICBpZihmcCA9PSBOVUxMKQotICAgICAgICBBTE9HRSgiRXJyb3JzIGZpbGUgY2FuIG5vdCBiZSBjcmVhdGVkIik7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZ3cml0ZShyZ2JQbGFuZS5wYWNfZGF0YSwgZnJhbWVTaXplLCAxLCBmcCk7Ci0gICAgICAgIGZjbG9zZShmcCk7Ci0gICAgfQotI2VuZGlmCi0gICAgICAgIHJnYlBsYW5lLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICByZ2JQbGFuZS51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIHJnYlBsYW5lLnVfc3RyaWRlID0gd2lkdGgqMzsKLSAgICAgICAgcmdiUGxhbmUudV90b3BsZWZ0ID0gMDsKLQotICAgICAgICB5dXZQbGFuZSA9IChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIk00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVjogT3V0cHV0IHBsYW5lIFlVViIpOwotICAgICAgICB5dXZQbGFuZVswXS51X2hlaWdodCA9IGhlaWdodDsKLSAgICAgICAgeXV2UGxhbmVbMF0udV93aWR0aCA9IHdpZHRoOwotICAgICAgICB5dXZQbGFuZVswXS51X3N0cmlkZSA9IHdpZHRoOwotICAgICAgICB5dXZQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICB5dXZQbGFuZVswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh5dXZQbGFuZVswXS51X2hlaWdodCAqIHl1dlBsYW5lWzBdLnVfd2lkdGggKiAxLjUsIE00VlMsIChNNE9TQV9DaGFyKikiaW1hZ2VDbGlwIFlVViBkYXRhIik7Ci0KLSAgICAgICAgeXV2UGxhbmVbMV0udV9oZWlnaHQgPSB5dXZQbGFuZVswXS51X2hlaWdodCA+PjE7Ci0gICAgICAgIHl1dlBsYW5lWzFdLnVfd2lkdGggPSB5dXZQbGFuZVswXS51X3dpZHRoID4+IDE7Ci0gICAgICAgIHl1dlBsYW5lWzFdLnVfc3RyaWRlID0geXV2UGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgeXV2UGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgeXV2UGxhbmVbMV0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoeXV2UGxhbmVbMF0ucGFjX2RhdGEgKyB5dXZQbGFuZVswXS51X2hlaWdodCAqIHl1dlBsYW5lWzBdLnVfd2lkdGgpOwotCi0gICAgICAgIHl1dlBsYW5lWzJdLnVfaGVpZ2h0ID0geXV2UGxhbmVbMF0udV9oZWlnaHQgPj4xOwotICAgICAgICB5dXZQbGFuZVsyXS51X3dpZHRoID0geXV2UGxhbmVbMF0udV93aWR0aCA+PiAxOwotICAgICAgICB5dXZQbGFuZVsyXS51X3N0cmlkZSA9IHl1dlBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgICAgIHl1dlBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHl1dlBsYW5lWzJdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKHl1dlBsYW5lWzFdLnBhY19kYXRhICsgeXV2UGxhbmVbMV0udV9oZWlnaHQgKiB5dXZQbGFuZVsxXS51X3dpZHRoKTsKLQotCi0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUsIHl1dlBsYW5lKTsKLSAgICAgICAgLy9lcnIgPSBNNFZJRklfQkdSODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgJnJnYlBsYW5lLCB5dXZQbGFuZSk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgKHVuc2lnbmVkIGludCllcnIpOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotCi0gICAgICAgIC8vQUxPR0UoIlJHQiB0byBZVVYgZG9uZSIpOwotI2lmZGVmIEZJTEVfRFVNUAotICAgICAgICBGSUxFICpmcDEgPSBmb3BlbigiL3NkY2FyZC9JbnB1dC90ZXN0X3l1di5yYXciLCAid2IiKTsKLSAgICAgICAgaWYoZnAxID09IE5VTEwpCi0gICAgICAgICAgICBBTE9HRSgiRXJyb3JzIGZpbGUgY2FuIG5vdCBiZSBjcmVhdGVkIik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZndyaXRlKHl1dlBsYW5lWzBdLnBhY19kYXRhLCB5dXZQbGFuZVswXS51X2hlaWdodCAqIHl1dlBsYW5lWzBdLnVfd2lkdGggKiAxLjUsIDEsIGZwMSk7Ci0gICAgICAgICAgICBmY2xvc2UoZnAxKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICpwQnVmZmVyID0geXV2UGxhbmVbMF0ucGFjX2RhdGE7Ci0gICAgICAgIGZyZWUoeXV2UGxhbmUpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotfQotTTRPU0FfVm9pZCBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmUsCi0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNFZJRklfVUludDggKmJ1ZmZlciwKLSAgICBNNE9TQV9VSW50MzIgcmVwb3J0ZWRXaWR0aCwgTTRPU0FfVUludDMyIHJlcG9ydGVkSGVpZ2h0KSB7Ci0KLSAgICAvL1kgcGxhbmUKLSAgICBwbGFuZVswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgcGxhbmVbMF0udV9zdHJpZGUgPSByZXBvcnRlZFdpZHRoOwotICAgIHBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgcGxhbmVbMF0ucGFjX2RhdGEgPSBidWZmZXI7Ci0KLSAgICAvLyBVIHBsYW5lCi0gICAgcGxhbmVbMV0udV93aWR0aCA9IHdpZHRoLzI7Ci0gICAgcGxhbmVbMV0udV9oZWlnaHQgPSBoZWlnaHQvMjsKLSAgICBwbGFuZVsxXS51X3N0cmlkZSA9IHJlcG9ydGVkV2lkdGggPj4gMTsKLSAgICBwbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBsYW5lWzFdLnBhY19kYXRhID0gYnVmZmVyKyhyZXBvcnRlZFdpZHRoKnJlcG9ydGVkSGVpZ2h0KTsKLQotICAgIC8vIFYgUGxhbmUKLSAgICBwbGFuZVsyXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZVsyXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lWzJdLnVfc3RyaWRlID0gcmVwb3J0ZWRXaWR0aCA+PiAxOwotICAgIHBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgcGxhbmVbMl0ucGFjX2RhdGEgPSBwbGFuZVsxXS5wYWNfZGF0YSArICgocmVwb3J0ZWRXaWR0aC8yKSoocmVwb3J0ZWRIZWlnaHQvMikpOwotfQotCi1NNE9TQV9Wb2lkIHByZXBhcmVZVjEySW1hZ2VQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmUsCi0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNE9TQV9VSW50MzIgc3RyaWRlLAotICAgIE00VklGSV9VSW50OCAqYnVmZmVyKSB7Ci0KLSAgICAvL1kgcGxhbmUKLSAgICBwbGFuZVswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgcGxhbmVbMF0udV9zdHJpZGUgPSBzdHJpZGU7Ci0gICAgcGxhbmVbMF0udV90b3BsZWZ0ID0gMDsKLSAgICBwbGFuZVswXS5wYWNfZGF0YSA9IGJ1ZmZlcjsKLQotICAgIC8vIFUgcGxhbmUKLSAgICBwbGFuZVsxXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZVsxXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lWzFdLnVfc3RyaWRlID0gYW5kcm9pZDo6UHJldmlld1JlbmRlcmVyOjpBTElHTihwbGFuZVswXS51X3N0cmlkZS8yLCAxNik7Ci0gICAgcGxhbmVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBwbGFuZVsxXS5wYWNfZGF0YSA9IChidWZmZXIKLSAgICAgICAgICAgICAgICArIHBsYW5lWzBdLnVfaGVpZ2h0ICogcGxhbmVbMF0udV9zdHJpZGUKLSAgICAgICAgICAgICAgICArIChwbGFuZVswXS51X2hlaWdodC8yKSAqIGFuZHJvaWQ6OlByZXZpZXdSZW5kZXJlcjo6QUxJR04oKAotICAgICAgICAgICAgICAgICBwbGFuZVswXS51X3N0cmlkZSAvIDIpLCAxNikpOwotCi0gICAgLy8gViBQbGFuZQotICAgIHBsYW5lWzJdLnVfd2lkdGggPSB3aWR0aC8yOwotICAgIHBsYW5lWzJdLnVfaGVpZ2h0ID0gaGVpZ2h0LzI7Ci0gICAgcGxhbmVbMl0udV9zdHJpZGUgPSBhbmRyb2lkOjpQcmV2aWV3UmVuZGVyZXI6OkFMSUdOKHBsYW5lWzBdLnVfc3RyaWRlLzIsIDE2KTsKLSAgICBwbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgIHBsYW5lWzJdLnBhY19kYXRhID0gKGJ1ZmZlciArCi0gICAgIHBsYW5lWzBdLnVfaGVpZ2h0ICogYW5kcm9pZDo6UHJldmlld1JlbmRlcmVyOjpBTElHTihwbGFuZVswXS51X3N0cmlkZSwgMTYpKTsKLQotCi19Ci0KLU00T1NBX1ZvaWQgc3dhcEltYWdlUGxhbmVzKAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIpIHsKLQotICAgIHBsYW5lSW5bMF0udV9oZWlnaHQgPSBwbGFuZU91dFswXS51X2hlaWdodDsKLSAgICBwbGFuZUluWzBdLnVfd2lkdGggPSBwbGFuZU91dFswXS51X3dpZHRoOwotICAgIHBsYW5lSW5bMF0udV9zdHJpZGUgPSBwbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICBwbGFuZUluWzBdLnVfdG9wbGVmdCA9IHBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwbGFuZUluWzBdLnBhY19kYXRhID0gcGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBVIHBsYW5lICovCi0gICAgcGxhbmVJblsxXS51X3dpZHRoID0gcGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICBwbGFuZUluWzFdLnVfaGVpZ2h0ID0gcGxhbmVPdXRbMV0udV9oZWlnaHQ7Ci0gICAgcGxhbmVJblsxXS51X3N0cmlkZSA9IHBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHBsYW5lSW5bMV0udV90b3BsZWZ0ID0gcGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHBsYW5lSW5bMV0ucGFjX2RhdGEgPSBwbGFuZU91dFsxXS5wYWNfZGF0YTsKLSAgICAvKioKLSAgICAgKiBWIFBsYW5lICovCi0gICAgcGxhbmVJblsyXS51X3dpZHRoID0gcGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICBwbGFuZUluWzJdLnVfaGVpZ2h0ID0gcGxhbmVPdXRbMl0udV9oZWlnaHQ7Ci0gICAgcGxhbmVJblsyXS51X3N0cmlkZSA9IHBsYW5lT3V0WzJdLnVfc3RyaWRlOwotICAgIHBsYW5lSW5bMl0udV90b3BsZWZ0ID0gcGxhbmVPdXRbMl0udV90b3BsZWZ0OwotICAgIHBsYW5lSW5bMl0ucGFjX2RhdGEgPSBwbGFuZU91dFsyXS5wYWNfZGF0YTsKLQotICAgIGlmKHBsYW5lT3V0WzBdLnBhY19kYXRhID09IChNNFZJRklfVUludDgqKWJ1ZmZlcjEpCi0gICAgewotICAgICAgICBwbGFuZU91dFswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKWJ1ZmZlcjI7Ci0gICAgICAgIHBsYW5lT3V0WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKGJ1ZmZlcjIgKwotICAgICAgICAgcGxhbmVPdXRbMF0udV93aWR0aCpwbGFuZU91dFswXS51X2hlaWdodCk7Ci0KLSAgICAgICAgcGxhbmVPdXRbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoYnVmZmVyMiArCi0gICAgICAgICBwbGFuZU91dFswXS51X3dpZHRoKnBsYW5lT3V0WzBdLnVfaGVpZ2h0ICsKLSAgICAgICAgIHBsYW5lT3V0WzFdLnVfd2lkdGgqcGxhbmVPdXRbMV0udV9oZWlnaHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwbGFuZU91dFswXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKWJ1ZmZlcjE7Ci0gICAgICAgIHBsYW5lT3V0WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKGJ1ZmZlcjEgKwotICAgICAgICAgcGxhbmVPdXRbMF0udV93aWR0aCpwbGFuZU91dFswXS51X2hlaWdodCk7Ci0KLSAgICAgICAgcGxhbmVPdXRbMl0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KikoYnVmZmVyMSArCi0gICAgICAgICBwbGFuZU91dFswXS51X3dpZHRoKnBsYW5lT3V0WzBdLnVfaGVpZ2h0ICsKLSAgICAgICAgIHBsYW5lT3V0WzFdLnVfd2lkdGgqcGxhbmVPdXRbMV0udV9oZWlnaHQpOwotICAgIH0KLQotfQotCi1NNE9TQV9Wb2lkIGNvbXB1dGVQZXJjZW50YWdlRG9uZSgKLSAgICBNNE9TQV9VSW50MzIgY3RzTXMsIE00T1NBX1VJbnQzMiBlZmZlY3RTdGFydFRpbWVNcywKLSAgICBNNE9TQV9VSW50MzIgZWZmZWN0RHVyYXRpb24sIE00T1NBX0RvdWJsZSAqcGVyY2VudGFnZURvbmUpIHsKLQotICAgIE00T1NBX0RvdWJsZSB2aWRlb0VmZmVjdFRpbWUgPTA7Ci0KLSAgICAvLyBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZmZlY3Qgd2UgYXJlLCBpbiBjbGlwLWJhc2UgdGltZS4KLSAgICB2aWRlb0VmZmVjdFRpbWUgPQotICAgICAoTTRPU0FfSW50MzIpKGN0c01zKyAwLjUpIC0gZWZmZWN0U3RhcnRUaW1lTXM7Ci0KLSAgICAvLyBUbyBjYWxjdWxhdGUgJSwgc3Vic3RyYWN0IHRpbWVJbmNyZW1lbnQKLSAgICAvLyBiZWNhdXNlIGVmZmVjdCBzaG91bGQgZmluaXNoIG9uIHRoZSBsYXN0IGZyYW1lCi0gICAgLy8gd2hpY2ggaXMgZnJvbSBDVFMgPSAoZW9mLXRpbWVJbmNyZW1lbnQpIHRpbGwgQ1RTID0gZW9mCi0gICAgKnBlcmNlbnRhZ2VEb25lID0KLSAgICAgdmlkZW9FZmZlY3RUaW1lIC8gKChNNE9TQV9GbG9hdCllZmZlY3REdXJhdGlvbik7Ci0KLSAgICBpZigqcGVyY2VudGFnZURvbmUgPCAwLjApICpwZXJjZW50YWdlRG9uZSA9IDAuMDsKLSAgICBpZigqcGVyY2VudGFnZURvbmUgPiAxLjApICpwZXJjZW50YWdlRG9uZSA9IDEuMDsKLQotfQotCi0KLU00T1NBX1ZvaWQgY29tcHV0ZVByb2dyZXNzRm9yVmlkZW9FZmZlY3QoCi0gICAgTTRPU0FfVUludDMyIGN0c01zLCBNNE9TQV9VSW50MzIgZWZmZWN0U3RhcnRUaW1lTXMsCi0gICAgTTRPU0FfVUludDMyIGVmZmVjdER1cmF0aW9uLCBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyogZXh0UHJvZ3Jlc3MpIHsKLQotICAgIE00T1NBX0RvdWJsZSBwZXJjZW50YWdlRG9uZSA9MDsKLQotICAgIGNvbXB1dGVQZXJjZW50YWdlRG9uZShjdHNNcywgZWZmZWN0U3RhcnRUaW1lTXMsIGVmZmVjdER1cmF0aW9uLCAmcGVyY2VudGFnZURvbmUpOwotCi0gICAgZXh0UHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDMyKSggcGVyY2VudGFnZURvbmUgKiAxMDAwICk7Ci0gICAgZXh0UHJvZ3Jlc3MtPnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpKGN0c01zICsgMC41KTsKLSAgICBleHRQcm9ncmVzcy0+dWlDbGlwVGltZSA9IGV4dFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgZXh0UHJvZ3Jlc3MtPmJJc0xhc3QgPSBNNE9TQV9GQUxTRTsKLX0KLQotTTRPU0FfRVJSIHByZXBhcmVGcmFtaW5nU3RydWN0dXJlKAotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogZWZmZWN0c1NldHRpbmdzLCBNNE9TQV9VSW50MzIgaW5kZXgsCi0gICAgTTRWSUZJX1VJbnQ4KiBvdmVybGF5UkdCLCBNNFZJRklfVUludDgqIG92ZXJsYXlZVVYpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gRm9yY2UgaW5wdXQgUkdCIGJ1ZmZlciB0byBldmVuIHNpemUgdG8gYXZvaWQgZXJyb3JzIGluIFlVViBjb252ZXJzaW9uCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy5wRnJhbWluZ0J1ZmZlcjsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCAmIH4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgJiB+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTlVMTDsKLQotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gZWZmZWN0c1NldHRpbmdzW2luZGV4XS51aUR1cmF0aW9uOwotICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9IGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgZnJhbWluZ0N0eC0+dG9wbGVmdF95ID0gZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnRvcGxlZnRfeTsKLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotICAgIGZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLQotICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyksIE00VlMsCi0gICAgICAoTTRPU0FfQ2hhciopImFscGhhIGJsZW5kaW5nIHN0cnVjdCIpOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lID0KLSAgICAgZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0KLSAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID0KLSAgICAgZWZmZWN0c1NldHRpbmdzW2luZGV4XS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9lbmQgPQotICAgICBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgPQotICAgICBlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotCi0gICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9zdGFydCA9Ci0gICAgIGVmZmVjdHNTZXR0aW5nc1tpbmRleF0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydDsKLQotICAgIC8vIElmIG5ldyBPdmVybGF5IGJ1ZmZlciwgY29udmVydCBmcm9tIFJHQiB0byBZVVYKLSAgICBpZigob3ZlcmxheVJHQiAhPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSkgfHwgKG92ZXJsYXlZVVYgPT0gTlVMTCkgKSB7Ci0KLSAgICAgICAgLy8gSWYgWVVWIGJ1ZmZlciBleGlzdHMsIGRlbGV0ZSBpdAotICAgICAgICBpZihvdmVybGF5WVVWICE9IE5VTEwpIHsKLSAgICAgICAgICAgZnJlZShvdmVybGF5WVVWKTsKLSAgICAgICAgICAgb3ZlcmxheVlVViA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICBpZihlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MucmdiVHlwZSA9PSBNNFZTUzNHUFBfa1JHQjU2NSkgewotICAgICAgICAvLyBJbnB1dCBSR0I1NjUgcGxhbmUgaXMgcHJvdmlkZWQsCi0gICAgICAgIC8vIGxldCdzIGNvbnZlcnQgaXQgdG8gWVVWNDIwLCBhbmQgdXBkYXRlIGZyYW1pbmcgc3RydWN0dXJlCi0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihmcmFtaW5nQ3R4KTsKLSAgICB9Ci0gICAgZWxzZSBpZihlZmZlY3RzU2V0dGluZ3NbaW5kZXhdLnhWU1MucmdiVHlwZSA9PSBNNFZTUzNHUFBfa1JHQjg4OCkgewotICAgICAgICAvLyBJbnB1dCBSR0I4ODggcGxhbmUgaXMgcHJvdmlkZWQsCi0gICAgICAgIC8vIGxldCdzIGNvbnZlcnQgaXQgdG8gWVVWNDIwLCBhbmQgdXBkYXRlIGZyYW1pbmcgc3RydWN0dXJlCi0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0I4ODh0b1lVVihmcmFtaW5nQ3R4KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgICAgIG92ZXJsYXlZVVYgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhOwotICAgICAgICBvdmVybGF5UkdCID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIEFMT0dWKCIgWVVWIGJ1ZmZlciByZXVzZSIpOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksIE00VlMsIChNNE9TQV9DaGFyKikiWVVWIik7Ci0KLSAgICAgICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQ7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilvdmVybGF5WVVWOwotCi0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgKwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodDsKLQotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfd2lkdGggPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV9zdHJpZGUgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCk+PjE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhICsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV93aWR0aCAqIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQ7Ci0KLSAgICAgICAgZnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgICAgIGZyYW1pbmdDdHgtPnByZXZpZXdPZmZzZXRDbGlwVGltZSA9IC0xOwotCi0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19WaWRlb0VmZmVjdFR5cGUgY29sb3JFZmZlY3QsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMiwgTTRPU0FfVUludDE2IHJnYkNvbG9yRGF0YSkgewotCi0gICAgTTR4VlNTX0NvbG9yU3RydWN0IGNvbG9yQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGNvbG9yQ29udGV4dC5jb2xvckVmZmVjdFR5cGUgPSBjb2xvckVmZmVjdDsKLSAgICBjb2xvckNvbnRleHQucmdiMTZDb2xvckRhdGEgPSByZ2JDb2xvckRhdGE7Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKAotICAgICAoTTRPU0FfVm9pZCAqKSZjb2xvckNvbnRleHQsIHBsYW5lSW4sIHBsYW5lT3V0LCBOVUxMLAotICAgICBjb2xvckVmZmVjdCk7Ci0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBBTE9HVigiTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvciglZCkgZXJyb3IgJWQiLAotICAgICAgICAgICAgY29sb3JFZmZlY3QsIGVycik7Ci0KLSAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIxKSB7Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcjEpOwotICAgICAgICAgICAgYnVmZmVyMSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIyKSB7Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcjIpOwotICAgICAgICAgICAgYnVmZmVyMiA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvLyBUaGUgb3V0IHBsYW5lIG5vdyBiZWNvbWVzIHRoZSBpbiBwbGFuZSBmb3IgYWRkaW5nIG90aGVyIGVmZmVjdHMKLSAgICBzd2FwSW1hZ2VQbGFuZXMocGxhbmVJbiwgcGxhbmVPdXQsIGJ1ZmZlcjEsIGJ1ZmZlcjIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIGFwcGx5THVtYUVmZmVjdChNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlIHZpZGVvRWZmZWN0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIsIE00T1NBX0ludDMyIGx1bV9mYWN0b3IpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgZXJyID0gTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZSgKLSAgICAgICAgIChNNFZpQ29tSW1hZ2VQbGFuZSopcGxhbmVJbiwoTTRWaUNvbUltYWdlUGxhbmUqKXBsYW5lT3V0LAotICAgICAgICAgbHVtX2ZhY3RvciwgTlVMTCk7Ci0KLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBBTE9HRSgiTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZSglZCkgZXJyb3IgJWQiLCB2aWRlb0VmZmVjdCwgKGludCllcnIpOwotCi0gICAgICAgIGlmKE5VTEwgIT0gYnVmZmVyMSkgewotICAgICAgICAgICAgZnJlZShidWZmZXIxKTsKLSAgICAgICAgICAgIGJ1ZmZlcjE9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTlVMTCAhPSBidWZmZXIyKSB7Ci0gICAgICAgICAgICBmcmVlKGJ1ZmZlcjIpOwotICAgICAgICAgICAgYnVmZmVyMj0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8vIFRoZSBvdXQgcGxhbmUgbm93IGJlY29tZXMgdGhlIGluIHBsYW5lIGZvciBhZGRpbmcgb3RoZXIgZWZmZWN0cwotICAgIHN3YXBJbWFnZVBsYW5lcyhwbGFuZUluLCBwbGFuZU91dCwoTTRWSUZJX1VJbnQ4ICopYnVmZmVyMSwKLSAgICAgKE00VklGSV9VSW50OCAqKWJ1ZmZlcjIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIGFwcGx5RWZmZWN0c0FuZFJlbmRlcmluZ01vZGUodmVQb3N0UHJvY2Vzc1BhcmFtcyAqcGFyYW1zLAotICAgIE00T1NBX1VJbnQzMiByZXBvcnRlZFdpZHRoLCBNNE9TQV9VSW50MzIgcmVwb3J0ZWRIZWlnaHQpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBsYW5lSW5bM10sIHBsYW5lT3V0WzNdOwotICAgIE00VklGSV9VSW50OCAqZmluYWxPdXRwdXRCdWZmZXIgPSBOVUxMLCAqdGVtcE91dHB1dEJ1ZmZlcj0gTlVMTDsKLSAgICBNNE9TQV9Eb3VibGUgcGVyY2VudGFnZURvbmUgPTA7Ci0gICAgTTRPU0FfSW50MzIgbHVtX2ZhY3RvcjsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLSAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCBmaWZ0aWVzQ3R4OwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAwLCBpPTA7Ci0KLSAgICBmcmFtZVNpemUgPSAocGFyYW1zLT52aWRlb1dpZHRoKnBhcmFtcy0+dmlkZW9IZWlnaHQqMykgPj4gMTsKLQotICAgIGZpbmFsT3V0cHV0QnVmZmVyID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZSwgTTRWUywKLSAgICAgKE00T1NBX0NoYXIqKSgibHZwcCBmaW5hbE91dHB1dEJ1ZmZlciIpKTsKLQotICAgIGlmKGZpbmFsT3V0cHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImFwcGx5RWZmZWN0c0FuZFJlbmRlcmluZ01vZGU6IG1hbGxvYyBlcnJvciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLy8gYWxsb2NhdGUgdGhlIHRlbXBPdXRwdXRCdWZmZXIKLSAgICB0ZW1wT3V0cHV0QnVmZmVyID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAoKHBhcmFtcy0+dmlkZW9IZWlnaHQqcGFyYW1zLT52aWRlb1dpZHRoKjMpPj4xKSwgTTRWUywgKE00T1NBX0NoYXIqKSgibHZwcCBjb2xvckJ1ZmZlciIpKTsKLQotICAgIGlmKHRlbXBPdXRwdXRCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiYXBwbHlFZmZlY3RzQW5kUmVuZGVyaW5nTW9kZTogbWFsbG9jIGVycm9yIHRlbXBPdXRwdXRCdWZmZXIiKTsKLSAgICAgICAgaWYoTlVMTCAhPSBmaW5hbE91dHB1dEJ1ZmZlcikgewotICAgICAgICAgICAgZnJlZShmaW5hbE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICBmaW5hbE91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8vIEluaXRpYWxpemUgdGhlIEluIHBsYW5lCi0gICAgcHJlcGFyZVlVVjQyMEltYWdlUGxhbmUocGxhbmVJbiwgcGFyYW1zLT52aWRlb1dpZHRoLCBwYXJhbXMtPnZpZGVvSGVpZ2h0LAotICAgICAgIHBhcmFtcy0+dmlkQnVmZmVyLCByZXBvcnRlZFdpZHRoLCByZXBvcnRlZEhlaWdodCk7Ci0KLSAgICAvLyBJbml0aWFsaXplIHRoZSBPdXQgcGxhbmUKLSAgICBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShwbGFuZU91dCwgcGFyYW1zLT52aWRlb1dpZHRoLCBwYXJhbXMtPnZpZGVvSGVpZ2h0LAotICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCBwYXJhbXMtPnZpZGVvV2lkdGgsIHBhcmFtcy0+dmlkZW9IZWlnaHQpOwotCi0gICAgLy8gVGhlIHBsYW5lSW4gY29udGFpbnMgdGhlIFlVVjQyMCBpbnB1dCBkYXRhIHRvIHBvc3Rwcm9jZXNzaW5nIG5vZGUKLSAgICAvLyBhbmQgcGxhbmVPdXQgd2lsbCBjb250YWluIHRoZSBZVVY0MjAgZGF0YSB3aXRoIGVmZmVjdAotICAgIC8vIEluIGVhY2ggc3VjY2Vzc2l2ZSBpZiBjb25kaXRpb24sIGFwcGx5IGZpbHRlciB0byBzdWNjZXNzaXZlCi0gICAgLy8gb3V0cHV0IFlVViBmcmFtZSBzbyB0aGF0IGNvbmN1cnJlbnQgZWZmZWN0cyBhcmUgYm90aCBhcHBsaWVkCi0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9CTEFDS0FORFdISVRFKSB7Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZSwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsIDApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX1BJTkspIHsKLSAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rLAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwgMCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfR1JFRU4pIHsKLSAgICAgICAgZXJyID0gYXBwbHlDb2xvckVmZmVjdChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbiwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsIDApOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX1NFUElBKSB7Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWEsCi0gICAgICAgICAgICAgIHBsYW5lSW4sIHBsYW5lT3V0LCAoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCAwKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9ORUdBVElWRSkgewotICAgICAgICBlcnIgPSBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlLAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwgMCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfR1JBRElFTlQpIHsKLSAgICAgICAgLy8gZmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmFkaWVudCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBhcHBseUNvbG9yRWZmZWN0KE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50LAotICAgICAgICAgICAgICBwbGFuZUluLCBwbGFuZU91dCwgKE00VklGSV9VSW50OCAqKWZpbmFsT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aVJnYjE2SW5wdXRDb2xvcik7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfQ09MT1JfUkdCMTYpIHsKLSAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IGFwcGx5Q29sb3JFZmZlY3QoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNiwKLSAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnhWU1MudWlSZ2IxNklucHV0Q29sb3IpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZJRlRJRVMpIHsKLSAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmKGkgPCBwYXJhbXMtPm51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgIGNvbXB1dGVQcm9ncmVzc0ZvclZpZGVvRWZmZWN0KHBhcmFtcy0+dGltZU1zLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24sICZleHRQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgIGlmKHBhcmFtcy0+aXNGaWZ0aWVzRWZmZWN0U3RhcnRlZCkgewotICAgICAgICAgICAgICAgIGZpZnRpZXNDdHgucHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlmdGllc0N0eC5maWZ0aWVzRWZmZWN0RHVyYXRpb24gPQotICAgICAgICAgICAgIDEwMDAvcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0ueFZTUy51aUZpZnRpZXNPdXRGcmFtZVJhdGU7Ci0KLSAgICAgICAgICAgIGZpZnRpZXNDdHguc2hpZnRSYW5kb21WYWx1ZSA9IDA7Ci0gICAgICAgICAgICBmaWZ0aWVzQ3R4LnN0cmlwZVJhbmRvbVZhbHVlID0gMDsKLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKAotICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopJmZpZnRpZXNDdHgsIHBsYW5lSW4sIHBsYW5lT3V0LCAmZXh0UHJvZ3Jlc3MsCi0gICAgICAgICAgICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRmlmdGllcyk7Ci0KLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIk00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyBlcnJvciAweCV4IiwgKHVuc2lnbmVkIGludCllcnIpOwotCi0gICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBmaW5hbE91dHB1dEJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICBmcmVlKGZpbmFsT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWxPdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihOVUxMICE9IHRlbXBPdXRwdXRCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh0ZW1wT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcE91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoZSBvdXQgcGxhbmUgbm93IGJlY29tZXMgdGhlIGluIHBsYW5lIGZvciBhZGRpbmcgb3RoZXIgZWZmZWN0cwotICAgICAgICAgICAgc3dhcEltYWdlUGxhbmVzKHBsYW5lSW4sIHBsYW5lT3V0LChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4ICopdGVtcE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwYXJhbXMtPmN1cnJlbnRWaWRlb0VmZmVjdCAmIFZJREVPX0VGRkVDVF9GUkFNSU5HKSB7Ci0KLSAgICAgICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgZnJhbWluZ0N0eDsKLSAgICAgICAgLy8gRmluZCB0aGUgZWZmZWN0IGluIGVmZmVjdFNldHRpbmdzIGFycmF5Ci0gICAgICAgIGZvcihpPTA7aTxwYXJhbXMtPm51bWJlckVmZmVjdHM7aSsrKSB7Ci0gICAgICAgICAgICBpZihwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0KLSAgICAgICAgICAgICAoTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSlNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nKSB7Ci0gICAgICAgICAgICAgICAgaWYoKHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lIDw9IHBhcmFtcy0+dGltZU1zICsgcGFyYW1zLT50aW1lT2Zmc2V0KSAmJgotICAgICAgICAgICAgICAgICAgICgocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0udWlTdGFydFRpbWUrCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uKSA+PSBwYXJhbXMtPnRpbWVNcyArIHBhcmFtcy0+dGltZU9mZnNldCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKGkgPCBwYXJhbXMtPm51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgIGNvbXB1dGVQcm9ncmVzc0ZvclZpZGVvRWZmZWN0KHBhcmFtcy0+dGltZU1zLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24sICZleHRQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgIGVyciA9IHByZXBhcmVGcmFtaW5nU3RydWN0dXJlKCZmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgcGFyYW1zLT5lZmZlY3RzU2V0dGluZ3MsIGksIHBhcmFtcy0+b3ZlcmxheUZyYW1lUkdCQnVmZmVyLAotICAgICAgICAgICAgICAgICAgcGFyYW1zLT5vdmVybGF5RnJhbWVZVVZCdWZmZXIpOwotCi0gICAgICAgICAgICBpZihlcnIgPT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZygKLSAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKSZmcmFtaW5nQ3R4LCBwbGFuZUluLCBwbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHguYWxwaGFCbGVuZGluZ1N0cnVjdCk7Ci0KLSAgICAgICAgICAgIGlmKGZyYW1pbmdDdHguRnJhbWluZ1l1diAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LkZyYW1pbmdZdXYpOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHguRnJhbWluZ1l1diA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0lmIHByZXBhcmVGcmFtaW5nU3RydWN0dXJlIC8gTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nCi0gICAgICAgICAgICAvLyByZXR1cm5lZCBlcnJvciwgdGhlbiByZXR1cm4gZnJvbSBmdW5jdGlvbgotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLQotICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gZmluYWxPdXRwdXRCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShmaW5hbE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsT3V0cHV0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoTlVMTCAhPSB0ZW1wT3V0cHV0QnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUodGVtcE91dHB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUaGUgb3V0IHBsYW5lIG5vdyBiZWNvbWVzIHRoZSBpbiBwbGFuZSBmb3IgYWRkaW5nIG90aGVyIGVmZmVjdHMKLSAgICAgICAgICAgIHN3YXBJbWFnZVBsYW5lcyhwbGFuZUluLCBwbGFuZU91dCwoTTRWSUZJX1VJbnQ4ICopZmluYWxPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKXRlbXBPdXRwdXRCdWZmZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYocGFyYW1zLT5jdXJyZW50VmlkZW9FZmZlY3QgJiBWSURFT19FRkZFQ1RfRkFERUZST01CTEFDSykgewotICAgICAgICAvKiBmaW5kIHRoZSBlZmZlY3QgaW4gZWZmZWN0U2V0dGluZ3MgYXJyYXkqLwotICAgICAgICBmb3IoaT0wO2k8cGFyYW1zLT5udW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgaWYocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZUZyb21CbGFjaykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGkgPCBwYXJhbXMtPm51bWJlckVmZmVjdHMpIHsKLSAgICAgICAgICAgIGNvbXB1dGVQZXJjZW50YWdlRG9uZShwYXJhbXMtPnRpbWVNcywKLSAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aVN0YXJ0VGltZSwKLSAgICAgICAgICAgICBwYXJhbXMtPmVmZmVjdHNTZXR0aW5nc1tpXS51aUR1cmF0aW9uLCAmcGVyY2VudGFnZURvbmUpOwotCi0gICAgICAgICAgICAvLyBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDI0KQotICAgICAgICAgICAgbHVtX2ZhY3RvciA9IChNNE9TQV9JbnQzMikoIHBlcmNlbnRhZ2VEb25lICogMTAyNCApOwotICAgICAgICAgICAgLy8gQXBwbHkgdGhlIGRhcmtlbmluZyBlZmZlY3QKLSAgICAgICAgICAgIGVyciA9IGFwcGx5THVtYUVmZmVjdChNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlRnJvbUJsYWNrLAotICAgICAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCBsdW1fZmFjdG9yKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBhcmFtcy0+Y3VycmVudFZpZGVvRWZmZWN0ICYgVklERU9fRUZGRUNUX0ZBREVUT0JMQUNLKSB7Ci0gICAgICAgIC8vIEZpbmQgdGhlIGVmZmVjdCBpbiBlZmZlY3RTZXR0aW5ncyBhcnJheQotICAgICAgICBmb3IoaT0wO2k8cGFyYW1zLT5udW1iZXJFZmZlY3RzO2krKykgewotICAgICAgICAgICAgaWYocGFyYW1zLT5lZmZlY3RzU2V0dGluZ3NbaV0uVmlkZW9FZmZlY3RUeXBlID09Ci0gICAgICAgICAgICAgTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRmFkZVRvQmxhY2spCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoaSA8IHBhcmFtcy0+bnVtYmVyRWZmZWN0cykgewotICAgICAgICAgICAgY29tcHV0ZVBlcmNlbnRhZ2VEb25lKHBhcmFtcy0+dGltZU1zLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpU3RhcnRUaW1lLAotICAgICAgICAgICAgIHBhcmFtcy0+ZWZmZWN0c1NldHRpbmdzW2ldLnVpRHVyYXRpb24sICZwZXJjZW50YWdlRG9uZSk7Ci0KLSAgICAgICAgICAgIC8vIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpCi0gICAgICAgICAgICBsdW1fZmFjdG9yID0gKE00T1NBX0ludDMyKSggKDEuMC1wZXJjZW50YWdlRG9uZSkgKiAxMDI0ICk7Ci0gICAgICAgICAgICAvLyBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdAotICAgICAgICAgICAgZXJyID0gYXBwbHlMdW1hRWZmZWN0KE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVUb0JsYWNrLAotICAgICAgICAgICAgICAgICAgcGxhbmVJbiwgcGxhbmVPdXQsIChNNFZJRklfVUludDggKilmaW5hbE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDggKil0ZW1wT3V0cHV0QnVmZmVyLCBsdW1fZmFjdG9yKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJkb01lZGlhUmVuZGVyaW5nIENBTEwgZ2V0QnVmZmVyKCkiKTsKLSAgICAvLyBTZXQgdGhlIG91dHB1dCBZVVY0MjAgcGxhbmUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFlWMTIgZm9ybWF0Ci0gICAgLy8gVyAmIEggZXZlbgotICAgIC8vIFlWVSBpbnN0ZWFkIG9mIFlVVgotICAgIC8vIGFsaWduIGJ1ZmZlcnMgb24gMzIgYml0cwotCi0gICAgLy8gWSBwbGFuZQotICAgIC8vaW4gWVYxMiBmb3JtYXQsIHNpemVzIG11c3QgYmUgZXZlbgotICAgIE00T1NBX1VJbnQzMiB5djEyUGxhbmVXaWR0aCA9ICgocGFyYW1zLT5vdXRWaWRlb1dpZHRoICsxKT4+MSk8PDE7Ci0gICAgTTRPU0FfVUludDMyIHl2MTJQbGFuZUhlaWdodCA9ICgocGFyYW1zLT5vdXRWaWRlb0hlaWdodCsxKT4+MSk8PDE7Ci0KLSAgICBwcmVwYXJlWVYxMkltYWdlUGxhbmUocGxhbmVPdXQsIHl2MTJQbGFuZVdpZHRoLCB5djEyUGxhbmVIZWlnaHQsCi0gICAgIChNNE9TQV9VSW50MzIpcGFyYW1zLT5vdXRCdWZmZXJTdHJpZGUsIChNNFZJRklfVUludDggKilwYXJhbXMtPnBPdXRCdWZmZXIpOwotCi0gICAgZXJyID0gYXBwbHlSZW5kZXJpbmdNb2RlKHBsYW5lSW4sIHBsYW5lT3V0LCBwYXJhbXMtPnJlbmRlcmluZ01vZGUpOwotCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBmaW5hbE91dHB1dEJ1ZmZlcikgewotICAgICAgICBmcmVlKGZpbmFsT3V0cHV0QnVmZmVyKTsKLSAgICAgICAgZmluYWxPdXRwdXRCdWZmZXI9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKE00T1NBX05VTEwgIT0gdGVtcE91dHB1dEJ1ZmZlcikgewotICAgICAgICBmcmVlKHRlbXBPdXRwdXRCdWZmZXIpOwotICAgICAgICB0ZW1wT3V0cHV0QnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1YoImRvVmlkZW9Qb3N0UHJvY2Vzc2luZzogYXBwbHlSZW5kZXJpbmdNb2RlIHJldHVybmVkIGVycj0lZCIsZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLWFuZHJvaWQ6OnN0YXR1c190IGdldFZpZGVvU2l6ZUJ5UmVzb2x1dGlvbigKLSAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSByZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwV2lkdGgsIHVpbnQzMl90ICpwSGVpZ2h0KSB7Ci0KLSAgICB1aW50MzJfdCBmcmFtZVdpZHRoLCBmcmFtZUhlaWdodDsKLQotICAgIGlmIChwV2lkdGggPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiZ2V0VmlkZW9GcmFtZVNpemVCeVJlc29sdXRpb24gaW52YWxpZCBwb2ludGVyIGZvciBwV2lkdGgiKTsKLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKHBIZWlnaHQgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiZ2V0VmlkZW9GcmFtZVNpemVCeVJlc29sdXRpb24gaW52YWxpZCBwb2ludGVyIGZvciBwSGVpZ2h0Iik7Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3dpdGNoIChyZXNvbHV0aW9uKSB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDEyODsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gOTY7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRUVZHQToKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSAxNjA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gMTc2OwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDMyMDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQ0lGOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDM1MjsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMjg4OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDY0MDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQToKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSA4MDA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa05UU0M6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gNzIwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s2NDBfMzYwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDY0MDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMzYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgIGZyYW1lV2lkdGggPSA4NTQ7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyODBfNzIwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDEyODA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwODBfNzIwOgotICAgICAgICAgICAgZnJhbWVXaWR0aCA9IDEwODA7Ci0gICAgICAgICAgICBmcmFtZUhlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gOTYwOwotICAgICAgICAgICAgZnJhbWVIZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgICAgICBmcmFtZVdpZHRoID0gMTkyMDsKLSAgICAgICAgICAgIGZyYW1lSGVpZ2h0ID0gMTA4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgdmlkZW8gcmVzb2x1dGlvbiAlZC4iLCByZXNvbHV0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgKnBXaWR0aCA9IGZyYW1lV2lkdGg7Ci0gICAgKnBIZWlnaHQgPSBmcmFtZUhlaWdodDsKLQotICAgIHJldHVybiBhbmRyb2lkOjpPSzsKLX0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGU5MExlZnRZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KSB7Ci0KLSAgICBNNFZJRklfSW50MzIgcGxhbmVfbnVtYmVyOwotICAgIE00VklGSV9VSW50MzIgaSxqLCB1X3N0cmlkZTsKLSAgICBNNFZJRklfVUludDggKnBfYnVmX3NyYywgKnBfYnVmX2Rlc3Q7Ci0KLSAgICAvKio8IExvb3Agb24gWSxVIGFuZCBWIHBsYW5lcyAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspIHsKLSAgICAgICAgLyoqPCBHZXQgYWRyZXNzZXMgb2YgZmlyc3QgdmFsaWQgcGl4ZWwgaW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgLyoqPCBBcyB3ZSBoYXZlIGEgLTkwwrAgcm90YXRpb24sIGZpcnN0IG5lZWRlZCBwaXhlbCBpcyB0aGUgdXBwZXItcmlnaHQgb25lICovCi0gICAgICAgIHBfYnVmX3NyYyA9Ci0gICAgICAgICAgICAmKHBQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKSArCi0gICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQgLSAxIDsKLSAgICAgICAgcF9idWZfZGVzdCA9Ci0gICAgICAgICAgICAmKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW3BQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICB1X3N0cmlkZSA9IHBQbGFuZUluW3BsYW5lX251bWJlcl0udV9zdHJpZGU7Ci0gICAgICAgIC8qKjwgTG9vcCBvbiBvdXRwdXQgcm93cyAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgLyoqPCBMb29wIG9uIGFsbCBvdXRwdXQgcGl4ZWxzIGluIGEgcm93ICovCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgKnBfYnVmX2Rlc3QrKz0gKnBfYnVmX3NyYzsKLSAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgKz0gdV9zdHJpZGU7ICAvKio8IEdvIHRvIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEdvIG9uIG5leHQgcm93IG9mIHRoZSBvdXRwdXQgZnJhbWUgKi8KLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0KLSAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAvKio8IEdvIHRvIG5leHQgcGl4ZWwgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSBpbnB1dCBmcmFtZSovCi0gICAgICAgICAgICBwX2J1Zl9zcmMgLT0KLSAgICAgICAgICAgICAgICBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlICogcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCArIDEgOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGU5MFJpZ2h0WVVWNDIwdG9ZVVY0MjAodm9pZCogcFVzZXJEYXRhLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkgewotCi0gICAgTTRWSUZJX0ludDMyIHBsYW5lX251bWJlcjsKLSAgICBNNFZJRklfVUludDMyIGksaiwgdV9zdHJpZGU7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotCi0gICAgLyoqPCBMb29wIG9uIFksVSBhbmQgViBwbGFuZXMgKi8KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDA7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKSB7Ci0gICAgICAgIC8qKjwgR2V0IGFkcmVzc2VzIG9mIGZpcnN0IHZhbGlkIHBpeGVsIGluIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIC8qKjwgQXMgd2UgaGF2ZSBhICs5MMKwIHJvdGF0aW9uLCBmaXJzdCBuZWVkZWQgcGl4ZWwgaXMgdGhlIGxlZnQtZG93biBvbmUgKi8KLSAgICAgICAgcF9idWZfc3JjID0KLSAgICAgICAgICAgICYocFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pICsKLSAgICAgICAgICAgICAocFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAqIChwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoIC0gMSkpOwotICAgICAgICBwX2J1Zl9kZXN0ID0KLSAgICAgICAgICAgICYocFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHVfc3RyaWRlID0gcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgLyoqPCBMb29wIG9uIG91dHB1dCByb3dzICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAvKio8IExvb3Agb24gYWxsIG91dHB1dCBwaXhlbHMgaW4gYSByb3cgKi8KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAqcF9idWZfZGVzdCsrPSAqcF9idWZfc3JjOwotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyAtPSB1X3N0cmlkZTsgIC8qKjwgR28gdG8gdGhlIHByZXZpb3VzIHJvdyAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKio8IEdvIG9uIG5leHQgcm93IG9mIHRoZSBvdXRwdXQgZnJhbWUgKi8KLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0KLSAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAvKio8IEdvIHRvIG5leHQgcGl4ZWwgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSBpbnB1dCBmcmFtZSovCi0gICAgICAgICAgICBwX2J1Zl9zcmMgKz0KLSAgICAgICAgICAgICAgICBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlICogcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCArMSA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTRWSUZJX09LOwotfQotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTE4MFlVVjQyMHRvWVVWNDIwKHZvaWQqIHBVc2VyRGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpIHsKLSAgICBNNFZJRklfSW50MzIgcGxhbmVfbnVtYmVyOwotICAgIE00VklGSV9VSW50MzIgaSxqOwotICAgIE00VklGSV9VSW50OCAqcF9idWZfc3JjLCAqcF9idWZfZGVzdCwgdGVtcF9waXgxOwotCi0gICAgLyoqPCBMb29wIG9uIFksVSBhbmQgViBwbGFuZXMgKi8KLSAgICBmb3IgKHBsYW5lX251bWJlciA9IDA7IHBsYW5lX251bWJlciA8IDM7IHBsYW5lX251bWJlcisrKSB7Ci0gICAgICAgIC8qKjwgR2V0IGFkcmVzc2VzIG9mIGZpcnN0IHZhbGlkIHBpeGVsIGluIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIHBfYnVmX3NyYyA9Ci0gICAgICAgICAgICAmKHBQbGFuZUluW3BsYW5lX251bWJlcl0ucGFjX2RhdGFbcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgcF9idWZfZGVzdCA9Ci0gICAgICAgICAgICAmKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnBhY19kYXRhW3BQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotCi0gICAgICAgIC8qKjwgSWYgcFBsYW5lSW4gPSBwUGxhbmVPdXQsIHRoZSBhbGdvcml0aG0gd2lsbCBiZSBkaWZmZXJlbnQgKi8KLSAgICAgICAgaWYgKHBfYnVmX3NyYyA9PSBwX2J1Zl9kZXN0KSB7Ci0gICAgICAgICAgICAvKio8IEdldCBBZGRyZXNzIG9mIGxhc3QgcGl4ZWwgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSBmcmFtZSAqLwotICAgICAgICAgICAgcF9idWZfZGVzdCArPQotICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlKihwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodC0xKSArCi0gICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGggLSAxOwotCi0gICAgICAgICAgICAvKio8IFdlIGxvb3AgKGhlaWdodC8yKSB0aW1lcyBvbiB0aGUgcm93cy4KLSAgICAgICAgICAgICAqIEluIGNhc2UgdV9oZWlnaHQgaXMgb2RkLCB0aGUgcm93IGF0IHRoZSBtaWRkbGUgb2YgdGhlIGZyYW1lCi0gICAgICAgICAgICAgKiBoYXMgdG8gYmUgcHJvY2Vzc2VkIGFzIG11c3QgYmUgbWlycm9yZWQgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0KT4+MSk7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcF9waXgxPSAqcF9idWZfZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgKnBfYnVmX2Rlc3QtLT0gKnBfYnVmX3NyYzsKLSAgICAgICAgICAgICAgICAgICAgKnBfYnVmX3NyYysrID0gdGVtcF9waXgxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKio8IEdvIG9uIG5leHQgcm93IGluIHRvcCBvZiBmcmFtZSAqLwotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyArPQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgLyoqPCBHbyB0byB0aGUgbGFzdCBwaXhlbCBpbiBwcmV2aW91cyByb3cgaW4gYm90dG9tIG9mIGZyYW1lKi8KLSAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0IC09Ci0gICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlIC0gcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqPCBNaXJyb3IgbWlkZGxlIHJvdyBpbiBjYXNlIGhlaWdodCBpcyBvZGQgKi8KLSAgICAgICAgICAgIGlmICgocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQlMikhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcF9idWZfc3JjID0KLSAgICAgICAgICAgICAgICAgICAgJihwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfdG9wbGVmdF0pOwotICAgICAgICAgICAgICAgIHBfYnVmX3NyYyArPQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZSoocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ+PjEpOwotICAgICAgICAgICAgICAgIHBfYnVmX2Rlc3QgPQotICAgICAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgKyBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgLyoqPCBXZSBsb29wIHVfd2lkdGgvMiB0aW1lcyBvbiB0aGlzIHJvdy4KLSAgICAgICAgICAgICAgICAgKiAgSW4gY2FzZSB1X3dpZHRoIGlzIG9kZCwgdGhlIHBpeGVsIGF0IHRoZSBtaWRkbGUgb2YgdGhpcyByb3cKLSAgICAgICAgICAgICAgICAgKiByZW1haW5zIHVuY2hhbmdlZCAqLwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAocFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aD4+MSk7IGorKykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wX3BpeDE9ICpwX2J1Zl9kZXN0OwotICAgICAgICAgICAgICAgICAgICAqcF9idWZfZGVzdC0tPSAqcF9idWZfc3JjOwotICAgICAgICAgICAgICAgICAgICAqcF9idWZfc3JjKysgPSB0ZW1wX3BpeDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoqPCBHZXQgQWRkcmVzcyBvZiBsYXN0IHBpeGVsIGluIHRoZSBsYXN0IHJvdyBvZiB0aGUgb3V0cHV0IGZyYW1lICovCi0gICAgICAgICAgICBwX2J1Zl9kZXN0ICs9Ci0gICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGUqKHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfaGVpZ2h0LTEpICsKLSAgICAgICAgICAgICAgICAgcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoIC0gMTsKLQotICAgICAgICAgICAgLyoqPCBMb29wIG9uIHJvd3MgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAqcF9idWZfZGVzdC0tPSAqcF9idWZfc3JjKys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqPCBHbyBvbiBuZXh0IHJvdyBpbiB0b3Agb2YgaW5wdXQgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBwX2J1Zl9zcmMgKz0KLSAgICAgICAgICAgICAgICAgICAgcFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZSAtIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgLyoqPCBHbyB0byBsYXN0IHBpeGVsIG9mIHByZXZpb3VzIHJvdyBpbiBib3R0b20gb2YgaW5wdXQgZnJhbWUqLwotICAgICAgICAgICAgICAgIHBfYnVmX2Rlc3QgLT0KLSAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9zdHJpZGUgLSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotTTRPU0FfRVJSIGFwcGx5VmlkZW9Sb3RhdGlvbihNNE9TQV9Wb2lkKiBwQnVmZmVyLCBNNE9TQV9VSW50MzIgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQsIE00T1NBX1VJbnQzMiByb3RhdGlvbikgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcGxhbmVJblszXSwgcGxhbmVPdXRbM107Ci0KLSAgICBpZiAocEJ1ZmZlciA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJhcHBseVZpZGVvUm90YXRpb246IE5VTEwgaW5wdXQgZnJhbWUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgTTRPU0FfVUludDgqIG91dFB0ciA9IChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgKHdpZHRoKmhlaWdodCoxLjUpLCBNNFZTLCAoTTRPU0FfQ2hhciopKCJyb3RhdGlvbiBvdXQgcHRyIikpOwotICAgIGlmIChvdXRQdHIgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLy8gSW4gcGxhbmUKLSAgICBwcmVwYXJlWVVWNDIwSW1hZ2VQbGFuZShwbGFuZUluLCB3aWR0aCwKLSAgICAgICAgaGVpZ2h0LCAoTTRWSUZJX1VJbnQ4ICopcEJ1ZmZlciwgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICAvLyBPdXQgcGxhbmUKLSAgICBpZiAocm90YXRpb24gIT0gMTgwKSB7Ci0gICAgICAgIHByZXBhcmVZVVY0MjBJbWFnZVBsYW5lKHBsYW5lT3V0LCBoZWlnaHQsCi0gICAgICAgICAgICB3aWR0aCwgb3V0UHRyLCBoZWlnaHQsIHdpZHRoKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2gocm90YXRpb24pIHsKLSAgICAgICAgY2FzZSA5MDoKLSAgICAgICAgICAgIE00VklGSV9Sb3RhdGU5MFJpZ2h0WVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcGxhbmVJbiwgcGxhbmVPdXQpOwotICAgICAgICAgICAgbWVtY3B5KHBCdWZmZXIsICh2b2lkICopb3V0UHRyLCAod2lkdGgqaGVpZ2h0KjEuNSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxODA6Ci0gICAgICAgICAgICAvLyBJbiBwbGFuZSByb3RhdGlvbiwgc28gcGxhbmVPdXQgPSBwbGFuZUluCi0gICAgICAgICAgICBNNFZJRklfUm90YXRlMTgwWVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcGxhbmVJbiwgcGxhbmVJbik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI3MDoKLSAgICAgICAgICAgIE00VklGSV9Sb3RhdGU5MExlZnRZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCBwbGFuZUluLCBwbGFuZU91dCk7Ci0gICAgICAgICAgICBtZW1jcHkocEJ1ZmZlciwgKHZvaWQgKilvdXRQdHIsICh3aWR0aCpoZWlnaHQqMS41KSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImludmFsaWQgcm90YXRpb24gcGFyYW0gJWQiLCAoaW50KXJvdGF0aW9uKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGZyZWUoKHZvaWQgKilvdXRQdHIpOwotICAgIHJldHVybiBlcnI7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvbHZwcC9WaWRlb0VkaXRvclRvb2xzLmggYi9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWI0NjRkYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9sdnBwL1ZpZGVvRWRpdG9yVG9vbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1ZFX1RPT0xTX0gKLSNkZWZpbmUgQU5EUk9JRF9WRV9UT09MU19ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICJNNFZJRklfQ2xpcC5oIgotI2luY2x1ZGUgIk00VkZMX3RyYW5zaXRpb24uaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTR4VlNTX0FQSS5oIgotI2luY2x1ZGUgIk00eFZTU19JbnRlcm5hbC5oIgotI2luY2x1ZGUgIk00QUlSX0FQSS5oIgotI2luY2x1ZGUgIlByZXZpZXdSZW5kZXJlci5oIgotCi0jZGVmaW5lIE1FRElBX1JFTkRFUklOR19JTlZBTElEIDI1NQotI2RlZmluZSBUUkFOU1BBUkVOVF9DT0xPUiAweDdFMAotI2RlZmluZSBMVU1fRkFDVE9SX01BWCAxMAotZW51bSB7Ci0gICAgVklERU9fRUZGRUNUX05PTkUgICAgICAgICAgICAgICA9IDAsCi0gICAgVklERU9fRUZGRUNUX0JMQUNLQU5EV0hJVEUgICAgICA9IDEsCi0gICAgVklERU9fRUZGRUNUX1BJTksgICAgICAgICAgICAgICA9IDIsCi0gICAgVklERU9fRUZGRUNUX0dSRUVOICAgICAgICAgICAgICA9IDQsCi0gICAgVklERU9fRUZGRUNUX1NFUElBICAgICAgICAgICAgICA9IDgsCi0gICAgVklERU9fRUZGRUNUX05FR0FUSVZFICAgICAgICAgICA9IDE2LAotICAgIFZJREVPX0VGRkVDVF9GUkFNSU5HICAgICAgICAgICAgPSAzMiwKLSAgICBWSURFT19FRkZFQ1RfRklGVElFUyAgICAgICAgICAgID0gNjQsCi0gICAgVklERU9fRUZGRUNUX0NPTE9SX1JHQjE2ICAgICAgICA9IDEyOCwKLSAgICBWSURFT19FRkZFQ1RfR1JBRElFTlQgICAgICAgICAgID0gMjU2LAotICAgIFZJREVPX0VGRkVDVF9GQURFRlJPTUJMQUNLICAgICAgPSA1MTIsCi0gICAgVklERU9fRUZGRUNUX0ZBREVUT0JMQUNLICAgICAgICA9IDIwNDgsCi19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRWSUZJX1VJbnQ4ICp2aWRCdWZmZXI7Ci0gICAgTTRPU0FfVUludDMyIHZpZGVvV2lkdGg7Ci0gICAgTTRPU0FfVUludDMyIHZpZGVvSGVpZ2h0OwotICAgIE00T1NBX1VJbnQzMiB0aW1lTXM7Ci0gICAgTTRPU0FfVUludDMyIHRpbWVPZmZzZXQ7IC8vaGFzIHRoZSBkdXJhdGlvbiBvZiBjbGlwcyBwbGF5ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhlIGZsYWcgc2hhbGwgYmUgdXNlZCBmb3IgRnJhbWluZy4KLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIGVmZmVjdHNTZXR0aW5nczsKLSAgICBNNE9TQV9VSW50MzIgbnVtYmVyRWZmZWN0czsKLSAgICBNNE9TQV9VSW50MzIgb3V0VmlkZW9XaWR0aDsKLSAgICBNNE9TQV9VSW50MzIgb3V0VmlkZW9IZWlnaHQ7Ci0gICAgTTRPU0FfVUludDMyIGN1cnJlbnRWaWRlb0VmZmVjdDsKLSAgICBNNE9TQV9Cb29sIGlzRmlmdGllc0VmZmVjdFN0YXJ0ZWQ7Ci0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nIHJlbmRlcmluZ01vZGU7Ci0gICAgdWludDhfdCAqcE91dEJ1ZmZlcjsKLSAgICBzaXplX3Qgb3V0QnVmZmVyU3RyaWRlOwotICAgIE00VklGSV9VSW50OCogIG92ZXJsYXlGcmFtZVJHQkJ1ZmZlcjsKLSAgICBNNFZJRklfVUludDgqICBvdmVybGF5RnJhbWVZVVZCdWZmZXI7Ci19IHZlUG9zdFByb2Nlc3NQYXJhbXM7Ci0KLU00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFyVG9ZVVY0MjBTZW1pcGxhbmFyKHZvaWQgKnVzZXJfZGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApOwotTTRWSUZJX1VJbnQ4IE00VklGSV9TZW1pcGxhbmFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0ICk7Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCxNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLCBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKTsKLQotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApOwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKCBNNE9TQV9Wb2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCApOwotCi11bnNpZ25lZCBjaGFyIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX2luLCBNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfb3V0LCB1bnNpZ25lZCBsb25nIGx1bV9mYWN0b3IsIHZvaWQgKnVzZXJfZGF0YSk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpOwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV94VlNTX1JHQjU2NXRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCODg4dG9ZVVYoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIGZyYW1pbmdDdHgpOwotTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZU91dFszXSk7Ci0KLS8qKyBIYW5kbGUgdGhlIGltYWdlIGZpbGVzIGhlcmUgKi8KLU00T1NBX0VSUiBMdkdldEltYWdlVGh1bWJOYWlsKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBNNE9TQV9VSW50MzIgaGVpZ2h0LCBNNE9TQV9VSW50MzIgd2lkdGgsIE00T1NBX1ZvaWQgKipwQnVmZmVyKTsKLS8qLSBIYW5kbGUgdGhlIGltYWdlIGZpbGVzIGhlcmUgKi8KLQotTTRPU0FfRVJSIGFwcGx5UmVuZGVyaW5nTW9kZShNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQsIE00eFZTU19NZWRpYVJlbmRlcmluZyBtZWRpYVJlbmRlcmluZyk7Ci0KLQotTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1lVVjQyMCh2b2lkICp1c2VyX2RhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW5bM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCApOwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLU00T1NBX1ZvaWQgcHJlcGFyZVlVVjQyMEltYWdlUGxhbmUoTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lLAotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRWSUZJX1VJbnQ4ICpidWZmZXIsCi0gICAgTTRPU0FfVUludDMyIHJlcG9ydGVkV2lkdGgsIE00T1NBX1VJbnQzMiByZXBvcnRlZEhlaWdodCk7Ci0KLU00T1NBX1ZvaWQgcHJlcGFyZVlWMTJJbWFnZVBsYW5lKE00VklGSV9JbWFnZVBsYW5lICpwbGFuZSwKLSAgICBNNE9TQV9VSW50MzIgd2lkdGgsIE00T1NBX1VJbnQzMiBoZWlnaHQsIE00T1NBX1VJbnQzMiBzdHJpZGUsIE00VklGSV9VSW50OCAqYnVmZmVyKTsKLQotTTRPU0FfVm9pZCBzd2FwSW1hZ2VQbGFuZXMoCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMik7Ci0KLU00T1NBX1ZvaWQgY29tcHV0ZVBlcmNlbnRhZ2VEb25lKAotICAgICBNNE9TQV9VSW50MzIgY3RzTXMsIE00T1NBX1VJbnQzMiBlZmZlY3RTdGFydFRpbWVNcywKLSAgICAgTTRPU0FfVUludDMyIGVmZmVjdER1cmF0aW9uLCBNNE9TQV9Eb3VibGUgKnBlcmNlbnRhZ2VEb25lKTsKLQotTTRPU0FfVm9pZCBjb21wdXRlUHJvZ3Jlc3NGb3JWaWRlb0VmZmVjdCgKLSAgICAgTTRPU0FfVUludDMyIGN0c01zLCBNNE9TQV9VSW50MzIgZWZmZWN0U3RhcnRUaW1lTXMsCi0gICAgIE00T1NBX1VJbnQzMiBlZmZlY3REdXJhdGlvbiwgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MqIGV4dFByb2dyZXNzKTsKLQotTTRPU0FfRVJSIHByZXBhcmVGcmFtaW5nU3RydWN0dXJlKAotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogZWZmZWN0c1NldHRpbmdzLCBNNE9TQV9VSW50MzIgaW5kZXgsCi0gICAgTTRWSUZJX1VJbnQ4KiBvdmVybGF5UkdCLCBNNFZJRklfVUludDgqIG92ZXJsYXlZVVYpOwotCi1NNE9TQV9FUlIgYXBwbHlDb2xvckVmZmVjdChNNHhWU1NfVmlkZW9FZmZlY3RUeXBlIGNvbG9yRWZmZWN0LAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcGxhbmVPdXQsCi0gICAgTTRWSUZJX1VJbnQ4ICpidWZmZXIxLCBNNFZJRklfVUludDggKmJ1ZmZlcjIsIE00T1NBX1VJbnQxNiByZ2JDb2xvckRhdGEpOwotCi1NNE9TQV9FUlIgYXBwbHlMdW1hRWZmZWN0KE00VlNTM0dQUF9WaWRlb0VmZmVjdFR5cGUgdmlkZW9FZmZlY3QsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwbGFuZU91dCwKLSAgICBNNFZJRklfVUludDggKmJ1ZmZlcjEsIE00VklGSV9VSW50OCAqYnVmZmVyMiwgTTRPU0FfSW50MzIgbHVtX2ZhY3Rvcik7Ci0KLU00T1NBX0VSUiBhcHBseUVmZmVjdHNBbmRSZW5kZXJpbmdNb2RlKHZlUG9zdFByb2Nlc3NQYXJhbXMgKnBhcmFtcywKLSAgICBNNE9TQV9VSW50MzIgcmVwb3J0ZWRXaWR0aCwgTTRPU0FfVUludDMyIHJlcG9ydGVkSGVpZ2h0KTsKLQotYW5kcm9pZDo6c3RhdHVzX3QgZ2V0VmlkZW9TaXplQnlSZXNvbHV0aW9uKE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIHJlc29sdXRpb24sCi0gICAgdWludDMyX3QgKnBXaWR0aCwgdWludDMyX3QgKnBIZWlnaHQpOwotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwTGVmdFlVVjQyMHRvWVVWNDIwKHZvaWQqIHBVc2VyRGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi1NNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwUmlnaHRZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGUxODBZVVY0MjB0b1lVVjQyMCh2b2lkKiBwVXNlckRhdGEsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotTTRPU0FfRVJSIGFwcGx5VmlkZW9Sb3RhdGlvbihNNE9TQV9Wb2lkKiBwQnVmZmVyLAotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgTTRPU0FfVUludDMyIGhlaWdodCwgTTRPU0FfVUludDMyIHJvdGF0aW9uKTsKLSNlbmRpZiAvLyBBTkRST0lEX1ZFX1RPT0xTX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL29zYWwvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjM3Mzc2ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVk9TQV9GaWxlUmVhZGVyX29wdGltLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfb3B0aW0uaAotICogQGJyaWVmICAgICAgICBGaWxlIHJlYWRlciBmb3IgU3ltYmlhbgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCB0eXBlcyB0byByZWFkIGEgZmlsZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVSRUFERVJfT1BUSU1fSAotI2RlZmluZSBNNE9TQV9GSUxFUkVBREVSX09QVElNX0gKLQotI2RlZmluZSBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLQotLyoqLwotI2lmbmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICB0eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICAgICAgTTRPU0FfVm9pZCogICAgICAgICgqcEZjdFB0cl9PcGVuKSggTTRPU0FfVm9pZCogZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOwotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gKCpwRmN0UHRyX1JlYWQpKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vICk7Ci0gICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAoKnBGY3RQdHJfU2VlaykoIE00T1NBX1ZvaWQqIGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOwotICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24gKCpwRmN0UHRyX1RlbGwpKCBNNE9TQV9Wb2lkKiBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2KiBlcnJubyApOwotICAgICAgICBNNE9TQV9JbnQzMiAgICAgICAgKCpwRmN0UHRyX0Nsb3NlKSggTTRPU0FfVm9pZCogZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYqIGVycm5vICk7Ci0gICAgICAgIE00T1NBX1ZvaWQgICAgICAgICAoKnBGY3RQdHJfQWNjZXNzVHlwZSkoIE00T1NBX1VJbnQzMiBGaWxlTW9kZUFjY2Vzc19JbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogRmlsZU1vZGVBY2Nlc3NfT3V0ICk7Ci0KLSAgICB9IE00T1NBX0ZpbGVTeXN0ZW1fRmN0UHRyOwotI2VuZGlmCi0vKiovCi0KLQotLyogUmVhZGVyIEFQSSA6IGJ1ZmZlcml6ZWQgZnVuY3Rpb25zICovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbSggTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpOwotI2Vsc2UKLSAgICBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltKCBNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIGZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBmaWxlTW9kZUFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0ciAqRlMpOwotI2VuZGlmCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZERhdGFfb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogc2l6ZSApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2Vla19vcHRpbSggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbiApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCApOwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uX29wdGltKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gKm9wdGlvblZhbHVlICk7Ci1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb25fb3B0aW0oIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSApOwotCi0jZW5kaWYgLyogTTRPU0FfRklMRVJFQURFUl9PUFRJTV9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9MVl9NYWNyb3MuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWX01hY3Jvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiOGQ3ZTg1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL0xWX01hY3Jvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgICAgICAgTFZfTWFjcm9zLmgKLSogQHBhciAgICAgICAgTlhQIFNvZnR3YXJlCi0qIEBicmllZiAgICBNYWNyb3MgZGVmaW5pdGlvbiBmb3IgU21hcnRwaG9uZSB0ZWFtCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIExWX01BQ1JPU19ICi0jZGVmaW5lIExWX01BQ1JPU19ICi0KLS8qLS0tLS0tLS0tLS0tKi8KLS8qICAgIElOQ0xVREVTICAqLwotLyotLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ0hFQ0tfUFRSKGZjdCwgcCwgZXJyLCBlcnJWYWx1ZSkKLSogQG5vdGUgICAgVGhpcyBtYWNybyBjaGVja3MgdGhlIHZhbHVlIHAuIElmIGl0IGlzIE5VTEwsIGl0IHNldHMgdGhlIHZhcmlhYmxlIGVycgotKiAgICAgICAgICAgdG8gZXJyVmFsdWUgYW5kIGp1bXBzIHRvIHRoZSBsYWJlbCA8ZmN0Pl9jbGVhblVwLiBBIHRyYWNlIGlzIGRpc3BsYXllZAotKiAgICAgICAgICAgc2lnbmFsbGluZyB0aGUgZXJyb3IsIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgbGluZSBudW1iZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENIRUNLX1BUUihmY3QsIHAsIGVyciwgZXJyVmFsdWUpIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgPT0gKHApKSBcCi0gICAgeyBcCi0gICAgICAgIChlcnIpID0gKGVyclZhbHVlKSA7IFwKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoKE00T1NBX0NoYXIqKSIiICNmY3QgIihMJWQpOiAiICNwICIgaXMgTlVMTCwgcmV0dXJuaW5nICIgI2VyclZhbHVlICIiLF9fTElORV9fKSA7IFwKLSAgICAgICAgZ290byBmY3QjI19jbGVhblVwOyBcCi0gICAgfSBcCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ0hFQ0tfRVJSKGZjdCwgZXJyKQotKiBAbm90ZSAgICBUaGlzIG1hY3JvIGNoZWNrcyB0aGUgdmFsdWUgZXJyLiBJZiBpdCBpcyBub3QgTlVMTCwgYSB0cmFjZSBpcyBkaXNwbGF5ZWQKLSogICAgICAgICAgIHNpZ25hbGxpbmcgdGhlIGVycm9yLCB0aGUgZnVuY3Rpb24gbmFtZSBhbmQgdGhlIGxpbmUgbnVtYmVyLiBUaGUgbWFjcm8KLSogICAgICAgICAgIGp1bXBzIHRvIHRoZSBsYWJlbCA8ZmN0Pl9jbGVhblVwLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBDSEVDS19FUlIoZmN0LCBlcnIpIFwKLXsgXAotICAgIGlmKE00Tk9fRVJST1IgIT0gKGVycikpIFwKLSAgICB7IFwKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoKE00T1NBX0NoYXIqKSIhISEgIiAjZmN0ICIoTCVkKTogRVJST1IgMHglLjh4IHJldHVybmVkIixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXyxlcnIpIDsgXAotICAgICAgICBnb3RvIGZjdCMjX2NsZWFuVXA7IFwKLSAgICB9IFwKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIENIRUNLX0VSUihmY3QsIGVycikKLSogQG5vdGUgICAgVGhpcyBtYWNybyBjb21wYXJlcyBhIGN1cnJlbnQgc3RhdGUgd2l0aCBhIHN0YXRlIHZhbHVlLiBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsCi0qICAgICAgICAgICBlcnIgaXMgc2V0IHRvIE00RVJSX1NUQVRFLgotKiAgICAgICAgICAgQSB0cmFjZSBpcyBkaXNwbGF5ZWQgc2lnbmFsbGluZyB0aGUgZXJyb3IsIHRoZSBmdW5jdGlvbiBuYW1lIGFuZCB0aGUgbGluZSBudW1iZXIuCi0qICAgICAgICAgICBUaGUgbWFjcm8ganVtcHMgdG8gdGhlIGxhYmVsIDxmY3Q+X2NsZWFuVXAuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lICAgIENIRUNLX1NUQVRFKGZjdCwgc3RhdGVWYWx1ZSwgc3RhdGUpIFwKLXsgXAotICAgIGlmKChzdGF0ZVZhbHVlKSAhPSAoc3RhdGUpKSBcCi0gICAgeyBcCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKCIiICNmY3QgIiBjYWxsZWQgaW4gYmFkIHN0YXRlICVkIiwgc3RhdGUpIDsgXAotICAgICAgICAoZXJyKSA9IE00RVJSX1NUQVRFIDsgXAotICAgICAgICBnb3RvIGZjdCMjX2NsZWFuVXA7IFwKLSAgICB9IFwKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBTQUZFX0ZSRUUocCkKLSogQG5vdGUgICAgVGhpcyBtYWNybyBjaGVja3MgdGhlIHZhbHVlIG9mIHAgaXMgbm90IE5VTEwuIElmIGl0IGlzIE5VTEwsIGl0IGRvZXMKLSogICAgICAgICAgIG5vdGhpbmcuIEVsc2UsIHAgaXMgZGUgYWxsb2NhdGVkIGFuZCBzZXQgdG8gTlVMTC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU0FGRV9GUkVFKHApIFwKLXsgXAotICAgIGlmKE00T1NBX05VTEwgIT0gKHApKSBcCi0gICAgeyBcCi0gICAgICAgIGZyZWUoKHApKSA7IFwKLSAgICAgICAgKHApID0gTTRPU0FfTlVMTCA7IFwKLSAgICB9IFwKLX0KLQotCi0KLSNlbmRpZiAvKi0tLSAgTFZfTUFDUk9TX0ggLS0tKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2hhclN0YXIuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0NoYXJTdGFyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA2MzE2ZjAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2hhclN0YXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0NoYXJTdGFyLmgKLSAqIEBpbmdyb3VwCi0gKiBAYnJpZWYgICAgICAgIGV4dGVybmFsIEFQSSBvZiB0aGUgQ2hhciBTdGFyIHNldCBvZiBmdW5jdGlvbnMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0NIQVJTVEFSX0gKLSNkZWZpbmUgTTRPU0FfQ0hBUlNUQVJfSAotCi0vKiBnZW5lcmFsIE9TQUwgdHlwZXMgYW5kIHByb3RvdHlwZXMgaW5jbHVzaW9uICAgICAgICAgICAgICAgICAgICAgICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0KLS8qIHR5cGVzIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgZW51bQotewotICAgTTRPU0Ffa2NockRlYyAgPSAweDAxLAotICAgTTRPU0Ffa2NockhleGEgPSAweDAyLAotICAgTTRPU0Ffa2Nock9jdCAgPSAweDAzCi19IE00T1NBX2Nock51bUJhc2U7Ci0KLS8qIGVycm9yIGFuZCB3YXJuaW5nIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRFUlJfQ0hSX1NUUl9PVkVSRkxPVyBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMSkKLSNkZWZpbmUgTTRFUlJfQ0hSX0NPTlZfRkFJTEVEICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMikKLSNkZWZpbmUgTTRXQVJfQ0hSX05PVF9GT1VORCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMSkKLSNkZWZpbmUgTTRXQVJfQ0hSX05VTV9SQU5HRSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMikKLSNkZWZpbmUgTTRXQVJfQ0hSX05FR0FUSVZFICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DSEFSU1RBUiwweDAwMDAwMykKLQotLyogcHJvdG90eXBlcyBvZiB0aGUgQ2hhciBTdGFyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJOQ29weSAgICAgICAgICAoTTRPU0FfQ2hhciAgICpzdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqc3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZW4yQ29weSk7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NockFyZUlkZW50aWNhbCAgIChNNE9TQV9DaGFyICAgKnN0ckluMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpzdHJJbjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgICpyZXN1bHQpOwotTTRPU0FMX0NIQVJTVEFSX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9jaHJHZXRVSW50MzIgICAgICAoTTRPU0FfQ2hhciAgICpzdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICp2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqKnN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKTsKLU00T1NBTF9DSEFSU1RBUl9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfY2hyR2V0VUludDE2ICAgICAgKE00T1NBX0NoYXIgICAqc3RySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiAqdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICAgKipzdHJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX2Nock51bUJhc2UgYmFzZSk7Ci1NNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2NoclNQcmludGYgICAgICAgICAoTTRPU0FfQ2hhciAgKnN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHN0ck91dE1heExlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciAgICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DbG9jay5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTJlYTY5Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9DbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfQ2xvY2suaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIGNsb2NrIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9DTE9DS19ICi0jZGVmaW5lIE00T1NBX0NMT0NLX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9UaW1lLmgiCi0KLQotI2RlZmluZSBNNFdBUl9USU1FU0NBTEVfVE9PX0JJRyAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNE9TQV9DTE9DSywweDAwMDAwMSkgLyoqPCBUaW1lIHByZWNpc2lvbiB0b28gaGlnaCBmb3IgdGhlIHN5c3RlbSovCi0jZGVmaW5lIE00RVJSX0NMT0NLX0JBRF9SRUZfWUVBUiAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00T1NBX0NMT0NLLDB4MDAwMDAxKSAvKio8IElucHV0IHllYXIgb2YgcmVmZXJlbmNlIGlzIG5laXRoZXIgMTkwMCwgbm9yIDE5NzAgbm9yIDIwMDAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi1NNE9TQUxfQ0xPQ0tfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2Nsb2NrR2V0VGltZShNNE9TQV9UaW1lKiBwVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0aW1lc2NhbGUpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLypNNE9TQV9DTE9DS19IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfQ29yZUlELmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9Db3JlSUQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTE3MjgwMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9Db3JlSUQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE9TQV9Db3JlSUQuaAotICogQGJyaWVmICBkZWZpbmVzIHRoZSB1bmlxdWVzIGNvbXBvbmVudCBpZGVudGlmaWVycyB1c2VkIGZvciBtZW1vcnkgbWFuYWdlbWVudAotICogICAgICAgICBhbmQgb3B0aW9uSUQgbWVjaGFuaXNtCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNE9TQV9DT1JFSURfSF9fCi0jZGVmaW5lIF9fTTRPU0FfQ09SRUlEX0hfXwotCi0vKiBDb3JlSWQgYXJlIGRlZmluZWQgb24gMTQgYml0cyAqLwotLyogd2Ugc3RhcnQgZnJvbSAweDAxMDAsIGxvd2VyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIG9zYWwgY29yZSBjb21wb25lbnRzICovCi0KLS8qIHJlYWRlciBzaGVsbHMqLwotI2RlZmluZSBNNFJFQURFUl9DT01NT04gICAgIDB4MDEwMAotI2RlZmluZSBNNFJFQURFUl9BVkkgICAgICAgIDB4MDEwMQotI2RlZmluZSBNNFJFQURFUl9BTVIgICAgICAgIDB4MDEwMgotI2RlZmluZSBNNFJFQURFUl8zR1AgICAgICAgIDB4MDEwMwotI2RlZmluZSBNNFJFQURFUl9ORVQgICAgICAgIDB4MDEwNAotI2RlZmluZSBNNFJFQURFUl8zR1BfSFRUUCAgIDB4MDEwNQotI2RlZmluZSBNNFJFQURFUl9NUDMgICAgICAgIDB4MDEwNgotI2RlZmluZSBNNFJFQURFUl9XQVYgICAgICAgIDB4MDEwNwotI2RlZmluZSBNNFJFQURFUl9NSURJICAgICAgIDB4MDEwOAotI2RlZmluZSBNNFJFQURFUl9BU0YgICAgICAgIDB4MDEwOQotI2RlZmluZSBNNFJFQURFUl9SRUFMICAgICAgICAweDAxMEEKLSNkZWZpbmUgTTRSRUFERVJfQUFDICAgICAgICAweDAxMEIKLSNkZWZpbmUgTTRSRUFERVJfRkxFWCAgICAgICAgMHgwMTBDCi0jZGVmaW5lIE00UkVBREVSX0JCQSAgICAgICAgMHgwMTBECi0jZGVmaW5lIE00UkVBREVSX1NZTlRIRVNJU19BVURJTyAgICAweDAxMEUKLSNkZWZpbmUgTTRSRUFERVJfSlBFRyAgICAgICAgMHgwMTBGCi0KLQotLyogd3JpdGVyIHNoZWxscyovCi0jZGVmaW5lIE00V1JJVEVSX0NPTU1PTiAgICAgMHgwMTEwCi0jZGVmaW5lIE00V1JJVEVSX0FWSSAgICAgICAgMHgwMTExCi0jZGVmaW5lIE00V1JJVEVSX0FNUiAgICAgICAgMHgwMTEyCi0jZGVmaW5lIE00V1JJVEVSXzNHUCAgICAgICAgMHgwMTEzCi0jZGVmaW5lIE00V1JJVEVSX0pQRUcgICAgICAgIDB4MDExNgotI2RlZmluZSBNNFdSSVRFUl9NUDMgICAgICAgIDB4MDExNwotCi0vKiBkZWNvZGVyIHNoZWxscyAqLwotI2RlZmluZSBNNERFQ09ERVJfQ09NTU9OICAgIDB4MDEyMAotI2RlZmluZSBNNERFQ09ERVJfSlBFRyAgICAgIDB4MDEyMQotI2RlZmluZSBNNERFQ09ERVJfTVBFRzQgICAgIDB4MDEyMgotI2RlZmluZSBNNERFQ09ERVJfQVVESU8gICAgIDB4MDEyMwotI2RlZmluZSBNNERFQ09ERVJfQVZDICAgICAgIDB4MDEyNAotI2RlZmluZSBNNERFQ09ERVJfTUlESSAgICAgIDB4MDEyNQotI2RlZmluZSBNNERFQ09ERVJfV01BICAgICAgICAweDAxMjYKLSNkZWZpbmUgTTRERUNPREVSX1dNViAgICAgICAgMHgwMTI3Ci0jZGVmaW5lIE00REVDT0RFUl9STVYgICAgICAgIDB4MDEyOAotI2RlZmluZSBNNERFQ09ERVJfUk1BICAgICAgICAweDAxMjkKLSNkZWZpbmUgTTRERUNPREVSX0FBQyAgICAgICAweDAxMkEKLSNkZWZpbmUgTTRERUNPREVSX0JFQVRCUkVXICAweDAxMkIKLSNkZWZpbmUgTTRERUNPREVSX0VYVEVSTkFMICAweDAxMkMKLQotLyogZW5jb2RlciBzaGVsbHMgKi8KLSNkZWZpbmUgTTRFTkNPREVSX0NPTU1PTiAgICAweDAxMzAKLSNkZWZpbmUgTTRFTkNPREVSX0pQRUcgICAgICAweDAxMzEKLSNkZWZpbmUgTTRFTkNPREVSX01QRUc0ICAgICAweDAxMzIKLSNkZWZpbmUgTTRFTkNPREVSX0FVRElPICAgICAweDAxMzMKLSNkZWZpbmUgTTRFTkNPREVSX1ZJRF9OVUxMICAweDAxMzQKLSNkZWZpbmUgTTRFTkNPREVSX01KUEVHICAgICAgICAweDAxMzUKLSNkZWZpbmUgTTRFTkNPREVSX01QMyAgICAgICAgMHgwMTM2Ci0jZGVmaW5lIE00RU5DT0RFUl9IMjY0ICAgICAgICAweDAxMzcKLSNkZWZpbmUgTTRFTkNPREVSX0FBQyAgICAgICAgMHgwMTM4Ci0jZGVmaW5lIE00RU5DT0RFUl9BTVJOQiAgICAgICAgMHgwMTM5Ci0jZGVmaW5lIE00RU5DT0RFUl9BVURfTlVMTCAgMHgwMTNBCi0jZGVmaW5lIE00RU5DT0RFUl9FWFRFUk5BTCAgMHgwMTNCCi0KLS8qIGNvcmVzICovCi0jZGVmaW5lIE00SlBHX0RFQ09ERVIgICAgICAgMHgwMTQwCi0jZGVmaW5lIE00SlBHX0VOQ09ERVIgICAgICAgMHgwMTQxCi0KLSNkZWZpbmUgTTRNUDRfREVDT0RFUiAgICAgICAweDAxNDIKLSNkZWZpbmUgTTRNUDRfRU5DT0RFUiAgICAgICAweDAxNDMKLQotI2RlZmluZSBNNEFWSV9DT01NT04gICAgICAgIDB4MDE0NAotI2RlZmluZSBNNEFWSV9SRUFERVIgICAgICAgIDB4MDE0NQotI2RlZmluZSBNNEFWSV9XUklURVIgICAgICAgIDB4MDE0NgotCi0jZGVmaW5lIE00SFRUUF9FTkdJTkUgICAgICAgMHgwMTQ3Ci0KLSNkZWZpbmUgTTRPU0FfVE1QRklMRSAgICAgICAweDAxNDgKLSNkZWZpbmUgTTRUT09MX1RJTUVSICAgICAgICAweDAxNDkKLQotI2RlZmluZSBNNEFNUl9SRUFERVIgICAgICAgIDB4MDE0QQotCi0jZGVmaW5lIE00TVAzX1JFQURFUiAgICAgICAgMHgwMTRCCi0KLSNkZWZpbmUgTTRXQVZfUkVBREVSICAgICAgICAweDAxNEMKLSNkZWZpbmUgTTRXQVZfV1JJVEVSICAgICAgICAweDAxNEQKLSNkZWZpbmUgTTRXQVZfQ09NTU9OICAgICAgICAweDAxNEUKLQotI2RlZmluZSBNNEFEVFNfUkVBREVSICAgICAgICAweDAxNEYKLSNkZWZpbmUgTTRBRElGX1JFQURFUiAgICAgICAgMHgwMTZBCi0KLSNkZWZpbmUgTTRTUFMgICAgICAgICAgICAgICAweDAxNTAKLSNkZWZpbmUgTTRFWElGX0RFQ09ERVIgICAgICAweDAxNTEKLSNkZWZpbmUgTTRFWElGX0VOQ09ERVIgICAgICAweDAxNTIKLSNkZWZpbmUgTTRHSUZfREVDT0RFUiAgICAgICAweDAxNTMKLSNkZWZpbmUgTTRHSUZfRU5DT0RFUiAgICAgICAweDAxNTQKLSNkZWZpbmUgTTRQTkdfREVDT0RFUiAgICAgICAweDAxNTUKLSNkZWZpbmUgTTRQTkdfRU5DT0RFUiAgICAgICAweDAxNTYKLSNkZWZpbmUgTTRXQk1QX0RFQ09ERVIgICAgICAweDAxNTcKLSNkZWZpbmUgTTRXQk1QX0VOQ09ERVIgICAgICAweDAxNTgKLQotI2RlZmluZSBNNEFNUl9XUklURVIgICAgICAgIDB4MDE1OSAgICAvKio8IG5vIHJvb20gdG8gcHV0IGl0IGFsb25nIE00QU1SX1JFQURFUiAqLwotCi0KLSNkZWZpbmUgTTRBVkNfREVDT0RFUiAgICAgICAweDAxNUEKLSNkZWZpbmUgTTRBVkNfRU5DT0RFUiAgICAgICAweDAxNUIKLQotI2RlZmluZSBNNEFTRl9SRUFERVIgICAgICAgIDB4MDE1QwotI2RlZmluZSBNNFdNRFJNX0FHRU5UICAgICAgICAweDAxNUQKLSNkZWZpbmUgTTRNSURJX1JFQURFUiAgICAgICAgMHgwMTYyICAgIC8qKjwgbm8gcm9vbSBiZWZvcmUgdGhlIHByZXNlbnRlcnMgKi8KLSNkZWZpbmUgTTRSTV9SRUFERVIgICAgICAgICAweDE2MwotI2RlZmluZSBNNFJNVl9ERUNPREVSICAgICAgICAweDE2NAotI2RlZmluZSBNNFJNQV9ERUNPREVSICAgICAgICAweDE2NQotCi0jZGVmaW5lIE00VE9PTF9YTUwgICAgICAgICAgICAweDAxNjYKLSNkZWZpbmUgTTRUT09MX0VGUiAgICAgICAgICAgIDB4MDE2NyAgICAvKio8IERlY3J5cHRpb24gbW9kdWxlIGZvciBWaWRlbyBBcnRpc3QgKi8KLSNkZWZpbmUgTTRJQUxfRlROICAgICAgICAgICAgMHgwMTY4ICAgIC8qIEZUTiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUFMICovCi0jZGVmaW5lIE00RlROICAgICAgICAgICAgICAgIDB4MDE2OSAgICAvKiBGVE4gbGlicmFyeSAqLwotCi0vKiBwcmVzZW50ZXIgKi8KLSNkZWZpbmUgTTRQUkVTRU5URVJfQVVESU8gICAweDAxNjAKLSNkZWZpbmUgTTRQUkVTRU5URVJfVklERU8gICAweDAxNjEKLQotLyogaGlnaCBsZXZlbCBpbnRlcmZhY2VzICh2cHMsIGV0Yy4uKSovCi0jZGVmaW5lIE00VlBTICAgICAgICAgICAgICAgMHgwMTcwCi0jZGVmaW5lIE00VlRTICAgICAgICAgICAgICAgMHgwMTcxCi0jZGVmaW5lIE00VlhTICAgICAgICAgICAgICAgMHgwMTcyCi0jZGVmaW5lIE00Q0FMTEJBQ0sgICAgICAgICAgMHgwMTczCi0jZGVmaW5lIE00VkVTICAgICAgICAgICAgICAgMHgwMTc0Ci0jZGVmaW5lIE00UFJFUFJPQ0VTU19WSURFTyAgMHgwMTc1Ci0jZGVmaW5lIE00R1JBQl9BVURJTyAgICAgICAgMHgwMTc2Ci0jZGVmaW5lIE00R1JBQl9WSURFTyAgICAgICAgMHgwMTc3Ci0jZGVmaW5lIE00VlNTQVZJICAgICAgICAgICAgMHgwMTc4Ci0jZGVmaW5lIE00VlNTM0dQUCAgICAgICAgICAgMHgwMTc5Ci0jZGVmaW5lIE00UFRPM0dQUCAgICAgICAgICAgMHgwMTdBCi0jZGVmaW5lIE00UFZYX1BBUlNFUiAgICAgICAgMHgwMTdCCi0jZGVmaW5lIE00VkNTICAgICAgICAgICAgICAgIDB4MDE3QwotI2RlZmluZSBNNE1DUyAgICAgICAgICAgICAgICAweDAxN0QKLSNkZWZpbmUgTTRNTk1DICAgICAgICAgICAgICAgIDB4MDE4MCAgICAvKio8IG1ubSBjb250cm9sbGVyICovCi0jZGVmaW5lIE00VFRFWFRfUEFSU0VSICAgICAgMHgwMTgxICAgIC8qKjwgdGltZWQgdGV4dCAqLwotI2RlZmluZSBNNE1NICAgICAgICAgICAgICAgIDB4MDE4MiAgICAvKio8IE11c2ljIG1hbmFnZXIgKi8KLSNkZWZpbmUgTTRNRFAgICAgICAgICAgICAgICAgMHgwMTgzICAgIC8qKjwgTWV0YWRhdGEgcGFyc2VyICovCi0jZGVmaW5lIE00TU1TUUxDT1JFICAgICAgICAgICAgMHgwMTg0Ci0jZGVmaW5lIE00VlBTSUwgICAgICAgICAgICAgICAgMHgwMTg1Ci0jZGVmaW5lIE00RklMRUlMICAgICAgICAgICAgMHgwMTg2IC8qIElMIGZpbGUgSW50ZXJmYWNlICovCi0jZGVmaW5lIE00TVUgICAgICAgICAgICAgICAgMHgwMTg3Ci0jZGVmaW5lIE00VkVFICAgICAgICAgICAgICAgIDB4MDE4OCAgLyoqPCBWaWRlbyBlZmZlY3QgZW5naW5lICovCi0jZGVmaW5lIE00VkEgICAgICAgICAgICAgICAgMHgwMTg5IC8qIFZpZGVvQXJ0aXN0ICovCi0jZGVmaW5lIE00SlRTICAgICAgICAgICAgICAgIDB4MDE4QQotI2RlZmluZSBNNEpUU0lMICAgICAgICAgICAgICAgIDB4MDE4QgotI2RlZmluZSBNNEFJUiAgICAgICAgICAgICAgICAweDAxOEMgIC8qKjwgQUlSICovCi0jZGVmaW5lIE00U1BFICAgICAgICAgICAgICAgIDB4MDE4RCAgLyoqPCBTdGlsbCBwaWN0dXJlIGVkaXRvciAqLwotI2RlZmluZSBNNFZTICAgICAgICAgICAgICAgIDB4MDE4RSAgICAvKio8IFZpZGVvIFN0dWRpbyAoeFZTUykgKi8KLSNkZWZpbmUgTTRWRVNJTCAgICAgICAgICAgICAgICAweDAxOEYgICAgLyoqPCBWRVMgaWwgKi8KLSNkZWZpbmUgTTRJRDMgICAgICAgICAgICAgICAgMHgwMTkwICAgIC8qKjwgSUQzIFRhZyBNb2R1bGUgKi8KLSNkZWZpbmUgTTRTQyAgICAgICAgICAgICAgICAweDAxOTEgICAgLyoqPCBNZWRpYSBTY2FubmVyICovCi0jZGVmaW5lIE00VEcgICAgICAgICAgICAgICAgMHgwMTkyICAvKio8IFRodW1ibmFpbCBHZW5lcmF0b3IqLwotI2RlZmluZSBNNFRTICAgICAgICAgICAgICAgIDB4MDE5MyAgICAvKio8IFRodW1ibmFpbCBzdG9yYWdlICovCi0jZGVmaW5lIE00TUIgICAgICAgICAgICAgICAgMHgwMTk0ICAgIC8qKjwgTWVkaWEgYnJvd3NlciAqLwotCi0vKiBoaWdoIGxldmVsIGFwcGxpY2F0aW9uICh0ZXN0IG9yIGNsaWVudCBhcHApICovCi0jZGVmaW5lIE00QVBQTEkgICAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIE00VkFfQVBQTEkgICAgICAgICAgICAweDAyMDEgICAgLyoqPCBWaWRlbyBBcnRpc3QgdGVzdCBhcHBsaWNhdGlvbiAqLwotCi0vKiBleHRlcm5hbCBjb21wb25lbnRzIChIVyB2aWRlbyBjb2RlY3MsIGV0Yy4pICovCi0jZGVmaW5lIE00VkRfRVhURVJOQUwgICAgICAgIDB4MDMwMAotI2RlZmluZSBNNFZFX0VYVEVSTkFMICAgICAgICAweDAzMDEKLQotCi0vKiBwcmlvcml0eSB0byBjb21iaW5lIHdpdGggbW9kdWxlIGlkcyAqLwotI2RlZmluZSBNNEhJR0hfUFJJT1JJVFkgICAgIDB4QzAwMAotI2RlZmluZSBNNE1FRElVTV9QUklPUklUWSAgIDB4ODAwMAotI2RlZmluZSBNNExPV19QUklPUklUWSAgICAgIDB4NDAwMAotI2RlZmluZSBNNERFRkFVTFRfUFJJT1JJVFkgIDB4MDAwMAotCi0KLSNlbmRpZiAvKl9fTTRPU0FfQ09SRUlEX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0RlYnVnLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9EZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MjZhYjUxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRGVidWcuaAotICogQGJyaWVmICAgICAgICBEZWJ1ZyBhbmQgVHJhY2UgTWFjcm8KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBfTTRPU0FfREVCVUdfSF8KLSNkZWZpbmUgX000T1NBX0RFQlVHX0hfCi0KLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLQotLyogZGVmYXV0IHZhbHVlLCBkZWZpbmVkIG9ubHkgaWYgbm90IGRlZmluZWQgYWxyZWFkeS4gKi8KLSNpZm5kZWYgTTRUUkFDRV9JRAotI2RlZmluZSBNNFRSQUNFX0lEIE00VU5LTk9XTl9DT1JFSUQKLSNlbmRpZiAvKiBNNFRSQUNFX0lEIHVuZGVmaW5lZCAqLwotCi0KLSNkZWZpbmUgTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgMAotCi0jaWZuZGVmIE00T1NBX0RFQlVHX0xFVkVMCi0jZGVmaW5lIE00T1NBX0RFQlVHX0xFVkVMICAgICAgIDAKLSNlbmRpZgotCi0KLSNkZWZpbmUgTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgMAotCi0jaWZuZGVmIE00T1NBX1RSQUNFX0xFVkVMCi0jZGVmaW5lIE00T1NBX1RSQUNFX0xFVkVMICAgICAgIDAKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0KLSNpZiAoTTRPU0FfREVCVUdfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX0RFQlVHX0xFVkVMID49IDEpCi0KLS8qIERlYnVnIG1hY3JvcyAqLwotZXh0ZXJuIE00T1NBX1ZvaWQgTTRPU0FfREVCVUdfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nQ29uZGl0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlIgcmV0dXJuZWRFcnJvcik7Ci0KLQotI2RlZmluZSBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIGxldmVsKVwKLSAgICAgIGlmKGNvbmQpXAotICAgICAge1wKLSAgICAgICAgIE00T1NBX0RFQlVHX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXywgbGV2ZWwsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopI2NvbmQsIChNNE9TQV9DaGFyKiltc2csXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3JDb2RlKSk7XAotICAgICAgICAgcmV0dXJuKGVycm9yQ29kZSk7XAotICAgICAgfQotCi0jZGVmaW5lIE00T1NBX0RFQlVHKGVycm9yQ29kZSwgbXNnKVwKLSAgICAgICAgIE00T1NBX0RFQlVHX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXywgMSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikjZXJyb3JDb2RlLCAoTTRPU0FfQ2hhciopbXNnLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yQ29kZSkpOwotCi0jZWxzZSAvKihNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkqLwotCi0KLSNkZWZpbmUgTTRPU0FfREVCVUcoZXJyb3JDb2RlLCBtc2cpCi0KLSNlbmRpZiAvKihNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkqLwotCi0KLQotI2lmIChNNE9TQV9ERUJVR19MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMSkKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMShjb25kLCBlcnJvckNvZGUsIG1zZylcCi0gICAgICAgICBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIDEpCi0jZWxzZQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYxKGNvbmQsIGVycm9yQ29kZSwgbXNnKQotI2VuZGlmIC8qKE00T1NBX0RFQlVHX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAxKSovCi0KLQotI2lmIChNNE9TQV9ERUJVR19MRVZFTCA+PSAyKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMikKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMihjb25kLCBlcnJvckNvZGUsIG1zZylcCi0gICAgICAgICBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIDIpCi0jZWxzZQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYyKGNvbmQsIGVycm9yQ29kZSwgbXNnKQotI2VuZGlmIC8qKE00T1NBX0RFQlVHX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAyKSovCi0KLQotI2lmIChNNE9TQV9ERUJVR19MRVZFTCA+PSAzKSB8fCAoTTRPU0FfU1VQRVJfREVCVUdfTEVWRUwgPj0gMykKLSAjZGVmaW5lIE00T1NBX0RFQlVHX0lGMyhjb25kLCBlcnJvckNvZGUsIG1zZylcCi0gICAgICAgICBNNE9TQV9ERUJVR19JRngoY29uZCwgZXJyb3JDb2RlLCBtc2csIDMpCi0jZWxzZQotICNkZWZpbmUgTTRPU0FfREVCVUdfSUYzKGNvbmQsIGVycm9yQ29kZSwgbXNnKQotI2VuZGlmIC8qKE00T1NBX0RFQlVHX0xFVkVMID49IDMpIHx8IChNNE9TQV9TVVBFUl9ERUJVR19MRVZFTCA+PSAzKSovCi0KLQotCi0vKiBUcmFjZSBtYWNyb3MgKi8KLQotI2lmIChNNE9TQV9UUkFDRV9MRVZFTCA+PSAxKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMSkKLQotZXh0ZXJuIE00T1NBX1ZvaWQgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nTXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gKTsKLQotCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0V4XzAobXNnLCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLCAoTTRPU0FfQ2hhciopbXNnKTsKLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF8xKG1zZywgcGFyYW0xLCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NvcmVJRClNNFRSQUNFX0lELCBsZXZlbCwgKE00T1NBX0NoYXIqKW1zZywgcGFyYW0xKTsKLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF8yKG1zZywgcGFyYW0xLCBwYXJhbTIsIGxldmVsKVwKLSAgICAgIE00T1NBX1RSQUNFX3RyYWNlRnVuY3Rpb24oX19MSU5FX18sIChNNE9TQV9DaGFyKilfX0ZJTEVfXyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Db3JlSUQpTTRUUkFDRV9JRCwgbGV2ZWwsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopbXNnLCBwYXJhbTEsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTIpOwotCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0V4XzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLCAoTTRPU0FfQ2hhciopbXNnLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0xLHBhcmFtMiwgcGFyYW0zKTsKLQotCi0jZGVmaW5lIE00T1NBX1RSQUNFeF80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKW1zZywgcGFyYW0xLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCk7Ci0KLQotI2RlZmluZSBNNE9TQV9UUkFDRXhfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01LCBsZXZlbClcCi0gICAgICBNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uKF9fTElORV9fLCAoTTRPU0FfQ2hhciopX19GSUxFX18sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ29yZUlEKU00VFJBQ0VfSUQsIGxldmVsLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKW1zZywgcGFyYW0xLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KTsKLQotI2VuZGlmIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAxKSovCi0KLQotCi0jaWYgKE00T1NBX1RSQUNFX0xFVkVMID49IDEpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAxKQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMChtc2cpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMChtc2csIDEpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzEobXNnLCBwYXJhbTEpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMShtc2csIHBhcmFtMSwgMSkKLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMihtc2csIHBhcmFtMSwgcGFyYW0yKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzIobXNnLCBwYXJhbTEsIHBhcmFtMiwgMSkKLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIDEpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UxXzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpXAotICAgICAgICBNNE9TQV9UUkFDRXhfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgMSkKLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSwgMSkKLQotI2Vsc2UgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDEpKi8KLQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMChtc2cpCi0jZGVmaW5lIE00T1NBX1RSQUNFMV8xKG1zZywgcGFyYW0xKQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMihtc2csIHBhcmFtMSwgcGFyYW0yKQotI2RlZmluZSBNNE9TQV9UUkFDRTFfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpCi0jZGVmaW5lIE00T1NBX1RSQUNFMV80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KQotI2RlZmluZSBNNE9TQV9UUkFDRTFfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KQotCi0jZW5kaWYgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMSkgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDEpKi8KLQotCi0jaWYgKE00T1NBX1RSQUNFX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAyKQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMChtc2cpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMChtc2csIDIpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzEobXNnLCBwYXJhbTEpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMShtc2csIHBhcmFtMSwgMikKLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMihtc2csIHBhcmFtMSwgcGFyYW0yKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzIobXNnLCBwYXJhbTEsIHBhcmFtMiwgMikKLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpXAotICAgICAgICBNNE9TQV9UUkFDRXhfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIDIpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UyXzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpXAotICAgICAgICBNNE9TQV9UUkFDRXhfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgMikKLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSwgMikKLQotI2Vsc2UgLyooTTRPU0FfVFJBQ0VfTEVWRUwgPj0gMikgfHwgKE00T1NBX1NVUEVSX1RSQUNFX0xFVkVMID49IDIpKi8KLQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMChtc2cpCi0jZGVmaW5lIE00T1NBX1RSQUNFMl8xKG1zZywgcGFyYW0xKQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMihtc2csIHBhcmFtMSwgcGFyYW0yKQotI2RlZmluZSBNNE9TQV9UUkFDRTJfMyhtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpCi0jZGVmaW5lIE00T1NBX1RSQUNFMl80KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KQotI2RlZmluZSBNNE9TQV9UUkFDRTJfNShtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KQotI2VuZGlmIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDIpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAyKSovCi0KLQotI2lmIChNNE9TQV9UUkFDRV9MRVZFTCA+PSAzKSB8fCAoTTRPU0FfU1VQRVJfVFJBQ0VfTEVWRUwgPj0gMykKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzAobXNnKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzAobXNnLCAzKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFM18xKG1zZywgcGFyYW0xKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzEobXNnLCBwYXJhbTEsIDMpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzIobXNnLCBwYXJhbTEsIHBhcmFtMilcCi0gICAgICAgIE00T1NBX1RSQUNFeF8yKG1zZywgcGFyYW0xLCBwYXJhbTIsIDMpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCAzKQotCi0jZGVmaW5lIE00T1NBX1RSQUNFM180KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KVwKLSAgICAgICAgTTRPU0FfVFJBQ0V4XzQobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIDMpCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSlcCi0gICAgICAgIE00T1NBX1RSQUNFeF81KG1zZywgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUsIDMpCi0KLSNlbHNlIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDMpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAzKSovCi0KLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzAobXNnKQotI2RlZmluZSBNNE9TQV9UUkFDRTNfMShtc2csIHBhcmFtMSkKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzIobXNnLCBwYXJhbTEsIHBhcmFtMikKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzMobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKQotI2RlZmluZSBNNE9TQV9UUkFDRTNfNChtc2csIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCkKLSNkZWZpbmUgTTRPU0FfVFJBQ0UzXzUobXNnLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSkKLQotI2VuZGlmIC8qKE00T1NBX1RSQUNFX0xFVkVMID49IDMpIHx8IChNNE9TQV9TVVBFUl9UUkFDRV9MRVZFTCA+PSAzKSovCi0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX000T1NBX0RFQlVHX0hfICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0Vycm9yLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9FcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NWMzMTc3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0Vycm9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRXJyb3IuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIERlZmluaXRpb24gb2YgY29tbW9uIGVycm9yIHR5cGVzCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBjb250YWlucyBtYWNyb3MgdG8gZ2VuZXJhdGUgYW5kIGFuYWx5emUgZXJyb3IgY29kZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfRVJST1JfSAotI2RlZmluZSBNNE9TQV9FUlJPUl9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0vKiogTTRPU0FfRVJSIGlzIGEgMzIgYml0cyB1bnNpZ25lZCBpbnRlZ2VyLgotICogVG8gc29ydCByZXR1cm5lZCBjb2RlLCBhIHNwZWNpZmljIG5hbWluZyBjb252ZW50aW9uIG11c3QgYmUgZm9sbG93ZWQ6Ci0gKiAtIFNldmVyaXR5ICgyIGJpdHMpOiBJdCBtYXkgYnIgZWl0aGVyIDBiMDAgKG5vIGVycm9yKSwgMGIwMSAod2FybmluZykgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgIDBiMDEgKGZhdGFsIGVycm9yKQotICogLSBDb3JlIElEICgxNCBiaXRzKTogSXQgaXMgYSB1bmlxdWUgSUQgZm9yIGVhY2ggY29yZSBjb21wb25lbnQKLSAqIC0gRXJyb3JJRCAoMTYgYml0cyk6IEl0IGlzIHRoZSBzcGVjaWZpYyBlcnJvciBjb2RlCi0KLSAqIEVBQ0ggQ09SRSBDT01QT05FTlQgRlVOQ1RJT04gU0hPVUxEIFJFVFVSTiBBTiBNNE9TQV9FUlIKLSovCi10eXBlZGVmIE00T1NBX1VJbnQzMiAgIE00T1NBX0VSUjsKLQotI2RlZmluZSBNNF9PSyAgICAgMAotI2RlZmluZSBNNF9XQVIgICAgMQotI2RlZmluZSBNNF9FUlIgICAgMgotCi0KLS8qIE1hY3JvIHRvIHByb2Nlc3MgTTRPU0FfRVJSICovCi0KLS8qKiBUaGlzIG1hY3JvIHRlc3RzIGlmIHRoZSBwcm92aWRlZCBNNE9TQV9FUlIgaXMgYSB3YXJuaW5nIG9yIG5vdCovCi0jZGVmaW5lIE00T1NBX0VSUl9JU19XQVJOSU5HKGVycm9yKSAgICgoKChlcnJvcik+PjMwKSA9PSBNNF9XQVIpID8gMTowKQotCi0vKiogVGhpcyBtYWNybyB0ZXN0cyBpZiB0aGUgcHJvdmlkZWQgTTRPU0FfRVJSIGlzIGEgZmF0YWwgZXJyb3Igb3Igbm90Ki8KLSNkZWZpbmUgTTRPU0FfRVJSX0lTX0VSUk9SKGVycm9yKSAgICgoKChlcnJvcik+PjMwKSA9PSBNNF9FUlIpID8gMTowKQotCi0vKiogVGhpcyBtYWNybyByZXR1cm5zIGFuIGVycm9yIGNvZGUgYWNjcm9kaW5nIHRvIHRoZSAzIHByb3ZpZGVkIGZpZWxkczoKLSAgKiBAYXJnIHNldmVyaXR5OiAoSU4pIFtNNE9TQV9VSW50MzJdIFNldmVyaXR5IHRvIHB1dCBpbiB0aGUgZXJyb3IgY29kZQotICAqIEBhcmcgY29yZUlEOiAoSU4pIFtNNE9TQV9VSW50MzJdIENvcmVJRCB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUKLSAgKiBAYXJnIGVycm9ySUQ6IChJTikgW000T1NBX1VJbnQzMl0gRXJyb3JJRCB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUqLwotI2RlZmluZSBNNE9TQV9FUlJfQ1JFQVRFKHNldmVyaXR5LCBjb3JlSUQsIGVycm9ySUQpXAotICAgKE00T1NBX1VJbnQzMikoKCgoTTRPU0FfVUludDMyKXNldmVyaXR5KTw8MzApKygoKChNNE9TQV9VSW50MzIpY29yZUlEKSYweDAwM0ZGRik8PDE2KSsoKChNNE9TQV9VSW50MzIpZXJyb3JJRCkmMHgwMEZGRkYpKQotCi0vKiogVGhpcyBtYWNybyBleHRyYWN0cyB0aGUgMyBmaWVsZHMgZnJvbSB0aGUgZXJyb3I6Ci0gICogQGFyZyBlcnJvcjogKElOKSBbTTRPU0FfRVJSXSBFcnJvciBjb2RlCi0gICogQGFyZyBzZXZlcml0eTogKE9VVCkgW000T1NBX1VJbnQzMl0gU2V2ZXJpdHkgdG8gcHV0IGluIHRoZSBlcnJvciBjb2RlCi0gICogQGFyZyBjb3JlSUQ6IChPVVQpIFtNNE9TQV9VSW50MzJdIENvcmVJRCB0byBwdXQgaW4gdGhlIGVycm9yIGNvZGUKLSAgKiBAYXJnIGVycm9ySUQ6IChPVVQpIFtNNE9TQV9VSW50MzJdIEVycm9ySUQgdG8gcHV0IGluIHRoZSBlcnJvciBjb2RlKi8KLSNkZWZpbmUgTTRPU0FfRVJSX1NQTElUKGVycm9yLCBzZXZlcml0eSwgY29yZUlELCBlcnJvcklEKVwKLSAgIHsgc2V2ZXJpdHk9KE00T1NBX1VJbnQzMikoKGVycm9yKT4+MzApO1wKLSAgICAgY29yZUlEPShNNE9TQV9VSW50MzIpKCgoZXJyb3IpPj4xNikmMHgwMDNGRkYpO1wKLSAgICAgKE00T1NBX1VJbnQzMikoZXJyb3JJRD0oZXJyb3IpJjB4MDBGRkZGKTsgfQotCi0KLS8qICJmYWtlIiBDb3JlSUQsIGlzIHVzZWQgdG8gcmVwb3J0IGFuIHVua25vd24gQ29yZUlELiBVc2VkIGJ5IHRoZSB0cmFjZSBzeXN0ZW0KLXdoZW4gdGhlIGNvcmUgSUQgbWFjcm8gaXNuJ3QgZGVmaW5lZC4gRGVmaW5lZCBoZXJlIGluc3RlYWQgb2YgQ29yZUlELmggdG8gYXZvaWQKLWludHJvZHVjaW5nIGRlcGVuZGVuY2llcyB0byBjb21tb24vaW5jLiAqLwotCi0jZGVmaW5lIE00VU5LTk9XTl9DT1JFSUQgICAgMHgzRkZGIC8qIG1heCBwb3NzaWJsZSBDb3JlSUQgKi8KLQotI2RlZmluZSBNNF9DT01NT04gICAgICAgICAgIDB4MDAgIC8qKjxDb21tb24qLwotI2RlZmluZSBNNE1QNF9DT01NT04gICAgICAgIDB4MDEgIC8qKjxDb3JlIE1QNCAoY29tbW9uKSovCi0jZGVmaW5lIE00TVA0X1dSSVRFUiAgICAgICAgMHgwMiAgLyoqPENvcmUgTVA0IHdyaXRlciovCi0jZGVmaW5lIE00TVA0X1JFQURFUiAgICAgICAgMHgwMyAgLyoqPENvcmUgTVA0IHJlYWRlciovCi0jZGVmaW5lIE00UlRTUF9DT01NT04gICAgICAgMHgxMSAgLyoqPENvcmUgUlRTUCBjb21tb24qLwotI2RlZmluZSBNNFJUU1BfV1JJVEVSICAgICAgIDB4MTIgIC8qKjxDb3JlIFJUU1AgdHJhbnNtaXR0ZXIqLwotI2RlZmluZSBNNFJUU1BfUkVBREVSICAgICAgIDB4MTMgIC8qKjxDb3JlIFJUU1AgcmVjZWl2ZXIqLwotI2RlZmluZSBNNFJUUF9XUklURVIgICAgICAgIDB4MTQgIC8qKjxDb3JlIFJUUC9SVENQIHJlY2VpdmVyKi8KLSNkZWZpbmUgTTRSVFBfUkVBREVSICAgICAgICAweDE1ICAvKio8Q29yZSBSVFAvUlRDUCB0cmFuc21pdHRlciovCi0jZGVmaW5lIE00U0FQX1dSSVRFUiAgICAgICAgMHgxNiAgLyoqPENvcmUgU0FQIHRyYW5zbWl0dGVyKi8KLSNkZWZpbmUgTTRTQVBfUkVBREVSICAgICAgICAweDE3ICAvKio8Q29yZSBTQVAgcmVjZWl2ZXIqLwotI2RlZmluZSBNNERWQkhfUkVBREVSICAgICAgICAweDE4ICAvKio8Q29yZSBEVkJIIHJlY2VpdmVyKi8KLSNkZWZpbmUgTTRTRFBfV1JJVEVSICAgICAgICAweDIyICAvKio8Q29yZSBTRFAgd3JpdGVyKi8KLSNkZWZpbmUgTTRTRFBfUkVBREVSICAgICAgICAweDMxICAvKio8Q29yZSBTRFAgcmVhZGVyKi8KLSNkZWZpbmUgTTRQQUtfQU1SICAgICAgICAgICAweDMyICAvKio8Q29yZSBwYWNrZXRpemVyIEFNUiAoUkZDMzI2NykqLwotI2RlZmluZSBNNERFUEFLX0FNUiAgICAgICAgIDB4MzMgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgQU1SIChSRkMzMjY3KSovCi0jZGVmaW5lIE00UEFLX0gyNjMgICAgICAgICAgMHgzNCAgLyoqPENvcmUgcGFja2V0aXplciBIMjYzIChSRkMyNDI5KSovCi0jZGVmaW5lIE00REVQQUtfSDI2MyAgICAgICAgMHgzNSAgLyoqPENvcmUgZGUtcGFja2V0aXplciBIMjYzKFJGQzI0MjkpKi8KLSNkZWZpbmUgTTRQQUtfU0lNUExFICAgICAgICAweDM2ICAvKio8Q29yZSBwYWNrZXRpemVyIFNpbXBsZURyYWZ0IChSRkMgeHh4eCkqLwotI2RlZmluZSBNNERFUEFLX1NJTVBMRSAgICAgIDB4MzcgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgU2ltcGxlRHJhZnQgKFJGQyB4eHh4KSovCi0jZGVmaW5lIE00UEFLXzMwMTZfVklERU8gICAgMHgzOCAgLyoqPENvcmUgcGFja2V0aXplciBSRkMzMDE2IHZpZGVvKi8KLSNkZWZpbmUgTTRERVBBS18zMDE2X1ZJREVPICAweDM5ICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIFJGQzMwMTYgdmlkZW8qLwotI2RlZmluZSBNNFBBS18zMDE2X0FVRElPICAgIDB4M0EgIC8qKjxDb3JlIHBhY2tldGl6ZXIgUkZDMzAxNiBhdWRpbyAoTEFUTSkqLwotI2RlZmluZSBNNERFUEFLXzMwMTZfQVVESU8gIDB4M0IgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgUkZDMzAxNiBhdWRpbyAoTEFUTSkqLwotI2RlZmluZSBNNERFUEFLX0gyNjQgICAgICAgIDB4M0MgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgSDI2NCovCi0jZGVmaW5lIE00REVQQUtfUkVBTFYgICAgICAgIDB4M0QgIC8qKjxDb3JlIGRlLXBhY2tldGl6ZXIgUmVhbCBWaWRlbyAqLwotI2RlZmluZSBNNERFUEFLX1JFQUxBICAgICAgICAweDNFICAvKio8Q29yZSBkZS1wYWNrZXRpemVyIFJlYWwgQXVkaW8gKi8KLSNkZWZpbmUgTTRSRFRfUkVBREVSICAgICAgICAweDNGICAvKio8Q29yZSBSRFQgcmVjZWl2ZXIqLwotI2RlZmluZSBNNFRDUF9ETVVYICAgICAgICAgIDB4NTAgIC8qKjxDb3JlIFRDUCBkZW11eCovCi0jZGVmaW5lIE00SU9EX1BBUlNFUiAgICAgICAgMHg1MSAgLyoqPENvcmUgSU9EIHBhcnNlciovCi0jZGVmaW5lIE00T1NBX0ZJTEVfQ09NTU9OICAgMHg2MSAgLyoqPE9TQUwgZmlsZSBjb21tb24qLwotI2RlZmluZSBNNE9TQV9GSUxFX1dSSVRFUiAgIDB4NjIgIC8qKjxPU0FMIGZpbGUgd3JpdGVyKi8KLSNkZWZpbmUgTTRPU0FfRklMRV9SRUFERVIgICAweDYzICAvKio8T1NBTCBmaWxlIHJlYWRlciovCi0jZGVmaW5lIE00T1NBX0ZJTEVfRVhUUkEgICAgMHg2NCAgLyoqPE9TQUwgZmlsZSBleHRyYSovCi0jZGVmaW5lIE00T1NBX0RJUkVDVE9SWSAgICAgMHg2NSAgLyoqPE9TQUwgZGlyZWN0b3J5Ki8KLSNkZWZpbmUgTTRPU0FfU09DS0VUICAgICAgICAweDcxICAvKio8T1NBTCBzb2NrZXQgKGJvdGggcmVhZGVyIGFuZCB3cml0ZXIpKi8KLSNkZWZpbmUgTTRPU0FfVEhSRUFEICAgICAgICAweDgxICAvKio8T1NBTCB0aHJlYWQqLwotI2RlZmluZSBNNE9TQV9NVVRFWCAgICAgICAgIDB4ODIgIC8qKjxPU0FMIG11dGV4Ki8KLSNkZWZpbmUgTTRPU0FfU0VNQVBIT1JFICAgICAweDgzICAvKio8T1NBTCBzZW1hcGhvcmUqLwotI2RlZmluZSBNNE9TQV9DTE9DSyAgICAgICAgIDB4ODQgIC8qKjxPU0FMIGNsb2NrKi8KLSNkZWZpbmUgTTRPU0FfTUVNT1JZICAgICAgICAweDkxICAvKio8T1NBTCBtZW1vcnkqLwotI2RlZmluZSBNNENBTExfQkFDSyAgICAgICAgIDB4QTEgIC8qKjxDYWxsIEJhY2sgZXJyb3IqLwotI2RlZmluZSBNNE9TQV9VUkkgICAgICAgICAgIDB4QjEgIC8qKjxPU0FMIFVSSSBoYW5kbGVyKi8KLSNkZWZpbmUgTTRPU0FfU1RSSU5HICAgICAgICAweEIyICAvKio8T1NBTCBzdHJpbmcqLwotI2RlZmluZSBNNFNZU19DTUFQSSAgICAgICAgIDB4QjMgIC8qKjxTWVNURU0gQ29tbW9uIE1lZGkgQVBJKi8KLSNkZWZpbmUgTTRPU0FfQ0hBUlNUQVIgICAgICAweEI0ICAvKio8T1NBTCBDaGFyU3RhciovCi0jZGVmaW5lIE00UkVBQ1RPUiAgICAgICAgICAgMHhDMSAgLyoqPENvcmUgcmVhY3RvciovCi0jZGVmaW5lIE00VEVTVCAgICAgICAgICAgICAgMHhEMSAgLyoqPFRlc3QgY29tcG9uZW50Ki8KLSNkZWZpbmUgTTRTVEFDSyAgICAgICAgICAgICAgICAweEUxICAvKio8IENvcmUgSUQgb2YgdGhlIGludGVncmF0ZWQgc3RhY2sqLwotI2RlZmluZSBNNFNUQUNLX1JFQUwgICAgICAgIDB4RTIgIC8qKjxDb3JlIElEIG9mIHRoZSBSZWFsIGludGVncmF0ZWQgc3RhY2sgKi8KLSNkZWZpbmUgTTRUT09MX0xCVlRfUEFSQU0gICAweEYxICAvKio8TEJfVlQgY29uZmlnIGZpbGUgbWFuYWdlciovCi0jZGVmaW5lIE00VE9PTF9MSU5LX0xJU1QgICAgMHhGMiAgLyoqPFRvb2wgbGlua2VkIGxpc3QqLwotI2RlZmluZSBNNFRPT0xfQkFTRTY0ICAgICAgIDB4RjMgIC8qKjxDb3JlIGJhc2U2NCBlbmNvZGVyL2RlY29kZXIqLwotCi0KLQotLyogRGVmaW5pdGlvbiBvZiBjb21tb24gZXJyb3IgY29kZXMgKi8KLS8qKiB0aGVyZSBpcyBubyBlcnJvciovCi0jZGVmaW5lIE00Tk9fRVJST1IgICAgICAgICAgICAweDAwMDAwMDAwCi0KLS8qKiBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwqLwotI2RlZmluZSBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDEpCi0vKiogVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdyovCi0jZGVmaW5lIE00RVJSX1NUQVRFICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwMikKLS8qKiBUaGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUqLwotI2RlZmluZSBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDMpCi0vKiogUHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUqLwotI2RlZmluZSBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDQpCi0jZGVmaW5lIE00RVJSX0NPTlRFWFRfRkFJTEVEICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwNSkKLSNkZWZpbmUgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRfQ09NTU9OLDB4MDAwMDA2KQotLyoqIFRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUqLwotI2RlZmluZSBNNEVSUl9CQURfT1BUSU9OX0lEICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDcpCi0vKiogVGhpcyBvcHRpb24gaXMgYSB3cml0ZSBvbmx5IG9uZSovCi0jZGVmaW5lIE00RVJSX1dSSVRFX09OTFkgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwOCkKLS8qKiBUaGlzIG9wdGlvbiBpcyBhIHJlYWQgb25seSBvbmUqLwotI2RlZmluZSBNNEVSUl9SRUFEX09OTFkgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNF9DT01NT04sMHgwMDAwMDkpCi0vKiogVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHlldCovCi0jZGVmaW5lIE00RVJSX05PVF9JTVBMRU1FTlRFRCAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00X0NPTU1PTiwweDAwMDAwQSkKLQotI2RlZmluZSAgICBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRfQ09NTU9OLCAweDAwMDAwQikKLQotI2RlZmluZSBNNFdBUl9OT19EQVRBX1lFVCAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDEpCi0jZGVmaW5lIE00V0FSX05PX01PUkVfU1RSRUFNICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwMikKLSNkZWZpbmUgTTRXQVJfSU5WQUxJRF9USU1FICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsTTRfQ09NTU9OLDB4MDAwMDAzKQotI2RlZmluZSBNNFdBUl9OT19NT1JFX0FVICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDQpCi0jZGVmaW5lIE00V0FSX1RJTUVfT1VUICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwNSkKLS8qKiBUaGUgYnVmZmVyIGlzIGZ1bGwqLwotI2RlZmluZSBNNFdBUl9CVUZGRVJfRlVMTCAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDYpCi0vKiBUaGUgc2VydmVyIGFza3MgZm9yIGEgcmVkaXJlY3Rpb24gKi8KLSNkZWZpbmUgTTRXQVJfUkVESVJFQ1QgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUixNNF9DT01NT04sMHgwMDAwMDcpCi0jZGVmaW5lIE00V0FSX1RPT19NVUNIX1NUUkVBTVMgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLE00X0NPTU1PTiwweDAwMDAwOCkKLS8qIFNGIENvZGVjIGRldGVjdGVkIElORk9fRk9STUFUX0NIQU5HRSBkdXJpbmcgZGVjb2RlICovCi0jZGVmaW5lIE00V0FSX0lORk9fRk9STUFUX0NIQU5HRSBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRfQ09NTU9OLCAweDAwMDAwOSkKLQotI2VuZGlmIC8qTTRPU0FfRVJST1JfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0V4cG9ydC5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRXhwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI3YTZlODEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRXhwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRPU0FfRXhwb3J0LmgKLSAqIEBicmllZiAgICBEYXRhIGFjY2VzcyBleHBvcnQgdHlwZXMgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHR5cGVzIHdoaWNoIG11c3QgYmUKLSAqICAgICAgICAgIHVzZWQgdG8gaW1wb3J0IG9yIGV4cG9ydCBhbnkgZnVuY3Rpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0VYUE9SVF9ICi0jZGVmaW5lIE00T1NBX0VYUE9SVF9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLypfX2NwbHVzcGx1cyovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgT1NBTCBFWFBPUlRTICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNE9TQUxfQ0hBUlNUQVJfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgQ0hBUl9TVEFSICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfQ0xPQ0tfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgQ0xPQ0sgICAgICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfREFURV9FWFBPUlRfVFlQRSAgICAgICAgICAgICAgICAvKio8IE9TQUwgREFURSAgICAgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9GSUxFX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgIC8qKjwgT1NBTCBGSUxFICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIFJFQUwgVElNRSAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1NPQ0tFVF9FWFBPUlRfVFlQRSAgICAgICAgICAgIC8qKjwgU09DS0VUICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9TVFJJTkdfRVhQT1JUX1RZUEUgICAgICAgICAgICAvKio8IE9TQUwgU1RSSU5HICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfVVJJX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgIC8qKjwgT1NBTCBVUkkgICAgICAgICAgICAqLwotI2RlZmluZSBNNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIE1FTU9SWSAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFICAgICAgICAgICAgLyoqPCBPU0FMIFRSQUNFICAgICAgICAgICAgKi8KLSNkZWZpbmUgTTRPU0FMX1RPT0xfVElNRVJfRVhQT1JUX1RZUEUgICAgICAgIC8qKjwgT1NBTCBUT09MIFRJTUVSICAgICovCi0jZGVmaW5lIE00T1NBTF9TWVNURU1fQ01fRVhQT1JUX1RZUEUgICAgICAgIC8qKjwgU1lTVEVNIENPTU1PTiBBUEkgICAgKi8KLSNkZWZpbmUgTTRPU0FMX0xJTktFRF9MSVNUX0VYUE9SVF9UWVBFICAgICAgICAvKio8IFRPT0wgTElOS0VEIExJU1QgICAgKi8KLSNkZWZpbmUgTTRPU0FMX01FTU9SWV9NQU5BR0VSX0VYUE9SVF9UWVBFICAgIC8qKjwgTUVNT1JZIE1BTkFHRVIgICAgICAgICovCi0jZGVmaW5lIE00T1NBTF9UUkFDRV9NQU5BR0VSX0VYUE9SVF9UWVBFICAgIC8qKjwgVE9PTCBUUkFDRSBNQU5BR0VSICovCi0jZGVmaW5lIE00VlBTX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAvKio8IFZQUyBBUEkgICAgICAgICAgICAqLwotI2RlZmluZSBNNEFQX0VYUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAvKio8IEFVRElPIFBSRVNFTlRFUlMgICAgKi8KLSNkZWZpbmUgTTRWUF9FWFBPUlRfVFlQRSAgICAgICAgICAgICAgICAgICAgLyoqPCBWSURFTyBQUkVTRU5URVJTICAgICovCi0jZGVmaW5lIE00Q0JfRVhQT1JUX1RZUEUgICAgICAgICAgICAgICAgICAgIC8qKjwgQ2FsbCBiYWNrICAgICAgICAgICAgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLypfX2NwbHVzcGx1cyovCi0KLSNlbmRpZiAvKk00T1NBX0VYUE9SVF9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMmFmYjhjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVDb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlQ29tbW9uLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBGaWxlIGNvbW1vbgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVjbGFyZXMgZnVuY3Rpb25zIGFuZCB0eXBlcyB1c2VkIGJ5IGJvdGggdGhlIGZpbGUKLSAqICAgICAgICAgICAgICAgd3JpdGVyIGFuZCBmaWxlIHJlYWRlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBNNE9TQV9GSUxFQ09NTU9OX0gKLSNkZWZpbmUgTTRPU0FfRklMRUNPTU1PTl9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiCi0KLQotdHlwZWRlZiBNNE9TQV9JbnQzMiBNNE9TQV9GaWxlUG9zaXRpb247Ci0KLS8qKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXBwbGljYXRpb24gbW9kZSBhY2Nlc3MuCi0gKiAgaWUsIHRoZSBhcHBsaWNhdGlvbiB1c2VzIGEgZmlsZSBkZXNjcmlwdG9yIHRvIHJlYWQgb3IgdG8gd3JpdGUgIG9yCi0gKiAgYm90aCB0byByZWFkIGFuZCB3cml0ZSBhdCB0aGUgc2FtZSB0aW1lLgotICogIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIE1NIHByb2plY3Qgb25seS4gSXQgZW5hYmxlcyB0byByZWFkIGFuZCB3cml0ZSB0byBhIGZpbGUKLSAqICB3aXRoIG9uZSBkZXNjcmlwdG9yLgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgIE00T1NBX2tEZXNjTm9uZUFjY2VzcyAgICA9IDB4MDAsCi0gICBNNE9TQV9rRGVzY1JlYWRBY2Nlc3MgICAgPSAweDAxLCAgICAvKiogVGhlIERlc2NyaXB0b3IgcmVhZHMgb25seSBmcm9tIHRoZSBmaWxlICovCi0gICBNNE9TQV9rRGVzY1dyaXRlQWNjZXNzICAgID0gMHgwMiwgICAgLyoqIFRoZSBEZXNjcmlwdG9yIHdyaXRlcyBvbmx5IGZyb20gdGhlIGZpbGUqLwotICAgTTRPU0Ffa0Rlc2NSV0FjY2VzcyAgICAgICAgPSAweDAzICAgIC8qKiBUaGUgRGVzY3JpcHRvciByZWFkcyBhbmQgd3JpdGVzIGZyb20vaW4gdGhlIGZpbGUqLwotfSBNNE9TQV9EZXNjck1vZGVBY2Nlc3M7Ci0KLQotLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBmaWxlIG1vZGUgYWNjZXNzLiBCb3RoIHRleHQgbW9kZSBhcyBiaW5hcnkgbW9kZQotICAgIGNhbm5vdCBiZSBzZXQgdG9nZXRoZXIuKi8KLXR5cGVkZWYgZW51bQotewotICAgLyoqIFRoZSBmaWxlIG11c3QgYmUgYWNjZXNzZWQgaW4gcmVhZCBvbmx5IG1vZGUqLwotICAgTTRPU0Ffa0ZpbGVSZWFkICAgICAgICAgICAgID0gMHgwMSwKLSAgIC8qKiBUaGUgZmlsZSBtdXN0IGJlIGFjY2Vzc2VkIGluIHdyaXRlIG9ubHkgbW9kZSovCi0gICBNNE9TQV9rRmlsZVdyaXRlICAgICAgICAgICAgPSAweDAyLAotICAgLyoqIFRoZSBmaWxlIG11c3QgYmUgYWNjZXNzZWQgaW4gYXBwZW5kIG1vZGUgKEFuIGV4aXN0aW5nIGZpbGUgbXVzdAotICAgICAgIGJlIGF2YWlsYWJsZSB0byBhcHBlbmQgZGF0YSkqLwotICAgTTRPU0Ffa0ZpbGVBcHBlbmQgICAgICAgICAgID0gMHgwNCwKLSAgIC8qKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkKi8KLSAgIE00T1NBX2tGaWxlQ3JlYXRlICAgICAgICAgICA9IDB4MDgsCi0gICAvKiogRGF0YSBhcmUgcHJvY2Vzc2VkIGFzIGJpbmFyeSBvbmUsIHRoZXJlIGlzIG5vIGRhdGEgbWFuYWdlbWVudCovCi0gICBNNE9TQV9rRmlsZUlzVGV4dE1vZGUgICAgICAgPSAweDEwCi19IE00T1NBX0ZpbGVNb2RlQWNjZXNzOwotCi0KLS8qKiBUaGlzIHR5cGUgaXMgdXNlZCB0byBzdG9yZSBhIGRhdGUuKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAvKiogVGltZSBzY2FsZSAodGljayBudW1iZXIgcGVyIHNlY29uZCkqLwotICAgTTRPU0FfVUludDMyIHRpbWVTY2FsZTsKLSAgIC8qKiBEYXRlIGV4cHJlc3NlZCBpbiB0aGUgdGltZSBzY2FsZSovCi0gICBNNE9TQV9UaW1lICAgdGltZTsKLSAgIC8qKiBZZWFyIG9mIHRoZSBhYnNvbHV0ZSB0aW1lICgxOTAwLCAxOTcwIG9yIDIwMDApKi8KLSAgIE00T1NBX1VJbnQzMiByZWZlcmVuY2VZZWFyOwotfSBNNE9TQV9EYXRlOwotCi0KLS8qKiBUaGlzIHN0cnVjdXJlIGRlZmluZXMgdGhlIGZpbGUgYXR0cmlidXRlcyovCi10eXBlZGVmIHN0cnVjdAotewotICAgLyoqIFRoZSBmaWxlIG1vZGUgYWNjZXNzKi8KLSAgIE00T1NBX0ZpbGVNb2RlQWNjZXNzICAgIG1vZGVBY2Nlc3M7Ci0gICAvKiogVGhlIGNyZWF0aW9uIGRhdGUqLwotICAgTTRPU0FfRGF0ZSAgICAgICAgICAgICAgY3JlYXRpb25EYXRlOwotICAgLyoqIFRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlKi8KLSAgIE00T1NBX0RhdGUgICAgICAgICAgICAgIG1vZGlmaWVkRGF0ZTsKLSAgIC8qKiBUaGUgbGFzdCBhY2Nlc3MgZGF0ZSAocmVhZCkqLwotICAgTTRPU0FfRGF0ZSAgICAgICAgICAgICAgbGFzdEFjY2Vzc0RhdGU7Ci19IE00T1NBX0ZpbGVBdHRyaWJ1dGU7Ci0KLQotCi0vKiogVGhpcyBlbnVtIGRlZmluZXMgdGhlIHNlZWsgYmVoYXZpb3IqLwotdHlwZWRlZiBlbnVtIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZQotewotICAgLyoqIFJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUqLwotICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nICAgICAgICAgICAgPSAweDAxLAotICAgLyoqIFJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUqLwotICAgTTRPU0Ffa0ZpbGVTZWVrRW5kICAgICAgICAgICAgICAgICAgPSAweDAyLAotICAgLyoqIFJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24qLwotICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCAgICAgICAgICAgICAgPSAweDAzCi19IE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZTsKLQotCi0vKiBFcnJvciBjb2RlcyAqLwotI2RlZmluZSBNNEVSUl9GSUxFX05PVF9GT1VORCAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX0NPTU1PTiwgMHgwMDAwMDEpCi0jZGVmaW5lIE00RVJSX0ZJTEVfTE9DS0VEICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfQ09NTU9OLCAweDAwMDAwMikKLSNkZWZpbmUgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9DT01NT04sIDB4MDAwMDAzKQotI2RlZmluZSBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04gIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX0NPTU1PTiwgMHgwMDAwMDQpCi0KLQotI2VuZGlmIC8qTTRPU0FfRklMRUNPTU1PTl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZUNvbW1vbl9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWViYTQ1Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlQ29tbW9uX3ByaXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgY29tbW9uIHByaXZhdGUgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdXNlZCBieSBib3RoIHRoZSBmaWxlCi0gKiAgICAgICAgICAgICAgIHdyaXRlciBhbmQgZmlsZSByZWFkZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX0ZJTEVDT01NT05fUFJJVl9ICi0jZGVmaW5lIE00T1NBX0ZJTEVDT01NT05fUFJJVl9ICi0KLQotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIE00T1NBX2lzQWNjZXNzTW9kZUFjdGl2ZWQoY29tcG91bmRfbW9kZV9hY2Nlc3MsZWxlbWVudGFyeV9tb2RlX2FjY2VzcylcCi0gICAgICAgICgoKGNvbXBvdW5kX21vZGVfYWNjZXNzKSYoZWxlbWVudGFyeV9tb2RlX2FjY2VzcykpPyAxOjApCi0KLQotdHlwZWRlZiBlbnVtIE00T1NBX0xhc3RTZWVrCi17Ci0gICBTZWVrTm9uZSwKLSAgIFNlZWtSZWFkLAotICAgU2Vla1dyaXRlCi19IE00T1NBX0xhc3RTZWVrOwotCi0vKiogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZmlsZSBjb250ZXh0Ki8KLXR5cGVkZWYgc3RydWN0IHsKLSAgIE00T1NBX1VJbnQzMiAgICAgICAgIGNvcmVJRF9yZWFkOwotICAgTTRPU0FfVUludDMyICAgICAgICAgY29yZUlEX3dyaXRlOwotICAgRklMRSogICAgICAgICAgICAgICAgZmlsZV9kZXNjOwotICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBVUkwgKi8KLSAgIE00T1NBX0NoYXIqICAgICAgICAgIHVybF9uYW1lOwotICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBmaWxlICovCi0gICBNNE9TQV9DaGFyKiAgICAgICAgICBmaWxlX25hbWU7Ci0gICAvKiogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZpbGUgKi8KLSAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgIGZpbGVfc2l6ZTsKLSAgIC8qKiBUaGUgZmlsZSBtb2RlIGFjY2VzcyB1c2VkIHRvIG9wZW4gdGhlIGZpbGUgKi8KLSAgIE00T1NBX0ZpbGVNb2RlQWNjZXNzIGFjY2Vzc19tb2RlOwotICAgTTRPU0FfTGFzdFNlZWsgICAgICAgY3VycmVudF9zZWVrOwotICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgcmVhZF9wb3NpdGlvbjsKLSAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgIHdyaXRlX3Bvc2l0aW9uOwotICAgTTRPU0FfQm9vbCAgICAgICAgICAgYl9pc19lbmRfb2ZfZmlsZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgIE00T1NBX0NvbnRleHQgICAgICAgIHNlbWFwaG9yZV9jb250ZXh0OwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotCi0gICAvKiBUaGVzZSB0d28gdmFyaWFibGVzIHdlcmUgYWRkZWQgdG8gbWFuYWdlIGNhc2Ugd2hlcmUgYSBmaWxlCi0gICAgKiBpcyBvcGVuZWQgaW4gcmVhZCBhbmQgd3JpdGUgbW9kZSB3aXRoIG9uZSBkZXNjcmlwdG9yICovCi0gICAgTTRPU0FfRGVzY3JNb2RlQWNjZXNzICAgIG1fRGVzY3JNb2RlQWNjZXNzOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlMb2NrTW9kZTsKLQotCi19IE00T1NBX0ZpbGVDb250ZXh0OwotCi0KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25PcGVuKE00T1NBX1VJbnQxNiBjb3JlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogVVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVNb2RlQWNjZXNzIGZpbGVNb2RlQWNjZXNzKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25DbG9zZShNNE9TQV9VSW50MTYgY29yZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZUF0dHJpYnV0ZSogYXR0cmlidXRlKTsKLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25HZXRVUkwoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqIHVybCk7Ci0KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWUoTTRPU0FfQ2hhciogdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogZmlsZW5hbWUpOwotCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vblNlZWsoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKTsKLQotI2lmZGVmIFVURl9DT05WRVJTSU9OCi1NNE9TQV9FUlIgTTRPU0FfVG9VVEY4X09TQUwgKE00T1NBX1ZvaWQgICAqcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAgKnBCdWZmZXJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqYnVmZmVyT3V0U2l6ZSk7Ci0jZW5kaWYgLypVVEZfQ09OVkVSU0lPTiovCi0KLQotI2VuZGlmIC8qTTRPU0FfRklMRUNPTU1PTl9QUklWX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyLmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMyMjc1NmQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXIuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgcmVhZGVyCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWNsYXJlcyBmdW5jdGlvbnMgYW5kIHR5cGVzIHRvIHJlYWQgYSBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVSRUFERVJfSAotI2RlZmluZSBNNE9TQV9GSUxFUkVBREVSX0gKLQotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVDb21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotCi0KLS8qKiBUaGlzIGVudW0gZGVmaW5lcyB0aGUgb3B0aW9uIElEIHRvIGJlIHVzZWQgaW4gTTRPU0FfRmlsZVJlYWRHZXRPcHRpb24oKQotICAgIGFuZCBNNE9TQV9GaWxlUmVhZFNldE9wdGlvbigpKi8KLXR5cGVkZWYgZW51bSBNNE9TQV9GaWxlUmVhZE9wdGlvbklECi17Ci0gICAvKiogR2V0IHRoZSBmaWxlIHNpemUgKE00T1NBX2Zwb3MqKSovCi0gICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfUkVBREVSLCAweDAxKSwKLQotICAgICAgLyoqIEdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIChNNE9TQV9GaWxlQXR0cmlidXRlKikqLwotICAgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZUF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfUkVBREVSLCAweDAyKSwKLQotICAgLyoqIEdldCB0aGUgZmlsZSBVUkwsIHByb3ZpZGVkIGJ5IHRoZSBNNE9TQV9GaWxlUmVhZE9wZW4gKE00T1NBX0NoYXIqKSovCi0gICBNNE9TQV9rRmlsZVJlYWRHZXRVUkwKLSAgICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1JFQURFUiwgMHgwMyksCi0KLSAgIC8qKiBHZXQgdGhlIGZpbGUgcG9zaXRpb24gKE00T1NBX2Zwb3MqKSovCi0gICBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb24KLSAgICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1JFQURFUiwgMHgwNCksCi0KLSAgIC8qKiBDaGVjayBlbmQgb2YgZmlsZTogVFJVRSBpZiB0aGUgRU9GIGhhcyBiZWVuIHJlYWNoZWQsIEZBTFNFIGVsc2UKLSAgICAgICAoTTRPU0FfQm9vbCopKi8KLSAgIE00T1NBX2tGaWxlUmVhZElzRU9GCi0gICAgICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9SRUFERVIsIDB4MDUpLAotCi0gICAvKiogQ2hlY2sgbG9jayBvZiBmaWxlICovCi0gICBNNE9TQV9rRmlsZVJlYWRMb2NrTW9kZQotICAgICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQURXUklURSwgTTRPU0FfRklMRV9SRUFERVIsIDB4MDYpCi0KLX0gTTRPU0FfRmlsZVJlYWRPcHRpb25JRDsKLQotCi0KLQotCi0vKiogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBzZXQgb2YgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYWNjZXNzIHRvIGEKLSAgICBmaWxlIGluIHJlYWQgbW9kZSovCi10eXBlZGVmIHN0cnVjdAotewotICAgTTRPU0FfRVJSICgqb3BlblJlYWQpICAgKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgTTRPU0FfRVJSICgqcmVhZERhdGEpICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBzaXplKTsKLQotICAgTTRPU0FfRVJSICgqc2VlaykgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci0KLSAgIE00T1NBX0VSUiAoKmNsb3NlUmVhZCkgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0gICBNNE9TQV9FUlIgKCpzZXRPcHRpb24pICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX0VSUiAoKmdldE9wdGlvbikgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICpvcHRpb25WYWx1ZSk7Ci19IE00T1NBX0ZpbGVSZWFkUG9pbnRlcjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3BlbiAgICAgICAgKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkRGF0YSAgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBzaXplKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2VlayAgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZENsb3NlICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24gICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAqb3B0aW9uVmFsdWUpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24gICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAgIC8qTTRPU0FfRklMRVJFQURFUl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfRmlsZVJlYWRlcl9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzI3YjA4Ni4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlUmVhZGVyX3ByaXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfcHJpdi5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIgcHJpdmF0ZSBmb3IgQW5kcm9pZAotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfRklMRVJFQURFUl9QUklWX0gKLSNkZWZpbmUgTTRPU0FfRklMRVJFQURFUl9QUklWX0gKLQotCi0vKiogVGhvc2UgZGVmaW5lIGVuYWJsZS9kaXNhYmxlIG9wdGlvbiBJRCovCi0KLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1NJWkUgICAgICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9BVFRSSUJVVEUgICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX1VSTCAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1BPU0lUSU9OICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9JU19FT0YgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRQotCi0jZW5kaWYgLypNNE9TQV9GSUxFUkVBREVSX1BSSVZfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWExMTMzMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlci5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgRmlsZSB3cml0ZXIKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgdHlwZXMgdG8gd3JpdGUgaW4gYSBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIE00T1NBX0ZJTEVXUklURVJfSAotI2RlZmluZSBNNE9TQV9GSUxFV1JJVEVSX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLQotLyoqIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBvcHRpb24gSUQgdG8gYmUgdXNlZCBpbiBNNE9TQV9GaWxlV3JpdGVHZXRPcHRpb24oKQotYW5kIE00T1NBX0ZpbGVXcml0ZVNldE9wdGlvbigpKi8KLXR5cGVkZWYgZW51bQotewotICAgLyoqIEdldCB0aGUgZmlsZSBVUkwsIHByb3ZpZGVkIGJ5IHRoZSBNNE9TQV9GaWxlV3JpdGVPcGVuIChNNE9TQV9DaGFyKikqLwotICAgTTRPU0Ffa0ZpbGVXcml0ZUdldFVSTAotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDAxKSwKLQotICAgLyoqIEdldCB0aGUgZmlsZSBhdHRyaWJ1dGVzIChNNE9TQV9GaWxlQXR0cmlidXRlKikqLwotICAgTTRPU0Ffa0ZpbGVXcml0ZUdldEF0dHJpYnV0ZQotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDAyKSwKLQotICAgLyoqIEdldCB0aGUgcmVhZGVyIGNvbnRleHQgZm9yIHJlYWQgJiB3cml0ZSBmaWxlLiAoTTRPU0FfQ29udGV4dCopKi8KLSAgIE00T1NBX2tGaWxlV3JpdGVHZXRSZWFkZXJDb250ZXh0Ci0gICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9XUklURVIsIDB4MDMpLAotCi0gICBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVBvc2l0aW9uCi0gICAgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRPU0FfRklMRV9XUklURVIsIDB4MDQpLAotCi0gICBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVNpemUKLSAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNE9TQV9GSUxFX1dSSVRFUiwgMHgwNSksCi0KLQotICAgIE00T1NBX2tGaWxlV3JpdGVMb2NrTW9kZQotICAgICAgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQURXUklURSwgTTRPU0FfRklMRV9XUklURVIsIDB4MDYpLAotCi0KLSAgIC8qKiBDaGVjayBsb2NrIG9mIGZpbGUgKi8KLSAgIE00T1NBX2tGaWxlV3JpdGVEZXNjTW9kZQotICAgICAgICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEV1JJVEUsIE00T1NBX0ZJTEVfV1JJVEVSLCAweDA3KQotfSBNNE9TQV9GaWxlV3JpdGVPcHRpb25JRDsKLQotCi0vKiogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBzZXQgb2YgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYWNjZXNzIHRvIGEgZmlsZQotICAgIGluIHJlYWQgbW9kZSovCi10eXBlZGVmIHN0cnVjdAotewotICAgTTRPU0FfRVJSICgqb3BlbldyaXRlKSAgIChNNE9TQV9Db250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBmaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgTTRPU0FfRVJSICgqd3JpdGVEYXRhKSAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKTsKLQotICAgTTRPU0FfRVJSICgqc2VlaykgICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbik7Ci0KLSAgIE00T1NBX0VSUiAoKkZsdXNoKSAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLSAgIE00T1NBX0VSUiAoKmNsb3NlV3JpdGUpICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLSAgIE00T1NBX0VSUiAoKnNldE9wdGlvbikgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX0VSUiAoKmdldE9wdGlvbikgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpOwotfSBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlcjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZU9wZW4gICAgICAgKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogZmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZURhdGEgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9NZW1BZGRyOCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplKTsKLQotLyogUGllcnJlIExlYmVhdXBpbiAyMDA4LzA0LzI5OiBXQVJOSU5HISB0aGUgZmVhdHVyZSBvZiBmaWxlKlNlZWsgd2hpY2ggcmV0dXJucwotdGhlIHBvc2l0aW9uIGluIHRoZSBmaWxlIChmcm9tIHRoZSBiZWdpbm5pbmcpIGFmdGVyIHRoZSBzZWVrIGluIHRoZSAicG9zaXRpb24iCi1wb2ludGVyIGhhcyBiZWVuIGZvdW5kIHRvIGJlIHVucmVsaWFibHkgKG9yIHNvbWV0aW1lcyBub3QgYXQgYWxsKSBpbXBsZW1lbnRlZAotaW4gc29tZSBPU0FMcywgc28gcmVseWluZyBvbiBpdCBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCwgdW5sZXNzIHlvdSByZWFsbHkgd2FudAotdG8gaGF2ZSBhIHBpenphIGV2ZW5pbmcuICovCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlU2VlayAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSBzZWVrTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBvc2l0aW9uKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUNsb3NlICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLU00T1NBTF9GSUxFX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVGbHVzaCAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi1NNE9TQUxfRklMRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIG9wdGlvblZhbHVlKTsKLQotTTRPU0FMX0ZJTEVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9GSUxFV1JJVEVSX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9GaWxlV3JpdGVyX3ByaXYuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXJfcHJpdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZDk3MmY0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX0ZpbGVXcml0ZXJfcHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlcl9wcml2LmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBGaWxlIHdyaXRlciBwcml2YXRlIGZvciBBbmRyb2lkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRPU0FfRklMRVdSSVRFUl9QUklWX0gKLSNkZWZpbmUgTTRPU0FfRklMRVdSSVRFUl9QUklWX0gKLQotCi0vKiogVGhvc2UgZGVmaW5lIGVuYWJsZS9kaXNhYmxlIG9wdGlvbiBJRCovCi0KLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9TSVpFICAgICAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfQVRUUklCVVRFICAgICAgICAgTTRPU0FfVFJVRQotI2RlZmluZSBNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9SRUFERVJfQ09OVEVYVCAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9QT1NJVElPTiAgICAgICAgICBNNE9TQV9UUlVFCi0jZGVmaW5lIE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1VSTCAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRQotCi0jZW5kaWYgLypNNE9TQV9GSUxFV1JJVEVSX1BSSVZfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX01lbW9yeS5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0ZDE1Y2MuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfTWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9NZW1vcnkuaAotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGZ1bmN0aW9uIHByb3RvdHlwZXMgdG8gYWxsb2NhdGUKLSAqICAgICAgICAgICAgICAgYW5kIGZyZWUgbWVtb3J5LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9NRU1PUllfSAotI2RlZmluZSBNNE9TQV9NRU1PUllfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiIC8qZm9yIE00T1NBX0NvcmVJRCBkZWZpbml0aW9uKi8KLQotdHlwZWRlZiBNNE9TQV9JbnQzMiogTTRPU0FfTWVtQWRkcjMyOwotdHlwZWRlZiBNNE9TQV9JbnQ4KiAgTTRPU0FfTWVtQWRkcjg7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9NRU1PUllfRVhQT1JUX1RZUEUgZXh0ZXJuIE00T1NBX01lbUFkZHIzMiBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgKE00T1NBX1VJbnQzMiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29yZUlEIGNvcmVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZyk7Ci0KLU00T1NBTF9NRU1PUllfRVhQT1JUX1RZUEUgZXh0ZXJuIE00T1NBX0VSUiBNNE9TQV9yYW5kSW5pdCh2b2lkKTsKLQotCi1NNE9TQUxfTUVNT1JZX0VYUE9SVF9UWVBFIGV4dGVybiBNNE9TQV9FUlIgTTRPU0FfcmFuZChNNE9TQV9JbnQzMiogb3V0X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG1heF92YWx1ZSk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX011dGV4LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9NdXRleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNDk2YmRkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX011dGV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9NdXRleC5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgbXV0ZXggQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfTVVURVhfSAotI2RlZmluZSBNNE9TQV9NVVRFWF9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0KLSNlbmRpZgotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX211dGV4T3BlbiggICAgTTRPU0FfQ29udGV4dCogY29udGV4dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfbXV0ZXhMb2NrKCAgICBNNE9TQV9Db250ZXh0ICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICAgdGltZW91dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfbXV0ZXhVbmxvY2soICBNNE9TQV9Db250ZXh0ICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9tdXRleENsb3NlKCAgIE00T1NBX0NvbnRleHQgIGNvbnRleHQgKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9NVVRFWF9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfT3B0aW9uSUQuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX09wdGlvbklELmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxYjkwNDQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfT3B0aW9uSUQuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgIE00T1NBX09wdGlvbklELmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBPcHRpb24gSUQgbWFjcm9zCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIG1hY3JvcyB0byBnZW5lcmF0ZSBhbmQgYW5hbHl6ZSBvcHRpb24gSUQuCi0gKiAgICAgICAgICAgICAgIE9wdGlvbiBJRCBpcyB1c2VkIGJ5IE00WVlZX1pac2V0T3B0aW9uKCkgYW5kCi0gKiAgICAgICAgICAgICAgIE00WVlZX1paZ2V0T3B0aW9uKCkgZnVuY3Rpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBNNE9TQV9PUFRJT05JRF9ICi0jZGVmaW5lIE00T1NBX09QVElPTklEX0gKLQotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotLyoqIE00T1NBX09wdGlvbklEIGlzIGEgMzIgYml0cyB1bnNpZ25lZCBpbnRlZ2VyLgotLSBSaWdodCBhY2Nlc3MgKDIgYml0cyk6IFNvbWUgb3B0aW9ucyBtYXkgaGF2ZSByZWFkIG9ubHksIHdyaXRlIG9ubHkgb3IgcmVhZAotICBhbmQgd3JpdGUgYWNjZXNzCi0tIENvcmUgSUQgKDE0IGJpdHMpOiBJdCBpcyBhIHVuaXF1ZSBJRCBmb3IgZWFjaCBjb3JlIGNvbXBvbmVudAotLSBTdWJPcHRpb24gSUQgKDE2IGJpdHMpOiBUbyBzZWxlY3Qgd2hpY2ggb3B0aW9uIGluIGEgc3BlY2lmaWMgY29yZSBjb21wb25lbnQKLSovCi10eXBlZGVmIE00T1NBX1VJbnQzMiBNNE9TQV9PcHRpb25JRDsKLXR5cGVkZWYgdm9pZCogICAgICAgIE00T1NBX0RhdGFPcHRpb247Ci0KLSNkZWZpbmUgTTRfUkVBRCAgICAgIDB4MDEKLSNkZWZpbmUgTTRfV1JJVEUgICAgIDB4MDIKLSNkZWZpbmUgTTRfUkVBRFdSSVRFIDB4MDMKLQotLyogTWFjcm8gdG8gcHJvY2VzcyBNNE9TQV9PcHRpb25JRCAqLwotCi0vKiogVGhpcyBtYWNybyBjcmVhdGVzIGFuIG9wdGlvbklEIGdpdmVuIHJlYWQvd3JpdGUgYWNjZXNzLAotICAgIGNvcmVJRCBhbmQgU3ViT3B0aW9uSUQqLwotI2RlZmluZSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKHJpZ2h0LCBjb3JlSUQsIGVycm9ySUQpXAotICAgKE00T1NBX0ludDMyKSgoKCgoKE00T1NBX1VJbnQzMilyaWdodCkmMHgwMyk8PDMwKSkrKCgoKE00T1NBX1VJbnQzMiljb3JlSUQpJjB4MDAzRkZGKTw8MTYpKygoKE00T1NBX1VJbnQzMillcnJvcklEKSYweDAwRkZGRikpCi0KLS8qKiBUaGlzIG1hY3JvIHNwbGl0cyBhbiBvcHRpb25JRCBpbnRvIHJlYWQvd3JpdGUgYWNjZXNzLAotICAgIGNvcmVJRCBhbmQgU3ViT3B0aW9uSUQqLwotI2RlZmluZSBNNE9TQV9PUFRJT05fSURfU1BMSVQob3B0aW9uSUQsIHJpZ2h0LCBjb3JlSUQsIGVycm9ySUQpXAotICAgeyByaWdodD0oTTRPU0FfVUludDgpKChvcHRpb25JRCk+PjMwKTtcCi0gICAgIGNvcmVJRD0oTTRPU0FfVUludDE2KSgoKG9wdGlvbklEKT4+MTYpJjB4MDAwMDNGRkYpO1wKLSAgICAgZXJyb3JJRD0oTTRPU0FfVUludDMyKSgob3B0aW9uSUQpJjB4MDAwMEZGRkYpOyB9Ci0KLS8qKiBUaGlzIG1hY3JvIHJldHVybnMgMSBpZiB0aGUgb3B0aW9uSUQgaXMgd3JpdGFibGUsIDAgb3RoZXJ3aXNlKi8KLSNkZWZpbmUgTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSAoKCgob3B0aW9uSUQpPj4zMCkmTTRfV1JJVEUpIT0wKQotCi0vKiogVGhpcyBtYWNybyByZXR1cm5zIDEgaWYgdGhlIG9wdGlvbklEIGlzIHJlYWRhYmxlLCAwIG90aGVyd2lzZSovCi0jZGVmaW5lIE00T1NBX09QVElPTl9JRF9JU19SRUFEQUJMRShvcHRpb25JRCkgKCgoKG9wdGlvbklEKT4+MzApJk00X1JFQUQpIT0wKQotCi0vKiogVGhpcyBtYWNybyByZXR1cm5zIDEgaWYgdGhlIG9wdGlvbklEIGhhcyBpdHMgY29yZSBJRCBlcXVhbCB0byAnY29yZUlEJywgMCBvdGhlcndpc2UqLwotI2RlZmluZSBNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBjb3JlSUQpXAotICAgKCgoKChvcHRpb25JRCk+PjE2KSYweDAwM0ZGRikgPT0gKGNvcmVJRCkpID8gTTRPU0FfVFJVRTpNNE9TQV9GQUxTRSkKLQotCi0jZW5kaWYgICAvKk00T1NBX09QVElPTklEX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9TZW1hcGhvcmUuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1NlbWFwaG9yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjMwNDU0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1NlbWFwaG9yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfU2VtYXBob3JlLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBzZW1hcGhvcmUgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX1NFTUFQSE9SRV9ICi0jZGVmaW5lIE00T1NBX1NFTUFQSE9SRV9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlT3BlbiggIE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAgIGluaXRpYWxOdW1iZXIgKTsKLQotCi1NNE9TQUxfUkVBTFRJTUVfRVhQT1JUX1RZUEUgTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZVBvc3QoICBNNE9TQV9Db250ZXh0ICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVXYWl0KCAgTTRPU0FfQ29udGV4dCAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgICAgdGltZW91dCApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlQ2xvc2UoIE00T1NBX0NvbnRleHQgIGNvbnRleHQgKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9TRU1BUEhPUkVfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZC5oIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhOTZhZmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVGhyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfVGhyZWFkLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICB0aHJlYWQgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpZm5kZWYgTTRPU0FfVEhSRUFEX0gKLSNkZWZpbmUgTTRPU0FfVEhSRUFEX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9PcHRpb25JRC5oIgotCi0KLS8qIERlZmluaXRpb24gb2YgY29tbW9uIGVycm9yIGNvZGVzICovCi0jZGVmaW5lIE00RVJSX1RIUkVBRF9OT1RfU1RBUlRFRCBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNE9TQV9USFJFQUQsMHgwMDAwMDEpCi0KLQotdHlwZWRlZiBlbnVtCi17Ci0gICBNNE9TQV9rVGhyZWFkT3BlbmVkICAgPSAweDEwMCwKLSAgIE00T1NBX2tUaHJlYWRTdGFydGluZyA9IDB4MjAwLAotICAgTTRPU0Ffa1RocmVhZFJ1bm5pbmcgID0gMHgzMDAsCi0gICBNNE9TQV9rVGhyZWFkU3RvcHBpbmcgPSAweDQwMCwKLSAgIE00T1NBX2tUaHJlYWRDbG9zZWQgID0gMHg1MDAKLX0gTTRPU0FfVGhyZWFkU3RhdGU7Ci0KLQotCi10eXBlZGVmIGVudW0KLXsKLSAgIE00T1NBX2tUaHJlYWRIaWdoZXN0UHJpb3JpdHkgID0gIDB4MDAwLAotICAgTTRPU0Ffa1RocmVhZEhpZ2hQcmlvcml0eSAgICAgPSAgMHgxMDAsCi0gICBNNE9TQV9rVGhyZWFkTm9ybWFsUHJpb3JpdHkgICA9ICAweDIwMCwKLSAgIE00T1NBX2tUaHJlYWRMb3dQcmlvcml0eSAgICAgID0gIDB4MzAwLAotICAgTTRPU0Ffa1RocmVhZExvd2VzdFByaW9yaXR5ICAgPSAgMHg0MDAKLX0gTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbDsKLQotCi0KLXR5cGVkZWYgZW51bQotewotICAgTTRPU0FfVGhyZWFkU3RhcnRlZAotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwMSksCi0KLSAgIE00T1NBX1RocmVhZFN0b3BwZWQKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDIpLAotCi0gICBNNE9TQV9UaHJlYWRQcmlvcml0eQotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwMyksCi0KLSAgIE00T1NBX1RocmVhZE5hbWUKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDQpLAotCi0gICBNNE9TQV9UaHJlYWRTdGFja1NpemUKLSAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEfE00X1dSSVRFLCBNNE9TQV9USFJFQUQsIDB4MDUpLAotCi0gICBNNE9TQV9UaHJlYWRVc2VyRGF0YQotICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUR8TTRfV1JJVEUsIE00T1NBX1RIUkVBRCwgMHgwNikKLQotfSBNNE9TQV9UaHJlYWRPcHRpb25JRDsKLQotCi0KLXR5cGVkZWYgTTRPU0FfRVJSICAoKk00T1NBX1RocmVhZERvSXQpKE00T1NBX1ZvaWQqKTsKLXR5cGVkZWYgTTRPU0FfVm9pZCAoKk00T1NBX1RocmVhZENhbGxCYWNrKShNNE9TQV9Db250ZXh0LCBNNE9TQV9Wb2lkKik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY09wZW4oICAgICBNNE9TQV9Db250ZXh0KiAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZERvSXQgICAgICBmdW5jICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU3RhcnQoICAgIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogICAgICAgICAgIHBhcmFtICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU3RvcCggICAgIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jQ2xvc2UoICAgIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0ICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGUoIE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkU3RhdGUqICAgIHN0YXRlICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTbGVlcCggICAgICAgIE00T1NBX1VJbnQzMiAgICAgICAgICB0aW1lICk7Ci0KLQotTTRPU0FMX1JFQUxUSU1FX0VYUE9SVF9UWVBFIE00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkT3B0aW9uSUQgIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gICAgICB2YWx1ZSApOwotCi0KLU00T1NBTF9SRUFMVElNRV9FWFBPUlRfVFlQRSBNNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbihNNE9TQV9Db250ZXh0ICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZE9wdGlvbklEICBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uKiAgICAgdmFsdWUgKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLypNNE9TQV9USFJFQURfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZF9wcml2LmggYi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaHJlYWRfcHJpdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDI0YjA1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RocmVhZF9wcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UaHJlYWRfcHJpdi5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgVGhyZWFkIHByaXZhdGUgZm9yIEFuZHJvaWQKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00T1NBX1RIUkVBRF9QUklWX0gKLSNkZWZpbmUgTTRPU0FfVEhSRUFEX1BSSVZfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0KLS8qIENvbnRleHQgZm9yIHRoZSB0aHJlYWQgKi8KLXR5cGVkZWYgc3RydWN0IE00T1NBX1RocmVhZENvbnRleHQgewotICAgTTRPU0FfVUludDMyIGNvcmVJRDsgICAgICAgICAgICAgICAgLyogdGhyZWFkIGNvbnRleHQgaWRlbnRpZmlhbnQgKi8KLSAgIHB0aHJlYWRfdCB0aHJlYWRJRDsgICAgICAgICAgICAgICAgIC8qIHRocmVhZCBpZGVudGlmaWVyLiAqLwotICAgTTRPU0FfQ2hhciogbmFtZTsgICAgICAgICAgICAgICAgICAgLyogdGhyZWFkIG5hbWUgKi8KLSAgIE00T1NBX1VJbnQzMiBzdGFja1NpemU7ICAgICAgICAgICAgIC8qIHRocmVhZCBzdGFja1NpemUgaW4gYnl0ZXMgKi8KLSAgIE00T1NBX1RocmVhZERvSXQgZnVuYzsgICAgICAgICAgICAgIC8qIHRocmVhZCBmdW5jdGlvbiAqLwotICAgTTRPU0FfVm9pZCogcGFyYW07ICAgICAgICAgICAgICAgICAgLyogdGhyZWFkIHBhcmFtZXRlciAqLwotLyoKLSAgIE00T1NBX1ZvaWQqIHVzZXJEYXRhOyAgICAgICAgICAgICAgIC8gKiB0aHJlYWQgdXNlciBkYXRhICogLwotKi8KLSAgIE00T1NBX1RocmVhZFN0YXRlIHN0YXRlOyAgICAgICAgICAgIC8qIHRocmVhZCBhdXRvbWF0b24gc3RhdGUgKi8KLSAgIE00T1NBX0NvbnRleHQgc3RhdGVNdXRleDsgICAgICAgICAgIC8qIG11dGV4IGZvciB0aHJlYWQgc3RhdGUgbWFuYWdlbWVudCAqLwotLyoKLSAgIE00T1NBX1RocmVhZENhbGxCYWNrIHN0YXJ0Q2FsbEJhY2s7IC8gKiBzdGFydGluZyB0aHJlYWQgY2FsbCBiYWNrICogLwotICAgTTRPU0FfVGhyZWFkQ2FsbEJhY2sgc3RvcENhbGxCYWNrOyAgLyAqIHN0b3BwaW5nIHRocmVhZCBjYWxsIGJhY2sgKiAvCi0qLwotICAgTTRPU0FfQ29udGV4dCBzZW1TdGFydFN0b3A7ICAgICAgICAgLyogc2VtYXBob3JlIGZvciBzdGFydCBhbmQgc3RvcCBkb19pdCAqLwotICAgTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbCBwcmlvcml0eTsgLyogdGhyZWFkIHByaW9yaXR5IGxldmVsICovCi19IE00T1NBX1RocmVhZENvbnRleHQgOwotCi0KLS8qKiBUaG9zZSBkZWZpbmUgZW5hYmxlL2Rpc2FibGUgb3B0aW9uIElEKi8KLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQVJURUQgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUT1BQRUQgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUgICAgICAgICAgICAgIE00T1NBX1RSVUUKLSNkZWZpbmUgTTRPU0FfT1BUSU9OSURfVEhSRUFEX1VTRVJfREFUQSAgICAgICAgIE00T1NBX1RSVUUKLQotI2VuZGlmIC8qTTRPU0FfVEhSRUFEX1BSSVZfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RpbWUuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1RpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjFmMjVlZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL2luYy9NNE9TQV9UaW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UaW1lLmgKLSAqIEBpbmdyb3VwICAgICAgT1NBTAotICogQGJyaWVmICAgICAgICBUaW1lIG1hY3JvcwotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aW1lIHR5cGUgYW5kIGFzc29jaWF0ZWQgbWFjcm9zIHdoaWNoIG11c3QKLSAqICAgICAgICAgICAgICAgYmUgdXNlZCB0byBtYW5pcHVsYXRlIHRpbWUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiAkSWQ6IE00T1NBX1RpbWUuaCx2IDEuMiAyMDA3LzAxLzA1IDEzOjEyOjIyIHRoZW5hdWx0IEV4cCAkICovCi0KLSNpZm5kZWYgTTRPU0FfVElNRV9ICi0jZGVmaW5lIE00T1NBX1RJTUVfSAotCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi0KLXR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyAgTTRPU0FfVGltZTsKLQotCi0vKiogVGhpcyBtYWNybyBzZXRzIHRoZSB1bmtub3duIHRpbWUgdmFsdWUgKi8KLQotI2RlZmluZSBNNE9TQV9USU1FX1VOS05PV04gMHg4MDAwMDAwMAotCi0vKiogVGhpcyBtYWNybyBjb252ZXJ0cyBhIHRpbWUgd2l0aCBhIHRpbWUgc2NhbGUgdG8gbWlsbGlzZWNvbmQuCi0gICAgVGhlIHJlc3VsdCBpcyBhIE00T1NBX0RvdWJsZSovCi0jZGVmaW5lIE00T1NBX1RJTUVfVE9fTVMocmVzdWx0LCB0aW1lLCB0aW1lc2NhbGUpXAotICAgICAgeyByZXN1bHQgPSAoMTAwMCooTTRPU0FfRG91YmxlKXRpbWUpLygoTTRPU0FfRG91YmxlKXRpbWVzY2FsZSk7IH0KLQotI2VuZGlmIC8qTTRPU0FfVElNRV9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jL000T1NBX1R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlMjU4YTAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMvTTRPU0FfVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UeXBlcy5oCi0gKiBAaW5ncm91cCAgICAgIE9TQUwKLSAqIEBicmllZiAgICAgICAgQWJzdHJhY3Rpb24gdHlwZXMgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIHJlZGVmaW5lcyBiYXNpYyB0eXBlcyB3aGljaCBtdXN0IGJlCi0gKiAgICAgICAgICAgICAgIHVzZWQgdG8gZGVjbGFyZSBhbnkgdmFyaWFibGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBNNE9TQV9UWVBFU19ICi0jZGVmaW5lIE00T1NBX1RZUEVTX0gKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJNNE9TQV9FeHBvcnQuaCIKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi10eXBlZGVmIGludDhfdCAgICAgTTRPU0FfQm9vbDsKLXR5cGVkZWYgdWludDhfdCAgICBNNE9TQV9VSW50ODsKLXR5cGVkZWYgaW50OF90ICAgICBNNE9TQV9JbnQ4OwotdHlwZWRlZiB1aW50MTZfdCAgIE00T1NBX1VJbnQxNjsKLXR5cGVkZWYgaW50MTZfdCAgICBNNE9TQV9JbnQxNjsKLXR5cGVkZWYgdWludDMyX3QgICBNNE9TQV9VSW50MzI7Ci10eXBlZGVmIGludDMyX3QgICAgTTRPU0FfSW50MzI7Ci0KLXR5cGVkZWYgc2lnbmVkIGNoYXIgICAgIE00T1NBX0NoYXI7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBNNE9TQV9VQ2hhcjsKLQotdHlwZWRlZiBkb3VibGUgICAgICAgICAgTTRPU0FfRG91YmxlOwotdHlwZWRlZiBmbG9hdCAgICAgICAgICAgTTRPU0FfRmxvYXQ7Ci0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgIE00T1NBX1dDaGFyOwotCi10eXBlZGVmIHZvaWQgICAgICAgICAgICBNNE9TQV9Wb2lkOwotCi0vKiBNaW4gJiBtYXggZGVmaW5pdGlvbnMqLwotI2RlZmluZSBNNE9TQV9VSU5UOF9NSU4gICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE00T1NBX1VJTlQ4X01BWCAgICAgICAgICAgICAgICAyNTUKLQotI2RlZmluZSBNNE9TQV9VSU5UMTZfTUlOICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE00T1NBX1VJTlQxNl9NQVggICAgICAgICAgICAgNjU1MzUKLQotI2RlZmluZSBNNE9TQV9VSU5UMzJfTUlOICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE00T1NBX1VJTlQzMl9NQVggICAgICAgIDB4RkZGRkZGRkYKLQotI2RlZmluZSBNNE9TQV9JTlQ4X01JTiAgICAgICAgICAgICAgICAtMTI4Ci0jZGVmaW5lIE00T1NBX0lOVDhfTUFYICAgICAgICAgICAgICAgICAxMjcKLQotI2RlZmluZSBNNE9TQV9JTlQxNl9NSU4gICAgICAgICAgICAgLTMyNzY4Ci0jZGVmaW5lIE00T1NBX0lOVDE2X01BWCAgICAgICAgICAgICAgMzI3NjcKLQotI2RlZmluZSBNNE9TQV9JTlQzMl9NSU4gICAgICAgKC0weDdGRkZGRkZGLTEpCi0jZGVmaW5lIE00T1NBX0lOVDMyX01BWCAgICAgICAgIDB4N0ZGRkZGRkYKLQotI2RlZmluZSBNNE9TQV9DSEFSX01JTiAgICAgICAgICAgICAgICAtMTI4Ci0jZGVmaW5lIE00T1NBX0NIQVJfTUFYICAgICAgICAgICAgICAgICAxMjcKLQotI2RlZmluZSBNNE9TQV9VQ0hBUl9NSU4gICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE00T1NBX1VDSEFSX01BWCAgICAgICAgICAgICAgICAyNTUKLQotI2RlZmluZSBNNE9TQV9OVUxMICAgICAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBNNE9TQV9UUlVFICAgICAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBNNE9TQV9GQUxTRSAgICAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBNNE9TQV9XQUlUX0ZPUkVWRVIgICAgICAgMHhmZmZmZmZmZgotCi0jZGVmaW5lIE00T1NBX0NPTlNUICAgICAgICAgICAgICAgICAgIGNvbnN0Ci0jZGVmaW5lIE00T1NBX0lOTElORSAgICAgICAgICAgICAgICAgaW5saW5lCi0KLS8qIFJvbGxvdmVyIG9mZnNldCBvZiB0aGUgY2xvY2sgKi8KLS8qIFRoaXMgdmFsdWUgbXVzdCBiZSB0aGUgb25lIG9mIE00T1NBX2Nsb2NrR2V0VGltZSAqLwotI2RlZmluZSBNNE9TQV9DTE9DS19ST0xMT1ZFUiAgICAgICAgICAgTTRPU0FfSU5UMzJfTUFYCi0KLXR5cGVkZWYgdm9pZCogICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dDsKLQotLyoqIEl0IGlzIGEgdW5pcXVlIElEIGZvciBlYWNoIGNvcmUgY29tcG9uZW50Ki8KLXR5cGVkZWYgIE00T1NBX1VJbnQxNiBNNE9TQV9Db3JlSUQ7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKk00T1NBX1RZUEVTX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGYzOGIwYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGlidmlkZW9lZGl0b3Jfb3NhbAotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFOj0gbGlidmlkZW9lZGl0b3Jfb3NhbAotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICBcCi0gICAgTTRPU0FfQ2hhclN0YXIuYyBcCi0gICAgTTRPU0FfQ2xvY2suYyBcCi0gICAgTTRPU0FfRmlsZUNvbW1vbi5jIFwKLSAgICBNNE9TQV9GaWxlUmVhZGVyLmMgXAotICAgIE00T1NBX0ZpbGVXcml0ZXIuYyBcCi0gICAgTTRPU0FfTXV0ZXguYyBcCi0gICAgTTRPU0FfUmFuZG9tLmMgXAotICAgIE00T1NBX1NlbWFwaG9yZS5jIFwKLSAgICBNNE9TQV9UaHJlYWQuYyBcCi0gICAgTTRQU1dfRGVidWdUcmFjZS5jIFwKLSAgICBNNFBTV19NZW1vcnlJbnRlcmZhY2UuYyBcCi0gICAgTTRQU1dfVHJhY2UuYyBcCi0gICAgTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5jCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYmxvZwotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYyBcCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLQotIyBBbGwgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgd2UgbGluayBhZ2FpbnN0LgotTE9DQUxfTERMSUJTIDo9IFwKLSAgICAtbHB0aHJlYWQgLWxkbAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgXAotICAgIC1EX19BTkRST0lEX18gXAotICAgIC1ETTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfQ09ERUNTIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9BVURJT0RFQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfVklERU9ERUMgXAotICAgIC1EVVNFX1NUQUdFRlJJR0hUX0FVRElPRU5DIFwKLSAgICAtRFVTRV9TVEFHRUZSSUdIVF9WSURFT0VOQyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfUkVBREVSUyBcCi0gICAgLURVU0VfU1RBR0VGUklHSFRfM0dQUF9SRUFERVIKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTFZPU0FfRmlsZVJlYWRlcl9vcHRpbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMTFlMDA4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL0xWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyX29wdGltLmMKLSAqIEBicmllZgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBmaWxlc3lzdGVtIGFjY2VzcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqIEFkZGl0aW9uIG9mIFRyYWNlIElEICoqLwotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLSNpZmRlZiBNNFRSQUNFX0lECi0jdW5kZWYgTTRUUkFDRV9JRAotI2VuZGlmCi0jZGVmaW5lIE00VFJBQ0VfSUQgICAgTTRPU0FfRklMRV9SRUFERVIKLQotCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbi5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLQotI2luY2x1ZGUgIkxWT1NBX0ZpbGVSZWFkZXJfb3B0aW0uaCIKLQotI2RlZmluZSBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSNpZm5kZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgI2luY2x1ZGUgIk00T1NBX0ZpbGVBY2Nlc3MuaCIKLSNlbmRpZgotCi0jZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcikgaWYgKChwb2ludGVyKSA9PSBNNE9TQV9OVUxMKSByZXR1cm4gKHJldHZhbCk7Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRmlsZSByZWFkZXIgY2FjaGUgYnVmZmVycyBwYXJhbWV0ZXJzIChzaXplLCBudW1iZXIgb2YgYnVmZmVycywgZXRjKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRPU0FfUkVBREJVRkZFUl9TSVpFICAgIDEwMjQqMTYKLSNkZWZpbmUgTTRPU0FfUkVBREJVRkZFUl9OQiAgICAgICAgMgotI2RlZmluZSBNNE9TQV9SRUFEQlVGRkVSX05PTkUgICAgLTEKLSNkZWZpbmUgTTRPU0FfRU9GICAgICAgICAgICAgICAgLTEKLQotI2RlZmluZSBNQVhfRklMTFNfU0lOQ0VfTEFTVF9BQ0NFU1MgICAgTTRPU0FfUkVBREJVRkZFUl9OQioyCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyCi0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgRmlsZSByZWFkZXIgQnVmZmVycyBjb250ZXh0IChwcml2YXRlKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfTWVtQWRkcjggICAgICBkYXRhOyAgICAgICAgLyoqPCBidWZmZXIgZGF0YSAqLwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgc2l6ZTsgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgYnVmZmVyICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBmaWxlcG9zOyAgICAvKio8IHBvc2l0aW9uIGluIHRoZSBmaWxlIHdoZXJlIHRoZSBidWZmZXIgc3RhcnRzICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICByZW1haW47ICAgICAgICAvKio8IGRhdGEgYW1vdW50IG5vdCBhbHJlYWR5IGNvcGllZCBmcm9tIGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbmJGaWxsU2luY2VMYXN0QWNlc3M7ICAgIC8qKjwgVG8ga25vdyBzaW5jZSBob3cgbWFueSB0aW1lIHdlIGRpZG4ndCB1c2UgdGhpcyBidWZmZXIgKi8KLX0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJfb3B0aW07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dAotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIEZpbGUgcmVhZGVyIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIEZpbGUgUmVhZGVyIGNhbGxzIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBJc09wZW5lZDsgICAgICAgLyoqPCBNaWNybyBzdGF0ZSBtYWNoaW5lICovCi0gICAgTTRPU0FfRmlsZUF0dHJpYnV0ZSAgICAgRmlsZUF0dHJpYnV0ZTsgIC8qKjwgT3BlbmluZyBtb2RlICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICAgICAgcmVhZEZpbGVQb3M7ICAgIC8qKjwgRWZmZWN0aXZlIHBvc2l0aW9uIG9mIHRoZSBHRkwgcmVhZCBwb2ludGVyICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICAgICAgYWJzb2x1dGVQb3M7ICAgIC8qKjwgVmlydHVhbCBwb3NpdGlvbiBmb3IgbmV4dCByZWFkaW5nICovCi0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgICAgICAgZmlsZVNpemU7ICAgICAgICAvKio8IFNpemUgb2YgdGhlIGZpbGUgKi8KLQotICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyX29wdGltIGJ1ZmZlcltNNE9TQV9SRUFEQlVGRkVSX05CXTsgIC8qKjwgUmVhZCBidWZmZXJzICovCi0KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICBhRmlsZURlc2M7ICAvKio8IEZpbGUgZGVzY3JpcHRvciAqLwotCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgRlM7ICAgICAgICAgICAgLyoqPCBGaWxlc3lzdGVtIGludGVyZmFjZSAqLwotI2Vsc2UKLSAgICBNNE9TQV9GaWxlU3lzdGVtX0ZjdFB0ciAqRlM7ICAgICAgICAvKio8IEZpbGVzeXN0ZW0gaW50ZXJmYWNlICovCi0jZW5kaWYKLQotfSBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW07Ci0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgICBHbG9iYWwgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIGxvdyBsZXZlbCByZWFkIGFjY2VzcyAgICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotc3RhdGljIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogZ3ZfTlhQU1dfUkVBRE9QVF9sb3dMZXZlbEZ1bmN0aW9uczsKLQotTTRPU0FfRVJSIE5YUFNXX0ZpbGVSZWFkZXJPcHRpbV9pbml0KE00T1NBX1ZvaWQgKmxvd0xldmVsX2Z1bmN0aW9uUG9pbnRlcnMsIE00T1NBX1ZvaWQgKm9wdGltaXplZF9mdW5jdGlvblBvaW50ZXJzKQotewotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogbG93TGV2ZWxfZnAgID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopIGxvd0xldmVsX2Z1bmN0aW9uUG9pbnRlcnM7Ci0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBvcHRpbWl6ZWRfZnAgPSAoTTRPU0FfRmlsZVJlYWRQb2ludGVyKikgb3B0aW1pemVkX2Z1bmN0aW9uUG9pbnRlcnM7Ci0KLSAgICAvL1NldCB0aGUgb3B0aW1pemVkIGZ1bmN0aW9ucywgdG8gYmUgY2FsbGVkIGJ5IHRoZSB1c2VyCi0gICAgb3B0aW1pemVkX2ZwLT5vcGVuUmVhZCAgPSBNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5yZWFkRGF0YSAgPSBNNE9TQV9maWxlUmVhZERhdGFfb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5zZWVrICAgICAgPSBNNE9TQV9maWxlUmVhZFNlZWtfb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5jbG9zZVJlYWQgPSBNNE9TQV9maWxlUmVhZENsb3NlX29wdGltOwotICAgIG9wdGltaXplZF9mcC0+c2V0T3B0aW9uID0gTTRPU0FfZmlsZVJlYWRTZXRPcHRpb25fb3B0aW07Ci0gICAgb3B0aW1pemVkX2ZwLT5nZXRPcHRpb24gPSBNNE9TQV9maWxlUmVhZEdldE9wdGlvbl9vcHRpbTsKLQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOWFBTV19GaWxlUmVhZGVyT3B0aW1fY2xlYW5VcCgpCi17Ci0KLSAgICBndl9OWFBTV19SRUFET1BUX2xvd0xldmVsRnVuY3Rpb25zID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLU00T1NBX0VSUiBOWFBTV19GaWxlUmVhZGVyT3B0aW1fZ2V0TG93TGV2ZWxGdW5jdGlvbnMoTTRPU0FfVm9pZCAqKkZTKQotewotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlcioqIHBGdW5jdGlvbnNQb2ludGVyID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlcioqKSBGUzsKLSAgICAqcEZ1bmN0aW9uc1BvaW50ZXIgPSBndl9OWFBTV19SRUFET1BUX2xvd0xldmVsRnVuY3Rpb25zOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgICAgICAgQnVmZmVyIGhhbmRsaW5nIGZ1bmN0aW9ucyBmb3IgUmVhZCBhY2Nlc3MgICAgICAgICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVySW5pdChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9VSW50OCBpOwotCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IDA7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgPSAwOwotICAgICAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5yZW1haW4gPSAwOwotICAgIH0KLQotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSA9IChNNE9TQV9NZW1BZGRyOCkgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00T1NBX1JFQURCVUZGRVJfU0laRSwgCi0gICAgICAgICAgICBNNE9TQV9GSUxFX1JFQURFUiwgKE00T1NBX0NoYXIgKikiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJJbml0Iik7Ci0gICAgICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0FMTE9DLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfVm9pZCBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZyZWUoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfSW50OCBpOwotCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLmRhdGEgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIGZyZWUoYXBDb250ZXh0LT5idWZmZXJbaV0uZGF0YSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0ZpbGVQb3NpdGlvbiBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckNvcHkoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggaSwgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHNpemUsIE00T1NBX01lbUFkZHI4IHBEYXRhKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBjb3B5c2l6ZTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gb2Zmc2V0OwotCi0gICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9PSBNNE9TQV9FT0YpIHJldHVybiBNNE9TQV9FT0Y7Ci0KLSAgICBpZiggICAocG9zIDwgYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcykKLSAgICAgICB8fCAocG9zID4gKGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MgKyBhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplIC0gMSkpICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOyAvKiBub3RoaW5nIGNvcGllZCAqLwotICAgIH0KLQotICAgIG9mZnNldCA9IHBvcyAtIGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3M7Ci0KLSAgICBjb3B5c2l6ZSA9IGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgLSBvZmZzZXQ7Ci0gICAgY29weXNpemUgPSAoc2l6ZSA8IGNvcHlzaXplKSA/IHNpemUgOiBjb3B5c2l6ZTsKLQotICAgIG1lbWNweSgodm9pZCAqKXBEYXRhLCAodm9pZCAqKShhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhICsgb2Zmc2V0KSwgY29weXNpemUpOwotCi0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluIC09IGNvcHlzaXplOwotICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzID0gMDsKLQotICAgIHJldHVybiBjb3B5c2l6ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggaSwgTTRPU0FfRmlsZVBvc2l0aW9uIHBvcykKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgIGdyaWRQb3M7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICAgIHRlbXBQb3M7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICBidWZmZXJTaXplOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgZGlmZjsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgIHNpemU7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSICAgICAgICAgICAgIGVycm5vID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICBmaWxlUmVhZFNpemUgPSAwOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgICAgZmlsZVNlZWtQb3NpdGlvbiA9IDA7Ci0jZWxzZQotICAgIE00T1NBX0ludDMyICAgICAgICAgcmV0X3ZhbDsKLSAgICBNNE9TQV9VSW50MTYgICAgICAgICBlcnJubzsKLSNlbmRpZgotCi0gICAgTTRPU0FfVFJBQ0UzXzQoIkJ1ZmZlckZpbGwgIGkgPSAlZCAgcG9zID0gJWxkICByZWFkID0gJWxkICBvbGQgPSAlbGQiLCBpLCBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zLCBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zKTsKLQotICAgIC8qIEF2b2lkIGN5Y2xpbmcgc3RhdGVtZW50IGJlY2F1c2Ugb2YgRU9GICovCi0gICAgaWYocG9zID49IGFwQ29udGV4dC0+ZmlsZVNpemUpCi0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotCi0gICAgLyogUmVsb2NhdGUgdG8gYWJzb2x1dGUgcG9zdGlvbiBpZiBuZWNlc3NhcnkgKi8KLSAgICBidWZmZXJTaXplID0gTTRPU0FfUkVBREJVRkZFUl9TSVpFOwotICAgIHRlbXBQb3MgPSAoTTRPU0FfRmlsZVBvc2l0aW9uKSAocG9zIC8gYnVmZmVyU2l6ZSk7Ci0gICAgZ3JpZFBvcyA9IHRlbXBQb3MgKiBNNE9TQV9SRUFEQlVGRkVSX1NJWkU7Ci0gICAgZGlmZiA9IGdyaWRQb3MgLSBhcENvbnRleHQtPnJlYWRGaWxlUG9zOwotCi0gICAgaWYoZGlmZiAhPSAwKQotICAgIHsKLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICAgICAgZmlsZVNlZWtQb3NpdGlvbiA9IGRpZmY7Ci0gICAgICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+c2VlayhhcENvbnRleHQtPmFGaWxlRGVzYywgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlU2Vla1Bvc2l0aW9uKTsKLSAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGdyaWRQb3M7Ci0KLSAgICAgICAgaWYoTTROT19FUlJPUiAhPSBlcnJubykKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gZXJybm87Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotI2Vsc2UKLSAgICAgICAgcmV0X3ZhbCA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfU2VlayhhcENvbnRleHQtPmFGaWxlRGVzYywgZGlmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwgJmVycm5vKTsKLSAgICAgICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGdyaWRQb3M7Ci0KLSAgICAgICAgaWYocmV0X3ZhbCAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVycm5vKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMSA9IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGKi8KLSAgICB9Ci0KLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5maWxlcG9zID0gYXBDb250ZXh0LT5yZWFkRmlsZVBvczsKLQotICAgIC8qIFJlYWQgRGF0YSAqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIGZpbGVSZWFkU2l6ZSA9IE00T1NBX1JFQURCVUZGRVJfU0laRTsKLSAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPnJlYWREYXRhKGFwQ29udGV4dC0+YUZpbGVEZXNjLAotICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhLCAmZmlsZVJlYWRTaXplKTsKLQotICAgIHNpemUgPSAoTTRPU0FfRmlsZVBvc2l0aW9uKWZpbGVSZWFkU2l6ZTsKLSAgICBpZiAoKE00Tk9fRVJST1IgIT0gZXJybm8pJiYoTTRXQVJfTk9fREFUQV9ZRVQgIT0gZXJybm8pKQotICAgIHsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IE00T1NBX0VPRjsKLSAgICAgICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID0gMDsKLQotICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIyID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotI2Vsc2UKLSAgICBzaXplID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9SZWFkKGFwQ29udGV4dC0+YUZpbGVEZXNjLAotICAgICAgICAoTTRPU0FfVUludDggKilhcENvbnRleHQtPmJ1ZmZlcltpXS5kYXRhLCBNNE9TQV9SRUFEQlVGRkVSX1NJWkUsICZlcnJubyk7Ci0gICAgaWYoc2l6ZSA9PSAtMSkKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPSBNNE9TQV9FT0Y7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLnJlbWFpbiA9IDA7Ci0KLSAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgRVJSMiA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSNlbmRpZgotCi0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA9IHNpemU7Ci0gICAgYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID0gc2l6ZTsKLSAgICBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzcyA9IDA7Ci0KLSAgICAvKiBSZXRyaWV2ZSBjdXJyZW50IHBvc2l0aW9uICovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgZXJybm8gPSBhcENvbnRleHQtPkZTLT5nZXRPcHRpb24oYXBDb250ZXh0LT5hRmlsZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKikgJmFwQ29udGV4dC0+cmVhZEZpbGVQb3MpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJybm8pCi0gICAgewotICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbCBFUlIzID0gMHgleCIsIGVycik7Ci0gICAgfQotICAgIGVsc2UgaWYoICAgKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPj0gMCkKLSAgICAgICAmJiAoYXBDb250ZXh0LT5idWZmZXJbaV0uc2l6ZSA8IE00T1NBX1JFQURCVUZGRVJfU0laRSkgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlckZpbGwgcmV0dXJucyBOTyBEQVRBIFlFVCIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSNlbHNlCi0gICAgYXBDb250ZXh0LT5yZWFkRmlsZVBvcyA9IGFwQ29udGV4dC0+RlMtPnBGY3RQdHJfVGVsbChhcENvbnRleHQtPmFGaWxlRGVzYywgJmVycm5vKTsKLQotICAgIGlmKCAgIChhcENvbnRleHQtPmJ1ZmZlcltpXS5zaXplID49IDApCi0gICAgICAgJiYgKGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUgPCBNNE9TQV9SRUFEQlVGRkVSX1NJWkUpICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGaWxsIEVSUjMgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotCi0gICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfSW50OCBNNE9TQV9GaWxlUmVhZGVyX0J1ZmZlck1hdGNoKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSogYXBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBwb3MpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfSW50OCBpOwotCi0KLSAgICAvKiBTZWxlY3QgdGhlIGJ1ZmZlciB3aGljaCBtYXRjaGVzIHdpdGggZ2l2ZW4gcG9zICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBpZiggICAocG9zID49IGFwQ29udGV4dC0+YnVmZmVyW2ldLmZpbGVwb3MpCi0gICAgICAgICAgICYmIChwb3MgPCAoYXBDb250ZXh0LT5idWZmZXJbaV0uZmlsZXBvcyArIGFwQ29udGV4dC0+YnVmZmVyW2ldLnNpemUpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBNNE9TQV9SRUFEQlVGRkVSX05PTkU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0ludDggTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJTZWxlY3QoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggY3VycmVudF9pKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0ludDggaSxqOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBtaW5fYW1vdW50LG1heF9hbW91bnQ7Ci0gICAgTTRPU0FfSW50OCBtaW5faSxtYXhfY291bnQ7Ci0KLSAgICAvKiB1cGRhdGUgbmJGaWxsU2luY2VMYXN0QWNlc3MgZmllbGQgKi8KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzICsrOwotICAgIH0KLQotICAgIC8qIFBsYW4gQSA6IFNjYW4gZm9yIGVtcHR5IGJ1ZmZlciAqLwotICAgIGZvcihpPTA7IGk8TTRPU0FfUkVBREJVRkZFUl9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYoYXBDb250ZXh0LT5idWZmZXJbaV0ucmVtYWluID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbWF4X2NvdW50ID0gTTRPU0FfUkVBREJVRkZFUl9OQjsKLSAgICBtYXhfYW1vdW50ID0gTUFYX0ZJTExTX1NJTkNFX0xBU1RfQUNDRVNTOwotCi0gICAgLyogUGxhbiBCIDogU2NhbiBmb3IgZGVhZCBidWZmZXIgKi8KLSAgICBmb3IoaT0wOyBpPE00T1NBX1JFQURCVUZGRVJfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2ldLm5iRmlsbFNpbmNlTGFzdEFjZXNzID49IChNNE9TQV9VSW50MzIpIG1heF9hbW91bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heF9hbW91bnQgPSBhcENvbnRleHQtPmJ1ZmZlcltpXS5uYkZpbGxTaW5jZUxhc3RBY2VzczsKLSAgICAgICAgICAgIG1heF9jb3VudCA9IGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYobWF4X2NvdW50PE00T1NBX1JFQURCVUZGRVJfTkIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMigiREVBRCBCVUZGRVI6ICVkLCAlZCIsbWF4X2NvdW50LGFwQ29udGV4dC0+YnVmZmVyW21heF9jb3VudF0ubmJGaWxsU2luY2VMYXN0QWNlc3MpOwotICAgICAgICByZXR1cm4gbWF4X2NvdW50OwotICAgIH0KLQotICAgIG1pbl9pID0gY3VycmVudF9pOwotICAgIG1pbl9hbW91bnQgPSBNNE9TQV9SRUFEQlVGRkVSX1NJWkU7Ci0KLSAgICAvKiBTZWxlY3QgdGhlIGJ1ZmZlciB3aGljaCBpcyB0aGUgbW9zdCAiZW1wdHkiICovCi0gICAgZm9yKGk9MDsgaTxNNE9TQV9SRUFEQlVGRkVSX05COyBpKyspCi0gICAgewotICAgICAgICBqID0gKGkrY3VycmVudF9pKSVNNE9TQV9SRUFEQlVGRkVSX05COwotCi0gICAgICAgIGlmKGFwQ29udGV4dC0+YnVmZmVyW2pdLnJlbWFpbiA8IG1pbl9hbW91bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbl9hbW91bnQgPSBhcENvbnRleHQtPmJ1ZmZlcltqXS5yZW1haW47Ci0gICAgICAgICAgICBtaW5faSA9IGo7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbWluX2k7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZShNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIE00T1NBX0VSUiAgICAgICAgICAgIGVycm5vID0gTTROT19FUlJPUjsKLSNlbHNlCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgcmV0X3ZhbDsKLSAgICBNNE9TQV9VSW50MTYgICAgICAgICBlcnJubzsKLSNlbmRpZgotCi0gICAgLyogZ28gdG8gdGhlIGVuZCBvZiBmaWxlKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPmdldE9wdGlvbihhcENvbnRleHQtPmFGaWxlRGVzYywgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24qKSAmYXBDb250ZXh0LT5maWxlU2l6ZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJybm8pCi0gICAgewotICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZSBFUlIgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0jZWxzZQotICAgIHJldF92YWwgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX1NlZWsoYXBDb250ZXh0LT5hRmlsZURlc2MsIDAsIE00T1NBX2tGaWxlU2Vla0VuZCwgJmVycm5vKTsKLQotICAgIGlmIChyZXRfdmFsICE9IDApCi0gICAgewotICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gTTRPU0FfRU9GOwotICAgICAgICBlcnIgPSBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRPU0FfRklMRV9SRUFERVIsIGVycm5vKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZSBFUlIgPSAweCV4IiwgZXJyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUmV0cmlldmUgc2l6ZSBvZiB0aGUgZmlsZSAqLwotICAgICAgICBhcENvbnRleHQtPmZpbGVTaXplID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9UZWxsKGFwQ29udGV4dC0+YUZpbGVEZXNjLCAmZXJybm8pOwotICAgICAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gYXBDb250ZXh0LT5maWxlU2l6ZTsKLSAgICB9Ci0jZW5kaWYgLypNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgICAgICAgICAgICAgICAgICAgT1NBTCBmaWxlc3lzdGVtIEFQSSAgICAgICAgICAgICAgICAgICAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIG1ldGhvZCBvcGVucyB0aGUgcHJvdmlkZWQgZmlsZURlc2NyaXB0b3IgYW5kIHJldHVybnMgaXRzIGNvbnRleHQuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKE9VVCkgRmlsZSByZWFkZXIgY29udGV4dC4KLSogQHBhcmFtICAgICAgIHBGaWxlRGVzY3JpcHRvciA6ICAgICAgIChJTikgRmlsZSBEZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCBmaWxlLgotKiBAcGFyYW0gICAgICAgRmlsZU1vZGVBY2Nlc3MgOiAgICAgICAgKElOKSBGaWxlIG1vZGUgYWNjZXNzLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiBwQ29udGV4dCBvciBmaWxlRGVzY3JpcHRvciBpcyBOVUxMCi0qIEByZXR1cm4gICAgICBNNEVSUl9BTExPQyAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qIEByZXR1cm4gICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUyAgICAgIHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0IChpdCBtdXN0IGJlIGVpdGhlciBpc1RleHRNb2RlIG9yIHJlYWQpCi0qIEByZXR1cm4gICAgICBNNEVSUl9GSUxFX05PVF9GT1VORCBUaGUgZmlsZSBjYW4gbm90IGJlIG9wZW5lZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEZpbGVNb2RlQWNjZXNzKQotI2Vsc2UKLSAgICBNNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEZpbGVNb2RlQWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVN5c3RlbV9GY3RQdHIgKkZTKQotI2VuZGlmCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgTTRPU0FfRVJSICAgZXJyICAgICAgID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9Wb2lkKiBhRmlsZURlc2MgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0Jvb2wgIGJ1ZmZlcnNfYWxsb2NhdGVkID0gTTRPU0FfRkFMU0U7Ci0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgTTRPU0FfRVJSIGVycm5vID0gTTROT19FUlJPUjsKLSNlbHNlCi0gICAgTTRPU0FfVUludDE2IGVycm5vOwotI2VuZGlmIC8qTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGKi8KLQotICAgIE00T1NBX1RSQUNFMl8zKCJNNE9TQV9maWxlUmVhZE9wZW5fb3B0aW0gcCA9IDB4JXAgZmQgPSAlcyBtb2RlID0gJWx1IiwgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZURlc2NyaXB0b3IsIEZpbGVNb2RlQWNjZXNzKTsKLQotICAgIC8qICAgICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcENvbnRleHQpOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX1BBUkFNRVRFUiwgcEZpbGVEZXNjcmlwdG9yKTsKLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiAgICAgIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIEZpbGUgcmVhZGVyIGNvbnRleHQuICovCi0gICAgYXBDb250ZXh0ID0gKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRklMRV9SRUFERVIsIChNNE9TQV9DaGFyICopIk00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSIpOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQUxMT0MsIGFwQ29udGV4dCk7Ci0KLSAgICAvKiBTZXQgZmlsZXN5c3RlbSBpbnRlcmZhY2UgKi8KLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLQotICAgIC8qU2V0IHRoZSBvcHRpbWl6ZWQgZnVuY3Rpb25zLCB0byBiZSBjYWxsZWQgYnkgdGhlIHVzZXIqLwotCi0gICAgYXBDb250ZXh0LT5GUyA9IChNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX0ZpbGVSZWFkUG9pbnRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GSUxFX1JFQURFUiwgKE00T1NBX0NoYXIgKikiTTRPU0FfRmlsZVJlYWRlck9wdGltX2luaXQiKTsKLSAgICBpZiAoTTRPU0FfTlVMTD09YXBDb250ZXh0LT5GUykKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE9TQV9GaWxlUmVhZGVyT3B0aW1faW5pdCAtIEVSUk9SIDogYWxsb2NhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBhcENvbnRleHQtPkZTLT5vcGVuUmVhZCAgPSBNNE9TQV9maWxlUmVhZE9wZW47Ci0gICAgYXBDb250ZXh0LT5GUy0+cmVhZERhdGEgID0gTTRPU0FfZmlsZVJlYWREYXRhOwotICAgIGFwQ29udGV4dC0+RlMtPnNlZWsgICAgICA9IE00T1NBX2ZpbGVSZWFkU2VlazsKLSAgICBhcENvbnRleHQtPkZTLT5jbG9zZVJlYWQgPSBNNE9TQV9maWxlUmVhZENsb3NlOwotICAgIGFwQ29udGV4dC0+RlMtPnNldE9wdGlvbiA9IE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uOwotICAgIGFwQ29udGV4dC0+RlMtPmdldE9wdGlvbiA9IE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uOwotI2Vsc2UKLSAgICBhcENvbnRleHQtPkZTID0gRlM7Ci0jZW5kaWYKLQotICAgIC8qIFZlcmlmeSBhY2Nlc3MgbW9kZSAqLwotICAgIGlmICggICAoKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpICE9IDApCi0gICAgICAgIHx8ICgoRmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpID09IDApKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICAvKiBPcGVuIGZpbGUgaW4gcmVhZCBtb2RlICovCi0gICAgaWYoKEZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVDcmVhdGUpICE9IDApCi0gICAgewotICAgICAgICBlcnIgPSBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKChGaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZpbGUgaXMgb3BlbmVkIGluIHJlYWQgb25seSovCi0jaWZkZWYgTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGCi0gICAgICAgICAgICBlcnJubyA9IGFwQ29udGV4dC0+RlMtPm9wZW5SZWFkKCZhRmlsZURlc2MsIHBGaWxlRGVzY3JpcHRvciwgRmlsZU1vZGVBY2Nlc3MpOwotCi0gICAgICAgICAgICBpZiAoKGFGaWxlRGVzYyA9PSBNNE9TQV9OVUxMKXx8KE00Tk9fRVJST1IgIT0gZXJybm8pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRPcGVuX29wdGltIEVSUjEgPSAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgYUZpbGVEZXNjID0gYXBDb250ZXh0LT5GUy0+cEZjdFB0cl9PcGVuKHBGaWxlRGVzY3JpcHRvciwgRmlsZU1vZGVBY2Nlc3MsICZlcnJubyk7Ci0KLSAgICAgICAgICAgIGlmIChhRmlsZURlc2MgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00T1NBX0ZJTEVfUkVBREVSLCBlcnJubyk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbSBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5Jc09wZW5lZCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPklzT3BlbmVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7Ci0KLSAgICAvKiBBbGxvY2F0ZSBidWZmZXJzICovCi0gICAgZXJyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJJbml0KGFwQ29udGV4dCk7Ci0gICAgYnVmZmVyc19hbGxvY2F0ZWQgPSBNNE9TQV9UUlVFOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7Ci0KLSAgICAvKiBJbml0aWFsaXplIHBhcmFtZXRlcnMgKi8KLSAgICBhcENvbnRleHQtPmZpbGVTaXplID0gMDsKLSAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gMDsKLSAgICBhcENvbnRleHQtPnJlYWRGaWxlUG9zID0gMDsKLQotICAgIC8qIFJldHJpZXZlIHRoZSBGaWxlIERlc2NyaXB0b3IqLwotICAgIGFwQ29udGV4dC0+YUZpbGVEZXNjID0gYUZpbGVEZXNjOwotCi0gICAgLyogUmV0cmlldmUgdGhlIEZpbGUgbW9kZSBBY2Nlc3MgKi8KLSAgICBhcENvbnRleHQtPkZpbGVBdHRyaWJ1dGUubW9kZUFjY2VzcyA9IChNNE9TQV9GaWxlTW9kZUFjY2VzcykgRmlsZU1vZGVBY2Nlc3M7Ci0KLSAgICAvKlJldHJpZXZlIHRoZSBGaWxlIHJlYWRlciBjb250ZXh0ICovCi0gICAgKnBDb250ZXh0PSAoTTRPU0FfQ29udGV4dClhcENvbnRleHQ7Ci0KLSAgICAvKiBDb21wdXRlIGZpbGUgc2l6ZSAqLwotICAgIGVyciA9IE00T1NBX0ZpbGVSZWFkZXJfQ2FsY3VsYXRlU2l6ZShhcENvbnRleHQpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSBnb3RvIGNsZWFudXA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLQotY2xlYW51cDoKLQotICAgIC8qIGZyZWUgY29udGV4dCAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IGFwQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIGlmKGJ1ZmZlcnNfYWxsb2NhdGVkID09IE00T1NBX1RSVUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRnJlZShhcENvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZnJlZSggYXBDb250ZXh0KTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSAoIk00T1NBX2ZpbGVSZWFkT3Blbl9vcHRpbTogcmV0dXJucyBlcnJvciAweCUweCIsIGVycikKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2QgcmVhZHMgdGhlICdzaXplJyBieXRlcyBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykKLSogICAgICAgICAgICAgICAgICAgICAgYW5kIHdyaXRlcyB0aGUgZGF0YSB0byB0aGUgJ2RhdGEnIHBvaW50ZXIuIElmICdzaXplJyBieXRlIGNhbiBub3QgYmUgcmVhZCBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciwKLSogICAgICAgICAgICAgICAgICAgICAgJ3NpemUnIHBhcmFtZXRlciBpcyB1cGRhdGVkIHRvIG1hdGNoIHRoZSBjb3JyZWN0IG51bWJlciBvZiByZWFkIGJ5dGVzLgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KLSogQHBhcmFtICAgICAgIHBEYXRhIDogKE9VVCkgRGF0YSBwb2ludGVyIG9mIHRoZSByZWFkIGRhdGEuCi0qIEBwYXJhbSAgICAgICBwU2l6ZSA6IChJTk9VVCkgU2l6ZSBvZiB0aGUgZGF0YSB0byByZWFkIChpbiBieXRlKS4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9QQVJBTUVURVIgcFNpemUsIGZpbGVEZXNjcmlwdG9yIG9yIHBEYXRhIGlzIE5VTEwKLSogQHJldHVybiAgICAgIE00RVJSX0FMTE9DICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSogQHJldHVybiAgICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkRGF0YV9vcHRpbShNNE9TQV9Db250ZXh0IHBDb250ZXh0LE00T1NBX01lbUFkZHI4IHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwU2l6ZSkKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVSZWFkZXJfQ29udGV4dF9vcHRpbSopIHBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gYVNpemU7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGNvcGllZFNpemU7Ci0gICAgTTRPU0FfSW50OCBzZWxlY3RlZF9idWZmZXIsIGN1cnJlbnRfYnVmZmVyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoIk00T1NBX2ZpbGVSZWFkRGF0YV9vcHRpbSBwID0gMHglcCAgZCA9IDB4JXAgIHMgPSAlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwRGF0YSwgKnBTaXplKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBEYXRhKTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBTaXplKTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgLyogUHJldmVudCByZWFkaW5nIGJleW9uZCBFT0YgKi8KLSAgICBpZigoKnBTaXplID4gMCkgJiYgKGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPj0gYXBDb250ZXh0LT5maWxlU2l6ZSkpCi0gICAgewotICAgICAgICBjb3BpZWRTaXplID0gMDsKLSAgICAgICAgZXJyID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIGRhdGEgY2FuIGJlIHJlYWQgZnJvbSBhIGJ1ZmZlciAqLwotICAgIC8qIElmIG5vdCwgZmlsbCBvbmUgYWNjb3JkaW5nIHRvIHF1YW50aXplZCBwb3NpdGlvbnMgKi8KLSAgICBjb3BpZWRTaXplID0gMDsKLSAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJNYXRjaChhcENvbnRleHQsIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MpOwotCi0gICAgaWYoc2VsZWN0ZWRfYnVmZmVyID09IE00T1NBX1JFQURCVUZGRVJfTk9ORSkKLSAgICB7Ci0gICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyU2VsZWN0KGFwQ29udGV4dCwgMCk7Ci0gICAgICAgIGVyciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbChhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyk7Ci0gICAgfQotCi0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBpZihlcnIgPT0gTTRXQVJfTk9fREFUQV9ZRVQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgqcFNpemUgPD0gKE00T1NBX1VJbnQzMilhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF9idWZmZXJdLnNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3BpZWRTaXplID0gKE00T1NBX1VJbnQzMilhcENvbnRleHQtPmJ1ZmZlcltzZWxlY3RlZF9idWZmZXJdLnNpemU7Ci0gICAgICAgICAgICAgICAgLypjb3B5IHRoZSBjb250ZW50IGludG8gcERhdGEqLwotICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyQ29weShhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zLCBjb3BpZWRTaXplLCBwRGF0YSk7Ci0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzMoInJlYWQgIHNpemUgPSAlbHUgIGJ1ZmZlciA9ICVkICBwb3MgPSAlbGQiLCAqcFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZF9idWZmZXIsIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MpOwotCi0gICAgLyogQ29weSBidWZmZXIgaW50byBwRGF0YSAqLwotICAgIHdoaWxlKCgoTTRPU0FfVUludDMyKWNvcGllZFNpemUgPCAqcFNpemUpICYmIChlcnIgPT0gTTROT19FUlJPUikpCi0gICAgewotICAgICAgICBhU2l6ZSA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyQ29weShhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNpemUtY29waWVkU2l6ZSwgcERhdGErY29waWVkU2l6ZSk7Ci0gICAgICAgIGNvcGllZFNpemUgKz0gYVNpemU7Ci0KLSAgICAgICAgaWYoYVNpemUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRXQVJfTk9fREFUQV9ZRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKWNvcGllZFNpemUgPCAqcFNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VycmVudF9idWZmZXIgPSBzZWxlY3RlZF9idWZmZXI7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRfYnVmZmVyID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJNYXRjaChhcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoc2VsZWN0ZWRfYnVmZmVyID09IE00T1NBX1JFQURCVUZGRVJfTk9ORSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkX2J1ZmZlciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyU2VsZWN0KGFwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyRmlsbChhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MrY29waWVkU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVyciA9PSBNNFdBUl9OT19EQVRBX1lFVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKklmIHdlIGdvdCBhbGwgdGhlIGRhdGEgdGhhdCB3ZSB3YW50ZWQsIHdlIHNob3VsZCByZXR1cm4gbm8gZXJyb3IqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKnBTaXplLWNvcGllZFNpemUpIDw9IChNNE9TQV9VSW50MzIpYXBDb250ZXh0LT5idWZmZXJbc2VsZWN0ZWRfYnVmZmVyXS5zaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypJZiB3ZSBkaWQgbm90IGdldCBlbm91Z2ggZGF0YSwgd2Ugd2lsbCByZXR1cm4gTk9fREFUQV9ZRVQqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb3B5IHRoZSBkYXRhIHJlYWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTaXplID0gTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJDb3B5KGFwQ29udGV4dCwgc2VsZWN0ZWRfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcytjb3BpZWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTaXplLWNvcGllZFNpemUsIHBEYXRhK2NvcGllZFNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFNpemUgKz0gYVNpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKndlIHJlYWNoZWQgZW5kIG9mIGZpbGUsIHNvIHN0b3AgdHJ5aW5nIHRvIHJlYWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gTTRXQVJfTk9fTU9SRV9BVSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19EQVRBX1lFVDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29weSB0aGUgZGF0YSByZWFkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhU2l6ZSA9IE00T1NBX0ZpbGVSZWFkZXJfQnVmZmVyQ29weShhcENvbnRleHQsIHNlbGVjdGVkX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zK2NvcGllZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTaXplLWNvcGllZFNpemUsIHBEYXRhK2NvcGllZFNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGllZFNpemUgKz0gYVNpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKndlIHJlYWNoZWQgZW5kIG9mIGZpbGUsIHNvIHN0b3AgdHJ5aW5nIHRvIHJlYWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotY2xlYW51cCA6Ci0KLSAgICAvKiBVcGRhdGUgdGhlIG5ldyBwb3NpdGlvbiBvZiB0aGUgcG9pbnRlciAqLwotICAgIGFwQ29udGV4dC0+YWJzb2x1dGVQb3MgPSBhcENvbnRleHQtPmFic29sdXRlUG9zICsgY29waWVkU2l6ZTsKLQotICAgIGlmKChlcnIgIT0gTTROT19FUlJPUikmJihlcnIhPU00V0FSX05PX0RBVEFfWUVUKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8zKCJNNE9TQV9maWxlUmVhZERhdGFfb3B0aW0gc2l6ZSA9ICVsZCAgY29waWVkID0gJWxkICBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBTaXplLCBjb3BpZWRTaXplLCBlcnIpOwotICAgIH0KLQotICAgIC8qIEVmZmVjdGl2ZSBjb3BpZWQgc2l6ZSBtdXN0IGJlIHJldHVybmVkICovCi0gICAgKnBTaXplID0gY29waWVkU2l6ZTsKLQotCi0gICAgLyogUmVhZCBpcyBkb25lICovCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgIFRoaXMgbWV0aG9kIHNlZWtzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbiBpbiB0aGUgY29yZSBmaWxlIHJlYWRlciAoc2VsZWN0ZWQgYnkgaXRzICdjb250ZXh0JykuCi0qICAgICAgICAgICAgICBUaGUgcG9zaXRpb24gaXMgcmVsYXRlZCB0byB0aGUgc2Vla01vZGUgcGFyYW1ldGVyIGl0IGNhbiBiZSBlaXRoZXIgOgotKiAgICAgICAgICAgICAgRnJvbSB0aGUgYmVnaW5uaW5nIChwb3NpdGlvbiBNVVNUIGJlIHBvc2l0aXZlKSA6IGVuZCBwb3NpdGlvbiA9IHBvc2l0aW9uCi0qICAgICAgICAgICAgICBGcm9tIHRoZSBlbmQgKHBvc2l0aW9uIE1VU1QgYmUgbmVnYXRpdmUpIDogZW5kIHBvc2l0aW9uID0gZmlsZSBzaXplICsgcG9zaXRpb24KLSogICAgICAgICAgICAgIEZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gKHNpZ25lZCBvZmZzZXQpIDogZW5kIHBvc2l0aW9uID0gY3VycmVudCBwb3NpdGlvbiArIHBvc2l0aW9uLgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KLSogQHBhcmFtICAgICAgIFNlZWtNb2RlIDogICAgICAoSU4pIFNlZWsgYWNjZXNzIG1vZGUuCi0qIEBwYXJhbSAgICAgICBwUG9zaXRpb24gOiAgICAgKElOKSBQb3NpdGlvbiBpbiB0aGUgZmlsZS4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9QQVJBTUVURVIgU2Vla21vZGUgb3IgZmlsZURlc2NyaXB0b3IgaXMgTlVMTAotKiBAcmV0dXJuICAgICAgTTRFUlJfQUxMT0MgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCi0qIEByZXR1cm4gICAgICBNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04gdGhlIHBvc2l0aW9uIGNhbm5vdCBiZSByZWFjaGVkLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2Vla19vcHRpbSggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIFNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbikKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qKSBwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9UUkFDRTNfMygiTTRPU0FfZmlsZVJlYWRTZWVrX29wdGltIHAgPSAweCVwIG1vZGUgPSAlZCBwb3MgPSAlZCIsIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZWtNb2RlLCAqcFBvc2l0aW9uKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBQb3NpdGlvbik7Ci0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBTZWVrTW9kZSk7Ci0KLSAgICBpZiAoYXBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAgICAvKjwgVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCi0gICAgfQotCi0gICAgLyogR28gdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gKi8KLSAgICBzd2l0Y2goU2Vla01vZGUpCi0gICAgewotICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZyA6Ci0gICAgICAgICAgICBpZigqcFBvc2l0aW9uIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gKnBQb3NpdGlvbjsKLSAgICAgICAgICAgICpwUG9zaXRpb24gPSBhcENvbnRleHQtPmFic29sdXRlUG9zOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtFbmQgOgotICAgICAgICAgICAgaWYoKnBQb3NpdGlvbiA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOyAvKio8IEJhZCBTZWVrQWNlc3MgbW9kZSAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyA9IGFwQ29udGV4dC0+ZmlsZVNpemUgKyAqcFBvc2l0aW9uOwotICAgICAgICAgICAgKnBQb3NpdGlvbiA9IGFwQ29udGV4dC0+YWJzb2x1dGVQb3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQgOgotICAgICAgICAgICAgaWYoKChhcENvbnRleHQtPmFic29sdXRlUG9zICsgKnBQb3NpdGlvbikgPiBhcENvbnRleHQtPmZpbGVTaXplKSB8fAotICAgICAgICAgICAgICAgICgoYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyArICpwUG9zaXRpb24pIDwgMCkpewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7IC8qKjwgQmFkIFNlZWtBY2VzcyBtb2RlICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcENvbnRleHQtPmFic29sdXRlUG9zID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvcyArICpwUG9zaXRpb247Ci0gICAgICAgICAgICAqcFBvc2l0aW9uID0gYXBDb250ZXh0LT5hYnNvbHV0ZVBvczsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOyAvKio8IEJhZCBTZWVrQWNlc3MgbW9kZSAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byBjbG9zZSB0aGUgZmlsZQotKiAgICAgICAgICAgICAgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpIGFuZCBhbHNvIGZyZWVzIHRoZSBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgcENvbnRleHQ6ICAgICAgIChJTikgRmlsZSByZWFkZXIgY29udGV4dC4KLSogQHJldHVybiAgICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZENsb3NlX29wdGltKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKiBhcENvbnRleHQgPSAoTTRPU0FfRmlsZVJlYWRlcl9Db250ZXh0X29wdGltKikgcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSNpZmRlZiBNNE9TQV9SRUFERVJfT1BUSU1fVVNFX09TQUxfSUYKLSAgICBNNE9TQV9FUlIgZXJybm8gPSBNNE5PX0VSUk9SOwotI2Vsc2UKLSAgICBNNE9TQV9VSW50MTYgZXJybm87Ci0jZW5kaWYKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZENsb3NlX29wdGltIHAgPSAweCVwIiwgcENvbnRleHQgKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9CQURfQ09OVEVYVCwgYXBDb250ZXh0KTsKLQotICAgIGlmIChhcENvbnRleHQtPklzT3BlbmVkICE9IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7ICAgICAgIC8qKjwgVGhlIGNvbnRleHQgY2FuIG5vdCBiZSBjb3JyZWN0ICovCi0gICAgfQotCi0gICAgLyogYnVmZmVyICovCi0gICAgTTRPU0FfRmlsZVJlYWRlcl9CdWZmZXJGcmVlKGFwQ29udGV4dCk7Ci0KLSAgICAvKiBDbG9zZSB0aGUgZmlsZSAqLwotI2lmZGVmIE00T1NBX1JFQURFUl9PUFRJTV9VU0VfT1NBTF9JRgotICAgIGVycm5vID0gYXBDb250ZXh0LT5GUy0+Y2xvc2VSZWFkKGFwQ29udGV4dC0+YUZpbGVEZXNjKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycm5vKQotICAgIHsKLSAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICBlcnIgPSBlcnJubzsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00T1NBX2ZpbGVSZWFkQ2xvc2Vfb3B0aW0gRVJSMSA9IDB4JXgiLCBlcnIpOwotICAgIH0KLSNlbHNlCi0gICAgYVJldF9WYWwgPSBhcENvbnRleHQtPkZTLT5wRmN0UHRyX0Nsb3NlKGFwQ29udGV4dC0+YUZpbGVEZXNjLCAmZXJybm8pOwotCi0gICAgaWYgKGFSZXRfVmFsICE9IDApCi0gICAgewotICAgICAgICAvKiBjb252ZXJ0cyB0aGUgZXJyb3IgdG8gUFNXIGZvcm1hdCovCi0gICAgICAgIGVyciA9IE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE9TQV9GSUxFX1JFQURFUiwgZXJybm8pOwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVJlYWRDbG9zZV9vcHRpbSBFUlIxID0gMHgleCIsIGVycik7Ci0gICAgfQotI2VuZGlmIC8qTTRPU0FfUkVBREVSX09QVElNX1VTRV9PU0FMX0lGKi8KLQotICAgIGFwQ29udGV4dC0+SXNPcGVuZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8vPj4+PiBHTE0yMDA5MDIxMiA6IHNldCB0aGUgbG93IGxldmVsIGZ1bmN0aW9uIHN0YXRpY2FsbHkKLSAgICBpZiAoYXBDb250ZXh0LT5GUyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSggYXBDb250ZXh0LT5GUyk7Ci0gICAgfQotICAgIC8vPDw8PCBHTE0yMDA5MDIxMiA6IHNldCB0aGUgbG93IGxldmVsIGZ1bmN0aW9uIHN0YXRpY2FsbHkKLQotICAgIC8qIEZyZWUgdGhlIGNvbnRleHQgKi8KLSAgICBmcmVlKGFwQ29udGV4dCk7Ci0KLSAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgICBUaGlzIGlzIGEgZHVtbXkgZnVuY3Rpb24gcmVxdWlyZWQgdG8gbWFpbnRhaW4gZnVuY3Rpb24gcG9pbnRlcgotKiAgICAgICAgICAgICAgc3RydWN0dXJlLgotKiBAbm90ZSAgICAgICAgVGhpcyBpcyBhIGR1bW15IGZ1bmN0aW9uIHJlcXVpcmVkIHRvIG1haW50YWluIGZ1bmN0aW9uIHBvaW50ZXIKLSogICAgICAgICAgICAgIHN0cnVjdHVyZS4KLSogQHBhcmFtICAgICAgIHBDb250ZXh0OiAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotKiBAcGFyYW0gICAgICAgT3B0aW9uSWQgOiAgICAgIChJTikgSWQgb2YgdGhlIG9wdGlvbiB0byBzZXQuCi0qIEBwYXJhbSAgICAgICBPcHRpb25WYWx1ZSA6ICAgKElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uLgotKiBAcmV0dXJuICAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNldE9wdGlvbl9vcHRpbShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgT3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBPcHRpb25WYWx1ZSkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQKLSogICAgICAgICAgICAgIHdpdGggdGhlIG9wdGlvbklELlRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZwotKiAgICAgICAgICAgICAgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0qIEBub3RlICAgICAgICBUaGUgb3B0aW9ucyBoYW5kbGVkIGJ5IHRoZSBjb21wb25lbnQgZGVwZW5kIG9uIHRoZSBpbXBsZW1lbnRhdGlvbgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjb21wb25lbnQuCi0qIEBwYXJhbSAgICAgICBwQ29udGV4dDogICAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSogQHBhcmFtICAgICAgIE9wdGlvbklkIDogICAgICAoSU4pIElkIG9mIHRoZSBvcHRpb24gdG8gc2V0LgotKiBAcGFyYW0gICAgICAgcE9wdGlvblZhbHVlIDogIChPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24uCi0qIEByZXR1cm4gICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcENvbnRleHQgaXMgTlVMTAotKiBAcmV0dXJuICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCB0aGUgb3B0aW9uIGlkIGlzIG5vdCB2YWxpZC4KLSogQHJldHVybiAgICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRCBUaGUgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRHZXRPcHRpb25fb3B0aW0oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZE9wdGlvbklEIE9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBPcHRpb25WYWx1ZSkKLXsKLSAgICBNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qIGFwQ29udGV4dCA9IChNNE9TQV9GaWxlUmVhZGVyX0NvbnRleHRfb3B0aW0qKSBwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfQkFEX0NPTlRFWFQsIGFwQ29udGV4dCk7Ci0KLSAgICBpZiAoYXBDb250ZXh0LT5Jc09wZW5lZCAhPSBNNE9TQV9UUlVFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOyAgICAgICAvKio8IFRoZSBjb250ZXh0IGNhbiBub3QgYmUgY29ycmVjdCAqLwotICAgIH0KLQotICAgIC8qIEdldCB0aGUgZGVzaXJlZCBvcHRpb24gaWYgaXQgaXMgYXZhbGFpYmxlICovCi0gICAgc3dpdGNoKE9wdGlvbklEKQotICAgIHsKLSAgICAgICAgLyogR2V0IEZpbGUgU2l6ZSAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplOi8qKjwgR2V0IHNpemUgb2YgdGhlIGZpbGUsIGxpbWl0ZWQgdG8gMzIgYml0IHNpemUgKi8KLQotICAgICAgICAgICAgKCooTTRPU0FfVUludDMyICopcE9wdGlvblZhbHVlKSA9IGFwQ29udGV4dC0+ZmlsZVNpemU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBDaGVjayBFbmQgb2YgZmlsZSBPY2N1cnMgKi8KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRJc0VPRiA6ICAgICAvKio8IFNlZSBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSAqLwotCi0gICAgICAgICAgICAoKihNNE9TQV9Cb29sICopcE9wdGlvblZhbHVlKSA9IChhcENvbnRleHQtPmFic29sdXRlUG9zID49IGFwQ29udGV4dC0+ZmlsZVNpemUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogR2V0IEZpbGUgUG9zaXRpb24gKi8KLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRGaWxlUG9zaXRpb24gOiAgIC8qKjwgR2V0IGZpbGUgcG9zaXRpb24gKi8KLQotICAgICAgICAgICAgKihNNE9TQV9GaWxlUG9zaXRpb24gKilwT3B0aW9uVmFsdWUgPSBhcENvbnRleHQtPmFic29sdXRlUG9zOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogR2V0IEF0dHJpYnV0ZSAqLwotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZEdldEZpbGVBdHRyaWJ1dGUgOiAgLyoqPCBHZXQgdGhlIGZpbGUgYXR0cmlidXRlID0gYWNjZXNzIG1vZGUgKi8KLQotICAgICAgICAgICAgKCooTTRPU0FfRmlsZUF0dHJpYnV0ZSAqKXBPcHRpb25WYWx1ZSkubW9kZUFjY2VzcyA9IGFwQ29udGV4dC0+RmlsZUF0dHJpYnV0ZS5tb2RlQWNjZXNzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8qKjwgQmFkIG9wdGlvbiBJRCAqLwotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qUmV0dXJuIHdpdGhvdXQgZXJyb3IgKi8KLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2hhclN0YXIuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0NoYXJTdGFyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4MTRjYmYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2hhclN0YXIuYworKysgL2Rldi9udWxsCkBAIC0xLDUwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNERQQUtfQ2hhclN0YXIuYwotICogQGluZ3JvdXAKLSAgKiBAYnJpZWYgICAgICAgIGRlZmluaXRpb24gb2YgdGhlIENoYXIgU3RhciBzZXQgb2YgZnVuY3Rpb25zLgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQ2hhciBTdGFyIHNldCBvZiBmdW5jdGlvbnMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0vKiBXQVJOSU5HOiBTcGVjaWZpYyBBbmRyb2lkICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBtaW1pY3MgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGxpYmMncyBzdHJuY3B5KCkuCi0gKiBAbm90ZSAgICAgICBJdCBjb3BpZXMgZXhhY3RseSBsZW4yQ29weSBjaGFyYWN0ZXJzIGZyb20gcFN0ckluIHRvIHBTdHJPdXQsCi0gKiAgICAgICAgICAgICB0cnVuY2F0aW5nICBwU3RySW4gb3IgYWRkaW5nIG51bGwgY2hhcmFjdGVycyB0byBwU3RyT3V0IGlmCi0gKiAgICAgICAgICAgICBuZWNlc3NhcnkuCi0gKiAgICAgICAgICAgICAtIElmIGxlbjJDb3B5IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHBTdHJJbiwKLSAqICAgICAgICAgICAgICAgYSBudWxsIGNoYXJhY3RlciBpcyBhcHBlbmRlZCBhdXRvbWF0aWNhbGx5IHRvIHRoZSBjb3BpZWQKLSAqICAgICAgICAgICAgICAgc3RyaW5nLgotICogICAgICAgICAgICAgLSBJZiBsZW4yQ29weSBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiBwU3RySW4sIHBTdHJPdXQgaXMKLSAqICAgICAgICAgICAgICAgcGFkZGVkIHdpdGggbnVsbCBjaGFyYWN0ZXJzIHVwIHRvIGxlbmd0aCBsZW4yQ29weS4KLSAqICAgICAgICAgICAgIC0gcFN0ck91dCBhbmQgcFN0ckluIE1VU1QgTk9UIE9WRVJMQVAgKHRoaXMgaXMgTk9UIENIRUNLRUQpLgotICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgRGVzdGluYXRpb24gY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBTb3VyY2UgY2hhcmFjdGVyIHN0cmluZy4KLSAqIEBwYXJhbSAgICAgIGxlbjJDb3B5OiAoSU4pIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBwU3RySW4gdG8gY29weS4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4gb3IgcFN0ck91dCBpcyBNNE9TQV9OVUxMLgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2hyTkNvcHkoTTRPU0FfQ2hhciogcFN0ck91dCwgTTRPU0FfQ2hhciAgICpwU3RySW4sIE00T1NBX1VJbnQzMiBsZW4yQ29weSkKLXsKLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyTkNvcHlcdChNNE9TQV9DaGFyKiAleCxNNE9TQV9DaGFyKiAleCxNNE9TQV9VSW50MzIgJWxkKSIsCi0gICAgICAgIHBTdHJPdXQscFN0ckluLGxlbjJDb3B5KTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFN0ck91dCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJOQ29weTpcdHBTdHJPdXQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU3RySW4pLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyTkNvcHk6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgc3RybmNweSgoY2hhciAqKXBTdHJPdXQsIChjb25zdCBjaGFyICopcFN0ckluLCAoc2l6ZV90KWxlbjJDb3B5KTsKLSAgICBpZihsZW4yQ29weSA8PSAoTTRPU0FfVUludDMyKXN0cmxlbigoY29uc3QgY2hhciAqKXBTdHJJbikpCi0gICAgewotICAgICAgICBwU3RyT3V0W2xlbjJDb3B5XSA9ICdcMCc7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYm9vbGVhbiBjb21wYXJpc29uIG9mIHBTdHJJbjEgYW5kIHBTdHJJbjIuCi0gKiBAbm90ZSAgICAgICBUaGUgdmFsdWUgcmV0dXJuZWQgaW4gcmVzdWx0IGlzIE00T1NBX1RSVUUgaWYgdGhlIHN0cmluZwotICogICAgICAgICAgICAgcG9pbnRlZCB0byBieSBwU3RySW4xIGlzIHN0cmljdGx5IGlkZW50aWNhbCB0byB0aGUgc3RyaW5nIHBvaW50ZWQKLSAqICAgICAgICAgICAgIHRvIGJ5IHBTdHJJbjIsIGFuZCBNNE9TQV9GQUxTRSBvdGhlcndpc2UuCi0gKiBAcGFyYW0gICAgICBwU3RySW4xOiAoSU4pIEZpcnN0IGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBwU3RySW4yOiAoSU4pIFNlY29uZCBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgY21wUmVzdWx0OiAoT1VUKSBDb21wYXJpc29uIHJlc3VsdC4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBwU3RySW4xIHBTdHJJbjIgb3IgY21wUmVzdWx0IGlzIE00T1NBX05VTEwuCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJBcmVJZGVudGljYWwoTTRPU0FfQ2hhciogcFN0ckluMSwgTTRPU0FfQ2hhciogcFN0ckluMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wqIHBSZXN1bHQpCi17Ci0gICAgTTRPU0FfVUludDMyIGkzMixsZW4zMjsKLSAgICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfY2hyQXJlSWRlbnRpY2FsXHQoTTRPU0FfQ2hhciogJXgsTTRPU0FfQ2hhciogJXgsIgotICAgICAgICAiTTRPU0FfSW50MzIqICV4KSIscFN0ckluMSxwU3RySW4yLHBSZXN1bHQpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbjEsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyQXJlSWRlbnRpY2FsOlx0cFN0ckluMSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluMiwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJBcmVJZGVudGljYWw6XHRwU3RySW4yIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwUmVzdWx0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NockFyZUlkZW50aWNhbDpcdHBSZXN1bHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgbGVuMzIgPSAoTTRPU0FfVUludDMyKXN0cmxlbigoY29uc3QgY2hhciAqKXBTdHJJbjEpOwotICAgIGlmKGxlbjMyICE9IChNNE9TQV9VSW50MzIpc3RybGVuKChjb25zdCBjaGFyICopcFN0ckluMikpCi0gICAgewotICAgICAgICAqcFJlc3VsdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBmb3IoaTMyPTA7aTMyPGxlbjMyO2kzMisrKQotICAgIHsKLSAgICAgICAgaWYocFN0ckluMVtpMzJdICE9IHBTdHJJbjJbaTMyXSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBSZXN1bHQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKnBSZXN1bHQgPSBNNE9TQV9UUlVFOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBNNE9TQV9VSW50MzIgZnJvbSBzdHJpbmcuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBmaXJzdCBzZXQgb2Ygbm9uLXdoaXRlc3BhY2UKLSAqICAgICAgICAgICAgIGNoYXJhY3RlcnMgb2YgcFN0ckluIHRvIGEgTTRPU0FfVUludDMyIHZhbHVlIHBWYWwsIGFzc3VtaW5nIGEKLSAqICAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIGluIGJhc2UgcHJvdmlkZWQgYnkgdGhlIHBhcmFtZXRlciBiYXNlLiBwU3RyT3V0IGlzCi0gKiAgICAgICAgICAgICBzZXQgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIGZvbGxvd2luZyB0aGUgbGFzdAotICogICAgICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSBudW1iZXIgdGhhdCBoYXMgYmVlbiBjb252ZXJ0ZWQuCi0gKiAgICAgICAgICAgICAtIGluIGNhc2Ugb2YgYSBmYWlsdXJlIGR1cmluZyB0aGUgY29udmVyc2lvbiwgcFN0ck91dCBpcyBub3QKLSAqICAgICAgICAgICAgICAgdXBkYXRlZCwgYW5kIHBWYWwgaXMgc2V0IHRvIG51bGwuCi0gKiAgICAgICAgICAgICAtIGluIGNhc2Ugb2YgbmVnYXRpdmUgbnVtYmVyLCBwU3RyT3V0IGlzIG5vdCB1cGRhdGVkLCBhbmQgcFZhbCBpcwotICogICAgICAgICAgICAgICBzZXQgdG8gbnVsbC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBudW1lcmljYWwgb3ZlcmZsb3csIHBWYWwgaXMgc2V0IHRvIE00T1NBX1VJTlQzMl9NQVguCi0gKiAgICAgICAgICAgICAtIGlmIHBTdHJPdXQgaXMgbm90IHRvIGJlIHVzZWQsIGl0IGNhbiBiZSBzZXQgdG8gTTRPU0FfTlVMTC4KLSAqIEBwYXJhbSAgICAgIHBTdHJJbjogKElOKSBDaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgcFZhbDogKE9VVCkgcmVhZCB2YWx1ZS4KLSAqIEBwYXJhbSAgICAgIHBTdHJPdXQ6IChPVVQpIE91dHB1dCBjaGFyYWN0ZXIgc3RyaW5nLgotICogQHBhcmFtICAgICAgYmFzZTogKElOKSBCYXNlIG9mIHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHBTdHJJbiBvciBwVmFsIGlzIE00T1NBX05VTEwuCi0gKiBAcmV0dXJuICAgICBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ6IGNvbnZlcnNpb24gZmFpbHVyZS4KLSAqIEByZXR1cm4gICAgIE00V0FSX0NIUl9OVU1fUkFOR0U6IHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudHMgYSBudW1iZXIKLSAqICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiBNNE9TQV9VSU5UMzJfTUFYLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05FR0FUSVZFOiB0aGUgY2hhcmFjdGVyIHN0cmluZyByZXByZXNlbnRzIGEgbmVnYXRpdmUKLSAqICAgICAgICAgICAgIG51bWJlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfY2hyR2V0VUludDMyKE00T1NBX0NoYXIqICAgIHBTdHJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiAgICBwVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiogICAgcFN0ck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTnVtQmFzZSBiYXNlKQotewotICAgIE00T1NBX1VJbnQzMiB1bDsKLSAgICBjaGFyKiAgICAgICAgcFRlbXA7Ci0KLSAgICBNNE9TQV9UUkFDRTFfNCgiTTRPU0FfY2hyR2V0VUludDMyXHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX1VJbnQzMiogJXgiCi0gICAgICAgICJNNE9TQV9DaGFyKiogJXgsTTRPU0FfY2hyTnVtQmFzZSAlZCkiLHBTdHJJbixwVmFsLHBTdHJPdXQsYmFzZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ckluLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRVSW50MzI6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0VUludDMyOlx0cFZhbCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBlcnJubyA9IDA7Ci0gICAgc3dpdGNoKGJhc2UpCi0gICAgewotICAgIGNhc2UgTTRPU0Ffa2NockRlYzoKLSAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsIDEwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNE9TQV9rY2hySGV4YToKLSAgICAgICAgdWwgPSBzdHJ0b3VsKChjb25zdCBjaGFyICopcFN0ckluLCAmcFRlbXAsMTYpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00T1NBX2tjaHJPY3Q6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDgpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIGhhcyBjb252ZXJzaW9uIGZhaWxlZCA/ICovCi0gICAgaWYoKE00T1NBX0NoYXIqKXBUZW1wID09IHBTdHJJbikKLSAgICB7Ci0gICAgICAgICpwVmFsID0gMDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9DT05WX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICAvKiB3YXMgdGhlIG51bWJlciBuZWdhdGl2ZSA/ICovCi0gICAgaWYoKihwU3RySW4rc3Ryc3BuKChjb25zdCBjaGFyICopcFN0ckluLCIgXHQiKSkgPT0gJy0nKQotICAgIHsKLSAgICAgICAgKnBWYWwgPSAwOwotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05FR0FUSVZFOwotICAgIH0KLQotICAgIC8qIGhhcyBhbiBvdmVyZmxvdyBvY2N1cmVkID8gKi8KLSAgICBpZihlcnJubyA9PSBFUkFOR0UpCi0gICAgewotICAgICAgICAqcFZhbCA9IE00T1NBX1VJTlQzMl9NQVg7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKLSAgICAgICAgewotICAgICAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9OVU1fUkFOR0U7Ci0gICAgfQotCi0gICAgLyogbm9taW5hbCBjYXNlICovCi0gICAgKnBWYWwgPSAoTTRPU0FfVUludDMyKXVsOwotICAgIGlmKE00T1NBX05VTEwgIT0gcFN0ck91dCkKLSAgICB7Ci0gICAgICAgICpwU3RyT3V0ID0gKE00T1NBX0NoYXIqKXBUZW1wOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIE00T1NBX1VJbnQxNiBmcm9tIHN0cmluZy4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgdGhlIGZpcnN0IHNldCBvZiBub24td2hpdGVzcGFjZQotICogICAgICAgICAgICAgY2hhcmFjdGVycyBvZiBwU3RySW4gdG8gYSBNNE9TQV9VSW50MTYgdmFsdWUgcFZhbCwgYXNzdW1pbmcgYQotICogICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gaW4gYmFzZSBwcm92aWRlZCBieSB0aGUgcGFyYW1ldGVyIGJhc2UuIHBTdHJPdXQgaXMKLSAqICAgICAgICAgICAgIHNldCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBsYXN0Ci0gKiAgICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIG51bWJlciB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSBjb252ZXJzaW9uLCBwU3RyT3V0IGlzIG5vdAotICogICAgICAgICAgICAgICB1cGRhdGVkLCBhbmQgcFZhbCBpcyBzZXQgdG8gbnVsbC4KLSAqICAgICAgICAgICAgIC0gaW4gY2FzZSBvZiBuZWdhdGl2ZSBudW1iZXIsIHBTdHJPdXQgaXMgbm90IHVwZGF0ZWQsIGFuZCBwVmFsIGlzCi0gKiAgICAgICAgICAgICAgIHNldCB0byBudWxsLgotICogICAgICAgICAgICAgLSBpbiBjYXNlIG9mIG51bWVyaWNhbCBvdmVyZmxvdywgcFZhbCBpcyBzZXQgdG8gTTRPU0FfVUlOVDE2X01BWC4KLSAqICAgICAgICAgICAgIC0gaWYgcFN0ck91dCBpcyBub3QgdG8gYmUgdXNlZCwgaXQgY2FuIGJlIHNldCB0byBNNE9TQV9OVUxMLgotICogQHBhcmFtICAgICAgcFN0ckluOiAoSU4pIENoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBwVmFsOiAoT1VUKSByZWFkIHZhbHVlLgotICogQHBhcmFtICAgICAgcFN0ck91dDogKE9VVCkgT3V0cHV0IGNoYXJhY3RlciBzdHJpbmcuCi0gKiBAcGFyYW0gICAgICBiYXNlOiAoSU4pIEJhc2Ugb2YgdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogcFN0ckluIG9yIHBWYWwgaXMgTTRPU0FfTlVMTC4KLSAqIEByZXR1cm4gICAgIE00RVJSX0NIUl9DT05WX0ZBSUxFRDogY29udmVyc2lvbiBmYWlsdXJlLgotICogQHJldHVybiAgICAgTTRXQVJfQ0hSX05VTV9SQU5HRTogdGhlIGNoYXJhY3RlciBzdHJpbmcgcmVwcmVzZW50cyBhIG51bWJlcgotICogICAgICAgICAgICAgZ3JlYXRlciB0aGFuIE00T1NBX1VJTlQxNl9NQVguCi0gKiBAcmV0dXJuICAgICBNNFdBUl9DSFJfTkVHQVRJVkU6IHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHJlcHJlc2VudHMgYSBuZWdhdGl2ZQotICogICAgICAgICAgICAgbnVtYmVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9jaHJHZXRVSW50MTYgKE00T1NBX0NoYXIqIHBTdHJJbiwgTTRPU0FfVUludDE2ICpwVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhcioqIHBTdHJPdXQsIE00T1NBX2Nock51bUJhc2UgYmFzZSkKLXsKLSAgICBNNE9TQV9VSW50MzIgdWw7Ci0gICAgY2hhciogICAgICAgIHBUZW1wOwotCi0gICAgTTRPU0FfVFJBQ0UxXzQoIk00T1NBX2NockdldFVJbnQxNlx0KE00T1NBX0NoYXIqICV4LCBNNE9TQV9VSW50MTYqICV4IgotICAgICAgICAiTTRPU0FfQ2hhcioqICV4LE00T1NBX2Nock51bUJhc2UgJWQpIixwU3RySW4scFZhbCxwU3RyT3V0LGJhc2UpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBTdHJJbixNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9jaHJHZXRVSW50MTY6XHRwU3RySW4gaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBWYWwsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyR2V0VUludDE2Olx0cFZhbCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBzd2l0Y2goYmFzZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rY2hyRGVjOgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCwxMCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRPU0Ffa2NockhleGE6Ci0gICAgICAgIHVsID0gc3RydG91bCgoY29uc3QgY2hhciAqKXBTdHJJbiwgJnBUZW1wLDE2KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNE9TQV9rY2hyT2N0OgotICAgICAgICB1bCA9IHN0cnRvdWwoKGNvbnN0IGNoYXIgKilwU3RySW4sICZwVGVtcCw4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBoYXMgY29udmVyc2lvbiBmYWlsZWQgPyAqLwotICAgIGlmKChNNE9TQV9DaGFyKilwVGVtcCA9PSBwU3RySW4pCi0gICAgewotICAgICAgICAqcFZhbCA9IDA7Ci0gICAgICAgIHJldHVybiBNNEVSUl9DSFJfQ09OVl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgLyogd2FzIHRoZSBudW1iZXIgbmVnYXRpdmUgPyAqLwotICAgIGlmKCoocFN0ckluK3N0cnNwbigoY29uc3QgY2hhciAqKXBTdHJJbiwiIFx0IikpID09ICctJykKLSAgICB7Ci0gICAgICAgICpwVmFsID0gMDsKLSAgICAgICAgcmV0dXJuIE00V0FSX0NIUl9ORUdBVElWRTsKLSAgICB9Ci0KLSAgICAvKiBoYXMgYW4gb3ZlcmZsb3cgb2NjdXJlZCA/ICovCi0gICAgaWYodWw+TTRPU0FfVUlOVDE2X01BWCkKLSAgICB7Ci0gICAgICAgICpwVmFsID0gTTRPU0FfVUlOVDE2X01BWDsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFN0ck91dCA9IChNNE9TQV9DaGFyKilwVGVtcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRXQVJfQ0hSX05VTV9SQU5HRTsKLSAgICB9Ci0KLSAgICAvKiBub21pbmFsIGNhc2UgKi8KLSAgICAqcFZhbCA9IChNNE9TQV9VSW50MTYpdWw7Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyT3V0KQotICAgIHsKLSAgICAgICAgKnBTdHJPdXQgPSAoTTRPU0FfQ2hhciopcFRlbXA7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTRPU0FfY2hyU1ByaW50ZihNNE9TQV9DaGFyICAqcFN0ck91dCwgTTRPU0FfVUludDMyIHN0ck91dE1heExlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgICAqZm9ybWF0LCAuLi4pCi17Ci0gICAgdmFfbGlzdCAgICAgICBtYXJrZXI7Ci0gICAgTTRPU0FfQ2hhciAgICpwVGVtcDsKLSAgICBNNE9TQV9DaGFyICAgKnBlcmNlbnRQb2ludGVyOwotICAgIE00T1NBX0NoYXIgICAqbmV3Rm9ybWF0OwotICAgIE00T1NBX0ludDMyICBuZXdGb3JtYXRMZW5ndGg9MDsKLSAgICBNNE9TQV9VSW50MzIgIGNvdW50X2xsID0gMDsKLSAgICBNNE9TQV9VSW50MzIgIGNvdW50X3RtID0gMDsKLSAgICBNNE9TQV9VSW50MzIgIGNvdW50X2FhID0gMDsKLSAgICBNNE9TQV9VSW50MzIgIGNvdW50OwotICAgIE00T1NBX1VJbnQzMiAgbmJDaGFyOwotICAgIE00T1NBX0ludDMyICAgICBlcnI7Ci0gICAgTTRPU0FfQ2hhciBmbGFnQ2hhcltdICAgICAgICAgICAgID0gIictKyAjMCI7Ci0gICAgTTRPU0FfQ2hhciB3aWR0aE9yUHJlY2lzaW9uQ2hhcltdID0gIiowMTIzNDU2Nzg5IjsKLSAgICBNNE9TQV9DaGFyIG90aGVyUHJlZml4Q2hhcltdICAgICAgPSAiaGxMIjsKLSAgICBNNE9TQV9DaGFyIGNvbnZlcnNpb25DaGFyW10gICAgICAgPSAiZGlvdXhYbmZlRWdHY0NzU3AlIjsKLQotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9jaHJTUHJpbnRmXHQoTTRPU0FfQ2hhciogJXgsIE00T1NBX1VJbnQzMiAlbGQiCi0gICAgICAgICJNNE9TQV9DaGFyKiAleCkiLHBTdHJPdXQsc3RyT3V0TWF4TGVuLGZvcm1hdCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFN0ck91dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2NoclNQcmludGY6XHRwU3RyT3V0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBmb3JtYXQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfY2hyU1ByaW50ZjpcdGZvcm1hdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICB2YV9zdGFydChtYXJrZXIsZm9ybWF0KTsKLQotICAgIC8qIGNvdW50IHRoZSBudW1iZXIgb2YgJVtmbGFnc11bd2lkdGhdWy5wcmVjaXNpb25dbGxbY29udmVyc2lvbl0gKi8KLSAgICBwVGVtcCA9IGZvcm1hdDsKLSAgICB3aGlsZSgqcFRlbXApCi0gICAgewotICAgICAgICBwZXJjZW50UG9pbnRlciA9IChNNE9TQV9DaGFyICopc3RyY2hyKChjb25zdCBjaGFyICopcFRlbXAsJyUnKTsgLyogZ2V0IHRoZSBuZXh0IHBlcmNlbnQgY2hhcmFjdGVyICovCi0gICAgICAgIGlmKCFwZXJjZW50UG9pbnRlcikKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAiVGhpcyBpcyB0aGUgRW5kIiwgKGMpIEouIE1vcnJpc3NvbiAqLwotICAgICAgICBwVGVtcCA9IHBlcmNlbnRQb2ludGVyKzE7ICAgICAgICAgICAvKiBzcGFuIGl0ICovCi0gICAgICAgIGlmKCEqcFRlbXApCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgcFRlbXAgKz0gc3Ryc3BuKChjb25zdCBjaGFyICopcFRlbXAsKGNvbnN0IGNoYXIgKilmbGFnQ2hhcik7ICAgIC8qIHNwYW4gdGhlIG9wdGlvbmFsIGZsYWdzICovCi0gICAgICAgIGlmKCEqcFRlbXApCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgcFRlbXAgKz0gc3Ryc3BuKChjb25zdCBjaGFyICopcFRlbXAsKGNvbnN0IGNoYXIgKil3aWR0aE9yUHJlY2lzaW9uQ2hhcik7IC8qIHNwYW4gdGhlIG9wdGlvbmFsIHdpZHRoICovCi0gICAgICAgIGlmKCEqcFRlbXApCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgaWYoKnBUZW1wPT0nLicpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBUZW1wKys7Ci0gICAgICAgICAgICBwVGVtcCArPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKil3aWR0aE9yUHJlY2lzaW9uQ2hhcik7IC8qIHNwYW4gdGhlIG9wdGlvbmFsIHByZWNpc2lvbiAqLwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqcFRlbXApCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIlRoaXMgaXMgdGhlIEVuZCIsIChjKSBKLiBNb3JyaXNzb24gKi8KLSAgICAgICAgaWYoc3RybGVuKChjb25zdCBjaGFyICopcFRlbXApPj0yKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKXBUZW1wLCJsbCIsMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnRfbGwrKzsgICAgICAgICAgICAgICAgIC8qIEkgZ290IE9ORSAqLwotICAgICAgICAgICAgICAgIHBUZW1wICs9MjsgICAgICAgICAgICAgICAgICAvKiBzcGFuIHRoZSAibGwiIHByZWZpeCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKXBUZW1wLCJ0bSIsMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnRfdG0rKzsKLSAgICAgICAgICAgICAgICBwVGVtcCArPTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopcFRlbXAsImFhIiwyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3VudF9hYSsrOwotICAgICAgICAgICAgICAgIHBUZW1wICs9MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwVGVtcCArPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilvdGhlclByZWZpeENoYXIpOyAvKiBzcGFuIHRoZSBvdGhlciBvcHRpb25hbCBwcmVmaXggKi8KLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgICAgIHBUZW1wICs9IHN0cnNwbigoY29uc3QgY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWNvbnZlcnNpb25DaGFyKTsKLSAgICAgICAgaWYoISpwVGVtcCkKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICJUaGlzIGlzIHRoZSBFbmQiLCAoYykgSi4gTW9ycmlzc29uICovCi0gICAgfQotCi0gICAgY291bnQgPSBjb3VudF9sbCArIGNvdW50X3RtICsgY291bnRfYWE7Ci0KLSAgICBpZighY291bnQpCi0gICAgewotICAgICAgICBlcnI9IHZzbnByaW50ZigoY2hhciAqKXBTdHJPdXQsIChzaXplX3Qpc3RyT3V0TWF4TGVuICsgMSwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG1hcmtlcik7Ci0gICAgICAgIHZhX2VuZChtYXJrZXIpOwotICAgICAgICBpZiAoKGVycjwwKSB8fCAoKE00T1NBX1VJbnQzMillcnI+c3RyT3V0TWF4TGVuKSkKLSAgICAgICAgewotICAgICAgICAgICAgcFN0ck91dFtzdHJPdXRNYXhMZW5dID0gJ1wwJzsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9DSFJfU1RSX09WRVJGTE9XOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIG5ld0Zvcm1hdExlbmd0aCA9IHN0cmxlbigoY29uc3QgY2hhciAqKWZvcm1hdCkgKyAxOwotCi0gICAgbmV3Rm9ybWF0TGVuZ3RoIC09IChjb3VudF9sbCtjb3VudF90bStjb3VudF9hYSk7Ci0KLSAgICBuZXdGb3JtYXQgPShNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobmV3Rm9ybWF0TGVuZ3RoLAotICAgICAgICBNNE9TQV9DSEFSU1RBUiwoTTRPU0FfQ2hhciopIk00T1NBX2NoclByaW50ZjogbmV3Rm9ybWF0Iik7Ci0gICAgaWYoTTRPU0FfTlVMTCA9PSBuZXdGb3JtYXQpCi0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICBuZXdGb3JtYXRbbmV3Rm9ybWF0TGVuZ3RoLTFdID0gJ1wwJzsKLSAgICBwVGVtcCA9IG5ld0Zvcm1hdDsKLQotICAgIC8qIGNvcHkgZm9ybWF0IHRvIG5ld0Zvcm1hdCwgcmVwbGFjaW5nICVbZmxhZ3NdW3dpZHRoXVsucHJlY2lzaW9uXWxsW2NvbnZlcnNpb25dCi0gICAgICogYnkgJVtmbGFnc11bd2lkdGhdWy5wcmVjaXNpb25dSTY0W2NvbnZlcnNpb25dICovCi0gICAgd2hpbGUoKmZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG5iQ2hhciA9IHN0cmNzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsICIlIik7Ci0gICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsgICAgICAvKiBjb3B5IGNoYXJhY3RlcnMgYmVmb3JlIHRoZSAlIGNoYXJhY3RlciAqLwotICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOwotICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7Ci0gICAgICAgICpwVGVtcCsrID0gKmZvcm1hdCsrOyAgICAgICAgICAgICAgICAgLyogY29weSB0aGUgJSBjaGFyYWN0ZXIgKi8KLSAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKWZsYWdDaGFyKTsKLSAgICAgICAgaWYobmJDaGFyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIGZsYWcgY2hhcmFjdGVycyAqLwotICAgICAgICAgICAgZm9ybWF0ICs9bmJDaGFyOwotICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKLSAgICAgICAgfQotICAgICAgICBpZighKmZvcm1hdCkgYnJlYWs7Ci0gICAgICAgIG5iQ2hhciA9IHN0cnNwbigoY29uc3QgY2hhciAqKWZvcm1hdCwgKGNvbnN0IGNoYXIgKil3aWR0aE9yUHJlY2lzaW9uQ2hhcik7Ci0gICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsgICAgICAvKiBjb3B5IHRoZSB3aWR0aCBjaGFyYWN0ZXJzICovCi0gICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICBwVGVtcCAgICs9bmJDaGFyOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEqZm9ybWF0KSBicmVhazsKLSAgICAgICAgaWYoKmZvcm1hdD09Jy4nKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFRlbXArKyA9ICpmb3JtYXQrKzsgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIGRvdCBjaGFyYWN0ZXIgKi8KLSAgICAgICAgICAgIGlmKCFmb3JtYXQpIGJyZWFrOwotICAgICAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKXdpZHRoT3JQcmVjaXNpb25DaGFyKTsKLSAgICAgICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJuY3B5KChjaGFyICopcFRlbXAsIChjb25zdCBjaGFyICopZm9ybWF0LCBuYkNoYXIpOyAgICAgIC8qIGNvcHkgdGhlIHdpZHRoIGNoYXJhY3RlcnMgKi8KLSAgICAgICAgICAgICAgICBmb3JtYXQgKz1uYkNoYXI7Ci0gICAgICAgICAgICAgICAgcFRlbXAgICArPW5iQ2hhcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCFmb3JtYXQpIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmKHN0cmxlbigoY29uc3QgY2hhciAqKWZvcm1hdCk+PTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCFzdHJuY21wKChjb25zdCBjaGFyICopZm9ybWF0LCAibGwiLCAyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFRlbXArKyA9ICdsJzsgLyogJWwgKi8KLSAgICAgICAgICAgICAgICBmb3JtYXQgKz0yOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcGFuIHRoZSAibGwiIHByZWZpeCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZighc3RybmNtcCgoY29uc3QgY2hhciAqKWZvcm1hdCwgInRtIiwgMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBUZW1wKysgPSAnbCc7IC8qICVsICovCi0gICAgICAgICAgICAgICAgZm9ybWF0ICs9MjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BhbiB0aGUgInRtIiBwcmVmaXggKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIXN0cm5jbXAoKGNvbnN0IGNoYXIgKilmb3JtYXQsICJhYSIsIDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwVGVtcCsrID0gJ2wnOwotICAgICAgICAgICAgICAgIGZvcm1hdCArPTI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNwYW4gdGhlICJhYSIgcHJlZml4ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbmJDaGFyID0gc3Ryc3BuKChjb25zdCBjaGFyICopZm9ybWF0LCAoY29uc3QgY2hhciAqKW90aGVyUHJlZml4Q2hhcik7Ci0gICAgICAgIGlmKG5iQ2hhcikKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKXBUZW1wLCAoY29uc3QgY2hhciAqKWZvcm1hdCwgbmJDaGFyKTsgICAgICAvKiBjb3B5IHRoZSBvdGhlciBQcmVmaXggKi8KLSAgICAgICAgICAgIGZvcm1hdCArPW5iQ2hhcjsKLSAgICAgICAgICAgIHBUZW1wICAgKz1uYkNoYXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoISpmb3JtYXQpIGJyZWFrOwotICAgICAgICBuYkNoYXIgPSBzdHJzcG4oKGNvbnN0IGNoYXIgKilmb3JtYXQsIChjb25zdCBjaGFyICopY29udmVyc2lvbkNoYXIpOwotICAgICAgICBpZihuYkNoYXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKilwVGVtcCwgKGNvbnN0IGNoYXIgKilmb3JtYXQsIG5iQ2hhcik7Ci0gICAgICAgICAgICBmb3JtYXQgKz0gbmJDaGFyOwotICAgICAgICAgICAgcFRlbXAgICArPSBuYkNoYXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoISpmb3JtYXQpIGJyZWFrOwotICAgIH0KLQotICAgIC8qIFplcm8gdGVybWluYXRlIHRoZSBmb3JtYXQgc3RyaW5nLiAqLwotICAgICgqcFRlbXApID0gJ1wwJzsKLQotICAgIGVyciA9IHZzbnByaW50ZigoY2hhciAqKXBTdHJPdXQsIChzaXplX3Qpc3RyT3V0TWF4TGVuICsgMSwgKGNvbnN0IGNoYXIgKiluZXdGb3JtYXQsIG1hcmtlcik7Ci0gICAgdmFfZW5kKG1hcmtlcik7Ci0gICAgZnJlZShuZXdGb3JtYXQpOwotICAgIGlmICgoZXJyPDApIHx8ICgoTTRPU0FfVUludDMyKWVycj5zdHJPdXRNYXhMZW4pKQotICAgIHsKLSAgICAgICAgcFN0ck91dFtzdHJPdXRNYXhMZW5dID0gJ1wwJzsKLSAgICAgICAgcmV0dXJuIE00RVJSX0NIUl9TVFJfT1ZFUkZMT1c7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2xvY2suYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0Nsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk4MTdiMjIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfQ2xvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfQ2xvY2suYwotICogQGJyaWVmICAgICAgICBDbG9jayByZWxhdGVkIGZ1bmN0aW9ucwotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBjbG9jawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9DbG9jay5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIGFuIGFic29sdXRlIHRpbWUgdG8gYW4gdW5rbm93biByZWZlcmVuY2Ugd2l0aAotICogICAgICAgICAgICAgYSBoaWdoIHByZWNpc2lvbi4KLSAqIEBub3RlICAgICAgIEl0IG1lYW5zIGl0IGNhbiBvbmx5IGJlIHVzZWQgdG8gZ2V0IGEgcmVsYXRpdmUgdGltZSBieSBjb21wdXRpbmcKLSAqICAgICAgICAgICAgIGRpZmZlcmVuY2VzIGJldHdlZW4gdG8gdGltZXMuCi0gKiAgICAgICAgICAgICBJdCBpcyB0byB0aGUgY2FsbGVyIHRvIGFsbG9jYXRlIHRpbWUuIFRpbWUgaXMgZXhwcmVzc2VkIGluCi0gKiAgICAgICAgICAgICB0aW1lc2NhbGUgdW5pdC4KLSAqICAgICAgICAgICAgIE00T1NBX1JPTExPVkVSX0NMT0NLIGluIE00T1NBX1R5cGVzLmggbXVzdCBiZSBjb25maWd1cmVkIHdpdGggdGhlIHJvbGxvdmVyCi0gKiAgICAgICAgICAgICBvZmZzZXQgb2YgdGhpcyBmdW5jdGlvbi4KLSAqIEBwYXJhbSAgICAgIHRpbWU6IChJTi9PVVQpIHRpbWUKLSAqIEBwYXJhbSAgICAgIHRpbWVzY2FsZTogKElOKSBUaGUgdGltZXNjYWxlICh0aW1lIHVuaXQgcGVyIHNlY29uZCkKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRXQVJfVElNRVNDQUxFX1RPT19CSUc6IHRoZSBwcmVjaXNpb24gb2YgdGhlIHN5c3RlbSBjbG9jayBpcwotICogICAgICAgICAgICAgbm90Ci0gKiAgICAgICAgICAgICBjb21wbGlhbnQgd2l0aCB0aGUgaW5wdXQgdGltZXNjYWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2Nsb2NrR2V0VGltZShNNE9TQV9UaW1lKiBwVGltZSwgTTRPU0FfVUludDMyIHRpbWVzY2FsZSkKLXsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7Ci0gICAgTTRPU0FfVUludDMyIHUzMl90aW1lID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdTMyX3RpbWVfaGk7Ci0gICAgTTRPU0FfVUludDMyIHUzMl90aW1lX2xvOwotICAgIE00T1NBX1VJbnQzMiB1MzJfdGltZV9saDsKLSAgICBNNE9TQV9VSW50MzIgZmFjdG9yOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX2Nsb2NrR2V0VGltZVx0XHRNNE9TQV9UaW1lKiAweCV4XHRNNE9TQV9VSW50MzIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGltZSwgdGltZXNjYWxlKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBUaW1lLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nsb2NrR2V0VGltZTogcFRpbWUgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IHRpbWVzY2FsZSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2Nsb2NrR2V0VGltZTogdGltZXNjYWxlIGlzIDAiKTsKLQotICAgIGZhY3RvciA9IDEwMDAwMDAgLyB0aW1lc2NhbGU7Ci0KLSAgICBpZihnZXR0aW1lb2ZkYXkoJnR2LCAmdHopID09IDApCi0gICAgewotICAgICAgICB1MzJfdGltZV9sbyA9ICh0di50dl9zZWMgJiAweEZGRkYpICogdGltZXNjYWxlOwotICAgICAgICB1MzJfdGltZV9oaSA9ICgoKHR2LnR2X3NlYyA+PiAxNikgJiAweEZGRkYpICogdGltZXNjYWxlKSArICgodTMyX3RpbWVfbG8gPj4gMTYpICYgMHhGRkZGKTsKLSAgICAgICAgdTMyX3RpbWVfbG8gJj0gMHhGRkZGOwotICAgICAgICB1MzJfdGltZV9sbyArPSB0di50dl91c2VjIC8gZmFjdG9yOwotICAgICAgICB1MzJfdGltZV9oaSArPSAoKHUzMl90aW1lX2xvID4+IDE2KSAmIDB4RkZGRik7Ci0gICAgICAgIHUzMl90aW1lX2xvICY9IDB4RkZGRjsKLSAgICAgICAgdTMyX3RpbWUgPSAoKHUzMl90aW1lX2hpICYgMHg3RkZGKSA8PCAxNikgfCB1MzJfdGltZV9sbzsKLSAgICB9Ci0KLSAgICAvKiBNNE9TQV9UaW1lIGlzIHNpZ25lZCwgc28gd2UgbmVlZCB0byBjaGVjayB0aGUgbWF4IHZhbHVlKi8KLSAgICBpZiAodTMyX3RpbWUgPiBNNE9TQV9JTlQzMl9NQVgpCi0gICAgewotICAgICAgICB1MzJfdGltZSA9IHUzMl90aW1lIC0gTTRPU0FfSU5UMzJfTUFYOwotICAgIH0KLQotICAgICpwVGltZSA9IChNNE9TQV9UaW1lKXUzMl90aW1lOwotCi0gICAgaWYoIHRpbWVzY2FsZSA+IDEwMDAwICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9USU1FU0NBTEVfVE9PX0JJRzsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVDb21tb24uYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVDb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzEyZGI1ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlQ29tbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZUNvbW1vbi5jCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgY29tbW9uIGZvciBBbmRyb2lkCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB1c2VkIGJ5IGJvdGggdGhlIGZpbGUgd3JpdGVyCi0gKiAgICAgICAgICAgICAgIGFuZCBmaWxlIHJlYWRlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgVVNFX1NUQUdFRlJJR0hUX0NPREVDUwotI2Vycm9yICJVU0VfU1RBR0VGUklHSFRfQ09ERUNTIGlzIG5vdCBkZWZpbmVkIgotI2VuZGlmIC8qVVNFX1NUQUdFRlJJR0hUX0NPREVDUyovCi0KLSNpZmRlZiBVVEZfQ09OVkVSU0lPTgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmIC8qVVRGX0NPTlZFUlNJT04qLwotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotI2luY2x1ZGUgIk00T1NBX1NlbWFwaG9yZS5oIgotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZUNvbW1vbl9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBwcm92aWRlZCBVUkwgYW5kIHJldHVybnMgaXRzIGNvbnRleHQuCi0gKiAgICAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cmVkLCB0aGUgY29udGV4dCBpcyBzZXQgdG8gTlVMTC4KLSAqIEBwYXJhbSAgICAgIGNvcmVfaWQ6IChJTikgQ29yZSBJRCBvZiB0aGUgY2FsbGVyIChNNE9TQV9GSUxFX1JFQURFUiBvciBNNE9TQV9GSUxFX1dSSVRFUikKLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChPVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSAqIEBwYXJhbSAgICAgIHVybDogKElOKSBVUkwgb2YgdGhlIGlucHV0IGZpbGUKLSAqIEBwYXJhbSAgICAgIGZpbGVNb2RlQWNjZXNzOiAoSU4pIEZpbGUgbW9kZSBhY2Nlc3MKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAotICogICAgICAgICAgICAgZmlsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZAotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9MT0NLRUQ6IHRoZSBmaWxlIGlzIGxvY2tlZCBieSBhbiBvdGhlcgotICogICAgICAgICAgICAgYXBwbGljYXRpb24vcHJvY2VzcwotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1M6IHRoZSBmaWxlIG1vZGUgYWNjZXNzIGlzIG5vdCBjb3JyZWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25PcGVuKE00T1NBX1VJbnQxNiBjb3JlX2lkLCBNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBwVXJsLCBNNE9TQV9GaWxlTW9kZUFjY2VzcyBmaWxlTW9kZUFjY2VzcykKLXsKLQotICAgIE00T1NBX0ludDMyIGkgICAgICAgICAgICA9IDA7Ci0gICAgTTRPU0FfSW50MzIgaU1vZGUgICAgICAgID0gMDsKLSAgICBNNE9TQV9JbnQzMiBpU2l6ZSAgICAgICAgPSAwOwotICAgIE00T1NBX0ludDMyIGlTYXZlUG9zICAgID0gMDsKLQotICAgIE00T1NBX0NoYXIgIG1vZGVbNF0gICAgICAgICAgICA9ICIiOwotICAgIE00T1NBX0NoYXIqIHBSZWFkU3RyaW5nICAgICAgICA9IChNNE9TQV9DaGFyKikiciI7Ci0gICAgTTRPU0FfQ2hhciogcFdyaXRlU3RyaW5nICAgID0gKE00T1NBX0NoYXIqKSJ3IjsKLSAgICBNNE9TQV9DaGFyKiBwQXBwZW5kU3RyaW5nICAgID0gKE00T1NBX0NoYXIqKSJhIjsKLSAgICBNNE9TQV9DaGFyKiBwQmluYXJ5U3RyaW5nICAgID0gKE00T1NBX0NoYXIqKSJiIjsKLSAgICBNNE9TQV9DaGFyKiBwUGx1c1N0cmluZyAgICAgICAgPSAoTTRPU0FfQ2hhciopIisiOwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBGSUxFKiBwRmlsZUhhbmRsZXIgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ZpbGVDb250ZXh0ICpwRmlsZUNvbnRleHQgICAgPSBNNE9TQV9OVUxMOwotCi0KLSNpZmRlZiBVVEZfQ09OVkVSU0lPTgotICAgIC8qRkI6IHRvIHRlc3QgdGhlIFVURjE2LT5VVEY4IGNvbnZlcnNpb24gaW50byBWaWRlbyBBcnRpc3QqLwotICAgIC8qQ29udmVydCB0aGUgVVJMIGZyb20gVVRGMTYgdG8gVVRGOCovCi0gICAgTTRPU0FfVm9pZCogdGVtcENvbnZlcnNpb25CdWY7Ci0gICAgTTRPU0FfVUludDMyIHRlbXBDb252ZXJzaW9uU2l6ZSA9IDEwMDA7Ci0KLSAgICB0ZW1wQ29udmVyc2lvbkJ1ZiA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2ModGVtcENvbnZlcnNpb25TaXplICsxLCAwLCAiY29udmVyc2lvbiBidWYiKTsKLSAgICBpZih0ZW1wQ29udmVyc2lvbkJ1ZiA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIHdoZW4gYWxsb2NhdGluZyBjb252ZXJzaW9uIGJ1ZmZlclxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIE00T1NBX1RvVVRGOF9PU0FMKHBVcmwsIHRlbXBDb252ZXJzaW9uQnVmLCAmdGVtcENvbnZlcnNpb25TaXplKTsKLSAgICAoKE00T1NBX0NoYXIqKXRlbXBDb252ZXJzaW9uQnVmKVt0ZW1wQ29udmVyc2lvblNpemUgXSA9ICdcMCc7Ci0KLSAgICBwcmludGYoImZpbGUgb3BlbiAlc1xuIiwgdGVtcENvbnZlcnNpb25CdWYpOwotI2VuZGlmIC8qVVRGIENPTlZFUlNJT04qLwotCi0gICAgTTRPU0FfVFJBQ0UzXzQoIk00T1NBX2ZpbGVDb21tb25PcGVuXHRcdE00T1NBX1VJbnQxNiAlZFx0TTRPU0FfQ29udGV4dCogMHgleFx0IgotICAgICAgICAiTTRPU0FfQ2hhciogJXNcdGZpbGVNb2RlQWNjZXNzICVkIiwgY29yZV9pZCwgcENvbnRleHQsIHBVcmwsIGZpbGVNb2RlQWNjZXNzKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCAgICBNNEVSUl9QQVJBTUVURVIsICAgICJNNE9TQV9maWxlQ29tbW9uT3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBVcmwsICAgICAgICBNNEVSUl9QQVJBTUVURVIsICAgICJNNE9TQV9maWxlQ29tbW9uT3BlbjogcFVybCAgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigwID09IGZpbGVNb2RlQWNjZXNzLCAgICBNNEVSUl9QQVJBTUVURVIsICAgICJNNE9TQV9maWxlQ29tbW9uT3BlbjogZmlsZU1vZGVBY2Nlc3MgaXMgMCIpOwotCi0gICAgLyogUmVhZCBtb2RlIG5vdCBzZXQgZm9yIHRoZSByZWFkZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpICYmICEoZmlsZU1vZGVBY2Nlc3MgJiBNNE9TQV9rRmlsZVJlYWQpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZVJlYWQiKTsKLQotICAgIC8qIFJlYWQgbW9kZSBub3Qgc2V0IGZvciB0aGUgcmVhZGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9GSUxFX1JFQURFUiA9PSBjb3JlX2lkKSAmJiAhKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSwKLSAgICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTTRPU0Ffa0ZpbGVSZWFkIik7Ci0KLSAgICAvKiBNNE9TQWZpbGVSZWFkT3BlbiBjYW5ub3QgYmUgdXNlZCB3aXRoIFdyaXRlIGZpbGUgbW9kZSBhY2Nlc3MgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpICYmIChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZVdyaXRlIik7Ci0KLSAgICAvKiBBcHBlbmQgYW5kIENyZWF0ZSBmbGFncyBjYW5ub3QgYmUgdXNlZCB3aXRoIFJlYWQgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpICYmIChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQXBwZW5kKSwKLSAgICAgICAgTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogTTRPU0Ffa0ZpbGVBcHBlbmQiKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfRklMRV9SRUFERVIgPT0gY29yZV9pZCkgJiYgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVDcmVhdGUpLAotICAgICAgICBNNEVSUl9GSUxFX0JBRF9NT0RFX0FDQ0VTUywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBNNE9TQV9rRmlsZUNyZWF0ZSIpOwotCi0gICAgLyogV3JpdGUgbW9kZSBub3Qgc2V0IGZvciB0aGUgd3JpdGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9GSUxFX1dSSVRFUiA9PSBjb3JlX2lkKSAmJiAhKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSksCi0gICAgICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE00T1NBX2tGaWxlV3JpdGUiKTsKLQotICAgIC8qIENyZWF0ZSBmbGFnIG5lY2Vzc2FyeSBmb3Igb3BlbmluZyBmaWxlICovCi0gICAgaWYgKChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkgJiYKLSAgICAgICAgKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVXcml0ZSkmJihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlQ3JlYXRlKSkKLSAgICB7Ci0gICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBXcml0ZVN0cmluZywgKHNpemVfdCkxKTsKLSAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcFBsdXNTdHJpbmcsIChzaXplX3QpMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBBcHBlbmRTdHJpbmcsIChzaXplX3QpMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RybmNhdCgoY2hhciAqKW1vZGUsIChjb25zdCBjaGFyICopcFJlYWRTdHJpbmcsIChzaXplX3QpMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKiltb2RlLCAoY29uc3QgY2hhciAqKXBXcml0ZVN0cmluZywgKHNpemVfdCkxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKChmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlUmVhZCkmJihmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwoY29uc3QgY2hhciAqKXBQbHVzU3RyaW5nLCAoc2l6ZV90KTEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIShmaWxlTW9kZUFjY2VzcyAmIE00T1NBX2tGaWxlSXNUZXh0TW9kZSkpCi0gICAgewotICAgICAgICBzdHJuY2F0KChjaGFyICopbW9kZSwgKGNvbnN0IGNoYXIgKilwQmluYXJ5U3RyaW5nLChzaXplX3QpMSk7Ci0gICAgfQotCi0gICAgLypPcGVuIHRoZSBmaWxlKi8KLQotI2lmZGVmIFVURl9DT05WRVJTSU9OCi0gICAgLypPcGVuIHRoZSBjb252ZXJ0ZWQgcGF0aCovCi0gICAgcEZpbGVIYW5kbGVyID0gZm9wZW4oKGNvbnN0IGNoYXIgKil0ZW1wQ29udmVyc2lvbkJ1ZiwgKGNvbnN0IGNoYXIgKiltb2RlKTsKLSAgICAvKkZyZWUgdGhlIHRlbXBvcmFyeSBkZWNvZGVkIGJ1ZmZlciovCi0gICAgZnJlZSh0ZW1wQ29udmVyc2lvbkJ1Zik7Ci0jZWxzZSAvKiBVVEZfQ09OVkVSU0lPTiAqLwotICAgIHBGaWxlSGFuZGxlciA9IGZvcGVuKChjb25zdCBjaGFyICopcFVybCwgKGNvbnN0IGNoYXIgKiltb2RlKTsKLSNlbmRpZiAvKiBVVEZfQ09OVkVSU0lPTiAqLwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcEZpbGVIYW5kbGVyKQotICAgIHsKLSAgICAgICAgc3dpdGNoKGVycm5vKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRU5PRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0ZJTEVfTk9UX0ZPVU5ELCAiTTRPU0FfZmlsZUNvbW1vbk9wZW46IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRmlsZSBub3QgZm91bmQ6ICVzIiwgcFVybCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEVBQ0NFUzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9GSUxFX0xPQ0tFRCwgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBQZXJtaXNzaW9uIGRlbmllZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9GSUxFX0xPQ0tFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgRUlOVkFMOgotICAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfRklMRV9CQURfTU9ERV9BQ0NFU1MsICJNNE9TQV9maWxlQ29tbW9uT3BlbjogSW52YWxpZCBBcmd1bWVudCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOwotICAgICAgICAgfQotICAgICAgICBjYXNlIEVNRklMRToKLSAgICAgICAgIGNhc2UgRU5PU1BDOgotICAgICAgICBjYXNlIEVOT01FTToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVDb21tb25PcGVuOiBUb28gbWFueSBvcGVuIGZpbGVzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX2ZpbGVDb21tb25PcGVuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIHRoZSBmaWxlIGNvbnRleHQgKi8KLSAgICBwRmlsZUNvbnRleHQgPSAoTTRPU0FfRmlsZUNvbnRleHQqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX0ZpbGVDb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgY29yZV9pZCwgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlQ29tbW9uT3BlbjogZmlsZSBjb250ZXh0Iik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0KQotICAgIHsKLSAgICAgICAgZmNsb3NlKHBGaWxlSGFuZGxlcik7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjICAgICAgICA9IHBGaWxlSGFuZGxlcjsKLSAgICBwRmlsZUNvbnRleHQtPmFjY2Vzc19tb2RlICAgID0gZmlsZU1vZGVBY2Nlc3M7Ci0gICAgcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgICAgPSBTZWVrTm9uZTsKLSAgICBwRmlsZUNvbnRleHQtPmJfaXNfZW5kX29mX2ZpbGUgICAgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICAqIE5vdGU6IE5ldmVyIHVzZSB0aGlzIGV4cHJlc3Npb24gImkgPSAodmFsdWUxID09IHZhbHVlMikgPyB4OiB5OyIKLSAgICAgKiBiZWNhdXNlIHRoYXQgZG9lbnMndCBjb21waWxlIG9uIG90aGVyIHBsYXRmb3JtcyAoQURTIGZvciBleGFtcGxlKQotICAgICAqIFVzZTogaWYodmFsdWUxID09IHZhbHVlMikKLSAgICAgKiAgICAgICAgeyBpPSB4OyAuLmV0YwotICAgICAqLwotICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3dyaXRlID0gMDsKLSAgICBwRmlsZUNvbnRleHQtPmNvcmVJRF9yZWFkID0gMDsKLSAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gTTRPU0Ffa0Rlc2NOb25lQWNjZXNzOwotCi0gICAgaWYgKE00T1NBX0ZJTEVfUkVBREVSID09IGNvcmVfaWQpCi0gICAgewotICAgICAgICBwRmlsZUNvbnRleHQtPmNvcmVJRF9yZWFkID0gY29yZV9pZDsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcyA9IE00T1NBX2tEZXNjUmVhZEFjY2VzczsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTTRPU0FfRklMRV9XUklURVIgPT0gY29yZV9pZCkKLSAgICB7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3dyaXRlID0gY29yZV9pZDsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcyA9IE00T1NBX2tEZXNjV3JpdGVBY2Nlc3M7Ci0gICAgfQotCi0gICAgcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uID0gMDsKLSAgICBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uID0gMDsKLQotICAgIC8qIEFsbG9jYXRlIHRoZSBtZW1vcnkgdG8gc3RvcmUgdGhlIFVSTCBzdHJpbmcgKi8KLSAgICBwRmlsZUNvbnRleHQtPnVybF9uYW1lID0gKE00T1NBX0NoYXIqKSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKChjb25zdCBjaGFyICopcFVybCkrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfaWQsIChNNE9TQV9DaGFyKikiTTRPU0FfZmlsZUNvbW1vbk9wZW46IFVSTCBuYW1lIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT51cmxfbmFtZSkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShwRmlsZUhhbmRsZXIpOwotICAgICAgICBmcmVlKHBGaWxlQ29udGV4dCk7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZUNvbW1vbk9wZW4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBNNE9TQV9jaHJOQ29weShwRmlsZUNvbnRleHQtPnVybF9uYW1lLCBwVXJsLCBzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKSsxKTsKLQotICAgIC8qIEdldCB0aGUgZmlsZSBuYW1lICovCi0gICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lKHBVcmwsICZwRmlsZUNvbnRleHQtPmZpbGVfbmFtZSk7Ci0gICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBmY2xvc2UocEZpbGVIYW5kbGVyKTsKLSAgICAgICAgZnJlZShwRmlsZUNvbnRleHQtPnVybF9uYW1lKTsKLSAgICAgICAgZnJlZShwRmlsZUNvbnRleHQpOwotICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlQ29tbW9uT3BlbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVPcGVuKCYocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCksIDEpOyAvKiBBbGxvY2F0ZSB0aGUgc2VtYXBob3JlICovCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0KLQotI2lmZGVmIFVTRV9TVEFHRUZSSUdIVF9DT0RFQ1MKLSAgICAvLyBXb3JrYXJvdW5kIGZvciBmaWxlIHN5c3RlbSBidWcgb24gU3RpbmdyYXkvSG9uZXljb21iIHdoZXJlIGEgZmlsZSByZS1jcmVhdGVkIHdpbGwga2VlcAotICAgIC8vIHRoZSBvcmlnaW5hbCBmaWxlJ3Mgc2l6ZSBmaWxsZWQgd2l0aCAwcy4gRG8gbm90IHNlZWsgdG8gdGhlIGVuZCB0byBhdm9pZCBpbGwgZWZmZWN0cwotICAgIGlmKGZpbGVNb2RlQWNjZXNzICYgTTRPU0Ffa0ZpbGVBcHBlbmQpIHsKLSAgICAgICAgLyogR2V0IHRoZSBmaWxlIHNpemUgKi8KLSAgICAgICAgaVNhdmVQb3MgPSBmdGVsbChwRmlsZUhhbmRsZXIpOyAgICAgICAgICAgIC8qICAgIDEtIENoZWNrIHRoZSBmaXJzdCBwb3NpdGlvbiAqLwotICAgICAgICBmc2VlayhwRmlsZUhhbmRsZXIsIDAsIFNFRUtfRU5EKTsgICAgICAgIC8qICAgIDItIEdvIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUqLwotICAgICAgICBpU2l6ZSA9IGZ0ZWxsKHBGaWxlSGFuZGxlcik7ICAgICAgICAgICAgLyogICAgMy0gQ2hlY2sgdGhlIGZpbGUgc2l6ZSAgICAgICAgKi8KLSAgICAgICAgZnNlZWsocEZpbGVIYW5kbGVyLCBpU2F2ZVBvcywgU0VFS19TRVQpOy8qICAgIDQtIGdvIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiAqLwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlTaXplID0gMDsKLSAgICB9Ci0jZWxzZSAvKiBVU0VfU1RBR0VGUklHSFRfQ09ERUNTICovCi0gICAgLyogR2V0IHRoZSBmaWxlIHNpemUgKi8KLSAgICBpU2F2ZVBvcyA9IGZ0ZWxsKHBGaWxlSGFuZGxlcik7ICAgICAgICAgICAgLyogICAgMS0gQ2hlY2sgdGhlIGZpcnN0IHBvc2l0aW9uICovCi0gICAgZnNlZWsocEZpbGVIYW5kbGVyLCAwLCBTRUVLX0VORCk7ICAgICAgICAvKiAgICAyLSBHbyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlKi8KLSAgICBpU2l6ZSA9IGZ0ZWxsKHBGaWxlSGFuZGxlcik7ICAgICAgICAgICAgLyogICAgMy0gQ2hlY2sgdGhlIGZpbGUgc2l6ZSAgICAgICAgKi8KLSAgICBmc2VlayhwRmlsZUhhbmRsZXIsIGlTYXZlUG9zLCBTRUVLX1NFVCk7LyogICAgNC0gZ28gdG8gdGhlIGZpcnN0IHBvc2l0aW9uICovCi0jZW5kaWYgLyogVVNFX1NUQUdFRlJJR0hUX0NPREVDUyAqLwotCi0KLQotICAgIC8qIFdhcm5pbmcgcG9zc2libGUgb3ZlcmZsb3cgaWYgdGhlIGZpbGUgaXMgaGlnaGVyIHRoYW4gMkdCeXRlcyAqLwotICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplID0gaVNpemU7Ci0KLSAgICAqcENvbnRleHQgPSBwRmlsZUNvbnRleHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gY29udmVydCBmcm9tIFVURjE2IHRvIFVURjgKLSAqIEBwYXJhbSAgICAgIHBCdWZmZXJJbjogKElOKSBVVEYxNiBpbnB1dCBwYXRoCi0gKiBAcGFyYW0gICAgICBwQnVmZmVyT3V0OiAoT1VUKSBVVEY4IG91dHB1dCBwYXRoCi0gKiBAcGFyYW0gICAgICBidWZmZXJPdXRTaXplOiAoSU4vT1VUKSBzaXplIG9mIHRoZSBvdXRwdXQgcGF0aAotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogdGhlIG91dHB1dCBwYXRoIHNpemUgaXMgbm90IGVub3VnaCB0byBjb250YWluCi0gKiAgICAgICAgICAgICAgIHRoZSBkZWNvZGVkIHBhdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZkZWYgVVRGX0NPTlZFUlNJT04KLU00T1NBX0VSUiBNNE9TQV9Ub1VURjhfT1NBTCAoTTRPU0FfVm9pZCAgICpwQnVmZmVySW4sIE00T1NBX1VJbnQ4ICAqcEJ1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKmJ1ZmZlck91dFNpemUpCi17Ci0gICAgTTRPU0FfVUludDE2IGk7Ci0gICAgd2NoYXJfdCAgICAgICp3X3N0ciA9ICh3Y2hhcl90ICopIHBCdWZmZXJJbjsKLSAgICBNNE9TQV9VSW50MzIgbGVuLCBzaXplX25lZWRlZCwgc2l6ZV9naXZlbjsKLSAgICBpZiAocEJ1ZmZlckluID09IE5VTEwpCi0gICAgewotICAgICAgICAqcEJ1ZmZlck91dD1OVUxMOwotICAgICAgICAqYnVmZmVyT3V0U2l6ZT0xOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBsZW4gICAgICAgICA9IHdjc2xlbih3X3N0cik7Ci0gICAgICAgIHNpemVfbmVlZGVkID0gbGVuKzE7Ci0gICAgICAgIHNpemVfZ2l2ZW4gID0gKmJ1ZmZlck91dFNpemU7Ci0KLSAgICAgICAqYnVmZmVyT3V0U2l6ZT1zaXplX25lZWRlZDsKLSAgICAgICAgaWYgKHNpemVfZ2l2ZW4gPCBzaXplX25lZWRlZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQnVmZmVyT3V0W2ldPShNNE9TQV9VSW50OCl3X3N0cltpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBCdWZmZXJPdXRbbGVuXT0wOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotI2VuZGlmIC8qVVRGIENPTlZFUlNJT04qLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gc2Vla3MgYXQgdGhlIHByb3ZpZGVkIHBvc2l0aW9uLgotICogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgc2Vla01vZGU6IChJTikgU2VlayBhY2Nlc3MgbW9kZQotICogQHBhcmFtICAgICAgcG9zaXRpb246IChJTi9PVVQpIFBvc2l0aW9uIGluIHRoZSBmaWxlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vblNlZWsoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwRmlsZVBvcykKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uIGZwb3NfY3VycmVudDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19zZWVrOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX251bGwgPSAwOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX25lZ191biA9IC0xOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBmcG9zX2ZpbGVfc2l6ZTsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gZnBvc19zZWVrX2Zyb21fYmVnaW5uaW5nOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoIk00T1NBX2ZpbGVDb21tb25TZWVrXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IE00T1NBX0ZpbGVTZWVrQWNjZXNzTW9kZSAlZFx0TTRPU0FfRmlsZVBvc2l0aW9uKiAweCV4IiwKLSAgICAgICAgcENvbnRleHQsIHNlZWtNb2RlLCBwRmlsZVBvcyk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBzZWVrTW9kZSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZVBvcywgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLQotICAgIGZwb3NfZmlsZV9zaXplID0gcEZpbGVDb250ZXh0LT5maWxlX3NpemU7Ci0KLSAgICBpZihTZWVrUmVhZCA9PSBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlaykKLSAgICB7Ci0gICAgICAgIGZwb3NfY3VycmVudCA9IHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbjsKLSAgICB9Ci0gICAgZWxzZSBpZihTZWVrV3JpdGUgPT0gcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWspCi0gICAgewotICAgICAgICBmcG9zX2N1cnJlbnQgPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmcG9zX2N1cnJlbnQgPSAwOwotICAgIH0KLQotICAgIHN3aXRjaChzZWVrTW9kZSkKLSAgICB7Ci0gICAgY2FzZSBNNE9TQV9rRmlsZVNlZWtDdXJyZW50OgotICAgICAgICB7Ci0gICAgICAgICAgICBmcG9zX3NlZWsgPSAqcEZpbGVQb3M7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nOgotICAgICAgICB7Ci0gICAgICAgICAgICBmcG9zX3NlZWsgPSAqcEZpbGVQb3MgLSBmcG9zX2N1cnJlbnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVTZWVrRW5kOgotICAgICAgICB7Ci0gICAgICAgICAgICBmcG9zX3NlZWsgPSAqcEZpbGVQb3MgKyBmcG9zX2ZpbGVfc2l6ZSAtIGZwb3NfY3VycmVudDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZwb3Nfc2Vla19mcm9tX2JlZ2lubmluZyA9IGZwb3NfY3VycmVudCArIGZwb3Nfc2VlazsKLQotICAgIGlmKGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCBmcG9zX3NlZWssIFNFRUtfQ1VSKSAhPSAwKQotICAgIHsKLSAgICAgICAgc3dpdGNoKGVycm5vKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRUlOVkFMOgotICAgICAgICAgICAgewotICAgICAgICAgICAgLyogbWVhbmluZyB0aGUgdmFsdWUgZm9yIG9yaWdpbiBpcyBpbnZhbGlkIG9yIHRoZSBwb3NpdGlvbgotICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSBvZmZzZXQgaXMgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOwotICAgICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRUJBREY6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOy8qIGZpbGUgaGFuZGxlIGlzIGludmFsaWQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcmV0dXJuZWQgcG9zaXRpb24gZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlICovCi0gICAgKnBGaWxlUG9zID0gZnBvc19zZWVrX2Zyb21fYmVnaW5uaW5nOwotCi0gICAgLyogU0VFSyBkb25lLCByZXNldCBlbmQgb2YgZmlsZSB2YWx1ZSAqLwotICAgIHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZSA9IE00T1NBX0ZBTFNFOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdG8gY2xvc2UgdGhlIGZpbGUgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpCi0gKiBAbm90ZSAgICAgICBUaGUgY29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlci93cml0ZXIgaXMgZnJlZWQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVDb21tb25DbG9zZShNNE9TQV9VSW50MTYgY29yZV9pZCwgTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTMyX2Vycl9jb2RlPTA7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZUNvbW1vbkNsb3NlXHRNNE9TQV9VSW50MTYgJWRcdE00T1NBX0NvbnRleHQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9pZCwgcENvbnRleHQpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LAotICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uQ2xvc2U6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkNsb3NlOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgZnJlZShwRmlsZUNvbnRleHQtPnVybF9uYW1lKTsKLSAgICBwRmlsZUNvbnRleHQtPnVybF9uYW1lID0gTTRPU0FfTlVMTDsKLQotICAgIGZyZWUocEZpbGVDb250ZXh0LT5maWxlX25hbWUpOwotICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9uYW1lID0gTTRPU0FfTlVMTDsKLQotICAgIGkzMl9lcnJfY29kZSA9IGZjbG9zZShwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7Ci0KLSAgICBwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyA9IE00T1NBX05VTEw7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlQ2xvc2UocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7LyogZnJlZSB0aGUgc2VtYXBob3JlICovCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgZnJlZShwRmlsZUNvbnRleHQpOwotCi0gICAgaWYgKGkzMl9lcnJfY29kZSAhPSAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9maWxlQ29tbW9uQ2xvc2UiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSBmaWxlIGF0dHJpYnV0ZXMgKGFzc29jaWF0ZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICBjb250ZXh0KQotICogQHBhcmFtICAgICAgY29udGV4dDogKElOKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBhdHRyaWJ1dGU6IChPVVQpIFRoZSBmaWxlIGF0dHJpYnV0ZSAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0ZpbGVBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpCi17Ci0KLSAgICBNNE9TQV9GaWxlQ29udGV4dCogZmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIHN0cnVjdCBzdGF0IFRoZVN0YXQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigiTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZVx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICJNNE9TQV9GaWxlQXR0cmlidXRlKiAweCV4IiwgcENvbnRleHQsIHBBdHRyaWJ1dGUpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlQ29tbW9uR2V0QXR0cmlidXRlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEF0dHJpYnV0ZSwgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZSIpOwotCi0gICAgaWYoc3RhdCgoY2hhciopZmlsZUNvbnRleHQtPnVybF9uYW1lLCAmVGhlU3RhdCkgIT0gMCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfZmlsZUNvbW1vbkdldEF0dHJpYnV0ZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgcEF0dHJpYnV0ZS0+Y3JlYXRpb25EYXRlLnRpbWUgPSAoTTRPU0FfVGltZSlUaGVTdGF0LnN0X2N0aW1lOwotICAgIHBBdHRyaWJ1dGUtPmxhc3RBY2Nlc3NEYXRlLnRpbWUgPSAoTTRPU0FfVGltZSlUaGVTdGF0LnN0X2F0aW1lOwotICAgIHBBdHRyaWJ1dGUtPm1vZGlmaWVkRGF0ZS50aW1lID0gKE00T1NBX1RpbWUpVGhlU3RhdC5zdF9tdGltZTsKLQotICAgIHBBdHRyaWJ1dGUtPmNyZWF0aW9uRGF0ZS50aW1lU2NhbGUgPSAxOwotICAgIHBBdHRyaWJ1dGUtPmxhc3RBY2Nlc3NEYXRlLnRpbWVTY2FsZSA9IDE7Ci0gICAgcEF0dHJpYnV0ZS0+bW9kaWZpZWREYXRlLnRpbWVTY2FsZSA9IDE7Ci0KLSAgICBwQXR0cmlidXRlLT5jcmVhdGlvbkRhdGUucmVmZXJlbmNlWWVhciA9IDE5NzA7Ci0gICAgcEF0dHJpYnV0ZS0+bGFzdEFjY2Vzc0RhdGUucmVmZXJlbmNlWWVhciA9IDE5NzA7Ci0gICAgcEF0dHJpYnV0ZS0+bW9kaWZpZWREYXRlLnJlZmVyZW5jZVllYXIgPSAxOTcwOwotCi0gICAgcEF0dHJpYnV0ZS0+bW9kZUFjY2VzcyA9IGZpbGVDb250ZXh0LT5hY2Nlc3NfbW9kZTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgZmlsZSBVUkwgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6IChJTikgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgdXJsOiAoT1VUKSBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFVSTCAoYWxsb2NhdGVkIGJ5Ci0gKiAgICAgICAgICAgICBNNE9TQV9maWxlQ29tbW9uR2V0VVJMKQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkdldFVSTChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9DaGFyKiogcFVybCkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDMyICAgIHVpTGVuZ3RoOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk00T1NBX2ZpbGVDb21tb25HZXRVUkxcdE00T1NBX0NvbnRleHQgMHgleFx0TTRPU0FfQ2hhcioqIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcFVybCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVDb21tb25HZXRVUkw6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwVXJsLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVDb21tb25HZXRVUkw6IHBVcmwgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgdWlMZW5ndGggPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilwRmlsZUNvbnRleHQtPnVybF9uYW1lKSsxOwotCi0gICAgLyogQWxsb2NhdGUgdGhlIG1lbW9yeSB0byBzdG9yZSB0aGUgdXJsX25hbWUgKi8KLSAgICAqcFVybCA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2ModWlMZW5ndGgsIE00T1NBX0ZJTEVfQ09NTU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNE9TQV9maWxlQ29tbW9uR2V0VVJMOiB1cmwiKTsKLSAgICBpZihNNE9TQV9OVUxMID09ICpwVXJsKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQUxMT0MsICJNNE9TQV9maWxlQ29tbW9uR2V0VVJMIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBNNE9TQV9jaHJOQ29weSgqcFVybCwgcEZpbGVDb250ZXh0LT51cmxfbmFtZSwgdWlMZW5ndGgpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZSBuYW1lIGFzc29jaWF0ZWQKLSAqICAgICAgICAgICAgIHRvIHRoZSBpbnB1dCBVUkwuCi0gKiBAbm90ZSAgICAgICBUaGUgdXNlciBzaG91bGQgbm90IGZvcmdldCB0byBkZWxldGUgdGhlIG91dHB1dCBzdHJpbmcgdXNpbmcKLSAqICAgICAgICAgICAgIE00T1NBX3N0ckRlc3Ryb3kKLSAqIEBwYXJhbSAgICAgIHBVcmw6ICAgICAgICAgICAgKElOKSBUaGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFVSTAotICogQHBhcmFtICAgICAgcEZpbGVOYW1lOiAgICAoT1VUKSBUaGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFVSTC4gSXQgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBpbnNpZGUgdGhpcyBmdW5jdGlvbgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgIGZpbGUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lKE00T1NBX0NoYXIqIHBVcmwsIE00T1NBX0NoYXIqKiBwRmlsZU5hbWUpCi17Ci0gICAgTTRPU0FfSW50MzIgaSAgICAgICAgICAgID0gMDsKLSAgICBNNE9TQV9JbnQzMiBpVXJsTGVuICAgICAgICA9IDA7Ci0gICAgTTRPU0FfSW50MzIgRmlsZU5hbWVMZW4gPSAwOwotCi0gICAgTTRPU0FfQ2hhciogcHRyVXJsICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfQ2hhciogcHRyRmlsZW5hbWUgICAgPSBNNE9TQV9OVUxMOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk00T1NBX2ZpbGVDb21tb25HZXRVUkxcdE00T1NBX0NoYXIqICVzXHRNNE9TQV9DaGFyKiogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXJsLCBwRmlsZU5hbWUpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFVybCwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZUNvbW1vbkdldEZpbGVuYW1lOiBwVXJsIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZU5hbWUsICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlQ29tbW9uR2V0RmlsZW5hbWU6IHBGaWxlTmFtZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAqcEZpbGVOYW1lID0gTTRPU0FfTlVMTDsKLQotICAgIC8qUGFyc2UgVVJMKi8KLSAgICBpVXJsTGVuID0gc3RybGVuKChjb25zdCBjaGFyICopcFVybCk7Ci0gICAgZm9yKGk9aVVybExlbi0xOyBpPj0wOyBpLS0pCi0gICAgewotICAgICAgICBpZiAocFVybFtpXSAhPSAnXFwnICYmIHBVcmxbaV0gIT0gJy8nKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlTmFtZUxlbisrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7IC8qIGZpbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSBuYW1lICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdHJGaWxlbmFtZSA9IChNNE9TQV9DaGFyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKEZpbGVOYW1lTGVuKzEsIE00T1NBX0ZJTEVfQ09NTU9OLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIk00T1NBX2ZpbGVDb21tb25HZXRGaWxlbmFtZTogRmlsZW5hbWUgc3RyaW5nIik7Ci0gICAgaWYgKHB0ckZpbGVuYW1lID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX2ZpbGVDb21tb25HZXRGaWxlbmFtZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcHRyVXJsID0gcFVybCArIChpVXJsTGVuIC0gRmlsZU5hbWVMZW4pOwotICAgIE00T1NBX2Nock5Db3B5KHB0ckZpbGVuYW1lLCBwdHJVcmwsIEZpbGVOYW1lTGVuKzEpOwotCi0gICAgKnBGaWxlTmFtZSA9IHB0ckZpbGVuYW1lOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVSZWFkZXIuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVSZWFkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDBhNzJmNS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlUmVhZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyLmMKLSAqIEBhdXRob3IgICAgICAgQ2VkcmljIExlY291dHJlIChjZWRyaWMubGVjb3V0cmVAcGhpbGlwcy5jb20pCi0gKiAgICAgICAgICAgICAgIExhdXJlbnQgRmF5IChsYXVyZW50LmZheUBwaGlsaXBzLmNvbSkKLSAqIEBwYXIgT3JnOiAgICAgUGhpbGlwcyBEaWdpdGFsIFN5c3RlbXMgTGFib3JhdG9yaWVzIC0gUGFyaXMgKFBEU0wtUCkKLSAqIEBicmllZiAgICAgICAgRmlsZSByZWFkZXIgZm9yIEFuZHJvaWQKLSAqIEBub3RlICAgICAgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHRvIHJlYWQgYSBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlcl9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIHByb3ZpZGVkIFVSTCBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KLSogICAgICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJlZCwgdGhlIGNvbnRleHQgaXMgc2V0IHRvIE5VTEwuCi0qIEBwYXJhbSAgICAgIGNvbnRleHQ6IChPVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIKLSogQHBhcmFtICAgICAgdXJsOiAoSU4pIFVSTCBvZiB0aGUgaW5wdXQgZmlsZQotKiBAcGFyYW0gICAgICBmaWxlTW9kZUFjY2VzczogKElOKSBGaWxlIG1vZGUgYWNjZXNzCi0qIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0qIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGUgVVJMIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHN1cHBvcnRlZAotKiAgICAgICAgICAgICBmaWxlCi0qIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQKLSogQHJldHVybiAgICAgTTRFUlJfRklMRV9MT0NLRUQ6IHRoZSBmaWxlIGlzIGxvY2tlZCBieSBhbiBvdGhlcgotKiAgICAgICAgICAgICBhcHBsaWNhdGlvbi9wcm9jZXNzCi0qIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOiB0aGUgZmlsZSBtb2RlIGFjY2VzcyBpcyBub3QgY29ycmVjdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkT3BlbihNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZU1vZGVBY2Nlc3MpCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzMoIk00T1NBX2ZpbGVSZWFkT3BlbiA6IHBDID0gMHglcCAgZmQgPSAweCVwICBtb2RlID0gJWx1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcEZpbGVEZXNjcmlwdG9yLCBmaWxlTW9kZUFjY2Vzcyk7Ci0KLSAgICByZXR1cm4gTTRPU0FfZmlsZUNvbW1vbk9wZW4oTTRPU0FfRklMRV9SRUFERVIsIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZURlc2NyaXB0b3IsIGZpbGVNb2RlQWNjZXNzKTsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgJ3NpemUnIGJ5dGVzIGluIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0qICAgICAgICAgICAgIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKSBhbmQgd3JpdGVzIHRoZSBkYXRhIHRvIHRoZSAnZGF0YScKLSogICAgICAgICAgICAgcG9pbnRlci4KLSogQG5vdGUgICAgICAgSWYgJ3NpemUnIGJ5dGUgY2Fubm90IGJlIHJlYWQgaW4gdGhlIGNvcmUgZmlsZSByZWFkZXIsICdzaXplJwotKiAgICAgICAgICAgICBwYXJhbWV0ZXIgaXMgdXBkYXRlZCB0byBtYXRjaCB0aGUgY29ycmVjdAotKiBAbm90ZSAgICAgICBudW1iZXIgb2YgcmVhZCBieXRlcy4KLSogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotKiBAcGFyYW0gICAgICBidWZmZXI6IChPVVQpIERhdGEgcG9pbnRlciBvZiB0aGUgcmVhZCBkYXRhCi0qIEBwYXJhbSAgICAgIHNpemU6IChJTi9PVVQpIFNpemUgb2YgdGhlIGRhdGEgdG8gcmVhZCAoaW4gYnl0ZXMpCi0qIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0qIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0qIEByZXR1cm4gICAgIE00V0FSX05PX0RBVEFfWUVUOiB0aGVyZSBpcyBubyBlbm91Z2ggZGF0YSB0byBmaWxsIHRoZSAnZGF0YScKLSogICAgICAgICAgICAgYnVmZmVyLCBzbyB0aGUgc2l6ZSBwYXJhbWV0ZXIgaGFzIGJlZW4gdXBkYXRlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZERhdGEoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfTWVtQWRkcjggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFNpemUpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotICAgIE00T1NBX0VSUiAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0ludDMyICAgIHVpU2l6ZVJlYWQ7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfZmlsZVJlYWREYXRhIDogZGF0YSA9IDB4JXAgIHNpemUgPSAlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgKE00T1NBX05VTEwgIT0gcFNpemUpID8gKCpwU2l6ZSkgOiAwKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkRGF0YTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IGRhdGEsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkRGF0YTogZGF0YSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFNpemUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWREYXRhOiBwU2l6ZSBpcyBNNE9TQV9OVUxMIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCi0gICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVSZWFkRGF0YTogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIGlmKE00T1NBX2tEZXNjUldBY2Nlc3MgPT0gcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcykgLyogcmVhZCB3cml0ZSAqLwotICAgIHsKLSAgICAgICAgdWlTaXplUmVhZCA9IGZyZWFkKGRhdGEsIHNpemVvZihNNE9TQV9DaGFyKSwgKnBTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLSAgICAgICAgaWYoLTEgPT0gdWlTaXplUmVhZCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogaGFuZGxlIGlzIGludmFsaWQsIG9yIHRoZSBmaWxlIGlzIG5vdCBvcGVuIGZvciByZWFkaW5nLCBvciB0aGUgZmlsZSBpcyBsb2NrZWQgKi8KLSAgICAgICAgICAgICpwU2l6ZSA9IDA7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiArIHVpU2l6ZVJlYWQ7Ci0gICAgICAgICAgICBpZiAoKE00T1NBX1VJbnQzMil1aVNpemVSZWFkIDwgKnBTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwU2l6ZSA9IHVpU2l6ZVJlYWQ7Ci0gICAgICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgICAgICAgICAgICAgICBwRmlsZUNvbnRleHQtPmJfaXNfZW5kX29mX2ZpbGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwU2l6ZSA9IHVpU2l6ZVJlYWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYocEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgIT0gU2Vla1JlYWQpCi0gICAgewotICAgICAgICAvKiBmc2VlayB0byB0aGUgbGFzdCByZWFkIHBvc2l0aW9uICovCi0gICAgICAgIGVyciA9IE00T1NBX2ZpbGVDb21tb25TZWVrKHBDb250ZXh0LCBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbikpOwotICAgICAgICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfREVCVUcoZXJyLCAiTTRPU0FfZmlsZVJlYWREYXRhOiBNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICAgICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayA9IFNlZWtSZWFkOwotICAgIH0KLQotICAgIC8qIFJlYWQgZGF0YSAqLwotICAgIHVpU2l6ZVJlYWQgPSBmcmVhZChkYXRhLCBzaXplb2YoTTRPU0FfQ2hhciksICpwU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7Ci0gICAgaWYoLTEgPT0gdWlTaXplUmVhZCkKLSAgICB7Ci0gICAgICAgIC8qIGhhbmRsZSBpcyBpbnZhbGlkLCBvciB0aGUgZmlsZSBpcyBub3Qgb3BlbiBmb3IgcmVhZGluZywKLSAgICAgICAgIG9yIHRoZSBmaWxlIGlzIGxvY2tlZCAqLwotICAgICAgICAqcFNpemUgPSAwOwotICAgICAgICBlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uID0gcEZpbGVDb250ZXh0LT5yZWFkX3Bvc2l0aW9uICsgdWlTaXplUmVhZDsKLSAgICAgICAgaWYgKChNNE9TQV9VSW50MzIpdWlTaXplUmVhZCA8ICpwU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBTaXplID0gdWlTaXplUmVhZDsKLQotICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+Yl9pc19lbmRfb2ZfZmlsZSA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgIGVyciA9IE00V0FSX05PX0RBVEFfWUVUOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKnBTaXplID0gdWlTaXplUmVhZDsKLSAgICAgICAgfQotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBzZWVrcyBhdCB0aGUgcHJvdmlkZWQgcG9zaXRpb24gaW4gdGhlIGNvcmUgZmlsZQotICogICAgICAgICAgICAgcmVhZGVyIChzZWxlY3RlZCBieSBpdHMgJ2NvbnRleHQnKS4gVGhlIHBvc2l0aW9uIGlzIHJlbGF0ZWQgdG8KLSAqICAgICAgICAgICAgIHRoZSBzZWVrTW9kZSBwYXJhbWV0ZXIgaXQgY2FuIGJlIGVpdGhlciBmcm9tIHRoZSBiZWdpbm5pbmcsIGZyb20KLSAqICAgICAgICAgICAgIHRoZSBlbmQgb3IgZnJvbSB0aGUgY3VycmVudCBwb3N0aW9uLiBUbyBzdXBwb3J0IGxhcmdlIGZpbGUKLSAqICAgICAgICAgICAgIGFjY2VzcyAobW9yZSB0aGFuIDJHQnl0ZXMpLCB0aGUgcG9zaXRpb24gaXMgcHJvdmlkZWQgb24gYSA2NAotICogICAgICAgICAgICAgYml0cy4KLSAqIEBub3RlICAgICAgIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciB0aGUgY3VycmVudCBwb3NpdGlvbiBwb2ludGVyCi0gKiAgICAgICAgICAgICBpbiB0aGUgZmlsZSBtdXN0IG5vdCBjaGFuZ2UuIEVsc2UgdGhlIGN1cnJlbnQKLSAqICAgICAgICAgICAgIHBvc2l0aW9uIHBvaW50ZXIgbXVzdCBiZSB1cGRhdGVkLgotICogQHBhcmFtICAgICAgY29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgc2Vla01vZGU6IChJTikgU2VlayBhY2Nlc3MgbW9kZQotICogQHBhcmFtICAgICAgcG9zaXRpb246IChJTi9PVVQpIFBvc2l0aW9uIGluIHRoZSBmaWxlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNlZWsoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRmlsZVNlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbikKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gKE00T1NBX0ZpbGVDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX2ZpbGVSZWFkU2VlayA6IG1vZGUgPSAlZCAgcG9zID0gJWx1Iiwgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQb3NpdGlvbiAhPSBNNE9TQV9OVUxMKSA/ICgqcFBvc2l0aW9uKSA6IDApOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZWVrOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gc2Vla01vZGUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZWVrOiBzZWVrTW9kZSBpcyAwIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFBvc2l0aW9uLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZWVrOiBwUG9zaXRpb24gaXMgTTRPU0FfTlVMTCIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LAotICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9maWxlUmVhZFNlZWs6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZiAoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKQotICAgIHsKLSAgICAgICAgIE00T1NBX1VJbnQzMiAgICBTZWVrTW9kZU9wdGlvbjsKLSAgICAgICAgIC8qIEdvIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uICovCi0gICAgICAgIGlmIChNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcgPT0gc2Vla01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19TRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoTTRPU0Ffa0ZpbGVTZWVrRW5kID09IHNlZWtNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZWVrTW9kZU9wdGlvbiA9IFNFRUtfRU5EOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKE00T1NBX2tGaWxlU2Vla0N1cnJlbnQgPT0gc2Vla01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19DVVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRPU0FfZmlsZVJlYWRTZWVrOiBFTkQgV0lUSCBFUlJPUiAhISEgKENPTlZFUklPTiBFUlJPUiBGT1IgVEhFIFNFRUsgTU9ERSkiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR28gdG8gdGhlIGRlc2lyZWQgcG9zaXRpb24gKi8KLSAgICAgICAgZXJyID0gZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsICpwUG9zaXRpb24sIFNlZWtNb2RlT3B0aW9uKTsKLSAgICAgICAgaWYoZXJyICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGNvbnZlcnRzIHRoZSBlcnJvciB0byBQU1cgZm9ybWF0Ki8KLSAgICAgICAgICAgIGVycj0oKE00T1NBX1VJbnQzMikoTTRfRVJSKTw8MzApKygoKE00T1NBX0ZJTEVfV1JJVEVSKSYweDAwM0ZGRik8PDE2KSsoTTRPU0FfSW50MTYpKGVycik7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfRmlsZVJlYWRTZWVrIGVycm9yOiV4IixlcnIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSZXR1cm4gd2l0aG91dCBlcnJvciAqLwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZihwRmlsZUNvbnRleHQtPmN1cnJlbnRfc2VlayAhPSBTZWVrUmVhZCkKLSAgICB7Ci0KLSAgICAgICAgLyogZnNlZWsgdG8gdGhlIGxhc3QgcmVhZCBwb3NpdGlvbiAqLwotICAgICAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uU2VlayhwQ29udGV4dCwgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb24pKTsKLSAgICAgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVSZWFkRGF0YTogTTRPU0FfZmlsZUNvbW1vblNlZWsiKTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgPSBTZWVrUmVhZDsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uU2VlayhwQ29udGV4dCwgc2Vla01vZGUsIHBQb3NpdGlvbik7Ci0gICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlUmVhZERhdGE6IE00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+cmVhZF9wb3NpdGlvbiA9ICpwUG9zaXRpb247Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byBjbG9zZSB0aGUgZmlsZQotICogICAgICAgICAgICAgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpLgotICogQG5vdGUgICAgICAgVGhlIGNvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSByZWFkZXIgaXMgZnJlZWQuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVJlYWRDbG9zZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSAoTTRPU0FfRmlsZUNvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX2ZpbGVSZWFkQ2xvc2UgOiBwQyA9IDB4JXAiLCBwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVSZWFkQ2xvc2U6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIGlmKE00T1NBX0ZJTEVfV1JJVEVSID09IHBGaWxlQ29udGV4dC0+Y29yZUlEX3dyaXRlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25DbG9zZShNNE9TQV9GSUxFX1JFQURFUiwgcENvbnRleHQpOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byByZXR1cm4gdGhlIHZhbHVlCi0gKiAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogICAgICAgICAgICAgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotICogQG5vdGUgICAgICAgJ3ZhbHVlJyBtdXN0IGJlIGNhc3QgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIHJlbGF0ZWQgdG8gdGhlCi0gKiAgICAgICAgICAgICBvcHRpb25JRCBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogICAgICAgICAgICAgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZSAndmFsdWUnIGZpZWxkLCB0aGUgY2FsbGVlIG11c3QgY29weQotICogICAgICAgICAgICAgdGhpcyBmaWVsZCB0byBpdHMgaW50ZXJuYWwgdmFyaWFibGUuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgcE9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSAgICAgIHBPcHRpb25WYWx1ZTogKE9VVCkgVmFsdWUgb2YgdGhlIG9wdGlvbgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX1dSSVRFX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgd3JpdGUgb25seSBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0ZpbGVSZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcE9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZEdldE9wdGlvbiA6IG9wdGlvbiA9IDB4JXgiLCBvcHRpb25JRCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb246IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIob3B0aW9uSUQgPT0gMCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb246IG9wdGlvbklEIGlzIDAiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwT3B0aW9uVmFsdWUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb246IHBPcHRpb25WYWx1ZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX0ZJTEVfUkVBREVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfUkVBREFCTEUob3B0aW9uSUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9XUklURV9PTkxZLCAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb24iKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRHZXRPcHRpb246IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBzd2l0Y2gob3B0aW9uSUQpCi0gICAgewotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9QT1NJVElPTiA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVBvc2l0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbiA9IChNNE9TQV9GaWxlUG9zaXRpb24qKXBPcHRpb25WYWx1ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgICpwUG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPnJlYWRfcG9zaXRpb247Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfRklMRV9QT1NJVElPTiovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfSVNfRU9GID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRJc0VPRjoKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfQm9vbCogYklzRW5kT2ZGaWxlID0gKE00T1NBX0Jvb2wqKXBPcHRpb25WYWx1ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgICpiSXNFbmRPZkZpbGUgPSBwRmlsZUNvbnRleHQtPmJfaXNfZW5kX29mX2ZpbGU7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9JU19FT0YqLwotCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfU0laRSA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZVNpemU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcFBvc2l0aW9uID0gKE00T1NBX0ZpbGVQb3NpdGlvbiopcE9wdGlvblZhbHVlOwotICAgICAgICAgICAgTTRPU0FfSW50MzIgaVNhdmVQb3MgICAgPSAwOwotICAgICAgICAgICAgTTRPU0FfSW50MzIgaVNpemUgICAgICAgID0gMDsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQnVnZml4OiB1cGRhdGUgdGhlIGZpbGUgc2l6ZS4KLSAgICAgICAgICAgICogV2hlbiBhIGZpbGUgaXMgaW4gcmVhZCBtb2RlLCBtYXkgYmUgYW5vdGhlciBhcHBsaWNhdGlvbiBpcyB3cml0aW5nIGluLgotICAgICAgICAgICAgKiBTbywgd2UgaGF2ZSB0byB1cGRhdGUgdGhlIGZpbGUgc2l6ZSAqLwotICAgICAgICAgICAgaVNhdmVQb3MgPSBmdGVsbChwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7ICAgICAgICAgICAgLyoxLSBDaGVjayB0aGUgZmlyc3QgcG9zaXRpb24gKi8KLSAgICAgICAgICAgIGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCAwLCBTRUVLX0VORCk7ICAgICAgICAvKjItIEdvIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgKi8KLSAgICAgICAgICAgIGlTaXplID0gZnRlbGwocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOyAgICAgICAgICAgICAgICAvKjMtIENoZWNrIHRoZSBmaWxlIHNpemUqLwotICAgICAgICAgICAgZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIGlTYXZlUG9zLCBTRUVLX1NFVCk7ICAgIC8qNC0gZ28gdG8gdGhlIGZpcnN0IHBvc2l0aW9uKi8KLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplID0gaVNpemU7Ci0KLSAgICAgICAgICAgICpwUG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX1NJWkUqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9SRUFEX0dFVF9GSUxFX0FUVFJJQlVURSA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkR2V0RmlsZUF0dHJpYnV0ZToKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9GaWxlQXR0cmlidXRlKilwT3B0aW9uVmFsdWUpOwotICAgICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9GSUxFX1JFQURfR0VUX0ZJTEVfQVRUUklCVVRFKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfVVJMID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVJlYWRHZXRVUkw6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uR2V0VVJMKHBDb250ZXh0LCAoTTRPU0FfQ2hhcioqKXBPcHRpb25WYWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfUkVBRF9HRVRfVVJMKi8KLQotICAgICAgICBjYXNlIE00T1NBX2tGaWxlUmVhZExvY2tNb2RlOgotICAgICAgICB7Ci0gICAgICAgICAgICAqKE00T1NBX1VJbnQzMiopcE9wdGlvblZhbHVlID0gcEZpbGVDb250ZXh0LT5tX3VpTG9ja01vZGU7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX2ZpbGVSZWFkR2V0T3B0aW9uIik7Ci0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgIE00T1NBX0VSUiBNNE9TQV9maWxlUmVhZFNldE9wdGlvbiAoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKSkKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHJlYWRlciB0byBzZXQgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3B0aW9uSUQuCi0gKiAgICAgICAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgICBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlICd2YWx1ZScgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5IHRoaXMgZmllbGQKLSAqICAgICAgICAgICAgIHRvIGl0cyBpbnRlcm5hbCB2YXJpYWJsZS4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgICBvcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICB2YWx1ZTogKElOKSBWYWx1ZSBvZiB0aGUgb3B0aW9uCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIG9wdGlvbklEIGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfUkVBRF9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHJlYWQgb25seSBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRPcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgIE00T1NBX0ZpbGVDb250ZXh0KiBwRmlsZUNvbnRleHQgPSBwQ29udGV4dDsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiA6IG9wdGlvbiA9IDB4JXgiLCBvcHRpb25JRCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb246IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSBvcHRpb25JRCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX0ZJTEVfUkVBREVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX2ZpbGVSZWFkU2V0T3B0aW9uIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19XUklUQUJMRShvcHRpb25JRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9SRUFEX09OTFksICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbjogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVSZWFkTG9ja01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+bV91aUxvY2tNb2RlPSAoTTRPU0FfVUludDMyKSooTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV9maWxlUmVhZFNldE9wdGlvbiIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVXcml0ZXIuYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX0ZpbGVXcml0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzdmYzE3My4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9GaWxlV3JpdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfRmlsZVdyaXRlci5jCi0gKiBAYnJpZWYgICAgICAgIEZpbGUgd3JpdGVyIGZvciBBbmRyb2lkCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byB3cml0ZSBpbiBhIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlQ29tbW9uX3ByaXYuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlcl9wcml2LmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIHByb3ZpZGVkIFVSTCBhbmQgcmV0dXJucyBpdHMgY29udGV4dC4KLSAqICAgICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VyZWQsIHRoZSBjb250ZXh0IGlzIHNldCB0byBOVUxMLgotICogQHBhcmFtICAgICAgcENvbnRleHQ6IChPVVQpIENvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIKLSAqIEBwYXJhbSAgICAgIHBVcmw6IChJTikgVVJMIG9mIHRoZSBpbnB1dCBmaWxlCi0gKiBAcGFyYW0gICAgICBmaWxlTW9kZUFjY2VzczogKElOKSBGaWxlIG1vZGUgYWNjZXNzCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhlIFVSTCBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgIGZpbGUKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiB0aGUgZmlsZSBjYW5ub3QgYmUgZm91bmQKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfTE9DS0VEOiB0aGUgZmlsZSBpcyBsb2NrZWQgYnkgYW4gb3RoZXIKLSAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uL3Byb2Nlc3MKLSAqIEByZXR1cm4gICAgIE00RVJSX0ZJTEVfQkFEX01PREVfQUNDRVNTOiB0aGUgZmlsZSBtb2RlIGFjY2VzcyBpcyBub3QgY29ycmVjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVPcGVuKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzKQotewotICAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV9maWxlV3JpdGVPcGVuIDogcEMgPSAweCVwICBmZCA9IDB4JXAgIG1vZGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcFVybCwgZmlsZU1vZGVBY2Nlc3MpOwotCi0gICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25PcGVuKE00T1NBX0ZJTEVfV1JJVEVSLCBwQ29udGV4dCwgcFVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1vZGVBY2Nlc3MpOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgdGhlICdzaXplJyBieXRlcyBzdG9yZWQgYXQgJ2RhdGEnIG1lbW9yeQotICogICAgICAgICAgICAgaW4gdGhlIGZpbGUgc2VsZWN0ZWQgYnkgaXRzIGNvbnRleHQuCi0gKiBAbm90ZSAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0gKiAgICAgICAgICAgICBtZW1vcnkgZm9yICdkYXRhJyBwYXJhbWV0ZXIuCi0gKiBAbm90ZSAgICAgICBNb3Jlb3ZlciB0aGUgZGF0YSBwb2ludGVyIG11c3QgYmUgYWxsb2NhdGVkIHRvIHN0b3JlIGF0IGxlYXN0Ci0gKiAgICAgICAgICAgICAnc2l6ZScgYnl0ZXMuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgYnVmZmVyOiAoSU4pIERhdGEgcG9pbnRlciBvZiB0aGUgd3JpdGUgZGF0YQotICogQHBhcmFtICAgICAgc2l6ZTogKElOKSBTaXplIG9mIHRoZSBkYXRhIHRvIHdyaXRlIChpbiBieXRlcykKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZURhdGEoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfTWVtQWRkcjggZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVNpemUpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IHBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpU2l6ZVdyaXRlOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX2ZpbGVXcml0ZURhdGEgOiBkYXRhID0gMHglcCAgc2l6ZSA9ICVsdSIsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVNpemUpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVEYXRhOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gZGF0YSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVEYXRhOiBkYXRhIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoMCA9PSB1aVNpemUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZURhdGE6IHVpU2l6ZSBpcyAwIik7Ci0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZURhdGE6IHNlbWFwaG9yZV9jb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZiAoTTRPU0Ffa0Rlc2NSV0FjY2VzcyA9PSBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyICAgIFdyaXRlU2l6ZTsKLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgV3JpdGVTaXplID0gZndyaXRlKCh2b2lkICopZGF0YSwxLCB1aVNpemUsIHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLSAgICAgICAgaWYoV3JpdGVTaXplICE9IHVpU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICAgICAgZXJyID0gKChNNE9TQV9VSW50MzIpKE00X0VSUik8PDMwKSsoKChNNE9TQV9GSUxFX1dSSVRFUikmMHgwMDNGRkYpPDwxNikrKE00T1NBX0ludDE2KShXcml0ZVNpemUpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX0ZpbGVXcml0ZURhdGEgZXJyb3I6JXgiLGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgZmZsdXNoKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsKLQotICAgICAgICBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbiArIFdyaXRlU2l6ZTsKLQotICAgICAgICAvKiBVcGRhdGUgdGhlIGZpbGUgc2l6ZSAqLwotICAgICAgICBpZihwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uID4gcEZpbGVDb250ZXh0LT5maWxlX3NpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYocEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgIT0gU2Vla1dyaXRlKQotICAgIHsKLSAgICAgICAgLyogZnNlZWsgdG8gdGhlIGxhc3QgcmVhZCBwb3NpdGlvbiAqLwotICAgICAgICBlcnIgPSBNNE9TQV9maWxlQ29tbW9uU2VlayhwQ29udGV4dCwgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgICAgJihwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uKSk7Ci0KLSAgICAgICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgIHsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLSAgICAgICAgICAgIE00T1NBX0RFQlVHKGVyciwgIk00T1NBX2ZpbGVXcml0ZURhdGE6IE00T1NBX2ZpbGVDb21tb25TZWVrIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgPSBTZWVrV3JpdGU7Ci0gICAgfQotCi0gICAgLyogV3JpdGUgZGF0YSAqLwotICAgIHVpU2l6ZVdyaXRlID0gZndyaXRlKGRhdGEsIHNpemVvZihNNE9TQV9DaGFyKSwgdWlTaXplLCBwRmlsZUNvbnRleHQtPmZpbGVfZGVzYyk7Ci0KLSAgICBpZih1aVNpemVXcml0ZSA9PSAoTTRPU0FfVUludDMyKS0xKQotICAgIHsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgIC8qIEFuIGVycm9yIG9jY3VyZWQgKi8KLQotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX2ZpbGVXcml0ZURhdGE6IGZ3cml0ZSBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUOwotICAgIH0KLQotICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPndyaXRlX3Bvc2l0aW9uICsgdWlTaXplV3JpdGU7Ci0KLSAgICAvKiBVcGRhdGUgdGhlIGZpbGUgc2l6ZSAqLwotICAgIGlmKHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPiBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZSkKLSAgICB7Ci0gICAgICAgIHBGaWxlQ29udGV4dC0+ZmlsZV9zaXplID0gcEZpbGVDb250ZXh0LT53cml0ZV9wb3NpdGlvbjsKLSAgICB9Ci0KLSAgICBpZigoTTRPU0FfVUludDMyKXVpU2l6ZVdyaXRlIDwgdWlTaXplKQotICAgIHsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfZmlsZVdyaXRlRGF0YSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIGZ1bmN0aW9uIHNlZWtzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbiBpbiB0aGUgY29yZSBmaWxlCi0gKiAgICAgICAgICAgICB3cml0ZXIgKHNlbGVjdGVkIGJ5IGl0cyAnY29udGV4dCcpLiBUaGUgcG9zaXRpb24gaXMgcmVsYXRlZCB0bwotICogICAgICAgICAgICAgdGhlIHNlZWtNb2RlIHBhcmFtZXRlciBpdCBjYW4gYmUgZWl0aGVyIGZyb20gdGhlIGJlZ2lubmluZywKLSAqICAgICAgICAgICAgIGZyb20gdGhlIGVuZCBvciBmcm9tIHRoZSBjdXJyZW50IHBvc3Rpb24uIFRvIHN1cHBvcnQgbGFyZ2UgZmlsZQotICogICAgICAgICAgICAgYWNjZXNzIChtb3JlIHRoYW4gMkdCeXRlcyksIHRoZSBwb3NpdGlvbiBpcyBwcm92aWRlZCBvbiBhIDY0Ci0gKiAgICAgICAgICAgICBiaXRzLgotICogQG5vdGUgICAgICAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uIHBvaW50ZXIKLSAqICAgICAgICAgICAgIGluIHRoZSBmaWxlIG11c3Qgbm90IGNoYW5nZS4gRWxzZSB0aGUgY3VycmVudCBwb3NpdGlvbiBwb2ludGVyCi0gKiAgICAgICAgICAgICBtdXN0IGJlIHVwZGF0ZWQuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHJlYWRlcgotICogQHBhcmFtICAgICAgc2Vla01vZGU6IChJTikgU2VlayBhY2Nlc3MgbW9kZQotICogQHBhcmFtICAgICAgcG9zaXRpb246IChJTi9PVVQpIFBvc2l0aW9uIGluIHRoZSBmaWxlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICAgTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OOiB0aGUgcG9zaXRpb24gY2Fubm90IGJlIHJlYWNoZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlU2VlayhNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9GaWxlU2Vla0FjY2Vzc01vZGUgc2Vla01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUG9zaXRpb24qIHBQb3NpdGlvbikKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gKE00T1NBX0ZpbGVDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX2ZpbGVXcml0ZVNlZWsgOiBtb2RlID0gJWQgIHBvcyA9ICVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWVrTW9kZSwgKE00T1NBX05VTEwgIT0gcFBvc2l0aW9uKSA/ICgqcFBvc2l0aW9uKSA6IDApOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZWVrOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gc2Vla01vZGUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZWVrOiBzZWVtTW9kZSBpcyAwIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcFBvc2l0aW9uLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZWVrOiBwUG9zaXRpb24gaXMgTTRPU0FfTlVMTCIpOwotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVTZWVrOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgaWYgKE00T1NBX2tEZXNjUldBY2Nlc3MgPT0gcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcykgLyogcmVhZCB3cml0ZSAqLwotICAgIHsKLSAgICAgICAgIE00T1NBX1VJbnQzMiAgICBTZWVrTW9kZU9wdGlvbjsKLSAgICAgICAgLypUaGUgcG9zaXRpb24gZm9yIHRoZSBzZWVrIG1vZGUgYmV0d2VlbiB0aGUgU0hQIGFuZCB0aGUgT1NBbCBwYXJ0IGFyZSBkaWZmZXJlbnQgKi8KLSAgICAgICAgaWYgKE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZyA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX1NFVDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE9TQV9rRmlsZVNlZWtFbmQgPT0gc2Vla01vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlZWtNb2RlT3B0aW9uID0gU0VFS19FTkQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCA9PSBzZWVrTW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2Vla01vZGVPcHRpb24gPSBTRUVLX0NVUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE9TQV9maWxlV3JpdGVTZWVrOiBFTkQgV0lUSCBFUlJPUiAhISEgKENPTlZFUklPTiBFUlJPUiBGT1IgVEhFIFNFRUsgTU9ERSkgIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdvIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uICovCi0gICAgICAgIGVyciA9IGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCpwUG9zaXRpb24sU2Vla01vZGVPcHRpb24pOwotICAgICAgICBpZihlcnIgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogY29udmVydHMgdGhlIGVycm9yIHRvIFBTVyBmb3JtYXQqLwotICAgICAgICAgICAgZXJyPSgoTTRPU0FfVUludDMyKShNNF9FUlIpPDwzMCkrKCgoTTRPU0FfRklMRV9XUklURVIpJjB4MDAzRkZGKTw8MTYpKyhNNE9TQV9JbnQxNikoZXJyKTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV9GaWxlV3JpdGVTZWVrIGVycm9yOiV4IixlcnIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgZXJyID0gTTRPU0FfZmlsZUNvbW1vblNlZWsocENvbnRleHQsIHNlZWtNb2RlLCBwUG9zaXRpb24pOwotCi0gICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhlcnIsICJNNE9TQV9maWxlV3JpdGVTZWVrOiBNNE9TQV9maWxlQ29tbW9uU2VlayIpOwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb24gPSAqcFBvc2l0aW9uOwotCi0gICAgcEZpbGVDb250ZXh0LT5jdXJyZW50X3NlZWsgPSBTZWVrV3JpdGU7Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0Ffc2VtYXBob3JlUG9zdChwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0KTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHdyaXRlciB0byBjbG9zZSB0aGUgZmlsZQotICogICAgICAgICAgICAgKGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQpLgotICogQG5vdGUgICAgICAgVGhlIGNvbnRleHQgb2YgdGhlIGNvcmUgZmlsZSB3cml0ZXIgaXMgZnJlZWQuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlcgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZUNsb3NlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRmlsZUNvbnRleHQqIHBGaWxlQ29udGV4dCA9IChNNE9TQV9GaWxlQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfZmlsZVdyaXRlQ2xvc2UgOiBwQyA9IDB4JXAiLCBwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlQ2xvc2U6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIHJldHVybiBNNE9TQV9maWxlQ29tbW9uQ2xvc2UoTTRPU0FfRklMRV9XUklURVIsIHBDb250ZXh0KTsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gZmx1c2hlcyB0aGUgc3RyZWFtIGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlcgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfZmlsZVdyaXRlRmx1c2goTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVdyaXRlRmx1c2ggOiBwQyA9IDB4JXAiLCBwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlRmx1c2g6IHBjb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUZsdXNoOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICBpZiAoZmZsdXNoKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKSAhPSAwKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0jaWZkZWYgTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRQotICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgZnVuY3Rpb24gYXNrcyB0aGUgY29yZSBmaWxlIHdyaXRlciB0byByZXR1cm4gdGhlIHZhbHVlCi0gKiAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELgotICogICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZQotICogICAgICAgICAgICAgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgICd2YWx1ZScgbXVzdCBiZSBjYXN0IGFjY29yZGluZyB0byB0aGUgdHlwZSByZWxhdGVkIHRvIHRoZQotICogICAgICAgICAgICAgb3B0aW9uSUQKLSAqICAgICAgICAgICAgIEFzIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKLSAqICAgICAgICAgICAgICd2YWx1ZScgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5IHRoaXMgZmllbGQKLSAqICAgICAgICAgICAgIHRvIGl0cyBpbnRlcm5hbCB2YXJpYWJsZS4KLSAqIEBwYXJhbSAgICAgIHBDb250ZXh0OiAoSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBjb3JlIGZpbGUgd3JpdGVyCi0gKiBAcGFyYW0gICAgICBvcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uCi0gKiBAcGFyYW0gICAgICB2YWx1ZTogKE9VVCkgVmFsdWUgb2YgdGhlIG9wdGlvbgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX1dSSVRFX09OTFk6IHRoaXMgb3B0aW9uIGlzIGEgd3JpdGUgb25seSBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBPcHRpb25WYWx1ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uIDogb3B0aW9uID0gMHgleCIsIG9wdGlvbklEKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihvcHRpb25JRCA9PSAwLCBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24iKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwT3B0aW9uVmFsdWUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBwT3Rpb25WYWx1ZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX0ZJTEVfV1JJVEVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfT1BUSU9OX0lELCAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfUkVBREFCTEUob3B0aW9uSUQpLCBNNEVSUl9XUklURV9PTkxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24iKTsKLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbjogc2VtYXBob3JlX2NvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgIHN3aXRjaChvcHRpb25JRCkKLSAgICB7Ci0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9QT1NJVElPTiA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldEZpbGVQb3NpdGlvbjoKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uKiBwb3NpdGlvbiA9IChNNE9TQV9GaWxlUG9zaXRpb24qKXBPcHRpb25WYWx1ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVdhaXQocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSNlbmRpZiAvKiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFICovCi0KLSAgICAgICAgICAgICpwb3NpdGlvbiA9IHBGaWxlQ29udGV4dC0+d3JpdGVfcG9zaXRpb247Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVQb3N0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQpOwotI2VuZGlmIC8qIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUgKi8KLQotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfUE9TSVRJT04qLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9TSVpFID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVNpemU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ZpbGVQb3NpdGlvbiogcG9zaXRpb24gPSAoTTRPU0FfRmlsZVBvc2l0aW9uKilwT3B0aW9uVmFsdWU7Ci0KLSAgICAgICAgICAgIGlmKE00T1NBX2tEZXNjUldBY2Nlc3MgPT0gcEZpbGVDb250ZXh0LT5tX0Rlc2NyTW9kZUFjY2VzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpU2F2ZVBvcyAgICA9IDA7Ci0gICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaVNpemUgICAgICAgID0gMDsKLQotICAgICAgICAgICAgICAgIGlTYXZlUG9zID0gZnRlbGwocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MpOyAgICAgICAgICAgIC8qMS0gQ2hlY2sgdGhlIGZpcnN0IHBvc2l0aW9uICovCi0gICAgICAgICAgICAgICAgZnNlZWsocEZpbGVDb250ZXh0LT5maWxlX2Rlc2MsIDAsIFNFRUtfRU5EKTsgICAgICAgIC8qMi0gR28gdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSAqLwotICAgICAgICAgICAgICAgICpwb3NpdGlvbiA9IGZ0ZWxsKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjKTsgICAgICAgICAgICAvKjMtIENoZWNrIHRoZSBmaWxlIHNpemUqLwotICAgICAgICAgICAgICAgIGZzZWVrKHBGaWxlQ29udGV4dC0+ZmlsZV9kZXNjLCBpU2F2ZVBvcywgU0VFS19TRVQpOyAgICAvKjQtIGdvIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSNpZmRlZiBNNE9TQV9GSUxFX0JMT0NLX1dJVEhfU0VNQVBIT1JFCi0gICAgICAgICAgICBNNE9TQV9zZW1hcGhvcmVXYWl0KHBGaWxlQ29udGV4dC0+c2VtYXBob3JlX2NvbnRleHQsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICAqcG9zaXRpb24gPSBwRmlsZUNvbnRleHQtPmZpbGVfc2l6ZTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICAgICAgICAgIE00T1NBX3NlbWFwaG9yZVBvc3QocEZpbGVDb250ZXh0LT5zZW1hcGhvcmVfY29udGV4dCk7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfRklMRV9TSVpFKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1VSTCA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldFVSTDoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25HZXRVUkwgKHBDb250ZXh0LCAoTTRPU0FfQ2hhcioqKXBPcHRpb25WYWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1VSTCovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9GSUxFX1dSSVRFX0dFVF9GSUxFX0FUVFJJQlVURSA9PSBNNE9TQV9UUlVFKQotICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZUdldEF0dHJpYnV0ZToKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00T1NBX2ZpbGVDb21tb25HZXRBdHRyaWJ1dGUocENvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX0ZpbGVBdHRyaWJ1dGUqKXBPcHRpb25WYWx1ZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX0ZJTEVfQVRUUklCVVRFKi8KLQotI2lmKE00T1NBX09QVElPTklEX0ZJTEVfV1JJVEVfR0VUX1JFQURFUl9DT05URVhUID09IE00T1NBX1RSVUUpCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlR2V0UmVhZGVyQ29udGV4dDoKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZU1vZGVBY2Nlc3MgYWNjZXNzID0gcEZpbGVDb250ZXh0LT5hY2Nlc3NfbW9kZTsKLQotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKCEoYWNjZXNzICYgTTRPU0Ffa0ZpbGVSZWFkKSwgTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZUdldE9wdGlvbjogTTRPU0Ffa0ZpbGVSZWFkIik7Ci0KLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMSghKGFjY2VzcyAmIE00T1NBX2tGaWxlV3JpdGUpLCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlR2V0T3B0aW9uOiBNNE9TQV9rRmlsZVdyaXRlIik7Ci0KLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+Y29yZUlEX3JlYWQgPSBNNE9TQV9GSUxFX1JFQURFUjsKLQotICAgICAgICAgICAgKnBPcHRpb25WYWx1ZSA9IHBDb250ZXh0OwotCi0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfRklMRV9XUklURV9HRVRfUkVBREVSX0NPTlRFWFQqLwotCi0gICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlTG9ja01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICooTTRPU0FfVUludDMyKilwT3B0aW9uVmFsdWUgPSBwRmlsZUNvbnRleHQtPm1fdWlMb2NrTW9kZTsKLSAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBNNE9TQV9ERUJVRyhNNEVSUl9OT1RfSU1QTEVNRU5URUQsICJNNE9TQV9maWxlV3JpdGVHZXRPcHRpb24iKTsKLQotICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci19Ci0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgICAgVGhpcyBmdW5jdGlvbiBhc2tzIHRoZSBjb3JlIGZpbGUgd3JpdGVyIHRvIHNldCB0aGUgdmFsdWUKLSogICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KLSogICAgICAgICAgICAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZy9kZS1hbGxvY2F0aW5nIHRoZQotKiAgICAgICAgICAgICBtZW1vcnkgb2YgdGhlIHZhbHVlIGZpZWxkLgotKiBAbm90ZSAgICAgICBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlLWFsbG9jYXRpbmcgdGhlCi0qICAgICAgICAgICAgICd2YWx1ZScgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5IHRoaXMgZmllbGQgdG8gaXRzIGludGVybmFsCi0qICAgICAgICAgICAgIHZhcmlhYmxlLgotKiBAcGFyYW0gICAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgY29yZSBmaWxlIHdyaXRlcgotKiBAcGFyYW0gICAgICBvcHRpb25JRDogKElOKSBJRCBvZiB0aGUgb3B0aW9uCi0qIEBwYXJhbSAgICAgIHZhbHVlOiAoSU4pIFZhbHVlIG9mIHRoZSBvcHRpb24KLSogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0qIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgICAgTTRFUlJfUkVBRF9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHJlYWQgb25seSBvbmUKLSogQHJldHVybiAgICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkKLXsKLSAgICBNNE9TQV9GaWxlQ29udGV4dCogcEZpbGVDb250ZXh0ID0gcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uIDogb3B0aW9uID0gMHgleCIsIG9wdGlvbklEKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMihNNE9TQV9OVUxMID09IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKDAgPT0gb3B0aW9uSUQsIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX2ZpbGVXcml0ZVNldE9wdGlvbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfQ09SRUlEKG9wdGlvbklELCBNNE9TQV9GSUxFX1dSSVRFUiksCi0gICAgICAgIE00RVJSX0JBRF9PUFRJT05fSUQsICJNNE9TQV9maWxlV3JpdGVTZXRPcHRpb24iKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX1dSSVRBQkxFKG9wdGlvbklEKSwgTTRFUlJfUkVBRF9PTkxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVJlYWRTZXRPcHRpb24iKTsKLQotI2lmZGVmIE00T1NBX0ZJTEVfQkxPQ0tfV0lUSF9TRU1BUEhPUkUKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBwRmlsZUNvbnRleHQtPnNlbWFwaG9yZV9jb250ZXh0LCBNNEVSUl9CQURfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAiTTRPU0FfZmlsZVdyaXRlU2V0T3B0aW9uOiBzZW1hcGhvcmVfY29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0jZW5kaWYgLyogTTRPU0FfRklMRV9CTE9DS19XSVRIX1NFTUFQSE9SRSAqLwotCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgY2FzZSBNNE9TQV9rRmlsZVdyaXRlTG9ja01vZGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBGaWxlQ29udGV4dC0+bV91aUxvY2tNb2RlID0gKE00T1NBX1VJbnQzMikqKE00T1NBX1VJbnQzMiopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTTRPU0Ffa0ZpbGVXcml0ZURlc2NNb2RlOgotICAgICAgICB7Ci0gICAgICAgICAgICBwRmlsZUNvbnRleHQtPm1fRGVzY3JNb2RlQWNjZXNzID0gKE00T1NBX0ludDMyKSooTTRPU0FfSW50MzIqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9NdXRleC5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfTXV0ZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmJlNmJiYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9NdXRleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICAgIE11dGV4IGZvciBBbmRyb2lkCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIG11dGV4Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfTXV0ZXguaCIKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0KLS8qIENvbnRleHQgZm9yIHRoZSBtdXRleCAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIE00T1NBX1VJbnQzMiAgICAgY29yZUlEOyAgICAgICAgICAgICAgIC8qIG11dGV4IGNvbnRleHQgaWRlbnRpZmlhbnQgKi8KLSAgIHB0aHJlYWRfbXV0ZXhfdCAgbXV0ZXg7ICAgICAgICAgICAgICAgIC8qIG11dGV4ICovCi0gICBwdGhyZWFkX3QgICAgICAgIHRocmVhZE93bmVySUQ7ICAgICAgICAvKiB0aHJlYWQgb3duZXIgaWRlbnRpZmlhbnQgKi8KLX0gTTRPU0FfTXV0ZXhDb250ZXh0OwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IG11dGV4LgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuZCBhbGxvY2F0ZXMgYSB1bmlxdWUgY29udGV4dC4gSXQncyB0aGUKLSAqICAgICAgICAgICAgIE9TQUwgcmVhbCB0aW1lIHJlc3BvbnNpYmlsaXR5IGZvciBtYW5hZ2luZyBpdHMgY29udGV4dC4gSXQgbXVzdAotICogICAgICAgICAgICAgYmUgZnJlZWQgYnkgdGhlIE00T1NBX211dGV4Q2xvc2UgZnVuY3Rpb24uIFRoZSBjb250ZXh0IHBhcmFtZXRlcgotICogICAgICAgICAgICAgd2lsbCBiZSBzZW50IGJhY2sgdG8gYW55IE9TQUwgY29yZSBtdXRleCBmdW5jdGlvbnMgdG8gYWxsb3cKLSAqICAgICAgICAgICAgIHJldHJpZXZpbmcgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBvcGVuZWQgbXV0ZXguCi0gKiBAcGFyYW0gICAgICBwQ29udGV4dDooT1VUKSBDb250ZXh0IG9mIHRoZSBjcmVhdGVkIG11dGV4Ci0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQ6IHRoZSBjb250ZXh0IGNyZWF0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9tdXRleE9wZW4oTTRPU0FfQ29udGV4dCogcENvbnRleHQpCi17Ci0gICAgTTRPU0FfTXV0ZXhDb250ZXh0KiBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopTTRPU0FfTlVMTDsKLSAgICBwdGhyZWFkX211dGV4YXR0cl90IGF0dHJpYnV0ZSA9IHsgMCB9OwotICAgIE00T1NBX0Jvb2wgb3BlbmVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfbXV0ZXhPcGVuXHRcdE00T1NBX0NvbnRleHQqIDB4JXgiLCBwQ29udGV4dCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRPU0FfbXV0ZXhPcGVuOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcE11dGV4Q29udGV4dCA9IChNNE9TQV9NdXRleENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfTXV0ZXhDb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfTVVURVgsIChNNE9TQV9DaGFyKikiTTRPU0FfbXV0ZXhPcGVuOiBtdXRleCBjb250ZXh0Iik7Ci0KLSAgICBpZihNNE9TQV9OVUxMID09IHBNdXRleENvbnRleHQpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9BTExPQywgIk00T1NBX211dGV4T3BlbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgbXV0ZXggYXR0cmlidXRlLiAqLwotICAgIGlmICggMCA9PSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCAmYXR0cmlidXRlICkgKQotICAgIHsKLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbXV0ZXggdHlwZS4gKi8KLSAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoICZhdHRyaWJ1dGUsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBtdXRleC4gKi8KLSAgICAgICAgICAgIGlmICgwID09IHB0aHJlYWRfbXV0ZXhfaW5pdCggJnBNdXRleENvbnRleHQtPm11dGV4LCAmYXR0cmlidXRlICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9wZW5lZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBEZXN0cm95IHRoZSBtdXRleCBhdHRyaWJ1dGUuICovCi0gICAgICAgIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koICZhdHRyaWJ1dGUgKTsKLSAgICB9Ci0KLSAgICBpZighb3BlbmVkKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQ09OVEVYVF9GQUlMRUQsICJNNE9TQV9tdXRleE9wZW46IE9TIG11dGV4IGNyZWF0aW9uIGZhaWxlZCIpOwotICAgICAgICBmcmVlKHBNdXRleENvbnRleHQpOwotICAgICAgICByZXR1cm4gTTRFUlJfQ09OVEVYVF9GQUlMRUQgOwotICAgIH0KLQotICAgIHBNdXRleENvbnRleHQtPmNvcmVJRCA9IE00T1NBX01VVEVYOwotCi0gICAgcE11dGV4Q29udGV4dC0+dGhyZWFkT3duZXJJRCA9IDA7Ci0KLSAgICAqcENvbnRleHQgPSAoTTRPU0FfQ29udGV4dCkgcE11dGV4Q29udGV4dDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGxvY2tzIHRoZSBtdXRleC4gIkNvbnRleHQiIGlkZW50aWZpZXMgdGhlIG11dGV4LgotICogQG5vdGUgICAgICAgSWYgdGhlIG11dGV4IGlzIGFscmVhZHkgbG9ja2VkLCB0aGUgY2FsbGluZyB0aHJlYWQgYmxvY2tzIHVudGlsCi0gKiAgICAgICAgICAgICB0aGUgbXV0ZXggYmVjb21lcyBhdmFpbGFibGUgKGJ5IGNhbGxpbmcgTTRPU0FfbXV0ZXhVbmxvY2spIG9yCi0gKiAgICAgICAgICAgICAidGltZW91dCIgaXMgcmVhY2hlZC4gVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIG11dGV4Ci0gKiBAcGFyYW0gICAgICB0aW1lb3V0OihJTikgVGltZSBvdXQgaW4gbWlsbGlzZWNvbmRzCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00V0FSX1RJTUVfT1VUOiB0aW1lIG91dCBpcyBlbGFwc2VkIGJlZm9yZSBtdXRleCBoYXMgYmVlbgotICogICAgICAgICAgICAgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfbXV0ZXhMb2NrKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfVUludDMyIHRpbWVvdXQpCi17Ci0gICAgTTRPU0FfTXV0ZXhDb250ZXh0KiBwTXV0ZXhDb250ZXh0ID0gKE00T1NBX011dGV4Q29udGV4dCopY29udGV4dDsKLSAgICBwdGhyZWFkX3QgICAgICAgICAgIGN1cnJlbnRUaHJlYWQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICByZXN1bHQ7Ci0gICAgc3RydWN0IHRpbWVzcGVjICAgICB0czsKLSAgICBzdHJ1Y3QgdGltZXNwZWMgICAgIGxlZnQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigiTTRPU0FfbXV0ZXhMb2NrXHRcdE00T1NBX0NvbnRleHQgMHgleFx0TTRPU0FfVUludDMyICVkIiwKLSAgICAgICAgY29udGV4dCwgdGltZW91dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBjb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE9TQV9tdXRleExvY2s6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihwTXV0ZXhDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfTVVURVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4TG9jayIpOwotCi0gICAgY3VycmVudFRocmVhZCA9IHB0aHJlYWRfc2VsZigpOwotCi0gICAgaWYocE11dGV4Q29udGV4dCAtPnRocmVhZE93bmVySUQgPT0gY3VycmVudFRocmVhZCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhMb2NrOiBUaHJlYWQgdHJpZWQgdG8gbG9jayBhIG11dGV4IGl0IGFscmVhZHkgb3ducyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQgOwotICAgIH0KLQotICAgIC8qIExvY2sgdGhlIG11dGV4LiAqLwotICAgIGlmICggTTRPU0FfV0FJVF9GT1JFVkVSID09IHRpbWVvdXQpCi0gICAgewotICAgICAgICBpZiAoIDAgIT0gcHRocmVhZF9tdXRleF9sb2NrKCZwTXV0ZXhDb250ZXh0LT5tdXRleCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4TG9jazogT1MgbXV0ZXggd2FpdCBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXN1bHQgPSBwdGhyZWFkX211dGV4X3RyeWxvY2soJnBNdXRleENvbnRleHQtPm11dGV4KTsKLSAgICAgICAgd2hpbGUgKCAoIEVCVVNZID09IHJlc3VsdCApICYmICggMCA8IHRpbWVvdXQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRzLnR2X3NlYyAgPSAwOwotICAgICAgICAgICAgaWYgKDEgPD0gdGltZW91dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cy50dl9uc2VjID0gMTAwMDAwMDsKLSAgICAgICAgICAgICAgICB0aW1lb3V0IC09IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHMudHZfbnNlYyA9IHRpbWVvdXQgKiAxMDAwMDAwOwotICAgICAgICAgICAgICAgIHRpbWVvdXQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmFub3NsZWVwKCZ0cywgJmxlZnQpOwotICAgICAgICAgICAgcmVzdWx0ID0gcHRocmVhZF9tdXRleF90cnlsb2NrKCZwTXV0ZXhDb250ZXh0LT5tdXRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKDAgIT0gcmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoRUJVU1kgPT0gcmVzdWx0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9USU1FX09VVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9ERUJVRyhNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX211dGV4TG9jazogT1MgbXV0ZXggd2FpdCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwTXV0ZXhDb250ZXh0LT50aHJlYWRPd25lcklEID0gY3VycmVudFRocmVhZDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCB1bmxvY2tzIHRoZSBtdXRleC4gVGhlIG11dGV4IGlzIGlkZW50aWZpZWQgYnkKLSAqICAgICAgICAgICAgIGl0cyBjb250ZXh0Ci0gKiBAbm90ZSAgICAgICBUaGUgTTRPU0FfbXV0ZXhMb2NrIHVuYmxvY2tzIHRoZSB0aHJlYWQgd2l0aCB0aGUgaGlnaGVzdAotICogICAgICAgICAgICAgcHJpb3JpdHkgYW5kIG1hZGUgaXQgcmVhZHkgdG8gcnVuLgotICogQG5vdGUgICAgICAgTm8gaHlwb3RoZXNlcyBjYW4gYmUgbWFkZSBvbiB3aGljaCB0aHJlYWQgd2lsbCBiZSB1bi1ibG9ja2VkCi0gKiAgICAgICAgICAgICBiZXR3ZWVuIHRocmVhZHMgd2l0aCB0aGUgc2FtZSBwcmlvcml0eS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgbXV0ZXgKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfbXV0ZXhVbmxvY2soTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00T1NBX011dGV4Q29udGV4dCogcE11dGV4Q29udGV4dCA9IChNNE9TQV9NdXRleENvbnRleHQqKWNvbnRleHQ7Ci0gICAgcHRocmVhZF90IGN1cnJlbnRUaHJlYWQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfbXV0ZXhVbmxvY2tcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gY29udGV4dCwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX211dGV4VW5sb2NrOiBjb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTVVURVggIT0gcE11dGV4Q29udGV4dC0+Y29yZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhVbmxvY2siKTsKLQotICAgIGN1cnJlbnRUaHJlYWQgPSBwdGhyZWFkX3NlbGYoKTsKLQotICAgIGlmKHBNdXRleENvbnRleHQtPnRocmVhZE93bmVySUQgIT0gY3VycmVudFRocmVhZCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHKE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfbXV0ZXhVbmxvY2s6IFRocmVhZCB0cmllZCB0byB1bmxvY2sgYSBtdXRleCBpdCBkb2Vzbid0IG93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX0NPTlRFWFQ7Ci0gICAgfQotCi0gICAgcE11dGV4Q29udGV4dC0+dGhyZWFkT3duZXJJRCA9IDAgOwotCi0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBNdXRleENvbnRleHQtPm11dGV4KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGRlbGV0ZXMgYSBtdXRleCAoaWRlbnRpZnkgYnkgaXRzIGNvbnRleHQpLiBBZnRlcgotICogICAgICAgICAgICAgdGhpcyBjYWxsLCB0aGUgbXV0ZXggYW5kIGl0cyBjb250ZXh0IGlzIG5vIG1vcmUgdXNlYWJsZS4gVGhpcwotICogICAgICAgICAgICAgZnVuY3Rpb24gZnJlZXMgYWxsIHRoZSBtZW1vcnkgcmVsYXRlZCB0byB0aGlzIG11dGV4LgotICogQG5vdGUgICAgICAgSXQgaXMgYW4gYXBwbGljYXRpb24gaXNzdWUgdG8gd2FycmFudCBubyBtb3JlIHRocmVhZHMgYXJlIGxvY2tlZAotICogICAgICAgICAgICAgb24gdGhlIGRlbGV0ZWQgbXV0ZXguCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIG11dGV4Ci0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9tdXRleENsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNE9TQV9NdXRleENvbnRleHQqIHBNdXRleENvbnRleHQgPSAoTTRPU0FfTXV0ZXhDb250ZXh0Kiljb250ZXh0OwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX211dGV4Q2xvc2VcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoTTRPU0FfTlVMTCA9PSBjb250ZXh0LCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00T1NBX211dGV4Q2xvc2U6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMihwTXV0ZXhDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfTVVURVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9tdXRleFVubG9jayIpOwotCi0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZwTXV0ZXhDb250ZXh0LT5tdXRleCk7Ci0KLSAgICBmcmVlKCBwTXV0ZXhDb250ZXh0KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNE9TQV9SYW5kb20uYyBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1JhbmRvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMjRkMDM5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1JhbmRvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFBTV19UcmFjZS5jCi0gKiBAYnJpZWYgICAgICAgIFRyYWNlIGZ1bmN0aW9uIGZvciB0cmFjZSBtYWNyb3MKLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZ2l2ZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmFjZSBmdW5jdGlvbiB1c2VkCi0gKiAgICAgICAgICAgICAgICBpbiB0aGUgdHJhY2UgaW5zdHJ1bWVudGF0aW9uIG1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKmZvciBwcmludGYgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4gLyogQU5TSSBDIG1hY3JvcyBhbmQgZGVmcyBmb3IgdmFyaWFibGUgYXJncyAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9NdXRleC5oIgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZm4gICAgICAgICBNNE9TQV9FUlIgTTRPU0FfcmFuZEluaXQoKQotICogQGJyaWVmICAgICAgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBudW1iZXIgZ2VuZXJhdG9yCi0gKiAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25jZSBiZWZvcmUgYW55IGNhbGwgdG8gTTRPU0FfcmFuZCgpCi0gKiAgICAgICAgICAgICAgIG5lZWQgdGhlIHN0ZGxpYiBhbmQgdGltZSBsaWJyYXJpZXMKLSAqIEBub3RlCi0gKiBAcGFyYW0KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNE9TQV9yYW5kSW5pdCgpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLQotICAgIC8qIFdpbmRvd3MnIHJhbmQgaXMgcm90dGVuLCB0aGUgZmlyc3QgZ2VuZXJhdGVkIHZhbHVlIGFmdGVyIHRoZSBpbml0Ci0gICAgYWJvdmUgaXMgbm90IHJhbmRvbSBlbm91Z2gsIHNvIGxldCdzIHNoYWtlIHRoaW5ncyBhIGxpdHRsZS4uLiAqLwotCi0gICAgZm9yIChpPTA7IGk8MTAwOyBpKyspIHJhbmQoKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZm4gICAgICAgICAgIE00T1NBX0VSUiBNNE9TQV9yYW5kKE00T1NBX0ludDMyKiBvdXRfdmFsdWUsIE00T1NBX1VJbnQzMiBtYXhfdmFsdWUpCi0gKiBAYnJpZWYgICAgICAgVGhpcyBmdW5jdGlvbiBnaXZlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiAxIGFuZCBtYXhfdmFsdWUKLSAqICAgICAgICAgICAgICAgKGluY2x1c2l2ZSkgd2l0aCBhcHByb3hpbWF0ZWx5IGVxdWFsIHByb2JhYmlsaXR5LCBhbmQKLSAqICAgICAgICAgICAgICAgcmV0dXJucyB0aGlzIG51bWJlciBpbiBvdXRfdmFsdWUuIEZvciBpbnN0YW5jZSwgYSBtYXhfdmFsdWUKLSAqICAgICAgICAgICAgIG9mIDYgd2lsbCBzaW11bGF0ZSBhIGZhaXIgNi1zaWRlZCBkaWNlIHJvbGwuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgb3V0X3ZhbHVlIChPVVQpOiBvbiByZXR1cm4sIHBvaW50cyB0byByYW5kb20gcmVzdWx0Ci0gKiBAcGFyYW0gICAgICAgbWF4X3ZhbHVlIChJTik6IG1heCBleHBlY3RlZCB2YWx1ZQotICogQHJldHVybiAgICAgTTROT19FUlJPUgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00T1NBX3JhbmQoTTRPU0FfSW50MzIqIG91dF92YWx1ZSwgTTRPU0FfVUludDMyIG1heF92YWx1ZSkKLXsKLSAgICBpZiggKG91dF92YWx1ZSA9PSBNNE9TQV9OVUxMKSB8fCAobWF4X3ZhbHVlIDwgMSkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAoKm91dF92YWx1ZSkgPSByYW5kKCk7Ci0gICAgLyogbm90aWNlIHRoaXMgYWxnb3JpdGhtIHdpbGwgb25seSB3b3JrIGZvciBtYXhfdmFsdWVzIHN1Y2ggdGhhdCB0aGUgbXVsdGlwbGljYXRpb24KLSAgICB3b24ndCBvdmVyZmxvdywgd2hpY2ggbWVhbnMgdGhhdCBtYXhfdmFsdWUgdHlwaWNhbGx5IHNob3VsZG4ndCBnbyBvdmVyIHRoZSByYW5nZSBvZgotICAgIGFuIEludDE2LiAqLwotICAgICgqb3V0X3ZhbHVlKSA9ICgoKCpvdXRfdmFsdWUpICogbWF4X3ZhbHVlKSAvICgoTTRPU0FfVUludDMyKVJBTkRfTUFYICsgMSkpICsgMTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1NlbWFwaG9yZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU2VtYXBob3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzYjU4NTIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfU2VtYXBob3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRPU0FfU2VtYXBob3JlLmMKLSAqIEBicmllZiAgICAgICAgU2VtYXBob3JlIGZvciBXaW5kb3dzCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIHNlbWFwaG9yZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLQotI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLQotLyogQ29udGV4dCBmb3IgdGhlIHNlbWFwaG9yZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgTTRPU0FfVUludDMyICAgY29yZUlEOyAgICAgLyogc2VtYXBob3JlIGNvbnRleHQgaWRlbnRpZmlhbnQgKi8KLSAgIHNlbV90ICAgICAgICAgIHNlbWFwaG9yZTsgIC8qIHNlbWFwaG9yZSAqLwotfSBNNE9TQV9TZW1hcGhvcmVDb250ZXh0OwotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgc2VtYXBob3JlIHdpdGggdGhlICJpbml0aWFsQ291bnRlciIKLSAqICAgICAgICAgICAgIHZhbHVlLgotICogQG5vdGUgICAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuZCBhbGxvY2F0ZXMgYSB1bmlxdWUgY29udGV4dC4gSXQncyB0aGUKLSAqICAgICAgICAgICAgIE9TQUwgcmVhbCB0aW1lIHJlc3BvbnNpYmlsaXR5IGZvciBtYW5hZ2luZyBpdHMgY29udGV4dC4gSXQgbXVzdAotICogICAgICAgICAgICAgYmUgZnJlZWQgYnkgdGhlIE00T1NBX3NlbWFwaG9yZUNsb3NlIGZ1bmN0aW9uLiBUaGUgY29udGV4dAotICogICAgICAgICAgICAgcGFyYW1ldGVyIHdpbGwgYmUgc2VudCBiYWNrIHRvIGFueSBPU0FMIGNvcmUgc2VtYXBob3JlIGZ1bmN0aW9ucwotICogICAgICAgICAgICAgdG8gYWxsb3cgcmV0cmlldmluZyBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIG9wZW5lZCBzZW1hcGhvcmUuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihPVVQpIENvbnRleHQgb2YgdGhlIGNyZWF0ZWQgc2VtYXBob3JlCi0gKiBAcGFyYW0gICAgICBpbml0aWFsX2NvdW50OihJTikgSW5pdGlhbCBjb3VudGVyIG9mIHRoZSBzZW1hcGhvcmUKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IHByb3ZpZGVkIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQ6IHRoZSBjb250ZXh0IGNyZWF0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVPcGVuKE00T1NBX0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaW5pdGlhbF9jb3VudCkKLXsKLSAgIE00T1NBX1NlbWFwaG9yZUNvbnRleHQqIHNlbWFwaG9yZUNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICBNNE9TQV9UUkFDRTFfMigiTTRPU0Ffc2VtYXBob3JlT3Blblx0XHRNNE9TQV9Db250ZXh0KiAweCV4XHRNNE9TQV9VSW50MzIgIgotICAgICAgICAgICAgICAgICAgIiVkIiwgY29udGV4dCwgaW5pdGlhbF9jb3VudCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc2VtYXBob3JlT3BlbiIpOwotCi0gICAqY29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgIHNlbWFwaG9yZUNvbnRleHQgPSAoTTRPU0FfU2VtYXBob3JlQ29udGV4dCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRPU0FfU2VtYXBob3JlQ29udGV4dCksIE00T1NBX1NFTUFQSE9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIk00T1NBX3NlbWFwaG9yZU9wZW46IHNlbWFwaG9yZSBjb250ZXh0Iik7Ci0KLSAgIGlmKHNlbWFwaG9yZUNvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgIHsKLSAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0Ffc2VtYXBob3JlT3BlbiIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICB9Ci0KLSAgIGlmICgwICE9IHNlbV9pbml0KCZzZW1hcGhvcmVDb250ZXh0LT5zZW1hcGhvcmUsIDAsIGluaXRpYWxfY291bnQpKQotICAgewotICAgICAgZnJlZShzZW1hcGhvcmVDb250ZXh0KTsKLQotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQ09OVEVYVF9GQUlMRUQsCi0gICAgICAgICAiTTRPU0Ffc2VtYXBob3JlT3BlbjogT1Mgc2VtYXBob3JlIGNyZWF0aW9uIGZhaWxlZCIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfQ09OVEVYVF9GQUlMRUQ7Ci0gICB9Ci0KLSAgIHNlbWFwaG9yZUNvbnRleHQtPmNvcmVJRCA9IE00T1NBX1NFTUFQSE9SRSA7Ci0gICAqY29udGV4dCA9IChNNE9TQV9Db250ZXh0KXNlbWFwaG9yZUNvbnRleHQ7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGRlY3JlbWVudHMgKG9uZSBieSBvbmUpIHRoZSBzZW1hcGhvcmUgY291bnRlci4gVGhlCi0gKiAgICAgICAgICAgICBzZW1hcGhvcmUgaXMgaWRlbnRpZmllZCBieSBpdHMgY29udGV4dCBUaGlzIGNhbGwgaXMgbm90IGJsb2NraW5nCi0gKiAgICAgICAgICAgICBpZiB0aGUgc2VtYXBob3JlIGNvdW50ZXIgaXMgcG9zaXRpdmUgb3IgemVybyAoYWZ0ZXIKLSAqICAgICAgICAgICAgIGRlY3JlbWVudGF0aW9uKS4gVGhpcyBjYWxsIGlzIGJsb2NraW5nIGlmIHRoZSBzZW1hcGhvcmUgY291bnRlcgotICogICAgICAgICAgICAgaXMgbGVzcyB0aGFuIHplcm8gKGFmdGVyIGRlY3JlbWVudGF0aW9uKSwgdW50aWwgdGhlIHNlbWFwaG9yZSBpcwotICogICAgICAgICAgICAgdXBwZXIgdGhhbiB6ZXJvIChzZWUgTTRPU0Ffc2VtYXBob3JlUG9zdCkgb3IgdGltZV9vdXQgaXMKLSAqICAgICAgICAgICAgIHJlYWNoZWQuCi0gKiBAbm90ZSAgICAgICBJZiAidGltZW91dCIgdmFsdWUgaXMgTTRPU0FfV0FJVF9GT1JFVkVSLCB0aGUgY2FsbGluZyB0aHJlYWQKLSAqICAgICAgICAgICAgIHdpbGwgYmxvY2sgaW5kZWZpbml0ZWx5IHVudGlsIHRoZSBzZW1hcGhvcmUgIGlzIHVubG9ja2VkLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSBzZW1hcGhvcmUKLSAqIEBwYXJhbSAgICAgIHRpbWVvdXQ6KElOKSBUaW1lIG91dCBpbiBtaWxsaXNlY29uZHMKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRXQVJfVElNRV9PVVQ6IHRpbWUgb3V0IGlzIGVsYXBzZWQgYmVmb3JlIHNlbWFwaG9yZSBoYXMgYmVlbgotICogICAgICAgICAgICAgYXZhaWxhYmxlLgotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3NlbWFwaG9yZVdhaXQoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9JbnQzMiB0aW1lb3V0KQotewotICAgTTRPU0FfU2VtYXBob3JlQ29udGV4dCogc2VtYXBob3JlQ29udGV4dCA9IChNNE9TQV9TZW1hcGhvcmVDb250ZXh0Kiljb250ZXh0OwotICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgdHM7Ci0gICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICBsZWZ0OwotICAgaW50ICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OwotCi0gICBNNE9TQV9UUkFDRTFfMigiTTRPU0Ffc2VtYXBob3JlV2FpdFx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdE00T1NBX1VJbnQzMiAlZCIsCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCB0aW1lb3V0KTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV9zZW1hcGhvcmVXYWl0Iik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihzZW1hcGhvcmVDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfU0VNQVBIT1JFLAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0Ffc2VtYXBob3JlV2FpdCIpOwotCi0gICBpZiAoIChNNE9TQV9JbnQzMilNNE9TQV9XQUlUX0ZPUkVWRVIgPT0gdGltZW91dCkKLSAgIHsKLSAgICAgICBpZiAoIDAgIT0gc2VtX3dhaXQoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSkgKQotICAgICAgIHsKLSAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAiTTRPU0Ffc2VtYXBob3JlV2FpdDogT1Mgc2VtYXBob3JlIHdhaXQgZmFpbGVkIik7Ci0KLSAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9DT05URVhUIDsKLSAgICAgICB9Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICAgcmVzdWx0ID0gc2VtX3RyeXdhaXQoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSk7Ci0gICAgICAgd2hpbGUgKCAoKEVCVVNZID09IHJlc3VsdCkgfHwgKEVBR0FJTiA9PSByZXN1bHQpKSAmJiAoIDAgPCB0aW1lb3V0ICkgKQotICAgICAgIHsKLSAgICAgICAgICAgdHMudHZfc2VjICA9IDA7Ci0gICAgICAgICAgIGlmICgxIDw9IHRpbWVvdXQpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHRzLnR2X25zZWMgPSAxMDAwMDAwOwotICAgICAgICAgICAgICAgdGltZW91dCAtPSAxOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgdHMudHZfbnNlYyA9IHRpbWVvdXQgKiAxMDAwMDAwOwotICAgICAgICAgICAgICAgdGltZW91dCA9IDA7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgbmFub3NsZWVwKCZ0cywgJmxlZnQpOwotICAgICAgICAgICByZXN1bHQgPSBzZW1fdHJ5d2FpdCgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKTsKLSAgICAgICB9Ci0gICAgICAgaWYgKDAgIT0gcmVzdWx0KQotICAgICAgIHsKLSAgICAgICAgICAgaWYgKChFQlVTWSA9PSByZXN1bHQpIHx8IChFQUdBSU4gPT0gcmVzdWx0KSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX1RJTUVfT1VUOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgTTRPU0FfREVCVUcoTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9zZW1hcGhvcmVXYWl0OiBPUyBzZW1hcGhvcmUgd2FpdCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgIH0KLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBpbmNyZW1lbnRzIHRoZSBzZW1hcGhvcmUgY291bnRlci4gVGhlIHNlbWFwaG9yZSBpcwotICogICAgICAgICAgICAgaWRlbnRpZmllZCBieSBpdHMgY29udGV4dAotICogQG5vdGUgICAgICAgSWYgdGhlIHNlbWFwaG9yZSBjb3VudGVyIGlzIHVwcGVyIHRoYW4gemVybyAoYWZ0ZXIgYWRkaXRpb24pLAotICogICAgICAgICAgICAgdGhlIE00T1NBX3NlbWFwaG9yZVdhaXQgY2FsbCBvZiB0aGUgdGhyZWFkIHdpdGggdGhlIGhpZ2hlc3QKLSAqICAgICAgICAgICAgIHByaW9yaXR5IGlzIHVuYmxvY2tlZCBhbmQgbWFkZSByZWFkeSB0byBydW4uCi0gKiBAbm90ZSAgICAgICBObyBoeXBvdGhlc2VzIGNhbiBiZSBtYWRlIG9uIHdoaWNoIHRocmVhZCB3aWxsIGJlIHVuYmxvY2tlZAotICogICAgICAgICAgICAgYmV0d2VlbiB0aHJlYWRzIHdpdGggdGhlIHNhbWUgcHJpb3JpdHkuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHNlbWFwaG9yZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV9zZW1hcGhvcmVQb3N0KE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgIE00T1NBX1NlbWFwaG9yZUNvbnRleHQqIHNlbWFwaG9yZUNvbnRleHQgPSAoTTRPU0FfU2VtYXBob3JlQ29udGV4dCopY29udGV4dDsKLQotICAgTTRPU0FfVFJBQ0UxXzEoIk00T1NBX3NlbWFwaG9yZVBvc3RcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc2VtYXBob3JlUG9zdCIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoc2VtYXBob3JlQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1NFTUFQSE9SRSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3NlbWFwaG9yZVBvc3QiKTsKLQotICAgc2VtX3Bvc3QoJnNlbWFwaG9yZUNvbnRleHQtPnNlbWFwaG9yZSk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgZGVsZXRlcyBhIHNlbWFwaG9yZSAoaWRlbnRpZnkgYnkgaXRzIGNvbnRleHQpLgotICogICAgICAgICAgICAgQWZ0ZXIgdGhpcyBjYWxsIHRoZSBzZW1hcGhvcmUgYW5kIGl0cyBjb250ZXh0IGlzIG5vIG1vcmUKLSAqICAgICAgICAgICAgIHVzZWFibGUuIFRoaXMgZnVuY3Rpb24gZnJlZXMgYWxsIHRoZSBtZW1vcnkgcmVsYXRlZCB0byB0aGlzCi0gKiAgICAgICAgICAgICBzZW1hcGhvcmUuCi0gKiBAbm90ZSAgICAgICBJdCBpcyBhbiBhcHBsaWNhdGlvbiBpc3N1ZSB0byB3YXJyYW50IG5vIG1vcmUgdGhyZWFkcyBhcmUgbG9ja2VkCi0gKiAgICAgICAgICAgICBvbiB0aGUgZGVsZXRlZCBzZW1hcGhvcmUuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTi9PVVQpIENvbnRleHQgb2YgdGhlIHNlbWFwaG9yZQotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0Ffc2VtYXBob3JlQ2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgTTRPU0FfU2VtYXBob3JlQ29udGV4dCogc2VtYXBob3JlQ29udGV4dCA9IChNNE9TQV9TZW1hcGhvcmVDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTFfMSgiTTRPU0Ffc2VtYXBob3JlQ2xvc2VcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0Ffc2VtYXBob3JlQ2xvc2UiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHNlbWFwaG9yZUNvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9TRU1BUEhPUkUsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV9zZW1hcGhvcmVDbG9zZSIpOwotCi0gICBzZW1fZGVzdHJveSgmc2VtYXBob3JlQ29udGV4dC0+c2VtYXBob3JlKTsKLQotICAgZnJlZShzZW1hcGhvcmVDb250ZXh0KTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000T1NBX1RocmVhZC5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfVGhyZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNlODJmYjMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRPU0FfVGhyZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNE9TQV9UaHJlYWQuYwotICogQGluZ3JvdXAgICAgICBPU0FMCi0gKiBAYnJpZWYgICAgICAgIEltcGxlbWVudHMgYW5kIG1hbmlwdWxhdGUgdGhyZWFkcwotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB0aHJlYWRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9UaHJlYWQuaCIKLSNpbmNsdWRlICJNNE9TQV9UaHJlYWRfcHJpdi5oIgotI2luY2x1ZGUgIk00T1NBX011dGV4LmgiCi0jaW5jbHVkZSAiTTRPU0FfU2VtYXBob3JlLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLQotCi12b2lkKiBNNE9TQV90aHJlYWRTeW5jRm9yRXZlckRvKHZvaWQgKmNvbnRleHQpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9Cb29sIGF1dG9fa2lsbCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoKLSAgICAgICBNNE9TQV9Wb2lkKiB1c2VyRGF0YTsKLSAgICAqLwotCi0gICBNNE9TQV9UUkFDRTJfMSgiTTRPU0FfdGhyZWFkU3luY0ZvckV2ZXJEb1x0XHRMUFZPSUQgMHgleCIsIGNvbnRleHQpOwotCi0gICAgLyoKLSAgICAgICB1c2VyRGF0YSA9IHRocmVhZENvbnRleHQtPnVzZXJEYXRhOwotICAgICovCi0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZFJ1bm5pbmc7Ci0KLSAgIE00T1NBX3NlbWFwaG9yZVBvc3QodGhyZWFkQ29udGV4dC0+c2VtU3RhcnRTdG9wKTsKLQotICAgd2hpbGUodGhyZWFkQ29udGV4dC0+c3RhdGUgPT0gTTRPU0Ffa1RocmVhZFJ1bm5pbmcpCi0gICB7Ci0gICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgICAgaWYoKHRocmVhZENvbnRleHQtPmZ1bmModGhyZWFkQ29udGV4dC0+cGFyYW0pKSAhPSBNNE5PX0VSUk9SKQotICAgICAgewotICAgICAgICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgICAgICAgIGlmKHRocmVhZENvbnRleHQtPnN0YXRlID09IE00T1NBX2tUaHJlYWRSdW5uaW5nKQotICAgICAgICAgewotCi0gICAgICAgICAgICAvL1BSIDIzNTQgLSBBQ08gOiBTdXBwcmVzcyBzdG9wcGluZyBzdGF0ZSBhbmQgZG9uJ3QKLSAgICAgICAgICAgIC8vICAgICAgICAgdW5sb2NrIG11dGV4IGJlZm9yZSBjbG9zaW5nIHRoZSB0aHJlYWQKLSAgICAgICAgICAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZE9wZW5lZDsKLSAgICAgICAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotICAgICAgfQotCi0gICAgICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLSAgIH0KLQotCi0gICBNNE9TQV9zZW1hcGhvcmVQb3N0KHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCk7Ci0KLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLQotICAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyB0aHJlYWQuIEFmdGVyIHRoaXMgY2FsbCB0aGUgdGhyZWFkIGlzCi0gKiAgICAgICAgICAgICBpZGVudGlmaWVkIGJ5IGl0cyAiY29udGV4dCIuIFRoZSB0aHJlYWQgZnVuY3Rpb24gaXMgcHJvdmlkZWQgYnkKLSAqICAgICAgICAgICAgIHRoZSAiZnVuYyIgcGFyYW1ldGVyLiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgJiBhbGxvY2F0ZXMgYSB1bmlxdWUKLSAqICAgICAgICAgICAgIGNvbnRleHQuIEl0J3MgdGhlIE9TQUwgcmVhbCB0aW1lIHJlc3BvbnNpYmlsaXR5IGZvciBtYW5hZ2luZyBpdHMKLSAqICAgICAgICAgICAgIGNvbnRleHQuIEl0IG11c3QgYmUgZnJlZWQgYnkgdGhlIE00T1NBX3RocmVhZFN5bmNDbG9zZSBmdW5jdGlvbi4KLSAqICAgICAgICAgICAgIFRoZSBjb250ZXh0IHBhcmFtZXRlciB3aWxsIGJlIHNlbnQgYmFjayB0byBhbnkgT1NBTCBjb3JlIHRocmVhZAotICogICAgICAgICAgICAgZnVuY3Rpb25zIHRvIGFsbG93IHJldHJpZXZpbmcgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBvcGVuZWQKLSAqICAgICAgICAgICAgIHRocmVhZC4KLSAqIEBub3RlICAgICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgdGhyZWFkLCBidXQgdGhlIHRocmVhZCBpcyBub3QgcnVubmluZy4KLSAqIEBub3RlICAgICAgIE9uY2UgdGhlIHRocmVhZCBpcyBjcmVhdGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZE9wZW5lZC4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KE9VVCkgQ29udGV4dCBvZiB0aGUgY3JlYXRlZCB0aHJlYWQKLSAqIEBwYXJhbSAgICAgIGZ1bmM6KElOKSAiZG9JdCIgZnVuY3Rpb24gcG9pbnRlciB0byBydW4KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICAgTTRFUlJfQ09OVEVYVF9GQUlMRUQ6IHRoZSBjb250ZXh0IGNyZWF0aW9uIGZhaWxlZAotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY09wZW4oTTRPU0FfQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWREb0l0IGZ1bmMpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgIE00T1NBX0VSUiBlcnJfY29kZTsKLQotICAgTTRPU0FfVFJBQ0UxXzIoIk00T1NBX3RocmVhZFN5bmNPcGVuXHRcdE00T1NBX0NvbnRleHQqIDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9UaHJlYWREb0l0IDB4JXgiLCBjb250ZXh0LCBmdW5jKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jT3BlbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoZnVuYyA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jT3BlbiIpOwotCi0gICAqY29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgIHRocmVhZENvbnRleHQgPQotICAgICAgKE00T1NBX1RocmVhZENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfVGhyZWFkQ29udGV4dCksCi0gICAgICBNNE9TQV9USFJFQUQsIChNNE9TQV9DaGFyKikiTTRPU0FfdGhyZWFkU3luY09wZW46IHRocmVhZCBjb250ZXh0Iik7Ci0KLSAgIGlmKHRocmVhZENvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgIHsKLSAgICAgIE00T1NBX0RFQlVHKE00RVJSX0FMTE9DLCAiTTRPU0FfdGhyZWFkU3luY09wZW4iKTsKLQotICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgfQotCi0gICB0aHJlYWRDb250ZXh0LT5mdW5jID0gZnVuYzsKLSAgIHRocmVhZENvbnRleHQtPnN0YWNrU2l6ZSA9IDY0ICogMTAyNDsKLSAgIHRocmVhZENvbnRleHQtPm5hbWUgPSBNNE9TQV9OVUxMOwotICAgdGhyZWFkQ29udGV4dC0+dGhyZWFkSUQgPSAwOwotICAgdGhyZWFkQ29udGV4dC0+Y29yZUlEID0gTTRPU0FfVEhSRUFEOwotICAgdGhyZWFkQ29udGV4dC0+c3RhdGUgPSBNNE9TQV9rVGhyZWFkT3BlbmVkOwotICAgdGhyZWFkQ29udGV4dC0+cHJpb3JpdHkgPSBNNE9TQV9rVGhyZWFkTm9ybWFsUHJpb3JpdHkgOwotCi0gICBlcnJfY29kZSA9IE00T1NBX211dGV4T3BlbigmKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpKTsKLQotICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgIHsKLSAgICAgIE00T1NBX0RFQlVHKGVycl9jb2RlLCAiTTRPU0FfdGhyZWFkU3luY09wZW46IE00T1NBX211dGV4T3BlbiIpOwotCi0gICAgICByZXR1cm4gZXJyX2NvZGU7Ci0gICB9Ci0KLSAgIGVycl9jb2RlID0gTTRPU0Ffc2VtYXBob3JlT3BlbigmKHRocmVhZENvbnRleHQtPnNlbVN0YXJ0U3RvcCksIDApOwotCi0gICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgewotICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV90aHJlYWRTeW5jT3BlbjogTTRPU0Ffc2VtYXBob3JlT3BlbiIpOwotCi0gICAgICByZXR1cm4gZXJyX2NvZGU7Ci0gICB9Ci0KLSAgICpjb250ZXh0ID0gdGhyZWFkQ29udGV4dDsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBydW5zIGEgc3BlY2lmaWVkIHRocmVhZC4gVGhlICJwYXJhbSIgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHNldCBhIHNwZWNpZmljIHBhcmFtZXRlciB0byB0aGUKLSAqICAgICAgICAgICAgIGNyZWF0ZWQgdGhyZWFkLiBUaGlzIHBhcmFtZXRlciB3aWxsIGJlIHVzZWQgYXMgdGhlIHNlY29uZCBvbmUgb2YKLSAqICAgICAgICAgICAgIHRoZSAiTTRPU0FfVGhyZWFkRG9JdCIgZnVuY3Rpb24uCi0gKiBAbm90ZSAgICAgICBUaGlzIG1ldGhvZCBpcyBhIGJsb2NraW5nIHVwIHRvIHRoZSB0aHJlYWQgaXMgcnVubmluZy4KLSAqICAgICAgICAgICAgIEJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZE9wZW5lZC4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkU3RhcnRpbmcuCi0gKiAgICAgICAgICAgICBPbmNlIHRoZSB0aHJlYWQgaXMgcnVubmluZywgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRSdW5uaW5nLgotICogQG5vdGUgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBpbW1lZGlhdGVseS4gSWYgdGhlICJ0aHJlYWRTdGFydGVkIiBvcHRpb25JRAotICogICAgICAgICAgICAgaXMgbm90IE5VTEwsIHRoZSB0aHJlYWQgd2lsbCBjYWxsIGl0IGJlZm9yZSBydW5uaW5nIHRoZSBkb0l0Ci0gKiAgICAgICAgICAgICBmdW5jdGlvbi4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgdGhyZWFkCi0gKiBAcGFyYW0gICAgICBwYXJhbTooSU4pIEFwcGxpY2F0aW9uIGRhdGEgdGhyZWFkIHBhcmFtZXRlcgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX1NUQVRFOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9USFJFQURfTk9UX1NUQVJURUQ6IHRoZSB0aHJlYWQgZGlkIG5vdCBzdGFydAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jU3RhcnQoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwYXJhbSkKLXsKLSAgIE00T1NBX1RocmVhZENvbnRleHQqIHRocmVhZENvbnRleHQgPSAgKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBwdGhyZWFkX2F0dHJfdCAgICAgYXR0cmlidXRlID0geyAwLCAwLCAwLCAwLCAwLCAwIH07Ci0gICBpbnQgICAgICAgICAgICAgICAgbWluICAgICAgID0gMDsKLSAgIGludCAgICAgICAgICAgICAgICBtYXggICAgICAgPSAwOwotICAgaW50ICAgICAgICAgICAgICAgIHByaW9yaXR5ICA9IDA7Ci0gICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gc2NoZWQgICAgID0geyAwIH07Ci0KLSAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV90aHJlYWRTeW5jU3RhcnRcdFx0TTRPU0FfQ29udGV4dCAweCV4XHRNNE9TQV9Wb2lkKiAiCi0gICAgICAgICAgICAgICAgICAiMHgleCIsIGNvbnRleHQsIHBhcmFtKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKGNvbnRleHQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jU3RhcnQiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHRocmVhZENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9USFJFQUQsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV90aHJlYWRTeW5jU3RhcnQiKTsKLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIGlmKHRocmVhZENvbnRleHQtPnN0YXRlICE9IE00T1NBX2tUaHJlYWRPcGVuZWQpCi0gICB7Ci0gICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RBVEUsICJNNE9TQV90aHJlYWRTeW5jU3RhcnQiKTsKLQotICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgfQotCi0gICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRTdGFydGluZzsKLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0gICB0aHJlYWRDb250ZXh0LT5wYXJhbSA9IHBhcmFtOwotCi0gICBpZiAoIDAgPT0gcHRocmVhZF9hdHRyX2luaXQoICZhdHRyaWJ1dGUgKSApCi0gICB7Ci0gICAgICBpZiAoIDAgPT0gcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCAmYXR0cmlidXRlLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCApICkKLSAgICAgIHsKLSAgICAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCAmYXR0cmlidXRlLCAoc2l6ZV90KXRocmVhZENvbnRleHQtPnN0YWNrU2l6ZSApICkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3koICZhdHRyaWJ1dGUsIFNDSEVEX09USEVSICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFRlbnRhdGl2ZSBwYXRjaGVzIHRvIGhhbmRsZSBwcmlvcml0aWVzIGluIGEgYmV0dGVyIHdheSA6ICovCi0gICAgICAgICAgICAgICAgLyogVXNlIEFuZHJvaWQncyBwcmVkZWZpbmVkIHByaW9yaXRpZXMgKHJhbmdlICsxOS4uLTIwKQotICAgICAgICAgICAgICAgICAqcmF0aGVyIHRoYW4gTGludXggb25lcyAoMC4uOTkpKi8KLQotICAgICAgICAgICAgICAgIC8qIEdldCBtaW4gYW5kIG1heCBwcmlvcml0aWVzICovCi0gICAgICAgICAgICAgICAgbWluID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiggU0NIRURfRklGTyApOwotICAgICAgICAgICAgICAgIG1heCA9IHNjaGVkX2dldF9wcmlvcml0eV9tYXgoIFNDSEVEX0ZJRk8gKTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV90aHJlYWRTeW5jU3RhcnQgTUFYPSVkIE1JTj0lZCIsIG1heCwgbWluKTsKLQotICAgICAgICAgICAgICAgIC8qIHRlbnRhdGl2ZSBtb2RpZmljYXRpb24gb2YgdGhlIHByaW9yaXRpZXMgKi8KLSAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHByaW9yaXR5IGJhc2VkIG9uIGRlZmF1bHQgYW5kcm9pZCBwcmlvcml0aWVzICovCi0gICAgICAgICAgICAgICAgLyogVGhpcyBwcm9iYWJseSByZXF1aXJlcyBzb21lIG1vcmUgdHVuaW5nLAotICAgICAgICAgICAgICAgICAqIG91dGNvbWUgb2YgdGhpcyBwcmlvcml0eSBzZXR0aW5ncyBhcmUgbm90IHlldCBzYXRpc2ZhY3RvcnkgKi8KLSAgICAgICAgICAgICAgICAvKiBJbXBsZW1lbnRpbmcgdGhyZWFkIGhhbmRsaW5nIGJhc2VkIG9uIEFuZHJvaWQncyB0aHJlYWQgY3JlYXRpb24KLSAgICAgICAgICAgICAgICAgKiBoZWxwZXJzIG1pZ2h0IGJyaW5nIHNvbWUgaW1wcm92ZW1lbnQgKHNlZSB0aHJlYWRzLmgpICovCi0gICAgICAgICAgICAgICAgc3dpdGNoKHRocmVhZENvbnRleHQtPnByaW9yaXR5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWRMb3dlc3RQcmlvcml0eToKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX05PUk1BTDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkTG93UHJpb3JpdHk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9ESVNQTEFZOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWROb3JtYWxQcmlvcml0eToKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9ESVNQTEFZOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX2tUaHJlYWRIaWdoUHJpb3JpdHk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9BVURJTzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNE9TQV9rVGhyZWFkSGlnaGVzdFByaW9yaXR5OgotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9IEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2NoZWQuc2NoZWRfcHJpb3JpdHkgPSBwcmlvcml0eTsKLQotICAgICAgICAgICAgICAgIGlmICggMCA9PSBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwYXJhbSggJmF0dHJpYnV0ZSwgJnNjaGVkICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAwID09IHB0aHJlYWRfY3JlYXRlKCAmdGhyZWFkQ29udGV4dC0+dGhyZWFkSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTTRPU0FfdGhyZWFkU3luY0ZvckV2ZXJEbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXRocmVhZENvbnRleHQgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggTTRPU0FfRkFMU0UgPT0gTTRPU0FfRVJSX0lTX0VSUk9SKCBNNE9TQV9zZW1hcGhvcmVXYWl0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1dBSVRfRk9SRVZFUiApICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgfQotICAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koICZhdHRyaWJ1dGUgKTsKLSAgIH0KLQotICAgTTRPU0FfbXV0ZXhMb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZE9wZW5lZDsKLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgIE00T1NBX0RFQlVHKE00RVJSX1RIUkVBRF9OT1RfU1RBUlRFRCwgIk00T1NBX3RocmVhZFN5bmNTdGFydCIpOwotCi0gICByZXR1cm4gTTRFUlJfVEhSRUFEX05PVF9TVEFSVEVEOwotfQotCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIHN0b3BzIGEgc3BlY2lmaWVkIHRocmVhZC4KLSAqIEBub3RlICAgICAgIFRoaXMgY2FsbCBpcyBhIGJsb2NraW5nIG9uZSB1cCB0byB0aGUgIk00T1NBX1RocmVhZERvSXQiCi0gKiAgICAgICAgICAgICBmdW5jdGlvbiBoYXMgcmV0dXJuZWQuCi0gKiAgICAgICAgICAgICBCZWZvcmUgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkUnVubmluZy4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkU3RvcHBpbmcuCi0gKiAgICAgICAgICAgICBPbmNlIHRoZSB0aHJlYWQgaXMgc3RvcHBlZCwgdGhlIHN0YXRlIGlzIE00T1NBX2tUaHJlYWRPcGVuZWQuCi0gKiBAbm90ZSAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIG9uY2UgdGhlIHRocmVhZCBoYXMgYmVlbiBzdG9wcGVkLiBJZiB0aGUKLSAqICAgICAgICAgICAgICJ0aHJlYWRTdG9wcGVkIiBvcHRpb25JRCBpcyBub3QgTlVMTCwgdGhlIHRocmVhZCB3aWxsIGNhbGwgaXQKLSAqICAgICAgICAgICAgIGJlZm9yZSBkeWluZy4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgdGhyZWFkCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX1NUQVRFOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRPU0FfdGhyZWFkU3luY1N0b3AoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfdGhyZWFkU3luY1N0b3BcdFx0TTRPU0FfQ29udGV4dCAweCV4IiwgY29udGV4dCk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY1N0b3AiKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHRocmVhZENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9USFJFQUQsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV90aHJlYWRTeW5jU3RvcCIpOwotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgIT0gTTRPU0Ffa1RocmVhZFJ1bm5pbmcpCi0gICB7Ci0gICAgICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgICAgTTRPU0FfREVCVUcoTTRFUlJfU1RBVEUsICJNNE9TQV90aHJlYWRTeW5jU3RvcCIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZFN0b3BwaW5nOwotCi0gICBNNE9TQV9tdXRleFVubG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgTTRPU0Ffc2VtYXBob3JlV2FpdCh0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3AsIE00T1NBX1dBSVRfRk9SRVZFUik7Ci0KLSAgIE00T1NBX211dGV4TG9jayh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4LCBNNE9TQV9XQUlUX0ZPUkVWRVIpOwotCi0gICB0aHJlYWRDb250ZXh0LT5zdGF0ZSA9IE00T1NBX2tUaHJlYWRPcGVuZWQ7Ci0KLSAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBkZWxldGVzIGEgdGhyZWFkIChpZGVudGlmaWVkIGJ5IGl0cyBjb250ZXh0KS4gQWZ0ZXIKLSAqICAgICAgICAgICAgIHRoaXMgY2FsbCB0aGUgdGhyZWFkIGFuZCBpdHMgY29udGV4dCBhcmUgbm8gbW9yZSB1c2VhYmxlLiBUaGlzCi0gKiAgICAgICAgICAgICBmdW5jdGlvbiBmcmVlcyBhbGwgdGhlIG1lbW9yeSByZWxhdGVkIHRvIHRoaXMgdGhyZWFkLgotICogQG5vdGUgICAgICAgQmVmb3JlIHRoZSBtZXRob2QgaXMgY2FsbGVkLCB0aGUgc3RhdGUgaXMgTTRPU0Ffa1RocmVhZE9wZW5lZC4KLSAqICAgICAgICAgICAgIE9uY2UgdGhlIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBzdGF0ZSBpcyBNNE9TQV9rVGhyZWFkQ2xvc2VkLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4vT1VUKSBDb250ZXh0IG9mIHRoZSB0aHJlYWQKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfU1RBVEU6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jQ2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICBNNE9TQV9UUkFDRTFfMSgiTTRPU0FfdGhyZWFkU3luY0Nsb3NlXHRcdE00T1NBX0NvbnRleHQgMHgleCIsIGNvbnRleHQpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoY29udGV4dCA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+c3RhdGUgPT0gTTRPU0Ffa1RocmVhZENsb3NlZCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOwotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgIT0gTTRPU0Ffa1RocmVhZE9wZW5lZCkKLSAgIHsKLSAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVEFURSwgIk00T1NBX3RocmVhZFN5bmNDbG9zZSIpOwotCi0gICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YXRlID0gTTRPU0Ffa1RocmVhZENsb3NlZDsKLQotICAgTTRPU0FfbXV0ZXhVbmxvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCk7Ci0KLSAgIGVycl9jb2RlID0gTTRPU0FfbXV0ZXhDbG9zZSh0aHJlYWRDb250ZXh0LT5zdGF0ZU11dGV4KTsKLQotICAgaWYoTTRPU0FfRVJSX0lTX0VSUk9SKGVycl9jb2RlKSkKLSAgIHsKLSAgICAgIE00T1NBX0RFQlVHKGVycl9jb2RlLCAiTTRPU0FfdGhyZWFkU3luY0Nsb3NlOiBNNE9TQV9tdXRleENsb3NlIik7Ci0KLSAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgIH0KLQotICAgZXJyX2NvZGUgPSBNNE9TQV9zZW1hcGhvcmVDbG9zZSh0aHJlYWRDb250ZXh0LT5zZW1TdGFydFN0b3ApOwotCi0gICBpZihNNE9TQV9FUlJfSVNfRVJST1IoZXJyX2NvZGUpKQotICAgewotICAgICAgTTRPU0FfREVCVUcoZXJyX2NvZGUsICJNNE9TQV90aHJlYWRTeW5jQ2xvc2U6IE00T1NBX3NlbWFwaG9yZUNsb3NlIik7Ci0KLSAgICAgIHJldHVybiBlcnJfY29kZTsKLSAgIH0KLQotICAgaWYodGhyZWFkQ29udGV4dC0+bmFtZSAhPSBNNE9TQV9OVUxMKQotICAgewotICAgICAgZnJlZSh0aHJlYWRDb250ZXh0LT5uYW1lKTsKLSAgIH0KLQotICAgZnJlZSh0aHJlYWRDb250ZXh0KTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgdGhyZWFkIHRvIHJldHVybiBpdHMgc3RhdGUuCi0gKiBAbm90ZSAgICAgICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nL2RlYWxsb2NhdGluZyB0aGUgc3RhdGUKLSAqICAgICAgICAgICAgIGZpZWxkLgotICogQHBhcmFtICAgICAgY29udGV4dDooSU4pIENvbnRleHQgb2YgdGhlIHRocmVhZAotICogQHBhcmFtICAgICAgc3RhdGU6KE9VVCkgVGhyZWFkIHN0YXRlCi0gKiBAcmV0dXJuICAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgTTRFUlJfUEFSQU1FVEVSOiBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9DT05URVhUOiBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaHJlYWRTdGF0ZSogc3RhdGUpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8yKCJNNE9TQV90aHJlYWRTeW5jR2V0U3RhdGVcdFx0TTRPU0FfQ29udGV4dCAweCV4XHQiCi0gICAgICAgICAgICAgICAgICAiTTRPU0FfVGhyZWFkU3RhdGUqIDB4JXgiLCBjb250ZXh0LCBzdGF0ZSk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0dldFN0YXRlIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihzdGF0ZSA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZSIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIodGhyZWFkQ29udGV4dC0+Y29yZUlEICE9IE00T1NBX1RIUkVBRCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCwgIk00T1NBX3RocmVhZFN5bmNHZXRTdGF0ZSIpOwotCi0gICAqc3RhdGUgPSB0aHJlYWRDb250ZXh0LT5zdGF0ZTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICAgVGhpcyBtZXRob2QgYXNrcyB0aGUgY2FsbGluZyB0aHJlYWQgdG8gc2xlZXAgZHVyaW5nICJ0aW1lU2xlZXAiCi0gKiAgICAgICAgICAgICBtaWxsaXNlY29uZHMuCi0gKiBAbm90ZSAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgICB0aW1lOihJTikgVGltZSB0byBzbGVlcCBpbiBtaWxsaXNlY29uZHMKLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFNsZWVwKE00T1NBX1VJbnQzMiB0aW1lKQotewotICAgc3RydWN0IHRpbWVzcGVjIHJxdHAgPSB7IDAsIDAgfTsKLSAgIHN0cnVjdCB0aW1lc3BlYyBybXRwID0geyAwLCAwIH07Ci0KLSAgIE00T1NBX1RSQUNFMV8xKCJNNE9TQV90aHJlYWRTbGVlcFx0XHRNNE9TQV9VSW50MzIgJWQiLCB0aW1lKTsKLQotICAgcnF0cC50dl9zZWMgPSAodGltZV90KXRpbWUvMTAwMDsKLSAgIHJxdHAudHZfbnNlYyA9ICh0aW1lJTEwMDApICogMTAwMDAwMDsKLSAgIG5hbm9zbGVlcCgmcnF0cCwgJnJtdHApOwotCi0gICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9QUklPUklUWSA9PSBNNE9TQV9UUlVFKQotCi1NNE9TQV9FUlIgTTRPU0FfU2V0VGhyZWFkU3luY1ByaW9yaXR5KE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotICAgTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbCBwcmlvcml0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbCkob3B0aW9uVmFsdWUpOwotCi0gICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfU2V0VGhyZWFkU3luY1ByaW9yaXR5XHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgaWYoKE00T1NBX1VJbnQzMikodWludHB0cl90KW9wdGlvblZhbHVlPk00T1NBX2tUaHJlYWRMb3dlc3RQcmlvcml0eSkKLSAgIHsKLSAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICB9Ci0KLSAgIHRocmVhZENvbnRleHQtPnByaW9yaXR5ID0gcHJpb3JpdHk7Ci0KLSAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkqLwotCi0KLQotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUgPT0gTTRPU0FfVFJVRSkKLQotTTRPU0FfRVJSIE00T1NBX1NldFRocmVhZFN5bmNOYW1lKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0gICBNNE9TQV9DaGFyKiBuYW1lID0gKE00T1NBX0NoYXIqKW9wdGlvblZhbHVlOwotICAgTTRPU0FfVUludDMyIG5hbWVTaXplIDsKLQotICAgTTRPU0FfVFJBQ0UyXzIoIk00T1NBX1NldFRocmVhZFN5bmNOYW1lXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX0RhdGFPcHRpb24gMHgleCIsIGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+bmFtZSAhPSBOVUxMKQotICAgewotICAgICAgZnJlZSh0aHJlYWRDb250ZXh0LT5uYW1lKTsKLSAgICAgIHRocmVhZENvbnRleHQtPm5hbWUgPSBNNE9TQV9OVUxMOwotICAgfQotCi0gICBpZihvcHRpb25WYWx1ZSAhPSBNNE9TQV9OVUxMKQotICAgewotICAgICAgbmFtZVNpemUgPSBzdHJsZW4oKGNvbnN0IGNoYXIgKiluYW1lKSsxOwotCi0gICAgICB0aHJlYWRDb250ZXh0LT5uYW1lID0KLSAgICAgICAgIChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobmFtZVNpemUsIE00T1NBX1RIUkVBRCwKLSAgICAgICAgIChNNE9TQV9DaGFyKikiTTRPU0FfU2V0VGhyZWFkU3luY05hbWU6IHRocmVhZCBuYW1lIik7Ci0KLSAgICAgIGlmKHRocmVhZENvbnRleHQgPT0gTTRPU0FfTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgIH0KLQotICAgICAgbWVtY3B5KCh2b2lkICopdGhyZWFkQ29udGV4dC0+bmFtZSwgKHZvaWQgKiluYW1lLAotICAgICAgICAgICAgICAgICAgIG5hbWVTaXplKTsKLSAgIH0KLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FKi8KLQotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUgPT0gTTRPU0FfVFJVRSkKLQotTTRPU0FfRVJSIE00T1NBX1NldFRocmVhZFN5bmNTdGFja1NpemUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotCi0gICBNNE9TQV9UUkFDRTJfMigiTTRPU0FfU2V0VGhyZWFkU3luY1N0YWNrU2l6ZVx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9EYXRhT3B0aW9uIDB4JXgiLCBjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgIHRocmVhZENvbnRleHQtPnN0YWNrU2l6ZSA9IChNNE9TQV9VSW50MzIpKHVpbnRwdHJfdClvcHRpb25WYWx1ZTsKLQotICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICBUaGlzIG1ldGhvZCBhc2tzIHRoZSBjb3JlIE9TQUwtVGhyZWFkIGNvbXBvbmVudCB0byBzZXQgdGhlIHZhbHVlCi0gKiAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklELiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogICAgICAgICAgICAgYWxsb2NhdGluZy9kZWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgICBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIG9mIGFsbG9jYXRpbmcvZGUtYWxsb2NhdGluZyB0aGUKLSAqICAgICAgICAgICAgICJ2YWx1ZSIgZmllbGQsIHRoZSBjYWxsZWUgbXVzdCBjb3B5IHRoaXMgZmllbGQgdG8gaXRzIGludGVybmFsCi0gKiAgICAgICAgICAgICB2YXJpYWJsZS4KLSAqIEBwYXJhbSAgICAgIGNvbnRleHQ6KElOL09VVCkgQ29udGV4dCBvZiB0aGUgdGhyZWFkCi0gKiBAcGFyYW0gICAgICBvcHRpb25JRDooSU4pIElEIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSAgICAgIG9wdGlvblZhbHVlOihJTikgVmFsdWUgb2YgdGhlIG9wdGlvbgotICogQHJldHVybiAgICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgIE00RVJSX1BBUkFNRVRFUjogYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfQ09OVEVYVDogcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX0JBRF9PUFRJT05fSUQ6IHRoZSBvcHRpb25JRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX1NUQVRFOiB0aGlzIG9wdGlvbiBpcyBub3QgYXZhaWxhYmxlIG5vdwotICogQHJldHVybiAgICAgTTRFUlJfUkVBRF9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHJlYWQgb25seSBvbmUKLSAqIEByZXR1cm4gICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogdGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGhyZWFkT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgTTRPU0FfVGhyZWFkQ29udGV4dCogdGhyZWFkQ29udGV4dCA9IChNNE9TQV9UaHJlYWRDb250ZXh0Kiljb250ZXh0OwotICAgTTRPU0FfRVJSIGVycl9jb2RlOwotCi0gICBNNE9TQV9UUkFDRTFfMygiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvblx0XHRNNE9TQV9Db250ZXh0IDB4JXhcdCIKLSAgICAgICAgICAgICAgICAgICJNNE9TQV9PcHRpb25JRCAlZFx0TTRPU0FfRGF0YU9wdGlvbiAweCV4IiwKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIG9wdGlvbklELCBvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIob3B0aW9uSUQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jU2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMih0aHJlYWRDb250ZXh0LT5jb3JlSUQgIT0gTTRPU0FfVEhSRUFELAotICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9DT05URVhULCAiTTRPU0FfdGhyZWFkU3luY1NldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19DT1JFSUQob3B0aW9uSUQsIE00T1NBX1RIUkVBRCksCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX09QVElPTl9JRCwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKCFNNE9TQV9PUFRJT05fSURfSVNfV1JJVEFCTEUob3B0aW9uSUQpLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1JFQURfT05MWSwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotCi0gICBNNE9TQV9tdXRleExvY2sodGhyZWFkQ29udGV4dC0+c3RhdGVNdXRleCwgTTRPU0FfV0FJVF9GT1JFVkVSKTsKLQotICAgaWYodGhyZWFkQ29udGV4dC0+c3RhdGUgIT0gTTRPU0Ffa1RocmVhZE9wZW5lZCkKLSAgIHsKLSAgICAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICAgICBNNE9TQV9ERUJVRyhNNEVSUl9TVEFURSwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgfQotCi0gICBzd2l0Y2gob3B0aW9uSUQpCi0gICB7Ci0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkgPT0gTTRPU0FfVFJVRSkKLSAgICAgIGNhc2UgTTRPU0FfVGhyZWFkUHJpb3JpdHk6Ci0gICAgICB7Ci0gICAgICAgICBlcnJfY29kZSA9IE00T1NBX1NldFRocmVhZFN5bmNQcmlvcml0eShjb250ZXh0LCBvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZKi8KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZE5hbWU6Ci0gICAgICB7Ci0gICAgICAgICBlcnJfY29kZSA9IE00T1NBX1NldFRocmVhZFN5bmNOYW1lKGNvbnRleHQsIG9wdGlvblZhbHVlKTsKLQotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfTkFNRSovCi0KLSNpZihNNE9TQV9PUFRJT05JRF9USFJFQURfU1RBQ0tfU0laRSA9PSBNNE9TQV9UUlVFKQotICAgICAgY2FzZSBNNE9TQV9UaHJlYWRTdGFja1NpemU6Ci0gICAgICB7Ci0gICAgICAgICBlcnJfY29kZSA9IE00T1NBX1NldFRocmVhZFN5bmNTdGFja1NpemUoY29udGV4dCwgb3B0aW9uVmFsdWUpOwotCi0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFKi8KLQotICAgICAgZGVmYXVsdDoKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX0RFQlVHKE00RVJSX05PVF9JTVBMRU1FTlRFRCwgIk00T1NBX3RocmVhZFN5bmNTZXRPcHRpb24iKTsKLQotICAgICAgICAgZXJyX2NvZGUgPSBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIE00T1NBX211dGV4VW5sb2NrKHRocmVhZENvbnRleHQtPnN0YXRlTXV0ZXgpOwotCi0gICByZXR1cm4gZXJyX2NvZGU7Ci19Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgIFRoaXMgbWV0aG9kIGFza3MgdGhlIE9TQUwtVGhyZWFkIHRvIHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZAotICogICAgICAgICAgICAgd2l0aCB0aGUgb3B0aW9uSUQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gKiAgICAgICAgICAgICBhbGxvY2F0aW5nL2RlYWxsb2NhdGluZyB0aGUgbWVtb3J5IG9mIHRoZSB2YWx1ZSBmaWVsZC4KLSAqIEBub3RlICAgICAgICJvcHRpb25WYWx1ZSIgbXVzdCBiZSBjYXN0IGFjY29yZGluZyB0byB0aGUgdHlwZSByZWxhdGVkIHRvIHRoZQotICogICAgICAgICAgICAgb3B0aW9uSUQuCi0gKiBAbm90ZSAgICAgICBBcyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZS1hbGxvY2F0aW5nIHRoZSAidmFsdWUiCi0gKiAgICAgICAgICAgICBmaWVsZCwgdGhlIGNvcmUgT1NBTC1UaHJlYWQgY29tcG9uZW50IG11c3QgcGVyZm9ybSBhIGNvcHkgb2YgaXRzCi0gKiAgICAgICAgICAgICBpbnRlcm5hbCB2YWx1ZSB0byB0aGUgdmFsdWUgZmllbGQuCi0gKiBAcGFyYW0gICAgICBjb250ZXh0OihJTikgQ29udGV4dCBvZiB0aGUgdGhyZWFkCi0gKiBAcGFyYW0gICAgICBvcHRpb25JRDooSU4pIElEIG9mIHRoZSBvcHRpb24KLSAqIEBwYXJhbSAgICAgIG9wdGlvblZhbHVlOihPVVQpIFZhbHVlIG9mIHRoZSBvcHRpb24KLSAqIEByZXR1cm4gICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgICBNNEVSUl9QQVJBTUVURVI6IGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgICAgTTRFUlJfQkFEX0NPTlRFWFQ6IHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9XUklURV9PTkxZOiB0aGlzIG9wdGlvbiBpcyBhIHdyaXRlIG9ubHkgb25lCi0gKiBAcmV0dXJuICAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6IHRoaXMgb3B0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RocmVhZE9wdGlvbklEIG9wdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpCi17Ci0gICBNNE9TQV9UaHJlYWRDb250ZXh0KiB0aHJlYWRDb250ZXh0ID0gKE00T1NBX1RocmVhZENvbnRleHQqKWNvbnRleHQ7Ci0KLSAgIE00T1NBX1RSQUNFMV8zKCJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uXHRcdE00T1NBX0NvbnRleHQgMHgleFx0IgotICAgICAgICAgICAgICAgICAgIk00T1NBX09wdGlvbklEICVkXHRNNE9TQV9EYXRhT3B0aW9uKiAweCV4IiwKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIG9wdGlvbklELCBvcHRpb25WYWx1ZSk7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihjb250ZXh0ID09IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIob3B0aW9uSUQgPT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMihvcHRpb25WYWx1ZSA9PSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgTTRPU0FfREVCVUdfSUYyKHRocmVhZENvbnRleHQtPmNvcmVJRCAhPSBNNE9TQV9USFJFQUQsCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQsICJNNE9TQV90aHJlYWRTeW5jR2V0T3B0aW9uIik7Ci0KLSAgIE00T1NBX0RFQlVHX0lGMighTTRPU0FfT1BUSU9OX0lEX0lTX0NPUkVJRChvcHRpb25JRCwgTTRPU0FfVEhSRUFEKSwKLSAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfT1BUSU9OX0lELCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICBNNE9TQV9ERUJVR19JRjIoIU00T1NBX09QVElPTl9JRF9JU19SRUFEQUJMRShvcHRpb25JRCksCi0gICAgICAgICAgICAgICAgICAgTTRFUlJfV1JJVEVfT05MWSwgIk00T1NBX3RocmVhZFN5bmNHZXRPcHRpb24iKTsKLQotICAgc3dpdGNoKG9wdGlvbklEKQotICAgewotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX1BSSU9SSVRZID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZFByaW9yaXR5OgotICAgICAgewotICAgICAgICAgTTRPU0FfVGhyZWFkUHJpb3JpdHlMZXZlbCogcHJpb3JpdHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1RocmVhZFByaW9yaXR5TGV2ZWwqKW9wdGlvblZhbHVlOwotCi0gICAgICAgICAqcHJpb3JpdHkgPSB0aHJlYWRDb250ZXh0LT5wcmlvcml0eTsKLQotICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICB9Ci0jZW5kaWYgLypNNE9TQV9PUFRJT05JRF9USFJFQURfUFJJT1JJVFkqLwotCi0jaWYoTTRPU0FfT1BUSU9OSURfVEhSRUFEX05BTUUgPT0gTTRPU0FfVFJVRSkKLSAgICAgIGNhc2UgTTRPU0FfVGhyZWFkTmFtZToKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX0NoYXIqKiBuYW1lID0gKE00T1NBX0NoYXIqKilvcHRpb25WYWx1ZTsKLQotICAgICAgICAgKm5hbWUgPSB0aHJlYWRDb250ZXh0LT5uYW1lOwotCi0gICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgIH0KLSNlbmRpZiAvKk00T1NBX09QVElPTklEX1RIUkVBRF9OQU1FKi8KLQotI2lmKE00T1NBX09QVElPTklEX1RIUkVBRF9TVEFDS19TSVpFID09IE00T1NBX1RSVUUpCi0gICAgICBjYXNlIE00T1NBX1RocmVhZFN0YWNrU2l6ZToKLSAgICAgIHsKLSAgICAgICAgIE00T1NBX1VJbnQzMiogc3RhY2tTaXplID0gKE00T1NBX1VJbnQzMiopb3B0aW9uVmFsdWU7Ci0KLSAgICAgICAgICpzdGFja1NpemUgPSB0aHJlYWRDb250ZXh0LT5zdGFja1NpemU7Ci0KLSAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgfQotI2VuZGlmIC8qTTRPU0FfT1BUSU9OSURfVEhSRUFEX1NUQUNLX1NJWkUqLwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgIH0KLQotICAgTTRPU0FfREVCVUcoTTRFUlJfTk9UX0lNUExFTUVOVEVELCAiTTRPU0FfdGhyZWFkU3luY0dldE9wdGlvbiIpOwotCi0gICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19EZWJ1Z1RyYWNlLmMgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19EZWJ1Z1RyYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg1MGVkOTEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfRGVidWdUcmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgIE00UFNXX0RlYnVnVHJhY2UuYwotICogQGJyaWVmICAgICAgRGVmYXVsdCB0cmFjZSBmdW5jdGlvbiBmb3IgZGVidWdnaW5nIG1hY3JvcwotICogQG5vdGUgICAgICAgVGhpcyBmaWxlIGdpdmVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmFjZSBmdW5jdGlvbgotICogICAgICAgICAgICAgdXNlZCBpbiB0aGUgZGVidWcgaW5zdHJ1bWVudGF0aW9uIG1hY3JvcywgYmFzZWQgb24gcHJpbnRmLgotICogICAgICAgICAgICAgQXBwbGljYXRpb24gd3JpdGVycyBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byBpbXBsZW1lbnQgdGhlaXIKLSAqICAgICAgICAgICAgIG93biAiTTRPU0FfRGVidWdUcmFjZSIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+IC8qZm9yIHByaW50ZiAqLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKiNkZWZpbmUgTk9fRklMRSAqLyAvKiBzdXBwcmVzc2VzIHRoZSBmaWxlIG5hbWUgcHJpbnQgb3V0ICovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiB2b2lkIE00T1NBX0RlYnVnVHJhY2UoTTRPU0FfSW50MzIgbGluZSwgY2hhciogZmlsZSwgTTRPU0FfSW50MzIgbGV2ZWwsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogY29uZCwgY2hhciogbXNnLCBNNE9TQV9FUlIgZXJyKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgdHJhY2UgZm9yIGRlYnVnIHRlc3RzCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIHRvIGJlIGNhbGxlZCBpbiB0aGUgZGVidWcgbWFjcm9zIG9ubHkuCi0gKiAgICAgICAgICAgIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBwcmludGYuCi0gKiBAcGFyYW0gICAgbGluZSAoSU4pOiB0aGUgbGluZSBudW1iZXIgaW4gdGhlIHNvdXJjZSBmaWxlCi0gKiBAcGFyYW0gICAgZmlsZSAoSU4pOiB0aGUgc291cmNlIGZpbGUgbmFtZQotICogQHBhcmFtICAgIGxldmVsIChJTik6IHRoZSBkZWJ1ZyBsZXZlbAotICogQHBhcmFtICAgIG1zZyAoSU4pOiB0aGUgZXJyb3IgbWVzc2FnZQotICogQHBhcmFtICAgIGVyciAoSU4pOiB0aGUgcmV0dXJuIHZhbHVlIChlcnJvciBjb2RlKQotICogQHJldHVybiAgICBub25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQUxfVFJBQ0VfRVhQT1JUX1RZUEUgdm9pZCBNNE9TQV9EZWJ1Z1RyYWNlKE00T1NBX0ludDMyIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyKiBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUiBlcnIpCi17Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIC8qIHRyeSB0byAiaW5kZW50IiB0aGUgcmVzdWx0aW5nIHRyYWNlcyBkZXBlbmRpbmcgb24gdGhlIGxldmVsICovCi0gICAgZm9yIChpID0wIDsgaSA8IGxldmVsOyBpICsrKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCIgIik7Ci0gICAgfQotCi0jaWZkZWYgTk9fRklMRQotICAgIHByaW50ZigiRXJyb3I6ICUiIFBSSXUzMiAiLCBvbiAlczogJXNcbiIsZXJyLGNvbmQsbXNnKTsKLSNlbHNlIC8qIE5PX0ZJTEUgICAgICovCi0gICAgcHJpbnRmKCJFcnJvcjogJSIgUFJJdTMyICIsIG9uICVzOiAlcyBMaW5lICUiIFBSSXUzMiAiIGluOiAlc1xuIixlcnIsY29uZCxtc2csbGluZSxmaWxlKTsKLSNlbmRpZiAvKiBOT19GSUxFICAgICAqLwotCi19Ci0KLU00T1NBTF9UUkFDRV9FWFBPUlRfVFlQRSBNNE9TQV9Wb2lkIE00T1NBX0RFQlVHX3RyYWNlRnVuY3Rpb24oTTRPU0FfVUludDMyIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZ0NvbmRpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSIHJldHVybmVkRXJyb3IpCi17Ci0gICAgTTRPU0FfRGVidWdUcmFjZShsaW5lLCBmaWxlTmFtZSwgbGV2ZWwsIHN0cmluZ0NvbmRpdGlvbiwgbWVzc2FnZSwgcmV0dXJuZWRFcnJvcik7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL000UFNXX01lbW9yeUludGVyZmFjZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfTWVtb3J5SW50ZXJmYWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVhNGNjZWEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfTWVtb3J5SW50ZXJmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFBTV19NZW1vcnlJbnRlcmZhY2UuYwotICogQGJyaWVmICBNZW1vcnkgSW50ZXJmYWNlCi0gKiBAbm90ZSAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBvc2FsIG1lbW9yeSBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaWZuZGVmIE00VlBTX0FEVkFOQ0VEX01FTU9SWV9NQU5BR0VSCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmbiAgICAgICAgIE00T1NBX01lbUFkZHIzMiBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRPU0FfVUludDMyIHNpemUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZykKLSAqIEBicmllZiAgICAgIHRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgbWVtb3J5IGJsb2NrIChhdCBsZWFzdCAzMiBiaXRzIGFsaWduZWQpCi0gKiBAbm90ZQotICogQHBhcmFtICAgICAgc2l6ZSAoSU4pOiBzaXplIG9mIGFsbG9jYXRlZCBibG9jayBpbiBieXRlcwotICogQHBhcmFtICAgICAgY29yZUlEIChJTik6IGlkZW50aWZpY2F0aW9uIG9mIHRoZSBjYWxsZXIgY29tcG9uZW50Ci0gKiBAcGFyYW0gICAgICBzdHJpbmcgKElOKTogZGVzY3JpcHRpb24gb2YgdGhlIGFsbG9jYXRlZCBibG9jayAobnVsbCB0ZXJtaW5hdGVkKQotICogQHJldHVybiAgICAgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIGJsb2NrLCBNNE9TQV9OVUxMIGlmIG5vIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX01lbUFkZHIzMiBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRPU0FfVUludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIHN0cmluZykKLXsKLSAgICBNNE9TQV9NZW1BZGRyMzIgQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAgKiBJZiBzaXplIGlzIDAsIG1hbGxvYyBvbiBXSU4gT1MgYWxsb2NhdGVzIGEgemVyby1sZW5ndGggaXRlbSBpbgotICAgICAqIHRoZSBoZWFwIGFuZCByZXR1cm5zIGEgdmFsaWQgcG9pbnRlciB0byB0aGF0IGl0ZW0uCi0gICAgICogT24gb3RoZXIgcGxhdGZvcm1zLCBtYWxsb2MgY291bGQgcmV0dXJucyBhbiBpbnZhbGlkIHBvaW50ZXIKLSAgICAgKiBTbywgRE9OJ1QgYWxsb2NhdGUgbWVtb3J5IG9mIDAgYnl0ZSAqLwotICAgIGlmIChzaXplID09IDApCi0gICAgewotICAgICAgICByZXR1cm4gQWRkcmVzczsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSU0ICE9IDApCi0gICAgewotICAgICAgICBzaXplID0gc2l6ZSArIDQgLSAoc2l6ZSU0KTsKLSAgICB9Ci0KLSAgICBBZGRyZXNzID0gKE00T1NBX01lbUFkZHIzMikgbWFsbG9jKHNpemUpOwotCi0gICAgcmV0dXJuIEFkZHJlc3M7Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19UcmFjZS5jIGIvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTTRQU1dfVHJhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjNkOWExZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9NNFBTV19UcmFjZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFBTV19UcmFjZS5jCi0gKiBAYnJpZWYgICAgICAgIFRyYWNlIGZ1bmN0aW9uIGZvciB0cmFjZSBtYWNyb3MKLSAqIEBub3RlICAgICAgICBUaGlzIGZpbGUgZ2l2ZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmFjZSBmdW5jdGlvbiB1c2VkCi0gKiAgICAgICAgICAgICAgICBpbiB0aGUgdHJhY2UgaW5zdHJ1bWVudGF0aW9uIG1hY3JvcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4gLypmb3IgcHJpbnRmICovCi0jaW5jbHVkZSA8c3RkYXJnLmg+IC8qIEFOU0kgQyBtYWNyb3MgYW5kIGRlZnMgZm9yIHZhcmlhYmxlIGFyZ3MgKi8KLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLQotI2RlZmluZSBOT19GSUxFIC8qIHN1cHByZXNzZXMgdGhlIGZpbGUgbmFtZSBwcmludCBvdXQgKi8KLQotI2RlZmluZSBNQVhfU1RSSU5HX1NJWkUgMTAyNAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHZvaWQgTTRPU0FfVHJhY2UoTTRPU0FfSW50MzIgbGluZSwgTTRPU0FfQ2hhciogZmlsZSAsTTRPU0FfSW50MzIgbGV2ZWwsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIqIGZvcm1hdCwgLi4uKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgdHJhY2UgZm9yIGRlYnVnIHRlc3RzCi0gKiBAbm90ZSAgICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgcHJpbnRmLiBGaXJzdCB0aGUgdmFyaWFibGVzIGFyZSByZXRyaWV2ZWQgdXNpbmcKLSAqICAgICAgICAgICAgQU5TSSBDIGRlZnMgYW5kIG1hY3JvcyB3aGljaCBlbmFibGUgdG8gYWNjZXNzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KLSAqICAgICAgICAgICAgVGhlbiB0aGUgcHJpbnRmIGlzIGRvbmUgKHdpdGggc29tZSBvcm5lbWVudGFsIGFkZHMpLgotICogQHBhcmFtICAgIGxldmVsIChJTik6IHRoZSBkZWJ1ZyBsZXZlbAotICogQHBhcmFtICAgIGZvcm1hdCAoSU4pOiB0aGUgInByaW50ZiIgZm9ybWF0ZWQgc3RyaW5nCi0gKiBAcGFyYW0gICAgLi4uIChJTik6IGFzIG1hbnkgcGFyYW1ldGVycyBhcyByZXF1aXJlZCAuLi4KLSAqIEByZXR1cm4gICAgbm9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFIHZvaWQgTTRPU0FfVHJhY2UoTTRPU0FfSW50MzIgbGluZSwgTTRPU0FfQ2hhciogZmlsZSAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0NoYXIqIGZvcm1hdCwgLi4uKQotewotICAgIE00T1NBX0NoYXIgbWVzc2FnZVtNQVhfU1RSSU5HX1NJWkVdOwotICAgIE00T1NBX0ludDMyIGk7Ci0gICAgdmFfbGlzdCBtYXJrZXI7IC8qIHBvaW50ZXIgdG8gbGlzdCBvZiBhcmd1bWVudHMgKi8KLQotICAgIC8qIGdldCB0aGUgdmFyIGFyZ3VtZW50cyBpbnRvIHRoZSBzdHJpbmcgbWVzc2FnZSB0byBiZSBhYmxlIHRvIHByaW50ICovCi0gICAgdmFfc3RhcnQobWFya2VyLGZvcm1hdCk7IC8qIHNldCBwdHIgdG8gZmlyc3QgYXJndW1lbnQgaW4gdGhlIGxpc3Qgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gKi8KLSAgICB2c3ByaW50ZigoY2hhciAqKW1lc3NhZ2UsIChjb25zdCBjaGFyICopZm9ybWF0LG1hcmtlciApOyAgLyogZm9ybWF0cyBhbmQgd3JpdGVzIHRoZSBkYXRhIGludG8gbWVzc2FnZSAqLwotICAgIHZhX2VuZChtYXJrZXIpOyAvKiByZXNldCBwb2ludGVyIHRvIE5VTEwgKi8KLQotICAgIC8qIGRvIHRoZSBhY3R1YWwgcHJpbnQgKi8KLSNpZmRlZiBOT19GSUxFCi0gICAgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCAiTTRPU0FfVHJhY2UiLCAiJXMiLCAoY2hhciopbWVzc2FnZSk7Ci0jZWxzZSAvKiBOT19GSUxFICAgICAqLwotICAgIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgIk00T1NBX1RyYWNlIiwgIiVzIiwgIiVzIGF0ICVsdSBpbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW1lc3NhZ2UsIGxpbmUsIGZpbGUpOwotI2VuZGlmIC8qIE5PX0ZJTEUgICAgICovCi0KLX0KLQotTTRPU0FMX1RSQUNFX0VYUE9SVF9UWVBFIE00T1NBX1ZvaWQgTTRPU0FfVFJBQ0VfdHJhY2VGdW5jdGlvbihNNE9TQV9VSW50MzIgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvcmVJRCBjb3JlSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogc3RyaW5nTXNnLCAuLi4pCi17Ci0gICAgTTRPU0FfQ2hhciBtZXNzYWdlW01BWF9TVFJJTkdfU0laRV07Ci0gICAgTTRPU0FfSW50MzIgaTsKLSAgICB2YV9saXN0IG1hcmtlcjsgLyogcG9pbnRlciB0byBsaXN0IG9mIGFyZ3VtZW50cyAqLwotCi0gICAgLyogZ2V0IHRoZSB2YXIgYXJndW1lbnRzIGludG8gdGhlIHN0cmluZyBtZXNzYWdlIHRvIGJlIGFibGUgdG8gcHJpbnQgKi8KLSAgICB2YV9zdGFydChtYXJrZXIsc3RyaW5nTXNnKTsgLyogc2V0IHB0ciB0byBmaXJzdCBhcmd1bWVudCBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiAqLwotICAgIHZzcHJpbnRmKChjaGFyICopbWVzc2FnZSwgKGNvbnN0IGNoYXIgKilzdHJpbmdNc2csbWFya2VyICk7ICAvKiBmb3JtYXRzIGFuZCB3cml0ZXMgdGhlIGRhdGEgaW50byBtZXNzYWdlICovCi0gICAgdmFfZW5kKG1hcmtlcik7IC8qIHJlc2V0IHBvaW50ZXIgdG8gTlVMTCAqLwotCi0gICAgLyogZG8gdGhlIGFjdHVhbCBwcmludCAqLwotI2lmZGVmIE5PX0ZJTEUKLSAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uIiwgIiVzIiwgKGNoYXIqKW1lc3NhZ2UpOwotI2Vsc2UgLyogTk9fRklMRSAgICAgKi8KLSAgICBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sICJNNE9TQV9UUkFDRV90cmFjZUZ1bmN0aW9uIiwgIiVzIiwgIiVzIGF0ICVsdSBpbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbWVzc2FnZSwgbGluZSwgKGNoYXIqKWZpbGUpOwotI2VuZGlmIC8qIE5PX0ZJTEUgICAgICovCi0KLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL29zYWwvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci9vc2FsL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3Ivb3NhbC9zcmMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfVHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19UeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZjlkMTZiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19UeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TVA0V19UeXBlcy5oCi0gKiBAYnJpZWYgICBEZWZpbml0aW9uIG9mIHR5cGVzIGZvciB0aGUgY29yZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBNNE1QNFdfVFlQRVNfSAotI2RlZmluZSBNNE1QNFdfVFlQRVNfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpZm5kZWYgX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIKLQotLyogaW5jbHVkZXMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRTWVNfU3RyZWFtLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0Q19GdHlwQm94Ci0gKiBAYnJpZWYgICAgICAgSW5mb3JtYXRpb24gdG8gYnVpbGQgdGhlICdmdHlwJyBhdG9tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgTTRNUEFDX0ZUWVBfVEFHIDB4NjY3NDc5NzAgLyogJ2Z0eXAnICovCi0jZGVmaW5lIE00TVBBQ19NQVhfQ09NUEFUSUJMRV9CUkFORFMgMTAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogQWxsIGJyYW5kIGZpZWxkcyBhcmUgYWN0dWFsbHkgY2hhcls0XSBzdG9yZWQgaW4gYmlnLWVuZGlhbiBpbnRlZ2VyIGZvcm1hdCAqLwotCi0gICAgTTRPU0FfVUludDMyICAgIG1ham9yX2JyYW5kOyAgICAgICAgIC8qIGdlbmVyYWxseSAnM2dwNCcgICAgICAgICAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtaW5vcl92ZXJzaW9uOyAgICAgICAvKiBnZW5lcmFsbHkgJzAwMDAnIG9yICd4LnggJyAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbmJDb21wYXRpYmxlQnJhbmRzOyAgLyogbnVtYmVyIG9mIGNvbXBhdGlibGUgYnJhbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgIGNvbXBhdGlibGVfYnJhbmRzW000TVBBQ19NQVhfQ09NUEFUSUJMRV9CUkFORFNdOyAgIC8qIGFycmF5IG9mIG1heCBjb21wYXRpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kcyAqLwotfSBNNE1QNENfRnR5cEJveDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNFdfbWVtQWRkcgotICogQGJyaWVmICAgICAgICBCdWZmZXIgc3RydWN0dXJlIGZvciB0aGUgTVA0IHdyaXRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgc2l6ZTsKLSAgICBNNE9TQV9NZW1BZGRyMzIgICAgYWRkcjsKLX0gTTRNUDRXX21lbUFkZHI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGltZSB0eXBlIGZvciB0aGUgY29yZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgTTRPU0FfVUludDMyIE00TVA0V19UaW1lMzI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICBNNE1QNFdfU3RhdGUKLSAqIEBicmllZiAgICAgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGNvcmUgTVA0IHdyaXRlciBzdGF0ZXMKLSAqIEBub3RlICAgICAgICAgVGhlc2Ugc3RhdGVzIGFyZSB1c2VkIGludGVybmFseSwgYnV0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSBvdXRzaWRlCi0gKiAgICAgICAgICAgICAgIHRoZSB3cml0ZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TVA0V19vcGVuZWQgICAgICAgICAgICA9IDB4MTAwLAotICAgIE00TVA0V19yZWFkeSAgICAgICAgICAgICA9IDB4MjAwLAotICAgIE00TVA0V193cml0aW5nICAgICAgICAgICA9IDB4MzAwLAotICAgIE00TVA0V193cml0aW5nX3N0YXJ0QVUgICA9IDB4MzAxLAotICAgIE00TVA0V19jbG9zZWQgICAgICAgICAgICA9IDB4NDAwCi19IE00TVA0V19TdGF0ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgICBNNE1QNFdfT3B0aW9uSUQKLSAqIEBicmllZiAgICAgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGNvcmUgTVA0IHdyaXRlciBvcHRpb25zCi0gKiBAbm90ZSAgICAgICAgVGhlc2Ugb3B0aW9ucyBnaXZlIHBhcmFtZXRlcnMgZm9yIHRoZSBjb3JlIE1QNCB3cml0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNUDRXX21heEFVcGVyQ2h1bmsgICAgICAgID0gMHhDMTAxLAotICAgIE00TVA0V19tYXhDaHVua1NpemUgICAgICAgICA9IDB4QzEwMiwKLSAgICBNNE1QNFdfbWF4Q2h1bmtJbnRlciAgICAgICAgPSAweEMxMDMsCi0gICAgTTRNUDRXX3ByZVdyaXRlQ2FsbEJhY2sgICAgID0gMHhDMTA0LAotICAgIE00TVA0V19wb3N0V3JpdGVDYWxsQmFjayAgICA9IDB4QzEwNSwKLSAgICBNNE1QNFdfbWF4QVVzaXplICAgICAgICAgICAgPSAweEMxMDYsCi0gICAgTTRNUDRXX0lPRCAgICAgICAgICAgICAgICAgID0gMHhDMTExLAotICAgIE00TVA0V19FU0QgICAgICAgICAgICAgICAgICA9IDB4QzExMiwKLSAgICBNNE1QNFdfU0RQICAgICAgICAgICAgICAgICAgPSAweEMxMTMsCi0gICAgTTRNUDRXX3RyYWNrU2l6ZSAgICAgICAgICAgID0gMHhDMTE0LAotICAgIE00TVA0V19NT09WZmlyc3QgICAgICAgICAgICA9IDB4QzEyMSwKLSAgICBNNE1QNFdfVjJfTU9PRiAgICAgICAgICAgICAgPSAweEMxMzEsCi0gICAgTTRNUDRXX1YyX3RibENvbXByZXMgICAgICAgID0gMHhDMTMyLAotICAgIC8qd2FybmluZzogdW5zcGVjaWZpZWQgb3B0aW9uczoqLwotICAgIE00TVA0V19tYXhGaWxlU2l6ZSAgICAgICAgICA9IDB4QzE1MiwKLSAgICBNNE1QNFdfQ2FtY29kZXJWZXJzaW9uICAgICAgPSAweEMxNTMsIC8qMDAwIHRvIDk5OSAhKi8KLSAgICBNNE1QNFdfZXN0aW1hdGVBdWRpb1NpemUgICAgPSAweEMxNTQsIC8qYXVkaW8gQVVzIGFyZSBwcm9jZXNzZWQgYWZ0ZXIgdGhlIHZpZGVvLCAqLwotICAgIC8qdGhpcyBvcHRpb24gTVVTVCBOT1QgYmUgc2V0IGlmIG5vbiBjb25zdGFudCBhdWRpbwotICAgIGZyYW1lIHNpemUgKGUuZy4gaWYgU0lEKSovCi0gICAgTTRNUDRXX2VtYmVkZGVkU3RyaW5nICAgICAgID0gMHhDMTU1LAotICAgIE00TVA0V19pbnRlZ3JhdGlvblRhZyAgICAgICA9IDB4QzE1NiwKLSAgICBNNE1QNFdfbWF4RmlsZUR1cmF0aW9uICAgICAgPSAweEMxNTcsCi0gICAgTTRNUDRXX3NldEZ0eXBCb3ggICAgICAgICAgID0gMHhDMTU4LAotICAgIE00TVA0V19EU0kgICAgICAgICAgICAgICAgICA9IDB4QzE1OSwKLSAgICAvKiBILjI2NCB0cmltbWluZyAqLwotICAgIE00TVA0V19NVUxfUFBTX1NQUyAgICAgICAgICA9IDB4QzE2MCwKLSAgICAvKiBILjI2NCB0cmltbWluZyAqLwotfSBNNE1QNFdfT3B0aW9uSUQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQXVkaW8gJiB2aWRlbyBzdHJlYW0gSURzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgQXVkaW9TdHJlYW1JRCAxCi0jZGVmaW5lIFZpZGVvU3RyZWFtSUQgMgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIERlZmF1bHQgcGFyYW1ldGVycyB2YWx1ZXMsIHRoYXQgY2FuIGJlIG1vZGlmaWVkIGJ5IE00TVA0V19zZXRPcHRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBNNE1QNFdfRGVmYXVsdFdpZHRoIDMyMAotI2RlZmluZSBNNE1QNFdfRGVmYXVsdEhlaWdodCAyNDAKLSNkZWZpbmUgTTRNUDRXX0RlZmF1bHRNYXhBdVNpemUgIDQwOTYgLypieXRlcyovCi0jZGVmaW5lIE00TVA0V19EZWZhdWx0TWF4Q2h1bmtTaXplIDEwMDAwMCAvKmJ5dGVzKi8KLSNkZWZpbmUgTTRNUDRXX0RlZmF1bHRJbnRlcmxlYXZlRHVyIDAgLypieXRlcyovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRXX1N0cmVhbUlEc2l6ZQotICogQGJyaWVmICAgICAgICBWaWRlbyBwbGFuZSBzaXplCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQ7Ci0gICAgTTRPU0FfVUludDE2ICAgIGhlaWdodDsKLSAgICBNNE9TQV9VSW50MTYgICAgd2lkdGg7Ci19IE00TVA0V19TdHJlYW1JRHNpemU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0V19UcmFja0RhdGEKLSAqIEBicmllZiAgICAgICBJbnRlcm5hbCBjb3JlIE1QNCB3cml0ZXIgdHJhY2sgc3RydWN0dXJlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRTWVNfU3RyZWFtVHlwZSAgICB0cmFja1R5cGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICB0aW1lc2NhbGU7ICAgICAgICAgIC8qIFQgKHZpZGVvPTEwMDApLCAoQU1SOD04MDAwKSwgKEFNUjE2PTE2MDAwKSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBzYW1wbGVTaXplOyAgICAgICAgIC8qIFMgKHZpZGVvPTApKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIHN0dHNUYWJsZUVudHJ5TmI7ICAgLyogSiAoYXVkaW89MSkqLwotICAgIE00TVA0V19UaW1lMzIgICAgICAgIGxhc3RDVFM7ICAgICAgICAgICAvKiBDVFMgb2YgdGhlIHByZXZpb3VzIEFVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0IHRvIDAuR2l2ZXMgZHVyYXRpb24gYXQgdGhlIGVuZC4qLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgc2FtcGxlTmI7ICAgICAgICAgICAvKiBLIChhdWRpbz1GKSovCi19IE00TVA0V19UcmFja0RhdGE7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00TVA0V19BdWRpb1RyYWNrRGF0YQotICogQGJyaWVmICAgICAgIEludGVybmFsIGNvcmUgTVA0IHdyaXRlciBhdWRpbyBzcGVjaWZpYyBzdHJ1Y3R1cmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE1QNFdfU3RhdGUgICAgICAgICAgICBtaWNyb1N0YXRlOwotICAgIE00TVA0V19UcmFja0RhdGEgICAgICAgIENvbW1vbkRhdGE7Ci0gICAgTTRPU0FfVUNoYXIqKiAgICAgICAgICAgQ2h1bms7Ci0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtTaXplVGFibGU7Ci0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGU7Ci0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZTsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGN1cnJlbnRDaHVuazsgICAgICAgLyogSW5pdCB0byAwKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBjdXJyZW50UG9zOyAgICAgICAgIC8qIEluaXQgdG8gMCAqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudFN0c2M7ICAgICAgICAvKiBJbml0IHRvIDAgKi8KLSNlbmRpZgotICAgIE00TVA0V19UaW1lMzIgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uOyAgICAgLyogQ2hlY2sgKEFNUjg9MTYwKSwgKEFNUjE2PTMyMCkqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIE1heENodW5rU2l6ZTsgICAgICAgLyogSW5pdCB0byBNNE1QNFdfTXA0RmlsZURhdGEuTWF4Q2h1bmtTaXplKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBNYXhBVVNpemU7ICAgICAgICAgIC8qIEluaXQgdG8gTTRNUDRXX01wNEZpbGVEYXRhLk1heEFVU2l6ZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTGFzdEFsbG9jYXRlZENodW5rOwotICAgIC8qIHByZXZpb3VzbHksIGF1ZGlvIGF1IHNpemUgd2FzIHN1cHBvc2VkIGNvbnN0YW50LAotICAgICAqIHdoaWNoIGlzIGFjdHVhbGx5IG5vdCB0aGUgY2FzZSBpZiBzaWxlbmNlcyAoc2lkKS4qLwotICAgIC8qIGF0IGZpcnN0IGF1ZGlvIGF1LCBzYW1wbGVTaXplIGlzIHNldC4gSXQgaXMgbGF0ZXIgcmVzZXQgdG8gMCBpZiBub24gY29uc3RhbnQgc2l6ZS4qLwotICAgIC8qIFNvIHNhbXBsZVNpemUgc2hvdWxkIGJlIHRlc3RlZCB0byBrbm93IHdlaXRoZXIgb3Igbm90IHRoZXJlIGlzIGEgVEFCTEVfU1RTWi4gKi8KLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFNaOyAvKiB0YWJsZSBzaXplIGlzIDRLKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrczsKLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFRTOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1heEJpdHJhdGU7ICAgICAvKm5vdCB1c2VkIGluIGFtciBjYXNlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBhdmdCaXRyYXRlOyAgICAgLypub3QgdXNlZCBpbiBhbXIgY2FzZSovCi0gICAgTTRPU0FfVUNoYXIqICAgICAgICAgICAgRFNJOyAgICAgICAgICAgIC8qIERlY29kZXIgU3BlY2lmaWMgSW5mbzogTWF5IGJlIE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHRlZCkgZm9yIEFNUiAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgIGRzaVNpemU7ICAgICAgICAvKiBEU0kgc2l6ZSwgYWx3YXlzIDkgYnl0ZXMgZm9yIEFNUiAqLwotfSBNNE1QNFdfQXVkaW9UcmFja0RhdGE7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRNUDRXX1ZpZGVvVHJhY2tEYXRhCi0gKiBAYnJpZWYgICAgICAgIEludGVybmFsIGNvcmUgTVA0IHdyaXRlciB2aWRlbyBzcGVjaWZpYyBzdHJ1Y3R1cmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE1QNFdfU3RhdGUgICAgICAgICAgICBtaWNyb1N0YXRlOwotICAgIE00TVA0V19UcmFja0RhdGEgICAgICAgIENvbW1vbkRhdGE7Ci0gICAgTTRPU0FfVUNoYXIqKiAgICAgICAgICAgQ2h1bms7Ci0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgY2h1bmtTaXplVGFibGU7Ci0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rT2Zmc2V0VGFibGU7Ci0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZTsKLSAgICBNNE1QNFdfVGltZTMyKiAgICAgICAgICBjaHVua1RpbWVNc1RhYmxlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGN1cnJlbnRDaHVuazsgICAgICAgICAgICAvKiBJbml0IHRvIDAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGN1cnJlbnRQb3MgOyAgICAgICAgICAgICAvKiBJbml0IHRvIDAqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgY3VycmVudFN0c2M7ICAgICAgICAgICAgIC8qIEluaXQgdG8gMCovCi0jZW5kaWYKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBzdHNzVGFibGVFbnRyeU5iIDsgICAgICAgLyogTiovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgd2lkdGg7ICAgICAgICAgICAgICAgICAgIC8qIFgqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgIGhlaWdodDsgICAgICAgICAgICAgICAgICAvKiBZKi8KLSAgICBNNE9TQV9VSW50MzIqICAgICAgICAgICBUQUJMRV9TVFRTOyAgICAgICAgICAgICAgLyogdGFibGUgc2l6ZSBpcyBKKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3R0c0Jsb2NrczsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotICAgIE00T1NBX1VJbnQxNiogICAgICAgICAgIFRBQkxFX1NUU1o7ICAgICAgICAgICAgICAvKiB0YWJsZSBzaXplIGlzIDJLKi8KLSNlbHNlCi0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgVEFCTEVfU1RTWjsgICAgICAgICAgICAgIC8qIHRhYmxlIHNpemUgaXMgNEsqLwotI2VuZGlmCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3pCbG9ja3M7Ci0gICAgTTRPU0FfVUludDMyKiAgICAgICAgICAgVEFCTEVfU1RTUzsgICAgICAgICAgICAgIC8qIHRhYmxlIHNpemUgaXMgTiovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3NCbG9ja3M7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBNYXhBVXBlckNodW5rOyAgICAgICAgICAgLypJbml0IHRvIDAsIGkuZS4gbm90IHVzZWQqLwotI2VuZGlmCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgTWF4Q2h1bmtTaXplOyAgICAgICAgICAgIC8qSW5pdCB0byBNNE1QNFdfTXA0RmlsZURhdGEuTWF4Q2h1bmtTaXplKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBNYXhBVVNpemU7ICAgICAgICAgICAgICAgLypJbml0IHRvIE00TVA0V19NcDRGaWxlRGF0YS5NYXhBVVNpemUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIExhc3RBbGxvY2F0ZWRDaHVuazsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtYXhCaXRyYXRlOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGF2Z0JpdHJhdGU7Ci0gICAgTTRPU0FfVUNoYXIqICAgICAgICAgICAgRFNJOyAgICAgICAgICAgIC8qIERlY29kZXIgU3BlY2lmaWMgSW5mbzogTWF5IGJlIE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHRlZCkgZm9yIEgyNjMqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgIGRzaVNpemU7ICAgICAgICAvKiBEU0kgc2l6ZSwgYWx3YXlzIDcgYnl0ZXMgZm9yIEgyNjMgKi8KLX0gTTRNUDRXX1ZpZGVvVHJhY2tEYXRhOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1QNFdfTXA0RmlsZURhdGEKLSAqIEBicmllZiAgICAgICBJbnRlcm5hbCBjb3JlIE1QNCB3cml0ZXIgcHJpdmF0ZSBjb250ZXh0IHN0cnVjdHVyZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00TVA0V19TdGF0ZSAgICAgICAgICAgICAgICAgIHN0YXRlOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgIHVybDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBkdXJhdGlvbjsgICAgLyogRCBpbiBtcywgbWF4IGR1cmF0aW9uIG9mIGF1ZGlvJnZpZGVvKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBmaWxlc2l6ZTsgICAgLyogYWN0dWFsIGZpbGVzaXplIGluIGJ5dGVzKi8KLSAgICBNNE1QNFdfQXVkaW9UcmFja0RhdGEqICAgICAgICBhdWRpb1RyYWNrUHRyOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGhhc0F1ZGlvOwotICAgIE00TVA0V19WaWRlb1RyYWNrRGF0YSogICAgICAgIHZpZGVvVHJhY2tQdHI7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgaGFzVmlkZW87Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgTWF4Q2h1bmtTaXplOyAgICAgICAvKiBJbml0IHRvIDEwMDAwMCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgTWF4QVVTaXplOyAgICAgICAgICAvKiBJbml0IHRvIDQwOTYqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIE1heEZpbGVTaXplOyAgICAgICAgLyogSW5pdCB0byAwLCBpLmUuIG5vdCB1c2VkKi8KLSAgICBNNE1QNFdfVGltZTMyICAgICAgICAgICAgICAgICBJbnRlcmxlYXZlRHVyOyAgICAgIC8qIEluaXQgdG8gMCwgaS5lLiBub3QgdXNlZCwgbXMqLwotICAgIC8qIE00TVA0V19Xcml0ZUNhbGxCYWNrICAgICAgICAgICAgUHJlV3JpdGVDYWxsQmFjazsqLyAgICAvKkluaXQgdG8gTTRPU0FfTlVMTCovCi0gICAgLyogTTRNUDRXX1dyaXRlQ2FsbEJhY2sgICAgICAgICAgICBQb3N0V3JpdGVDYWxsQmFjazsqLyAvKkluaXQgdG8gTTRPU0FfTlVMTCovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgZmlsZVdyaXRlckZ1bmN0aW9uczsKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBmaWxlUmVhZGVyRnVuY3Rpb25zOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGNhbWNvZGVyVmVyc2lvbjsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZUF1ZGlvU2l6ZTsgIC8qIGRlZmF1bHQgaXMgZmFsc2UqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgIGF1ZGlvTXNDaHVua0R1cjsgICAgLyogaW4gbXMsIHNldCBvbmx5IGlmIGVzdGltYXRlQXVkaW9TaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0cnVlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBhdWRpb01zU3RvcFRpbWU7ICAgIC8qIHRpbWUgdG8gc3RvcCBhdWRpbywgc2V0IG9ubHkgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlQXVkaW9TaXplIGlzIHRydWUqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0OwotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUN1cnJlbnRQb3M7IC8qIG5ldyBmaWVsZCBmb3Igb2Zmc2V0IHVwZGF0ZSovCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotICAgIE00T1NBX1VDaGFyKiAgICAgICAgICAgICAgICAgIGVtYmVkZGVkU3RyaW5nOyAgICAgLyogMTYgYnl0ZXMgc3RyaW5nLCBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZW4gaWYgTlVMTCovCi0gICAgTTRPU0FfVUNoYXIqICAgICAgICAgICAgICAgICAgaW50ZWdyYXRpb25UYWc7ICAgICAvKiA2MCBieXRlcyBzdHJpbmcsIG1lbXNldCB0byAwIGlmIE5VTEwgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICBNYXhGaWxlRHVyYXRpb247ICAgIC8qIEluaXQgdG8gMCwgaS5lLiBub3QgdXNlZCovCi0gICAgTTRNUDRDX0Z0eXBCb3ggICAgICAgICAgICAgICAgZnR5cDsgICAgICAgICAgICAgICAvKiBmdHlwIGF0b20sIGlmIG5vdCBkZWZpbmVkIHNldCBtYWpvcl9icmFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCB3aWxsIHVzZSBkZWZhdWx0IGJveCAqLwotI2lmZGVmIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgIHNhZmV0eUZpbGVVcmw7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuU2FmZXR5RmlsZTsKLSNlbmRpZiAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1VTFBQU1NQUzsKLX0gTTRNUDRXX01wNEZpbGVEYXRhOwotCi0jZW5kaWYgLyogX000TVA0V19VU0VfQ1NUX01FTU9SWV9XUklURVIgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qTTRNUDRXX1RZUEVTX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfVXRpbHMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19VdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYmU3YWJiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19VdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TVA0V19VdGlscy5oCi0gKiBAYnJpZWYgICBVdGlsaXRpZXMgYW5kIHByaXZhdGUgZnVuY3Rpb25zIGRlY2xhcmF0aW9uIGZvciB0aGUgTVA0IHdyaXRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgTTRNUDRXX1VUSUxTX0gKLSNkZWZpbmUgTTRNUDRXX1VUSUxTX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZuZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0KLS8qIGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBVdGlsaXR5IGZ1bmN0aW9ucyB0byB3cml0ZSBkYXRhIGluIGJpZyBlbmRpYW4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19wdXRCeXRlKE00T1NBX1VDaGFyIGMsICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLU00T1NBX0VSUiBNNE1QNFdfcHV0QkUxNihNNE9TQV9VSW50MzIgdmFsLCBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMjQoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotTTRPU0FfRVJSIE00TVA0V19wdXRCRTMyKE00T1NBX1VJbnQzMiB2YWwsIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBXcml0ZSBhIGJ1bGsgb2YgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgZmlsZSwgc2l6ZSBpcyBnaXZlbiBpbiBieXRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJsb2NrKGNvbnN0IE00T1NBX1VDaGFyKiBCbG9jaywgTTRPU0FfVUludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29udmVydCB0aGUgJ25iJyB1bnNpZ25lZCBpbnRlZ2VycyBpbiAndGFiJyB0YWJsZSBmcm9tIExFIGludG8gQkUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdm9pZCBNNE1QNFdfdGFibGUzMlRvQkUoTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQzMiBuYik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29udmVydCBhbiB1bnNpZ25lZCAzMiBiaXRzIGludGVnZXIgZnJvbSBMRSBpbnRvIEJFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXZvaWQgTTRNUDRXX2NvbnZlcnRJbnQzMkJFKE00T1NBX1VJbnQzMiogdmFsUHRyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSZS1hbGxvY2F0aW9uIGZ1bmN0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXZvaWQqIE00TVA0V19yZWFsbG9jKE00T1NBX01lbUFkZHIzMiBwdHIsIE00T1NBX1VJbnQzMiBvbGRTaXplLCBNNE9TQV9VSW50MzIgbmV3U2l6ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRGUtYWxsb2NhdGUgdGhlIGNvbnRleHQKLSAqIFRoaXMgbWV0aG9kIGlzIG5vIGxvbmdlciBpbiB0aGUgd3JpdGVyIGV4dGVybmFsIGludGVyZmFjZSwgYnV0IGlzIGNhbGxlZCBmcm9tCi0gKiB0aGUgZnVuY3Rpb24gTTRNUDRXX2Nsb3NlV3JpdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19mcmVlQ29udGV4dChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQdXQgSGkgYW5kIExvIHUxNiBwYXJ0IGluIGEgdTMyIHZhcmlhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX1ZvaWQgTTRNUDRXX3B1dDMyX0hpKE00T1NBX1VJbnQzMiogdGFiLCBNNE9TQV9VSW50MTYgSGkpOwotTTRPU0FfVm9pZCBNNE1QNFdfcHV0MzJfTG8oTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQxNiBMbyk7Ci1NNE9TQV9VSW50MTYgTTRNUDRXX2dldDMyX0hpKE00T1NBX1VJbnQzMiogdGFiKTsKLU00T1NBX1VJbnQxNiBNNE1QNFdfZ2V0MzJfTG8oTTRPU0FfVUludDMyKiB0YWIpOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUiAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypNNE1QNFdfVVRJTFNfSCovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19Xcml0ZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvaW5jL000TVA0V19Xcml0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjczYTIyMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYy9NNE1QNFdfV3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX1dyaXRlci5oCi0gKiBAYnJpZWYgICBDb3JlIE1QNCB3cml0ZXIgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1QNCB3cml0ZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucy4KLSAqICAgICAgICAgIFRoZSBNUDQgd3JpdGVyIHNwZWNpZmljIHR5cGVzIGFyZSBkZWZpbmVkIGluIGZpbGUgTTRNUDRXX1R5cGVzLmgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2lmbmRlZiBNNE1QNFdfV1JJVEVSX0gKLSNkZWZpbmUgTTRNUDRXX1dSSVRFUl9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2lmbmRlZiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUgotCi0vKiBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00U1lTX0FjY2Vzc1VuaXQuaCIKLSNpbmNsdWRlICJNNE1QNFdfVHlwZXMuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNUDRXIEVycm9ycyAmIFdhcm5pbmdzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2RlZmluZSBNNFdBUl9NUDRXX09WRVJTSVpFICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9XQVIsIE00TVA0X1dSSVRFUiAsMHgwMDAwMDEpCi0jZGVmaW5lIE00V0FSX01QNFdfTk9UX0VWQUxVQUJMRSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRNUDRfV1JJVEVSICwweDAwMDAwMikKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IE1QNFcgdmVyc2lvbgotICogQHBhcmFtICAgIG1ham9yICAgICAgICAgICAgKE9VVCkgUG9pbnRlciB0byB0aGUgJ21ham9yJyB2ZXJzaW9uIG51bWJlci4KLSAqIEBwYXJhbSAgICBtaW5vciAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gdGhlICdtaW5vcicgdmVyc2lvbiBudW1iZXIuCi0gKiBAcGFyYW0gICAgcmV2aXNpb24gICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHRoZSAncmV2aXNpb24nIG51bWJlci4KLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19nZXRWZXJzaW9uKE00T1NBX1VJbnQ4KiBtYWpvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogbWlub3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHJldmlzaW9uKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgSW5pdGlhdGlvbiBvZiB0aGUgTVA0IGZpbGUgY3JlYXRpb24KLSAqIEBwYXJhbSAgICBjb250ZXh0UHRyICAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgdG8gdGhlIE1QNCB3cml0ZXIgY29udGV4dCB0byBjcmVhdGUuCi0gKiBAcGFyYW0gICAgb3V0cHV0RmlsZURlc2NyaXB0b3IgICAoSU4pICBEZXNjcmlwdG9yIG9mIHRoZSBvdXRwdXQgZmlsZSB0byBvcGVuLgotICogQHBhcmFtICAgIGZpbGVXcml0ZXJGdW5jdGlvbiAgICAgKElOKSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgc2V0IG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMuCi0gKiBAcGFyYW0gICAgdGVtcEZpbGVEZXNjcmlwdG9yICAgICAoSU4pICBEZXNjcmlwdG9yIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSB0byBvcGVuLgotICogQHBhcmFtICAgIGZpbGVSZWFkZXJGdW5jdGlvbiAgICAgKElOKSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgc2V0IG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19vcGVuV3JpdGUoIE00T1NBX0NvbnRleHQqICAgICAgICAgICAgICAgICAgY29udGV4dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgICAgICAgZmlsZVdyaXRlckZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgICAgZmlsZVJlYWRlckZ1bmN0aW9uICk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEFkZCBhIG5ldyB0cmFjawotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgIChJTi9PVVQpICBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgc3RyZWFtRGVzY1B0ciAgICAgICAgKElOKSAgICAgIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGZvciB0aGUgbmV3IHRyYWNrLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIEludmFsaWQgc3RhdGUKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQ6ICBBbiBhdWRpbyAocmVzcC52aWRlbykgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGlzIGNvbnRleHQgd2hpbGUgYXR0ZW1wdGluZyB0byBhZGQgYW5vdGhlciBvbmUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgZm9yYmlkZGVuLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX2FkZFN0cmVhbSggTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiAgICAgc3RyZWFtRGVzY1B0cik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgU2lnbmFsIHRvIHRoZSBjb3JlIE1QNCB3cml0ZXIgdGhhdCB0aGVyZSBpcyBubyBtb3JlIHRyYWNrcyB0byBhZGQKLSAqIEBwYXJhbSAgIGNvbnRleHQgICAgICAgICAgICAgKElOL09VVCkgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBJbnZhbGlkIHN0YXRlCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfQ09OVEVYVDogIEF1ZGlvIHNpemUgZXN0aW1hdGlvbiBpcyByZXF1aXJlZCBidXQgbm90IHR3byBzdHJlYW1zCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYmVlbiBhZGRlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19zdGFydFdyaXRpbmcoIE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgQXNrcyB0aGUgY29yZSBNUDQgd3JpdGVyIHRvIGluaXRpYXRlIHRoZSBhY2Nlc3MgdW5pdCBjcmVhdGlvbiBpbgotICogICAgICAgICAgdGhlIHN0cmVhbUlEIHRyYWNrCi0gKiBAcGFyYW0gICBjb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgIHN0cmVhbUlEICAgICAgICAgICAgKElOKSBTdHJlYW0gSUQgb2YgdGhlIHRyYWNrLgotICogQHBhcmFtICAgYXVQdHIgICAgICAgICAgICAgICAoSU4vT1VUKSBBY2Nlc3MgdW5pdC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRDpVbmtub3duIHN0cmVhbSBJRAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIEludmFsaWQgc3RhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19zdGFydEFVKCBNNE9TQV9Db250ZXh0ICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1JRCAgICAgICBzdHJlYW1JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogICAgYXVQdHIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEFzayB0aGUgY29yZSBNUDQgd3JpdGVyIHRvIHdyaXRlIHRoZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtSUQgdHJhY2sKLSAqIEBub3RlICAgIElmIE00TVA0V19XQVJfT1ZFUlNJWkUgaXMgcmV0dXJuZWQsIE00TVA0V19zdGFydEFVIG11c3Qgbm90IGJlIGNhbGxlZCBhbnltb3JlLAotICogICAgICAgICAgYnV0IGRpcmVjdGx5IE00TVA0V19jbG9zZVdyaXRlKCkuCi0gKiBAcGFyYW0gICBjb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpICAgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgc3RyZWFtSUQgICAgICAgICAgICAoSU4pICAgICAgIFN0cmVhbSBJRCBvZiB0aGUgdHJhY2suCi0gKiBAcGFyYW0gICBhdVB0ciAgICAgICAgICAgICAgIChJTi9PVVQpICAgQWNjZXNzIHVuaXQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOiAgICAgICAgVW5rbm93biBzdHJlYW0gSUQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgICAgICAgICAgSW52YWxpZCBzdGF0ZQotICogQHJldHVybiAgICBNNFdBUl9NUDRXX05PVF9FVkFMVUFCTEU6ICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGV2YWx1YXRlIGF1ZGlvIHNpemUgaWYgYXVkaW8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgZG9uJ3QgaGF2ZSBhIGNvbnN0YW50IHNpemUuCi0gKiBAcmV0dXJuICAgIE00V0FSX01QNFdfT1ZFUlNJWkU6ICAgICAgICBNYXggZmlsZSBzaXplIHdhcyByZWFjaGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfcHJvY2Vzc0FVKCBNNE9TQV9Db250ZXh0ICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEICAgICAgIHN0cmVhbUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgIGF1UHRyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgIENsb3NlIHRoZSBNUDQgZmlsZQotICogQG5vdGUgICAgICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgTVA0IHdyaXRlciwgdGhlIE00TVA0V19mcmVlQ29udGV4dCBtZXRob2QKLSAqICAgICAgICAgICAgd2FzIGluIHRoZSBpbnRlcmZhY2UsIHdoaWNoIGlzIG5vdCB0aGUgY2FzZSBhbnltb3JlLgotICogICAgICAgICAgICBUaGUgY29udGV4dCBpcyBub3cgYWx3YXlzIGRlYWxsb2NhdGVkIGluIHRoZSBNNE1QNFdfY2xvc2VXcml0ZSBmdW5jdGlvbi4KLSAqIEBwYXJhbSAgICAgY29udGV4dCAgICAgICAgICAgICAoSU4vT1VUKSBNUDQgd3JpdGVyIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwgb3IgaW5jb3JyZWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1QNFdfY2xvc2VXcml0ZSggTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQXNrIHRoZSBjb3JlIE1QNCB3cml0ZXIgdG8gcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wdGlvbklECi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4pICAgIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBvcHRpb24gICAgICAgICAgICAgICAgIChJTikgICAgT3B0aW9uIElELgotICogQHBhcmFtICAgIHZhbHVlUHRyICAgICAgICAgICAgICAgKE9VVCkgICBQb2ludGVyIHRvIHRoZSBvcHRpb24gdmFsdWUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqIEByZXR1cm4gICAgTTRFUlJfTk9UX0lNUExFTUVOVEVEOiAgTm90IGltcGxlbWVudGVkIGluIHRoZSBjdXJyZW50IHZlcnNpb24KLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRDogICAgVW5rbm93biBvcHRpb25JRAotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOiAgICBCYWQgc3RyZWFtIElEIGluIHRoZSBvcHRpb24gdmFsdWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19nZXRPcHRpb24oIE00T1NBX0NvbnRleHQgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgICAgICAgIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICAgICp2YWx1ZVB0cik7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEFzayB0aGUgY29yZSBNUDQgd3JpdGVyIHRvIHNldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcHRpb25JRC4KLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAoSU4vT1VUKSAgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIG9wdGlvbiAgICAgICAgICAgICAgIChJTikgICAgICBPcHRpb24gSUQuCi0gKiBAcGFyYW0gICAgdmFsdWUgICAgICAgICAgICAgICAgKElOKSAgICAgIE9wdGlvbiB2YWx1ZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBudWxsIG9yIGluY29ycmVjdAotICogQHJldHVybiAgICBNNEVSUl9OT1RfSU1QTEVNRU5URUQ6ICBOb3QgaW1wbGVtZW50ZWQgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbgotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiAgICBVbmtub3duIG9wdGlvbklECi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6ICAgIEJhZCBzdHJlYW0gSUQgaW4gdGhlIG9wdGlvbiB2YWx1ZQotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgICAgICBBIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNUDRXX3NldE9wdGlvbiggTTRPU0FfQ29udGV4dCAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX09wdGlvbklEICAgICAgb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gICAgdmFsdWUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBBc2sgdGhlIGNvcmUgTVA0IHdyaXRlciB0byByZXR1cm4gaXRzIHN0YXRlLgotICogQG5vdGUgICAgIEJ5IHNlbGVjdGluZyBhIHNwZWNpZmljIHN0cmVhbUlEIChub3QgbnVsbCksIHRoZSBjYWxsZXIgY2FuIG9idGFpbgotICogICAgICAgICAgIHRoZSBzdGF0ZSBvZiBhIHNwZWNpZmljIHN0cmVhbS4gQnkgdXNpbmcgMCBhcyBzdHJlYW1JRCB0aGUgcmV0dXJuZWQKLSAqICAgICAgICAgICBzdGF0ZSBpcyBub3Qgc3RyZWFtIHNwZWNpZmljLgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgICAgKElOL09VVCkgTVA0IHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAgICAgKElOKSAgICAgUG9pbnRlciB0byB0aGUgc3RhdGUgZW51bWVyYXRpb24uCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBzdHJlYW1JRCBvZiB0aGUgc3RyZWFtIHRvIHJldHJpZXZlIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm8tc3RhdGUgKDAgZm9yIGdsb2JhbCBzdGF0ZSkuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ6ICAgIFVua25vd24gc3RyZWFtIElECi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbnVsbCBvciBpbmNvcnJlY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19nZXRTdGF0ZSggTTRPU0FfQ29udGV4dCAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRXX1N0YXRlKiAgICBzdGF0ZVB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEICAgc3RyZWFtSUQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgdGhlIGN1cnJlbnRseSBleHBlY3RlZCBmaWxlIHNpemUKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgIChJTi9PVVQpIE1QNCB3cml0ZXIgY29udGV4dC4KLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TVA0V19nZXRDdXJyZW50RmlsZVNpemUoIE00T1NBX0NvbnRleHQgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiAgICAgICAgY3VycmVudEZpbGVTaXplKTsKLQotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQotI2VuZGlmIC8qTTRNUDRXX1dSSVRFUl9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhYjMyYmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIGxpYjNncHdyaXRlcgotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFOj0gbGlidmlkZW9lZGl0b3JfM2dwd3JpdGVyCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgIFwKLSAgICAgIE00TVA0V19JbnRlcmZhY2UuYyBcCi0gICAgICBNNE1QNFdfVXRpbHMuYyBcCi0gICAgICBNNE1QNFdfV3JpdGVyLmMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgICBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL29zYWwvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgLUREVVBMSUNBVEVfU1RUU19JTl9MQVNUX0FVCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX0ludGVyZmFjZS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX0ludGVyZmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMmM1MjUwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL000TVA0V19JbnRlcmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDkxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE1QNFdfSW50ZXJmYWNlLmMKLSAqIEBicmllZiAgICAzR1BQIGZpbGUgd3JpdGVyIGludGVyZmFjZQotICogQG5vdGUgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBjb21tb24gaW50ZXJmYWNlIGRlZmluZWQKLSAqICAgICAgICAgIGluICJNNFdSSVRFUl9jb21tb24uaCIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0vKioKLSAqIE9TQUwgaW5jbHVkZXMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIiAgICAgICAgICAgIC8qKjwgT1NBTCBiYXNpYyB0eXBlcyBkZWZpbml0b24gKi8KLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiICAgICAgICAvKio8IEluY2x1ZGUgZm9yIE9TQUwgZmlsZSBhY2Nlc3NlcyBpbXBsZW1lbnRhdGlvbiAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgT1NBTCBtZW1vcnkgYWNjZXNzZXMgaW1wbGVtZW50YXRpb24gKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgICAgICAgICAgIC8qKjwgT1NBTCBkZWJ1ZyB0b29scyAqLwotCi0vKioKLSAqIFdyaXRlciBpbmNsdWRlcyAqLwotI2luY2x1ZGUgIk00V1JJVEVSX2NvbW1vbi5oIiAgICAgICAgLyoqPCBEZWZpbml0aW9uIG9mIHRoZSB3cml0ZXIgY29tbW9uIGludGVyZmFjZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1vZHVsZSBmb2xsb3dzICovCi0KLSNpZmRlZiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUgotI2luY2x1ZGUgIk00TVA0V19UeXBlc19Dc3RNZW0uaCIgICAgLyoqPCBNUDQvM0dQIGNvcmUgd3JpdGVyIHR5cGVzICovCi0jaW5jbHVkZSAiTTRNUDRXX1dyaXRlcl9Dc3RNZW0uaCIgICAgLyoqPCBNUDQvM0dQIGNvcmUgd3JpdGVyIGZ1bmN0aW9ucyAqLwotI2Vsc2UKLSNpbmNsdWRlICJNNE1QNFdfVHlwZXMuaCIgICAgICAgICAgICAvKio8IE1QNC8zR1AgY29yZSB3cml0ZXIgdHlwZXMgKi8KLSNpbmNsdWRlICJNNE1QNFdfV3JpdGVyLmgiICAgICAgICAgICAgLyoqPCBNUDQvM0dQIGNvcmUgd3JpdGVyIGZ1bmN0aW9ucyAqLwotI2VuZGlmIC8qIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSICovCi0KLS8qKgotICogU3BlY2lmaWMgZXJyb3JzIGZvciB0aGlzIG1vZHVsZSAqLwotI2RlZmluZSBNNFdSSVRFUl8zR1BfRVJSX1VOU1VQUE9SVEVEX1NUUkVBTV9UWVBFIFwKLSAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRXUklURVJfM0dQLCAweDAwMDAwMSkKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHdyaXRlciBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCB3cml0ZXIgY2FsbHMgdG8gc3RvcmUgdGhlIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0NvbnRleHQgICAgcE1QNENvbnRleHQ7ICAgIC8qKjwgTVA0IHdyaXRlciBjb250ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgIG1heEFVc2l6ZXM7ICAgICAgICAvKio8IHRoZSBtYXhpbXVtIEFVIHNpemUgcG9zc2libGUgKi8KLX0gTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dDsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX29wZW5Xcml0ZShNNFdSSVRFUl9Db250ZXh0KiBwQ29udGV4dCwgdm9pZCogcFdoYXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVyUG9pbnRlcikKLSAqIEBicmllZiAgICBPcGVuIGEgd3JpdGVyIHNlc3Npb24uCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgKE9VVCkgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIDNHUCB3cml0ZXIsIGFsbG9jYXRlZCBieSB0aGlzIGZ1bmN0aW9uLgotICogQHBhcmFtICAgIG91dHB1dEZpbGVEZXNjcmlwdG9yIChJTikgIERlc2NyaXB0b3Igb2YgdGhlIG91dHB1dCBmaWxlIHRvIGNyZWF0ZS4KLSAqIEBwYXJhbSAgICBmaWxlV3JpdGVyRnVuY3Rpb24gICAgIChJTikgIFBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHNldCBvZiBPU0FMCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgd3JpdGUgZnVuY3Rpb25zLgotICogQHBhcmFtICAgIHRlbXBGaWxlRGVzY3JpcHRvciAgICAgKElOKSAgRGVzY3JpcHRvciBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUgdG8gb3BlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5VTEwgaWYgbm90IHVzZWQpCi0gKiBAcGFyYW0gICAgZmlsZVJlYWRlckZ1bmN0aW9uICAgICAoSU4pICBQb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBzZXQgb2YgT1NBTCBmaWxlIHJlYWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMgKE5VTEwgaWYgbm90IHVzZWQpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogdGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEZpbGVQdHJGY3QgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgb3BlbldyaXRlIChJdHMgY29yZUlEIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX29wZW5Xcml0ZSggTTRXUklURVJfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0cHV0RmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVyUG9pbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB0ZW1wRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRlclBvaW50ZXIgKQotewotICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqIGFwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIk00V1JJVEVSXzNHUF9vcGVuV3JpdGUiKTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1Bfb3BlbldyaXRlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlV3JpdGVyUG9pbnRlciksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6IHBGaWxlV3JpdGVyUG9pbnRlciBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBjb250ZXh0ICovCi0gICAgKnBDb250ZXh0PU00T1NBX05VTEw7Ci0gICAgYXBDb250ZXh0ID0gKE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl8zR1AsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQiKTsKLQotICAgIGlmIChNNE9TQV9OVUxMID09IGFwQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFdSSVRFUl8zR1Bfb3BlbldyaXRlOlwKLSAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgY29udGV4dCwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIFJlc2V0IGNvbnRleHQgdmFyaWFibGVzICovCi0gICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgYXBDb250ZXh0LT5tYXhBVXNpemVzID0gMDsKLQotICAgIC8qKgotICAgICAqICAgIFJldHVybiB0aGUgd3JpdGVyIGNvbnRleHQgKi8KLSAgICAqcENvbnRleHQgPSAoTTRXUklURVJfQ29udGV4dCAqKWFwQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqICAgIExhdW5jaCB0aGUgb3BlbldyaXRlIG9mIHRoZSBNUDQgd3JpdGVyICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6IGNhbGxpbmcgTTRNUDRXX29wZW5Xcml0ZSgpIik7Ci0KLSAgICBlcnIgPSBNNE1QNFdfb3BlbldyaXRlKCZhcENvbnRleHQtPnBNUDRDb250ZXh0LCBvdXRwdXRGaWxlRGVzY3JpcHRvciwKLSAgICAgICAgICAgIHBGaWxlV3JpdGVyUG9pbnRlciwgdGVtcEZpbGVEZXNjcmlwdG9yLCBwRmlsZVJlYWRlclBvaW50ZXIgKTsKLQotICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1Bfb3BlbldyaXRlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfb3BlbldyaXRlIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00V1JJVEVSXzNHUF9vcGVuV3JpdGU6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9zdGFydFdyaXRpbmcoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICBJbmRpY2F0ZXMgdG8gdGhlIHdyaXRlciB0aGF0IHRoZSBzZXR1cCBzZXNzaW9uIGlzIGVuZGVkIGFuZCB0aGF0Ci0gKiAgICAgICAgICB3ZSB3aWxsIHN0YXJ0IHRvIHdyaXRlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgcENvbnRleHQ6ICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBzdGFydFdyaXRpbmcgKEl0cwotICogICAgICAgICAgICBjb3JlSUQgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfc3RhcnRXcml0aW5nKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9zdGFydFdyaXRpbmc6IHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZzogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2FsbCB0aGUgTVA0IGNvcmUgd3JpdGVyICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9zdGFydFdyaXRpbmc6IGNhbGxpbmcgTTRNUDRXX3N0YXJ0V3JpdGluZygpIik7Ci0gICAgZXJyID0gTTRNUDRXX3N0YXJ0V3JpdGluZyhhcENvbnRleHQtPnBNUDRDb250ZXh0KTsKLSAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3N0YXJ0V3JpdGluZyByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNFdSSVRFUl8zR1Bfc3RhcnRXcml0aW5nOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX2FkZFN0cmVhbSgKLSAqICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LAotICogICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uICpwU3RyZWFtRGVzY3JpcHRpb24pCi0gKiBAYnJpZWYgICAgIEFkZCBhIHN0cmVhbSAoYXVkaW8gb3IgdmlkZW8pLgotICogQG5vdGUgICAgICBEZWNvZGVyIHNwZWNpZmljIGluZm8gcHJvcGVydGllcyBhcmUgY29ycmVjdGx5IHNldCBiZWZvcmUgY2FsbGluZwotICogICAgICAgICAgICB0aGUgY29yZSB3cml0ZXIgYWRkIGZ1bmN0aW9uCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIDNHUCB3cml0ZXIsCi0gKiBAcGFyYW0gICAgIHN0cmVhbURlc2NyaXB0aW9uOiAgICAoSU4pIHN0cmVhbSBkZXNjcmlwdGlvbi4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBvciBwU3RyZWFtRGVzY3JpcHRpb24gaXMgTTRPU0FfTlVMTAotICogICAgICAgICAgICAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgYWRkU3RyZWFtCi0gKiAgICAgICAgICAgIChJdHMgY29yZUlEIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX2FkZFN0cmVhbShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjcmlwdGlvbikKLXsKLSAgICBNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0ICphcENvbnRleHQgPQotICAgICAgICAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCAqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zICpwVmlkZW9JbmZvID0gTTRPU0FfTlVMTDsKLSAgICBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zICpwQXVkaW9JbmZvID0gTTRPU0FfTlVMTDsKLSAgICBNNE1QNFdfU3RyZWFtSURzaXplIHNpemVWYWx1ZTsKLQotICAgIE00T1NBX1RSQUNFMV8yKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBwQ29udGV4dD0weCV4LCAiCi0gICAgICAgICAgICAgICAgICAgInBTdHJlYW1EZXNjcmlwdGlvbj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcFN0cmVhbURlc2NyaXB0aW9uKTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU3RyZWFtRGVzY3JpcHRpb24pLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBwU3RyZWFtRGVzY3JpcHRpb24gaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogICAgQWRhcHQgYXVkaW8vdmlkZW8gc3RyZWFtIGluZm9zICovCi0gICAgc3dpdGNoIChwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbVR5cGUpCi0gICAgewotICAgICAgICBjYXNlIE00U1lTX2tNUEVHXzQ6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjQ6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogIgotICAgICAgICAgICAgICAgICAgICAiYWRkaW5nIGEgVmlkZW8gc3RyZWFtIChzdHJlYW1UeXBlPTB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogICAgQ29tbW9uIGRlc2NyaXB0aW9ucyAqLwotICAgICAgICAgICAgcFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1JRCA9IFZpZGVvU3RyZWFtSUQ7ICAgIC8qKjwgVGhlIG9ubHkgdmFsdWVzIGNoZWNrZWQgYnkgb3VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlIHdyaXRlciBhcmUgc3RyZWFtSUQgKi8KLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+dGltZVNjYWxlID0gMTAwMDsgICAgICAgICAgICAvKio8IGFuZCB0aW1lU2NhbGUgKi8KLQotLyogTm90IHJlY29tbWVuZGVkIGZvciB2aWRlbyBlZGl0aW5nIC0+IHdyaXRlIGV4cGxpY2l0ZWx5IHRoZSAnYml0cicgYm94IGludG8gJ2QyNjMnICovCi0vKiBSZW0gOiBpdCBpcyBSRUwgNSBvZiAzZ3BwIGRvY3VtZW50YXRpb24gKi8KLS8vICAgICAgICAgICAgLyoqCi0vLyAgICAgICAgICAgICAqIEF2ZXJhZ2UgYml0LXJhdGUgbXVzdCBub3QgYmUgc2V0IGluIEgyNjMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFBsYXRmb3JtNCAqLwotLy8gICAgICAgICAgICBpZiAoTTRTWVNfa0gyNjMgPT0gcFN0cmVhbURlc2NyaXB0aW9uLT5zdHJlYW1UeXBlKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPmF2ZXJhZ2VCaXRyYXRlID0gLTE7Ci0vLyAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAgICBEZWNvZGVyIHNwZWNpZmljIGluZm8gKi8KLSAgICAgICAgICAgIHBWaWRlb0luZm8gPSAoTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcyAqKXBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mbzsKLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBwVmlkZW9JbmZvLT5IZWFkZXIuU2l6ZTsKLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+ZGVjb2RlclNwZWNpZmljSW5mbyA9IChNNE9TQV9NZW1BZGRyMzIpcFZpZGVvSW5mby0+SGVhZGVyLnBCdWY7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogVmlkZW86IERTST0weCV4LCBEU0lzaXplPSVkIiwKLSAgICAgICAgICAgICAgICAgcFZpZGVvSW5mby0+SGVhZGVyLnBCdWYsIHBWaWRlb0luZm8tPkhlYWRlci5TaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgY2FzZSBNNFNZU19rQU1SX1dCOgotICAgICAgICBjYXNlIE00U1lTX2tBQUM6Ci0gICAgICAgIGNhc2UgTTRTWVNfa0VWUkM6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogYWRkaW5nIGFuIEF1ZGlvIHN0cmVhbSAoc3RyZWFtVHlwZT0weCV4KSIsCi0gICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqICAgIENvbW1vbiBkZXNjcmlwdGlvbnMgKi8KLSAgICAgICAgICAgIHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtSUQgPSBBdWRpb1N0cmVhbUlEOyAgICAvKio8IFRoZSBvbmx5IHZhbHVlIGNoZWNrZWQgYnkgb3VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUgd3JpdGVyIGlzIHN0cmVhbUlEICovCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogICAgRGVjb2RlciBzcGVjaWZpYyBpbmZvICovCi0gICAgICAgICAgICBwQXVkaW9JbmZvID0gKE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MgKilwU3RyZWFtRGVzY3JpcHRpb24tPmRlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gcEF1ZGlvSW5mby0+SGVhZGVyLlNpemU7Ci0gICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPmRlY29kZXJTcGVjaWZpY0luZm8gPSAoTTRPU0FfTWVtQWRkcjMyKXBBdWRpb0luZm8tPkhlYWRlci5wQnVmOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzIoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IEF1ZGlvOiBEU0k9MHgleCwgRFNJc2l6ZT0lZCIsCi0gICAgICAgICAgICAgICAgIHBBdWRpb0luZm8tPkhlYWRlci5wQnVmLCBwQXVkaW9JbmZvLT5IZWFkZXIuU2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06XAotICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXUklURVJfM0dQX0VSUl9VTlNVUFBPUlRFRF9TVFJFQU1fVFlQRSAoc3RyZWFtVHlwZT0weCV4KSIsCi0gICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzY3JpcHRpb24tPnN0cmVhbVR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRXUklURVJfM0dQX0VSUl9VTlNVUFBPUlRFRF9TVFJFQU1fVFlQRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIENhbGwgdGhlIE1QNCBjb3JlIHdyaXRlciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBjYWxsaW5nIE00TVA0V19hZGRTdHJlYW0oKSIpOwotICAgIGVyciA9IE00TVA0V19hZGRTdHJlYW0oYXBDb250ZXh0LT5wTVA0Q29udGV4dCxwU3RyZWFtRGVzY3JpcHRpb24pOwotICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiBNNE1QNFdfYWRkU3RyZWFtIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1BfYWRkU3RyZWFtOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiAoZXJyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBGb3IgVmlkZW8sIHNldCB0aGUgTTRNUDRXX3RyYWNrU2l6ZSBPcHRpb24gKi8KLSAgICBzd2l0Y2ggKHBTdHJlYW1EZXNjcmlwdGlvbi0+c3RyZWFtVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2NDoKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLSAgICAgICAgICAgIHNpemVWYWx1ZS5zdHJlYW1JRCA9IFZpZGVvU3RyZWFtSUQ7Ci0gICAgICAgICAgICBzaXplVmFsdWUuaGVpZ2h0ID0gKE00T1NBX1VJbnQxNikocFZpZGVvSW5mby0+aGVpZ2h0KTsKLSAgICAgICAgICAgIHNpemVWYWx1ZS53aWR0aCAgPSAoTTRPU0FfVUludDE2KShwVmlkZW9JbmZvLT53aWR0aCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogVmlkZW86IGhlaWdodD0lZCwgd2lkdGg9JWQiLAotICAgICAgICAgICAgICAgICBzaXplVmFsdWUuaGVpZ2h0LCBzaXplVmFsdWUud2lkdGgpOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogY2FsbGluZyBNNE1QNFdfc2V0T3B0aW9uKE00TVA0V190cmFja1NpemUpIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKCBhcENvbnRleHQtPnBNUDRDb250ZXh0LCBNNE1QNFdfdHJhY2tTaXplLAotICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikmc2l6ZVZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX2FkZFN0cmVhbTogTTRNUDRXX3NldE9wdGlvbiByZXR1cm5zIGVycm9yIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00V1JJVEVSXzNHUF9hZGRTdHJlYW06IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIENsb3NlIHRoZSB3cml0ZXIuIFRoZSBjb250ZXh0IGlzIGZyZWVkIGhlcmUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBwQ29udGV4dDogICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSAzR1Agd3JpdGVyLAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIGFueSBlcnJvciByZXR1cm5lZCBieSB0aGUgTVA0IGNvcmUgd3JpdGVyIGNsb3NlV3JpdGUgKEl0cyBjb3JlSUQKLSAqICAgICAgICAgICAgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1BfY2xvc2VXcml0ZShNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqIGFwQ29udGV4dD0oTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRXUklURVJfM0dQX2Nsb3NlV3JpdGUgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGFwQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9jbG9zZVdyaXRlOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDYWxsIHRoZSBNUDQgY29yZSB3cml0ZXIgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBhcENvbnRleHQtPnBNUDRDb250ZXh0KQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00V1JJVEVSXzNHUF9jbG9zZVdyaXRlOiBjYWxsaW5nIE00TVA0V19jbG9zZVdyaXRlKCkiKTsKLSAgICAgICAgZXJyID0gTTRNUDRXX2Nsb3NlV3JpdGUoYXBDb250ZXh0LT5wTVA0Q29udGV4dCk7Ci0gICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00V1JJVEVSXzNHUF9jbG9zZVdyaXRlOiBNNE1QNFdfY2xvc2VXcml0ZSByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgRGVhbGxvY2F0ZSBvdXIgb3duIGNvbnRleHQgKi8KLSAgICBmcmVlKGFwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRXUklURVJfM0dQX2Nsb3NlV3JpdGU6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfc2V0T3B0aW9uKAotICogICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQzMiBvcHRpb25JRCwKLSAqICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotICogQGJyaWVmICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIHdyaXRlciB0byBzZXQgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aAotICogICAgICAgICAgICB0aGUgb3B0aW9uSUQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvCi0gKiAgICAgICAgICAgIGRlLWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgIFRoZSBvcHRpb25zIGhhbmRsZWQgYnkgdGhlIGNvbXBvbmVudCBkZXBlbmQgb24gdGhlIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgIG9mIHRoZSBjb21wb25lbnQuCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwKLSAqIEBwYXJhbSAgICAgcHB0aW9uSWQ6ICAgICAoSU4pIElEIG9mIHRoZSBvcHRpb24gdG8gc2V0LgotICogQHBhcmFtICAgICBPcHRpb25WYWx1ZSA6IChJTikgVmFsdWUgb2YgdGhlIG9wdGlvbiB0byBzZXQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIElEIG9mIHRoZSBvcHRpb24gaXMgbm90IHZhbGlkLgotICogQHJldHVybiAgICBhbnkgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIE1QNCBjb3JlIHdyaXRlciBzZXRPcHRpb24gKEl0cyBjb3JlSUQKLSAqICAgICAgICAgICAgaXMgTTRNUDRfV1JJVEVSKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFdSSVRFUl8zR1Bfc2V0T3B0aW9uKAotICAgICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50MzIgb3B0aW9uSUQsCi0gICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0ID0KLSAgICAgICAgICAgIChNNFdSSVRFUl8zR1BfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00TVA0V19tZW1BZGRyIG1lbXZhbDsKLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlIG9wdHZhbDsKLQotICAgIE00T1NBX1RSQUNFMl8zKCJNNFdSSVRFUl8zR1Bfc2V0T3B0aW9uOiBwQ29udGV4dD0weCV4LCBvcHRpb25JRD0weCV4LFwKLSAgICAgICAgIG9wdGlvblZhbHVlPTB4JXgiLCBwQ29udGV4dCwgb3B0aW9uSUQsIG9wdGlvblZhbHVlKTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTD09YXBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3NldE9wdGlvbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIEFjY2VzcyBVbml0IHNpemUgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rTWF4QVVTaXplOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa01heEFVU2l6ZSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX21heEFVc2l6ZSwgb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19tYXhBVXNpemUpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgTWF4aW11bSBjaHVuY2sgc2l6ZSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhDaHVuY2tTaXplOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa01heENodW5ja1NpemUgb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX21heENodW5rU2l6ZSwgb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19tYXhDaHVua1NpemUpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgRmlsZSBzdHJpbmcgc2lnbmF0dXJlICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nIG9wdGlvbiIpOwotICAgICAgICAgICAgLyogVGhlIGdpdmVuIE00T1NBX0RhdGFPcHRpb24gbXVzdCBhY3R1YWxseQotICAgICAgICAgICAgICAgYmUgYSB0ZXh0IHN0cmluZyAqLwotICAgICAgICAgICAgbWVtdmFsLmFkZHIgPSAoTTRPU0FfTWVtQWRkcjMyKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgLyoqPCB0aGlzIGlzIG1heCBzdHJpbmcgc2l6ZSBjb3BpZWQgYnkgdGhlIGNvcmUgKi8KLSAgICAgICAgICAgIG1lbXZhbC5zaXplID0gMTY7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX2VtYmVkZGVkU3RyaW5nLCAmbWVtdmFsKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfZW1iZWRkZWRTdHJpbmcpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgRmlsZSBpbnRlZ3JhdGlvbiB0YWcgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rSW50ZWdyYXRpb25UYWc6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rSW50ZWdyYXRpb25UYWcgb3B0aW9uIik7Ci0gICAgICAgICAgICAvKiBUaGUgZ2l2ZW4gTTRPU0FfRGF0YU9wdGlvbiBtdXN0IGFjdHVhbGx5Ci0gICAgICAgICAgICAgICBiZSBhIHRleHQgc3RyaW5nICovCi0gICAgICAgICAgICBtZW12YWwuYWRkciA9IChNNE9TQV9NZW1BZGRyMzIpb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICAvKio8IHRoaXMgaXMgbWF4IHN0cmluZyBzaXplIGNvcGllZCBieSB0aGUgY29yZSAqLwotICAgICAgICAgICAgbWVtdmFsLnNpemUgPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX2ludGVncmF0aW9uVGFnLCAmbWVtdmFsKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfaW50ZWdyYXRpb25UYWcpIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgRmlsZSB2ZXJzaW9uIHNpZ25hdHVyZSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb246Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uIG9wdGlvbiIpOwotICAgICAgICAgICAgLyogVGhlIGdpdmVuIE00T1NBX0RhdGFPcHRpb24gbXVzdCBhY3R1YWxseQotICAgICAgICAgICAgICAgYmUgYSB2ZXJzaW9uIG51bWJlciAqLwotCi0gICAgICAgICAgICAvKio8IEhlcmUgMCBtZWFucyBib3RoIHN0cmVhbXMgKi8KLSAgICAgICAgICAgIG9wdHZhbC5zdHJlYW1JRCA9IDA7Ci0gICAgICAgICAgICAvKio8IHZlcnNpb24gbnVtYmVyICovCi0gICAgICAgICAgICBvcHR2YWwudmFsdWUgPSAqKE00T1NBX1VJbnQzMiopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX0NhbWNvZGVyVmVyc2lvbiwgJm9wdHZhbCk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX0NhbWNvZGVyVmVyc2lvbikiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBTb21lIG9wdGlvbnMgYXJlIHJlYWQtb25seSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tGaWxlU2l6ZToKLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rRmlsZVNpemVBdWRpb0VzdGltYXRlZDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJ0cnlpbmcgdG8gc2V0IGEgcmVhZC1vbmx5IG9wdGlvbiEgKElEPTB4JXgpIiwKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfUkVBRF9PTkxZOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIGZpbGVzaXplIGxpbWl0YXRpb24gKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rTWF4RmlsZVNpemU6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgic2V0dGluZyBNNFdSSVRFUl9rTWF4RmlsZVNpemUgb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX21heEZpbGVTaXplLCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX21heEZpbGVTaXplKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKioKLSAgICAgICAgICogICAgTWF4aW11bSBmaWxlIGR1cmF0aW9uIGxpbWl0YXRpb24gKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa01heEZpbGVEdXJhdGlvbiBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4RmlsZUR1cmF0aW9uLCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRXUklURVJfa01heEZpbGVEdXJhdGlvbikiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIFNldCAnZnR5cCcgYXRvbSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tTZXRGdHlwQm94OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa1NldEZ0eXBCb3ggb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfc2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIGFwQ29udGV4dC0+cE1QNENvbnRleHQsIE00TVA0V19zZXRGdHlwQm94LCBvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zZXRPcHRpb24oTTRNUDRXX3NldEZ0eXBCb3gpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBEZWNvZGVyIFNwZWNpZmljIEluZm8gKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rRFNJOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa0RTSSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19zZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgYXBDb250ZXh0LT5wTVA0Q29udGV4dCwgTTRNUDRXX0RTSSwgb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uKE00TVA0V19EU0kpXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKisgSC4yNjQgVHJpbW1pbmcgICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa01VTF9QUFNfU1BTOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoInNldHRpbmcgTTRXUklURVJfa01VTF9QUFNfU1BTIG9wdGlvbiIpOwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3NldE9wdGlvbigKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LCBNNE1QNFdfTVVMX1BQU19TUFMsIG9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX3NldE9wdGlvbihNNE1QNFdfRFNJKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyotIEguMjY0IFRyaW1taW5nICAqLwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBVbmtub3duIG9wdGlvbiAqLwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoInRyeWluZyB0byBzZXQgYW4gdW5rbm93biBvcHRpb24hXAotICAgICAgICAgICAgICAgICAob3B0aW9uSUQ9MHgleCkiLCBvcHRpb25JRCk7Ci0gICAgICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00V1JJVEVSXzNHUF9zZXRPcHRpb246IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0T3B0aW9uKAotICogICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQzMiBvcHRpb25JRCwKLSAqICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotICogQGJyaWVmICAgICBUaGlzIGZ1bmN0aW9uIGFza3MgdGhlIHdyaXRlciB0byByZXR1cm4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aAotICogICAgICAgICAgICB0aGUgb3B0aW9uSUQuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcvCi0gKiAgICAgICAgICAgIGRlLWFsbG9jYXRpbmcgdGhlIG1lbW9yeSBvZiB0aGUgdmFsdWUgZmllbGQuCi0gKiBAbm90ZSAgICAgIFRoZSBvcHRpb25zIGhhbmRsZWQgYnkgdGhlIGNvbXBvbmVudCBkZXBlbmQgb24gdGhlIGltcGxlbWVudGF0aW9uCi0gKiAgICAgICAgICAgIG9mIHRoZSBjb21wb25lbnQuCi0gKiBAcGFyYW0gICAgIHBDb250ZXh0OiAgICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwKLSAqIEBwYXJhbSAgICAgT3B0aW9uSWQ6ICAgICAgKElOKSBJZCBvZiB0aGUgb3B0aW9uIHRvIGdldC4KLSAqIEBwYXJhbSAgICAgcE9wdGlvblZhbHVlOiAoT1VUKSBWYWx1ZSBvZiB0aGUgb3B0aW9uIHRvIGdldC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEOiB0aGUgSUQgb2YgdGhlIG9wdGlvbiBpcyBub3QgdmFsaWQuCi0gKiBAcmV0dXJuICAgIE00RVJSX05PVF9JTVBMRU1FTlRFRDogVGhpcyBvcHRpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4KLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgZ2V0T3B0aW9uIChJdHMgY29yZUlECi0gKiAgICAgICAgICAgIGlzIE00TVA0X1dSSVRFUikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX2dldE9wdGlvbigKLSAgICAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDMyIG9wdGlvbklELAotICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKQotewotICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqIGFwQ29udGV4dCA9Ci0gICAgICAgICAgICAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00V1JJVEVSXzNHUF9nZXRPcHRpb246IHBDb250ZXh0PTB4JXgsIG9wdGlvbklEPTB4JXgsXAotICAgICAgICAgb3B0aW9uVmFsdWU9MHgleCIsIHBDb250ZXh0LCBvcHRpb25JRCwgb3B0aW9uVmFsdWUpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gYXBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX2dldE9wdGlvbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JRCkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBNYXhpbXVtIEFjY2VzcyBVbml0IHNpemUgKi8KLSAgICAgICAgY2FzZSBNNFdSSVRFUl9rTWF4QVVTaXplOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoImdldHRpbmcgTTRXUklURVJfa01heEFVU2l6ZSBvcHRpb24iKTsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19nZXRPcHRpb24oYXBDb250ZXh0LT5wTVA0Q29udGV4dCxNNE1QNFdfbWF4QVVzaXplLAotICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKikmb3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfZ2V0T3B0aW9uKE00TVA0V19tYXhBVXNpemUpIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgTWF4aW11bSBjaHVuY2sgc2l6ZSAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tNYXhDaHVuY2tTaXplOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoImdldHRpbmcgTTRXUklURVJfa01heENodW5ja1NpemUgb3B0aW9uIik7Ci0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfZ2V0T3B0aW9uKGFwQ29udGV4dC0+cE1QNENvbnRleHQsTTRNUDRXX21heENodW5rU2l6ZSwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbiopJm9wdGlvblZhbHVlKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2dldE9wdGlvbihNNE1QNFdfbWF4Q2h1bmtTaXplKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIFRoZSBmaWxlIHNpemUgb3B0aW9uICovCi0gICAgICAgIGNhc2UgTTRXUklURVJfa0ZpbGVTaXplOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoImdldHRpbmcgTTRXUklURVJfa0ZpbGVTaXplIG9wdGlvbiIpOwotICAgICAgICAgICAgLyogZ2V0IHRoZSBjdXJyZW50IGZpbGUgc2l6ZSAqLwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX2dldEN1cnJlbnRGaWxlU2l6ZSgKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LCAoTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19nZXRDdXJyZW50RmlsZVNpemUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgICBUaGUgZmlsZSBzaXplIHdpdGggYXVkaW8gb3B0aW9uIGhhcyBpdHMgb3duIGZ1bmN0aW9uIGNhbGwKLSAgICAgICAgICAgICAgaW4gdGhlIE1QNCBjb3JlIHdyaXRlciAqLwotICAgICAgICBjYXNlIE00V1JJVEVSX2tGaWxlU2l6ZUF1ZGlvRXN0aW1hdGVkOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoImdldHRpbmcgTTRXUklURVJfa0ZpbGVTaXplQXVkaW9Fc3RpbWF0ZWQgb3B0aW9uIik7Ci0gICAgICAgICAgICAvKiBnZXQgdGhlIGN1cnJlbnQgZmlsZSBzaXplIC4uLiAqLwotICAgICAgICAgICAgZXJyID0gTTRNUDRXX2dldEN1cnJlbnRGaWxlU2l6ZSgKLSAgICAgICAgICAgICAgICBhcENvbnRleHQtPnBNUDRDb250ZXh0LCAoTTRPU0FfVUludDMyKilvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfRVJSX0lTX0VSUk9SKGVycikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19nZXRDdXJyZW50RmlsZVNpemUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9ubyBtb3JlIG5lZWRlZCAzZ3Agd3JpdGVyIGhhcyBpdHMgb3duIG1lY2FuaXNtCi0gICAgICAgICAgICAvLy8qIC4uLiBhZGQgdGhlIGVzdGltYXRlZCBuZXh0IG1heCBBVSBzaXplICovCi0gICAgICAgICAgICAvLyooKE00T1NBX1VJbnQzMiopb3B0aW9uVmFsdWUpICs9IGFwQ29udGV4dC0+bWF4QVVzaXplczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAvKioKLSAgICAgICAgICogICAgVW5rbm93biBvcHRpb24gKi8KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJ0cnlpbmcgdG8gZ2V0IGFuIHVua25vd24gb3B0aW9uIVwKLSAgICAgICAgICAgICAgICAgKG9wdGlvbklEPTB4JXgpIiwgb3B0aW9uSUQpOwotICAgICAgICAgICAgcmV0dXJuICAgIChNNE9TQV9FUlIpTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFdSSVRFUl8zR1BfZ2V0T3B0aW9uOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX3N0YXJ0QVUoCi0gKiAgICAgICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAqICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLSAqIEBicmllZiAgICAgUHJlcGFyZSBhbiBBY2Nlc3MgVW5pdCB0byBiZSByZWFkeSB0byBzdG9yZSBkYXRhCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBwQ29udGV4dDogKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwKLSAqIEBwYXJhbSAgICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQKLSAqICAgICAgICAgICAgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICAgcEFVOiAgICAgIChJTi9PVVQpIEFjY2VzcyBVbml0IHRvIGJlIHByZXBhcmVkLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBBVSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEOiBzdHJlYW1JRCBpcyBub3QgVmlkZW9TdHJlYW1JRCBub3IKLSAqICAgICAgICAgICAgQXVkaW9TdHJlYW1JRCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgYW55IGVycm9yIHJldHVybmVkIGJ5IHRoZSBNUDQgY29yZSB3cml0ZXIgc3RhcnRBVSAoSXRzIGNvcmVJRAotICogICAgICAgICAgICBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9zdGFydEFVKAotICAgICAgICBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwKLSAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVKQotewotICAgIE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqIGFwQ29udGV4dCA9Ci0gICAgICAgICAgICAoTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00V1JJVEVSXzNHUF9zdGFydEFVOiBwQ29udGV4dD0weCV4LCBzdHJlYW1JRD0lZCwgcEFVPTB4JXgiLAotICAgICAgICAgcENvbnRleHQsIHN0cmVhbUlELCBwQVUpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IGFwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFdSSVRFUl8zR1Bfc3RhcnRBVTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQVUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3N0YXJ0QVU6IHBBVSBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKAotICAgICAgICAgKChWaWRlb1N0cmVhbUlEICE9IHN0cmVhbUlEKSAmJiAoQXVkaW9TdHJlYW1JRCAhPSBzdHJlYW1JRCkpLAotICAgICAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRCwKLSAgICAgICAgICJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiBXcm9uZyBzdHJlYW1JRCIpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbCB0aGUgTVA0IHdyaXRlciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFdSSVRFUl8zR1Bfc3RhcnRBVTogY2FsbGluZyBNNE1QNFdfc3RhcnRBVSgpIik7Ci0gICAgZXJyID0gTTRNUDRXX3N0YXJ0QVUoYXBDb250ZXh0LT5wTVA0Q29udGV4dCwgc3RyZWFtSUQsIHBBVSk7Ci0gICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19zdGFydEFVIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIkFVOiBkYXRhQWRkcmVzcz0weCV4LCBzaXplPSVkIiwKLSAgICAgICAgIHBBVS0+ZGF0YUFkZHJlc3MsIHBBVS0+c2l6ZSk7Ci0KLSAgICAvKiBDb252ZXJ0IG92ZXJzaXplIHRvIGEgcmVxdWVzdCB0b3dhcmQgVkVTIGF1dG9tYXRvbiAqLwotICAgIGlmIChNNFdBUl9NUDRXX09WRVJTSVpFID09IGVycikKLSAgICB7Ci0gICAgICAgIGVyciA9IE00V0FSX1dSSVRFUl9TVE9QX1JFUTsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRXUklURVJfM0dQX3N0YXJ0QVU6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVKAotICogICAgICAgICAgTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gKiAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi0gKiBAYnJpZWYgICAgIFdyaXRlIGFuIEFjY2VzcyBVbml0Ci0gKiBAbm90ZQotICogQHBhcmFtICAgICBwQ29udGV4dDogKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciwKLSAqIEBwYXJhbSAgICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQKLSAqICAgICAgICAgICAgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICAgcEFVOiAgICAgIChJTi9PVVQpIEFjY2VzcyBVbml0IHRvIGJlIHdyaXR0ZW4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBvciBwQVUgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX1NUUkVBTV9JRDogc3RyZWFtSUQgaXMgbm90IFZpZGVvU3RyZWFtSUQgbm9yCi0gKiAgICAgICAgICAgIEF1ZGlvU3RyZWFtSUQgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIGFueSBlcnJvciByZXR1cm5lZCBieSB0aGUgTVA0IGNvcmUgd3JpdGVyIHByb2Nlc3NBVQotICogICAgICAgICAgICAoSXRzIGNvcmVJRCBpcyBNNE1QNF9XUklURVIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9wcm9jZXNzQVUoCi0gICAgICAgIE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELAotICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi17Ci0gICAgTTRXUklURVJfM0dQX0ludGVybmFsQ29udGV4dCogYXBDb250ZXh0ID0KLSAgICAgICAgKE00V1JJVEVSXzNHUF9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8zKCJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiAiCi0gICAgICAgICAgICAgICAgICAgInBDb250ZXh0PTB4JXgsIHN0cmVhbUlEPSVkLCBwQVU9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBzdHJlYW1JRCwgcEFVKTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBhcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3Byb2Nlc3NBVTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQVUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRXUklURVJfM0dQX3Byb2Nlc3NBVTogcEFVIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoCi0gICAgICAgICAoKFZpZGVvU3RyZWFtSUQgIT0gc3RyZWFtSUQpICYmIChBdWRpb1N0cmVhbUlEICE9IHN0cmVhbUlEKSksCi0gICAgICAgICBNNEVSUl9CQURfU1RSRUFNX0lELAotICAgICAgICAgIk00V1JJVEVSXzNHUF9wcm9jZXNzQVU6IFdyb25nIHN0cmVhbUlEIik7Ci0KLSAgICBNNE9TQV9UUkFDRTNfNCgiTTRXUklURVJfM0dQX3Byb2Nlc3NBVTogQVU6ICIKLSAgICAgICAgICJkYXRhQWRkcmVzcz0weCV4LCBzaXplPSVkLCBDVFM9JWQsIG5iRnJhZz0lZCIsCi0gICAgICAgICBwQVUtPmRhdGFBZGRyZXNzLCBwQVUtPnNpemUsIChNNE9TQV9VSW50MzIpcEFVLT5DVFMsIHBBVS0+bmJGcmFnKTsKLQotICAgIGlmKHBBVS0+c2l6ZSA+IGFwQ29udGV4dC0+bWF4QVVzaXplcykKLSAgICB7Ci0gICAgICAgIGFwQ29udGV4dC0+bWF4QVVzaXplcyA9IHBBVS0+c2l6ZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQ2FsbCB0aGUgTVA0IHdyaXRlciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiBjYWxsaW5nIE00TVA0V19wcm9jZXNzQVUoKSIpOwotICAgIGVyciA9IE00TVA0V19wcm9jZXNzQVUoYXBDb250ZXh0LT5wTVA0Q29udGV4dCwgc3RyZWFtSUQsIHBBVSk7Ci0gICAgaWYgKE00T1NBX0VSUl9JU19FUlJPUihlcnIpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19wcm9jZXNzQVUgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICAvKiBDb252ZXJ0IG92ZXJzaXplIHRvIGEgcmVxdWVzdCB0b3dhcmQgVkVTIGF1dG9tYXRvbiAqLwotICAgIGlmKE00V0FSX01QNFdfT1ZFUlNJWkUgPT0gZXJyKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRXQVJfV1JJVEVSX1NUT1BfUkVROwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFM18xKCJNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoCi0gKiAgICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICogICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gKiAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKQotICogQGJyaWVmICAgICBHZXQgdGhlIDNHUFAgd3JpdGVyIGNvbW1vbiBpbnRlcmZhY2UKLSAqIEBub3RlICAgICAgUmV0cmlldmVzIHRoZSBzZXQgb2YgZnVuY3Rpb25zIG5lZWRlZCB0byB1c2UgdGhlIDNHUFAgd3JpdGVyLgotICogICAgICAgICAgICBJdCBmb2xsb3dzIHRoZSBjb21tb24gd3JpdGVyIGludGVyZmFjZS4KLSAqIEBwYXJhbSAgICAgVHlwZTogKE9VVCkgcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgd3JpdGVyLiBXaWxsIGFsd2F5cyBiZQotICogICAgICAgICAgICBNNFdSSVRFUl9rM0dQUC4KLSAqIEBwYXJhbSAgICAgU3JjR2xvYmFsSW50ZXJmYWNlOiAoT1VUKSBNYWluIHNldCBvZiBmdW5jdGlvbiB0byB1c2UgdGhpcwotICogICAgICAgICAgICAzR1BQIHdyaXRlcgotICogQHBhcmFtICAgICBTcmNEYXRhSW50ZXJmYWNlOiAgIChPVVQpIFNldCBvZiBmdW5jdGlvbiByZWxhdGVkIHRvIGRhdGFzCi0gKiAgICAgICAgICAgIHRvIHVzZSB0aGlzIDNHUFAgd3JpdGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiB0aGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgTTRPU0FfTlVMTAotICogICAgICAgICAgICAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoCi0gICAgICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKQotewotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSAqcEdsb2JhbDsKLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlICpwRGF0YTsKLQotICAgIE00T1NBX1RSQUNFMl8zKCJNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlczogIgotICAgICAgICAgIlR5cGU9MHgleCwgU3JjR2xvYmFsSW50ZXJmYWNlPTB4JXgsXAotICAgICAgICAgU3JjRGF0YUludGVyZmFjZT0weCV4IiwgVHlwZSwgU3JjR2xvYmFsSW50ZXJmYWNlLCBTcmNEYXRhSW50ZXJmYWNlKTsKLQotICAgIC8qKgotICAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBUeXBlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiBUeXBlIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gU3JjR2xvYmFsSW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiBTcmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBTcmNEYXRhSW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzOiBTcmNEYXRhSW50ZXJmYWNlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICAgIFNldCB0aGUgb3V0cHV0IHR5cGUgKi8KLSAgICAqVHlwZSA9IE00V1JJVEVSX2szR1BQOwotCi0gICAgLyoqCi0gICAgICogICAgQWxsb2NhdGUgdGhlIGdsb2JhbCBpbnRlcmZhY2Ugc3RydWN0dXJlICovCi0gICAgcEdsb2JhbCA9IChNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKSwKLSAgICAgICAgICAgICAgICBNNFdSSVRFUl8zR1AsIChNNE9TQV9DaGFyICopIk00V1JJVEVSX0dsb2JhbEludGVyZmFjZSIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IHBHbG9iYWwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgidW5hYmxlIHRvIGFsbG9jYXRlIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSxcCi0gICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICpTcmNHbG9iYWxJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICAqU3JjRGF0YUludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAgIEFsbG9jYXRlIHRoZSBkYXRhIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KLSAgICBwRGF0YSA9Ci0gICAgICAgIChNNFdSSVRFUl9EYXRhSW50ZXJmYWNlICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKSwKLSAgICAgICAgTTRXUklURVJfM0dQLCAoTTRPU0FfQ2hhciAqKSJNNFdSSVRFUl9EYXRhSW50ZXJmYWNlIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcERhdGEpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgidW5hYmxlIHRvIGFsbG9jYXRlIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UsXAotICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICBmcmVlKHBHbG9iYWwpOwotICAgICAgICAqU3JjR2xvYmFsSW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgKlNyY0RhdGFJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBGaWxsIHRoZSBnbG9iYWwgaW50ZXJmYWNlIHN0cnVjdHVyZSAqLwotICAgIHBHbG9iYWwtPnBGY3RPcGVuID0gTTRXUklURVJfM0dQX29wZW5Xcml0ZTsKLSAgICBwR2xvYmFsLT5wRmN0QWRkU3RyZWFtID0gTTRXUklURVJfM0dQX2FkZFN0cmVhbTsKLSAgICBwR2xvYmFsLT5wRmN0U3RhcnRXcml0aW5nID0gTTRXUklURVJfM0dQX3N0YXJ0V3JpdGluZzsKLSAgICBwR2xvYmFsLT5wRmN0Q2xvc2VXcml0ZSA9IE00V1JJVEVSXzNHUF9jbG9zZVdyaXRlOwotICAgIHBHbG9iYWwtPnBGY3RTZXRPcHRpb24gPSBNNFdSSVRFUl8zR1Bfc2V0T3B0aW9uOwotICAgIHBHbG9iYWwtPnBGY3RHZXRPcHRpb24gPSBNNFdSSVRFUl8zR1BfZ2V0T3B0aW9uOwotCi0gICAgLyoqCi0gICAgICogICAgRmlsbCB0aGUgZGF0YSBpbnRlcmZhY2Ugc3RydWN0dXJlICovCi0gICAgcERhdGEtPnBTdGFydEFVID0gTTRXUklURVJfM0dQX3N0YXJ0QVU7Ci0gICAgcERhdGEtPnBQcm9jZXNzQVUgPSBNNFdSSVRFUl8zR1BfcHJvY2Vzc0FVOwotCi0gICAgLyoqCi0gICAgICogICAgU2V0IHRoZSByZXR1cm4gdmFsdWVzICovCi0gICAgKlNyY0dsb2JhbEludGVyZmFjZSA9IHBHbG9iYWw7Ci0gICAgKlNyY0RhdGFJbnRlcmZhY2UgPSBwRGF0YTsKLQotICAgIE00T1NBX1RSQUNFMl8wKCJNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlczogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX1V0aWxzLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfVXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjJlMmFkMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfVXRpbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TVA0V19VdGlscy5jCi0gKiBAYnJpZWYgICBVdGlsaXRpZXMgYW5kIHByaXZhdGUgZnVuY3Rpb25zIGZvciB0aGUgTVA0IHdyaXRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZuZGVmIF9NNE1QNFdfVVNFX0NTVF9NRU1PUllfV1JJVEVSCi0KLSNpbmNsdWRlICJNNE1QNFdfVXRpbHMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00TVA0V19UeXBlcy5oIgotCi0jZGVmaW5lIEVSUl9DSEVDSyhleHAsIGVycikgaWYgKCEoZXhwKSkgeyByZXR1cm4gZXJyOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19wdXRCeXRlKE00T1NBX1VDaGFyIGMsIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IGZpbGVGdW5jdGlvbi0+d3JpdGVEYXRhKGNvbnRleHQsIChNNE9TQV9NZW1BZGRyOCkmYywgMSk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJFMTYoTTRPU0FfVUludDMyIHZhbCwgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIGZpbGVGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikodmFsID4+IDgpLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIEVSUl9DSEVDSyhlcnIgPT0gTTROT19FUlJPUiwgZXJyKTsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpdmFsLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19wdXRCRTI0KE00T1NBX1VJbnQzMiB2YWwsIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKHZhbCA+PiAxNiksIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKGVyciA9PSBNNE5PX0VSUk9SLCBlcnIpOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikodmFsID4+IDgpLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIEVSUl9DSEVDSyhlcnIgPT0gTTROT19FUlJPUiwgZXJyKTsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpdmFsLCBmaWxlRnVuY3Rpb24sIGNvbnRleHQpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19wdXRCRTMyKE00T1NBX1VJbnQzMiB2YWwsIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBmaWxlRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBjb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBlcnIgPSBNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKHZhbCA+PiAyNCksIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKGVyciA9PSBNNE5PX0VSUk9SLCBlcnIpOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikodmFsID4+IDE2KSwgZmlsZUZ1bmN0aW9uLCBjb250ZXh0KTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKSh2YWwgPj4gOCksIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKGVyciA9PSBNNE5PX0VSUk9SLCBlcnIpOwotICAgIGVyciA9IE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcil2YWwsIGZpbGVGdW5jdGlvbiwgY29udGV4dCk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3B1dEJsb2NrKGNvbnN0IE00T1NBX1VDaGFyKiBCbG9jaywgTTRPU0FfVUludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogZmlsZUZ1bmN0aW9uLCBNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gZmlsZUZ1bmN0aW9uLT53cml0ZURhdGEoY29udGV4dCwgKE00T1NBX01lbUFkZHI4KUJsb2NrLCBzaXplKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTTRNUDRXX2NvbnZlcnRJbnQzMkJFKE00T1NBX1VJbnQzMiogdmFsUHRyKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfVUNoYXIgYSwgYjsKLSAgICBNNE9TQV9VQ2hhciogYyA9IChNNE9TQV9VQ2hhciopdmFsUHRyOwotICAgIGEgICAgICAgPSAqKGMpOwotICAgIGIgICAgICAgPSAqKGMrMSk7Ci0gICAgKihjKSAgID0gKihjKzMpOwotICAgICooYysxKSA9ICooYysyKTsKLSAgICAqKGMrMikgPSBiOwotICAgICooYyszKSA9IGE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNNE1QNFdfdGFibGUzMlRvQkUoTTRPU0FfVUludDMyKiB0YWIsIE00T1NBX1VJbnQzMiBuYikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX1VJbnQzMiBpOwotICAgIGZvciAoaT0wOyBpPG5iOyBpKyspCi0gICAgICAgIE00TVA0V19jb252ZXJ0SW50MzJCRSgmKHRhYilbaV0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQqIE00TVA0V19yZWFsbG9jKE00T1NBX01lbUFkZHIzMiBwdHIsIE00T1NBX1VJbnQzMiBvbGRTaXplLCBNNE9TQV9VSW50MzIgbmV3U2l6ZSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX01lbUFkZHIzMiBwdHIyID0gKE00T1NBX01lbUFkZHIzMilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobmV3U2l6ZSwgTTRNUDRfV1JJVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopInJlYWxsb2MiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwdHIyKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcHRyMiwgKHZvaWQgKilwdHIsIG9sZFNpemUpOwotICAgIH0KLSAgICBmcmVlKHB0cik7Ci0gICAgcmV0dXJuIHB0cjI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19mcmVlQ29udGV4dChNNE9TQV9Db250ZXh0IGNvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICBNNE9TQV9VSW50MzIgaTsKLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhKiBtTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvKmZyZWVDb250ZXh0IGlzIG5vdyBjYWxsZWQgYWZ0ZXIgY2xvc2VXcml0ZSovCi0gICAgRVJSX0NIRUNLKCBtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19jbG9zZWQsIE00RVJSX1NUQVRFKTsKLSAgICBtTXA0RmlsZURhdGFQdHItPnN0YXRlID0gTTRNUDRXX2Nsb3NlZDsKLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qZGVsZXRlIGFsc28gb3RoZXIgY2h1bmtzIGlmIGFueSovCi0gICAgICAgIC8qZm9yIChpPTA7IGk8PW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKyspKi8KLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgICAgICBmb3IgKGk9MDsgaTw9bU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bms7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rW2ldKTsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgaWYgKChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmspICYmCi0gICAgICAgICAgICAgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgLypub3cgZHluYW1pYyovCi0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1ogIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1opOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kpOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHIgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAvKmRlbGV0ZSBhbHNvIG90aGVyIGNodW5rcyBpZiBhbnkqLwotICAgICAgICAvKmZvciAoaT0wOyBpPD1tTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrKSovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICAgICAgZm9yIChpPTA7IGk8PW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1tpXSk7Ci0gICAgICAgIH0KLSNlbHNlCi0gICAgICAgIGlmICgoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rKSAmJgotICAgICAgICAgICAgIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0pKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUpOwotICAgICAgICB9Ci0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgIC8qbm93IGR5bmFtaWMqLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmspOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLypub3cgZHluYW1pYyovCi0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWikKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1opOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MpOwotICAgICAgICB9Ci0KLSAgICAgICAgZnJlZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmcmVlKG1NcDRGaWxlRGF0YVB0cik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX1ZvaWQgTTRNUDRXX3B1dDMyX0hpKE00T1NBX1VJbnQzMiogdGFiLCBNNE9TQV9VSW50MTYgSGkpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICAqdGFiICY9IDB4RkZGRjsKLSAgICAqdGFiIHw9IEhpPDwxNjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9Wb2lkIE00TVA0V19wdXQzMl9MbyhNNE9TQV9VSW50MzIqIHRhYiwgTTRPU0FfVUludDE2IExvKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgKnRhYiAmPSAweEZGRkYwMDAwOwotICAgICp0YWIgfD0gTG87Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfVUludDE2IE00TVA0V19nZXQzMl9IaShNNE9TQV9VSW50MzIqIHRhYikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIHJldHVybiAoKnRhYiA+PiAxNikgJiAweEZGRkY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfVUludDE2IE00TVA0V19nZXQzMl9MbyhNNE9TQV9VSW50MzIqIHRhYikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIHJldHVybiAqdGFiICYgMHhGRkZGOwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUiAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfV3JpdGVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9NNE1QNFdfV3JpdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkZmM0NDEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTTRNUDRXX1dyaXRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRNUDRXX1dyaXRlci5jCi0gKiBAYnJpZWYgICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29yZSBNUDQgd3JpdGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2lmbmRlZiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUgotCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00TVA0V19Xcml0ZXIuaCIKLSNpbmNsdWRlICJNNE1QNFdfVXRpbHMuaCIKLQotLyogQ2hlY2sgb3B0aW1pc2F0aW9uIGZsYWdzIDogQkVHSU4gKi8KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotI2Vycm9yICJfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBfTTRNUDRXX01PT1ZfRklSU1QiCi0KLSNlbmRpZgotCi0jZW5kaWYKLQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotI2lmbmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotI2Vycm9yICJfTTRNUDRXX1VOQlVGRkVSRURfVklERU8gc2hvdWxkIGJlIHVzZWQgd2l0aCBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSIKLQotI2VuZGlmCi0KLSNlbmRpZgotLyogQ2hlY2sgb3B0aW1pc2F0aW9uIGZsYWdzIDogRU5EICovCi0KLSNpZm5kZWYgX000TVA0V19ET05UX1VTRV9USU1FX0gKLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNlbmRpZiAvKl9NNE1QNFdfRE9OVF9VU0VfVElNRV9IKi8KLQotLypNQUNST1MqLwotI2RlZmluZSBNQUpPUl9WRVJTSU9OIDMKLSNkZWZpbmUgTUlOT1JfVkVSU0lPTiAzCi0jZGVmaW5lIFJFVklTSU9OIDAKLQotI2RlZmluZSBFUlJfQ0hFQ0soZXhwLCBlcnIpIGlmICghKGV4cCkpIHsgcmV0dXJuIGVycjsgfQotI2RlZmluZSBDTEVBTlVQb25FUlIoZnVuYykgaWYgKChlcnIgPSBmdW5jKSAhPSBNNE5PX0VSUk9SKSBnb3RvIGNsZWFudXAKLQotI2RlZmluZSBtYXgoYSxiKSAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCi0KLS8qKioqKioqKioqKioqKiovCi0vKlN0YXRpYyBibG9ja3MqLwotLyoqKioqKioqKioqKioqKi8KLQotLypDb21tb25CbG9ja3MqLwotCi1jb25zdCBNNE9TQV9VQ2hhciBEZWZhdWx0X2Z0eXAgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsICdmJywgJ3QnLCAneScsICdwJywgJzMnLCAnZycsICdwJywgJzcnLCAweDAwLCAweDAwLAotICAgIDB4MDMsIDB4MDAsICczJywgJ2cnLCAncCcsICc3JywgJ2knLCAncycsICdvJywgJ20nCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazIgW10gPQotewotICAgICdtJywgJ2QnLCAnYScsICd0JwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2szIFtdID0KLXsKLSAgICAnbScsICdvJywgJ28nLCAndicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NkMsICdtJywgJ3YnLCAnaCcsICdkJywgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazQgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDMsIDB4RTgKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrNSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2s2IFtdID0KLXsKLSAgICAndCcsICdyJywgJ2EnLCAnaycsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NUMsICd0JywgJ2snLCAnaCcsICdkJywgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAxCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazcgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrN2JpcyBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDQwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazggW10gPQotewotICAgICdtJywgJ2QnLCAnaScsICdhJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgJ20nLCAnZCcsICdoJywgJ2QnLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrOSBbXSA9Ci17Ci0gICAgMHg1NSwgMHhDNCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2sxMCBbXSA9Ci17Ci0gICAgJ20nLCAnaScsICduJywgJ2YnLCAweDAwLCAweDAwLCAweDAwLCAweDI0LCAnZCcsICdpJywgJ24nLCAnZicsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgxQywgJ2QnLCAncicsICdlJywgJ2YnLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsICd1JywgJ3InLCAnbCcsICcgJywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAxCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazExIFtdID0KLXsKLSAgICAncycsICd0JywgJ2InLCAnbCcKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMTIgW10gPQotewotICAgICdzJywgJ3QnLCAndCcsICdzJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgU2FtcGxlRGVzY3JpcHRpb25IZWFkZXIgW10gPQotewotICAgICdzJywgJ3QnLCAncycsICdkJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMQotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgU2FtcGxlRGVzY3JpcHRpb25FbnRyeVN0YXJ0IFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIENvbW1vbkJsb2NrMTUgW10gPQotewotICAgICdzJywgJ3QnLCAncycsICd6JywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQ29tbW9uQmxvY2sxNiBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICdzJywgJ2MnLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBDb21tb25CbG9jazE3IFtdID0KLXsKLSAgICAncycsICd0JywgJ2MnLCAnbycsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEJsb2NrU2lnbmF0dXJlU2tpcEhlYWRlciBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg1RSwgJ3MnLCAnaycsICdpJywgJ3AnCi19OwotLyogZHVlIHRvIGN1cnJlbnQgbGltaXRhdGlvbnMsIHNpemUgbXVzdCBiZSAxNiAqLwotY29uc3QgTTRPU0FfVUNoYXIgQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEVtYmVkZGVkU3RyaW5nIFtdID0KLXsKLSAgICAnTicsICdYJywgJ1AnLCAnUycsICdXJywgJyAnLCAnQycsICdBJywgJ00nLCAnQycsICdPJywgJ1InLCAnRCcsICdFJywKLSAgICAnUicsICcgJwotfTsKLS8qIGZvbGxvd3MgdGhlIHZlcnNpb24gKGxpa2UgIiAzLjAuMiIpLCB0aGVuICIgLS0gIiAqLwotLyogZHVlIHRvIGN1cnJlbnQgbGltaXRhdGlvbnMsIHNpemUgbXVzdCBiZSA2MCAqLwotY29uc3QgTTRPU0FfVUNoYXIgQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEludGVncmF0aW9uVGFnIFtdID0KLXsKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAotfTsKLQotLypWaWRlb0Jsb2NrcyovCi0vKiAzMjAqMjQwLCBub3cgbm8gbG9uZ2VyIGhhcmRjb2RlZCAqLwotLyogY29uc3QgTTRPU0FfVUNoYXIgVmlkZW9CbG9jazFbXSA9Ci0gICAgeyAweDAxLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweDAwLCAweDAwIH07ICovCi1jb25zdCBNNE9TQV9VQ2hhciBWaWRlb0Jsb2NrMV8xIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDIxLCAnaCcsICdkJywgJ2wnLCAncicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgJ3YnLCAnaScsICdkJywgJ2UnLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIFNhbXBsZURlc2NyaXB0aW9uRW50cnlWaWRlb0JvaWxlcnBsYXRlMSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgU2FtcGxlRGVzY3JpcHRpb25FbnRyeVZpZGVvQm9pbGVycGxhdGUyIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweEZGLCAweEZGCi19OwotCi1jb25zdCBNNE9TQV9VQ2hhciBWaWRlb0Jsb2NrNCBbXSA9Ci17Ci0gICAgJ3MnLCAndCcsICdzJywgJ3MnLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi19OyAvKlNUU1MqLwotCi1jb25zdCBNNE9TQV9VQ2hhciBWaWRlb0Jsb2NrNSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgJ3YnLCAnbScsICdoJywgJ2QnLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIFZpZGVvUmVzb2x1dGlvbnMgW10gPQotewotICAgIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAKLX07Ci0KLS8qTXA0dkJsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBNcDR2QmxvY2sxIFtdID0KLXsKLSAgICAnbScsICdwJywgJzQnLCAndicKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIE1wNHZCbG9jazMgW10gPQotewotICAgIDB4MjAsIDB4MTEKLX07Ci0KLS8qSDI2M0Jsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBIMjYzQmxvY2sxIFtdID0KLXsKLSAgICAncycsICcyJywgJzYnLCAnMycKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEgyNjNCbG9jazIgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEYsICdkJywgJzInLCAnNicsICczJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgSDI2M0Jsb2NrMl9iaXRyIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDFGLCAnZCcsICcyJywgJzYnLCAnMycKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEgyNjNCbG9jazMgW10gPQotewotICAgICdQJywgJ0gnLCAnTCcsICdQJywgMHgwMCwgMHgwQSwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgSDI2M0Jsb2NrNCBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgJ2InLCAnaScsICd0JywgJ3InCi19OwotCi0vKkgyNjRCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgSDI2NEJsb2NrMSBbXSA9Ci17Ci0gICAgJ2EnLCAndicsICdjJywgJzEnCi19OwotCi0vKiBTdG9yZSB0aGUgYXZjQyBmaWVsZCwgdGhlIHZlcnNpb24gKD0xKSwKLSAgICB0aGUgcHJvZmlsZSAoPTY2KSwgdGhlIGNvbXBhdGliaWxpdHkgKD0wKSwgKi8KLQotLyogdGhlIGxldmVsICg9MTApLDExMTExMSArIE5BTCBmaWVsZCBTaXplICg9IDQgLSAxKSwKLSAgICAxMTEgKyBudW1iZXIgb2YgUFBTICg9MSkgKi8KLQotY29uc3QgTTRPU0FfVUNoYXIgSDI2NEJsb2NrMiBbXSA9Ci17Ci0gICAgICAgIC8vIFJlbW92ZSB0aGUgaGFyZGNvZGVkIERTSSB2YWx1ZXMgb2YgSDI2NEJsb2NrMgotICAgICAgICAnYScgLCAndicgLCAnYycgLCAnQycKLX07Ci0KLS8qQU1SQmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIEFNUkJsb2NrMSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQU1SQmxvY2sxXzEgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjEsICdoJywgJ2QnLCAnbCcsICdyJywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAncycsICdvJywgJ3UnLCAnbicsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQXVkaW9TYW1wbGVEZXNjRW50cnlCb2lsZXJwbGF0ZSBbXSA9Ci17Ci0gICAgMHgwMCwgMHgwMiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQU1SRFNJSGVhZGVyIFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDExLCAnZCcsICdhJywgJ20nLCAncicKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEFNUkRlZmF1bHREU0kgW10gPQotewotICAgICdQJywgJ0gnLCAnTCcsICdQJywgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMQotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgQU1SQmxvY2s0IFtdID0KLXsKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDEwLCAncycsICdtJywgJ2gnLCAnZCcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMAotfTsKLQotLypBTVI4QmxvY2tzKi8KLWNvbnN0IE00T1NBX1VDaGFyIEFNUjhCbG9jazEgW10gPQotewotICAgICdzJywgJ2EnLCAnbScsICdyJwotfTsKLQotLypBTVIxNkJsb2NrcyovCi0vKmNvbnN0IE00T1NBX1VDaGFyIEFNUjE2QmxvY2sxW10gPSB7ICdzJywgJ2EnLCAndycsICdiJ307Ki8KLQotLypBQUNCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgQUFDQmxvY2sxIFtdID0KLXsKLSAgICAnbScsICdwJywgJzQnLCAnYScKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIEFBQ0Jsb2NrMiBbXSA9Ci17Ci0gICAgMHg0MCwgMHgxNQotfTsKLQotLypNUEVHQ29uZmlnQmxvY2tzIChBQUMgJiBNUDRWKSovCi1jb25zdCBNNE9TQV9VQ2hhciBNUEVHQ29uZmlnQmxvY2swIFtdID0KLXsKLSAgICAnZScsICdzJywgJ2QnLCAncycsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIE1QRUdDb25maWdCbG9jazEgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQKLX07Ci0KLWNvbnN0IE00T1NBX1VDaGFyIE1QRUdDb25maWdCbG9jazIgW10gPSB7IDB4MDUgfTsKLWNvbnN0IE00T1NBX1VDaGFyIE1QRUdDb25maWdCbG9jazMgW10gPQotewotICAgIDB4MDYsIDB4MDEsIDB4MDIKLX07Ci0KLS8qRVZSQ0Jsb2NrcyovCi1jb25zdCBNNE9TQV9VQ2hhciBFVlJDQmxvY2szXzEgW10gPQotewotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsICdkJywgJ2UnLCAndicsICdjJwotfTsKLQotY29uc3QgTTRPU0FfVUNoYXIgRVZSQ0Jsb2NrM18yIFtdID0KLXsKLSAgICAnUCcsICdIJywgJ0wnLCAnUCcsIDB4MDAsIDB4MDAKLX07Ci0KLS8qRVZSQzhCbG9ja3MqLwotY29uc3QgTTRPU0FfVUNoYXIgRVZSQzhCbG9jazEgW10gPQotewotICAgICdzJywgJ2UnLCAndicsICdjJwotfTsKLQotLyoqKioqKioqKioqLwotLyogTWV0aG9kcyAqLwotLyoqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfZ2V0VmVyc2lvbihNNE9TQV9VSW50OCAqbWFqb3IsIE00T1NBX1VJbnQ4ICptaW5vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcmV2aXNpb24gKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gbWFqb3IsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gbWlub3IsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gcmV2aXNpb24sIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAqbWFqb3IgPSBNQUpPUl9WRVJTSU9OOwotICAgICptaW5vciA9IE1JTk9SX1ZFUlNJT047Ci0gICAgKnJldmlzaW9uID0gUkVWSVNJT047Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1QNFdfU1RUU19BTExPQ19TSVpFOwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1QNFdfU1RTWl9BTExPQ19TSVpFOwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1QNFdfU1RTU19BTExPQ19TSVpFOwotc3RhdGljIE00T1NBX1VJbnQzMiBNNE1QNFdfQ0hVTktfQUxMT0NfTkI7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkU7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkU7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQjsKLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0vKiBzdHNjWyBdIHRhYmxlIGlzIHNwbGl0dGVkIGF0IDEyIGJpdHMgKi8KLSNkZWZpbmUgTTRNUDRXX1ZJREVPX01BWF9BVV9QRVJfQ0hVTksgNDA5NSAvKiAwPW5vdHVzZWQgKi8KLQotI2Vsc2UKLSNkZWZpbmUgTTRNUDRXX1ZJREVPX01BWF9BVV9QRVJfQ0hVTksgMTAgICAvKiAwPW5vdHVzZWQgKi8KLQotI2VuZGlmCi0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTTRPU0FfRVJSIE00TVA0V19pbml0aWFsaXplQWxsb2NhdGlvblBhcmFtZXRlcnMoTTRNUDRXX01wNEZpbGVEYXRhICpQdHIgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgIE00T1NBX1VJbnQzMiBtYXhNZW1vcnksIHZlc01lbW9yeTsKLSAgICBNNE9TQV9VSW50MzIgbmJWaWRlb0ZyYW1lcywgbmJBdWRpb0ZyYW1lczsKLSAgICBNNE9TQV9VSW50MzIgYXZlcmFnZVZpZGVvQ2h1bms7Ci0KLSAgICAvKi0tLS0tLS0tLS0tKi8KLSAgICAvKiBOQl9GUkFNRVMgKi8KLSAgICAvKi0tLS0tLS0tLS0tKi8KLQotICAgIC8qIG1hZ2ljYWwgZm9ybXVsYSA6IG1lbW9yeSA9IHZlc01lbW9yeSArIDEyICogZnJhbWVyYXRlICogZHVyYXRpb24gKi8KLQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgdmVzTWVtb3J5ID0gMHgzMjAwMDsgLyogMjAwIGtCICovCi0KLSNlbHNlCi0KLSAgICB2ZXNNZW1vcnkgPSAweDNFODAwOyAvKiAyNTAga0IgKi8KLQotI2VuZGlmCi0KLSNkZWZpbmUgVklERU9fUE9PTF9NRU1PUlkgMTAwMDAwMAotCi0gICAgbWF4TWVtb3J5ID0gVklERU9fUE9PTF9NRU1PUlk7Ci0KLSAgICBpZiAobWF4TWVtb3J5IDwgdmVzTWVtb3J5KSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBuYlZpZGVvRnJhbWVzID0gKCBtYXhNZW1vcnkgLSB2ZXNNZW1vcnkpIC8gMTI7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXOiAlZCBpbWFnZXMgbWF4IiwgbmJWaWRlb0ZyYW1lcyk7Ci0KLSAgICAvKiBWSURFTyAqLwotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotICAgIC8qIGFzc3VtZSBhbiBhdmVyYWdlIG9mIDI1IGZwYyA6IHJlZmVyZW5jZSA9IDE1IGZwcyAqIDJzICogMC44ICovCi0KLSAgICBhdmVyYWdlVmlkZW9DaHVuayA9IDI1MDA7Ci0KLSNlbHNlCi0KLSAgICBpZiAoTTRNUDRXX1ZJREVPX01BWF9BVV9QRVJfQ0hVTksgPiAwKQotICAgIHsKLSAgICAgICAgYXZlcmFnZVZpZGVvQ2h1bmsgPSAxMDAgKiBNNE1QNFdfVklERU9fTUFYX0FVX1BFUl9DSFVOSyAtIDIwCi0gICAgICAgICAgICAqIChNNE1QNFdfVklERU9fTUFYX0FVX1BFUl9DSFVOSyAtIDEpOyAvKiBtYXJnaW4gMjAlICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIGFzc3VtZSBhbiBhdmVyYWdlIG9mIDUwIGZwYyAqLwotICAgICAgICBhdmVyYWdlVmlkZW9DaHVuayA9IDUwMDA7Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIE00TVA0V19TVFRTX0FMTE9DX1NJWkUgPSBuYlZpZGVvRnJhbWVzICogc2l6ZW9mKE00T1NBX1VJbnQzMik7Ci0gICAgTTRNUDRXX1NUU1pfQUxMT0NfU0laRSA9IG5iVmlkZW9GcmFtZXMgKiBzaXplb2YoTTRPU0FfVUludDE2KTsKLSAgICBNNE1QNFdfU1RTU19BTExPQ19TSVpFID0gbmJWaWRlb0ZyYW1lcyAqIHNpemVvZigKLSAgICAgICAgTTRPU0FfVUludDMyKTsgLyogdmVyeSBjb25zZXJ2YXRpdmUgKGFsbCBpbWFnZXMgYXJlIGludHJhKSAqLwotCi0gICAgTTRNUDRXX0NIVU5LX0FMTE9DX05CID0gKCBuYlZpZGVvRnJhbWVzICogMTAwKSAvIGF2ZXJhZ2VWaWRlb0NodW5rICsgMTsKLQotICAgIC8qIEFVRElPICovCi0KLSAgICBuYkF1ZGlvRnJhbWVzID0gbmJWaWRlb0ZyYW1lczsKLSAgICAvKiBhdWRpbyBpcyA1IGZwcywgd2hpY2ggaXMgdGhlIHNtYWxsZXN0IGZyYW1lcmF0ZSBmb3IgdmlkZW8gKi8KLQotICAgIE00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkUgPSAxMDA7IC8qIGNvbXByZXNzZWQgKi8KLSAgICBNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFID0gMTAwOyAvKiBjb21wcmVzc2VkICovCi0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLQotICAgIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQiA9IG5iQXVkaW9GcmFtZXMgLyAxMCArIDE7Ci0KLSNlbHNlCi0KLSAgICBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIgPSBuYkF1ZGlvRnJhbWVzIC8gMzggKyAxOwotCi0jZW5kaWYKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0jZWxzZQotCi0gICAgLyogVklERU8gNSBtaW4gYXQgMjUgZnBzIG51bGwtZW5jICovCi0KLSAgICBNNE1QNFdfU1RUU19BTExPQ19TSVpFID0gMjAwMDA7Ci0gICAgTTRNUDRXX1NUU1pfQUxMT0NfU0laRSA9IDE4MDAwOwotICAgIE00TVA0V19TVFNTX0FMTE9DX1NJWkUgPSA1MDAwOwotICAgIE00TVA0V19DSFVOS19BTExPQ19OQiA9IDUwMDsKLQotICAgIC8qIEFVRElPIDIgbWluIGFhYysgbnVsbC1lbmMgKi8KLQotICAgIE00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkUgPSAzMjAwMDsKLSAgICBNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFID0gMjAwMDA7Ci0gICAgTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CID0gMTAwMDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0jZW5kaWYgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX29wZW5Xcml0ZShNNE9TQV9Db250ZXh0ICpjb250ZXh0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3V0cHV0RmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqZmlsZVdyaXRlckZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdGVtcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpmaWxlUmVhZGVyRnVuY3Rpb24gKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSBNNE9TQV9OVUxMOwotCi0gICAgRVJSX0NIRUNLKE00T1NBX05VTEwgIT0gY29udGV4dFB0ciwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBvdXRwdXRGaWxlRGVzY3JpcHRvciwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBmaWxlV3JpdGVyRnVuY3Rpb24sIE00RVJSX1BBUkFNRVRFUik7Ci0jaWZkZWYgX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAvKiBPcHRpb25hbCwgZmVhdHVyZSB3b24ndCBiZSB1c2VkIGlmIE5VTEwgKi8KLQotICAgIE00T1NBX1RSQUNFMl8xKCJ0ZW1wRmlsZURlc2NyaXB0b3IgPSAlcCIsIHRlbXBGaWxlRGVzY3JpcHRvcik7Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSB0ZW1wRmlsZURlc2NyaXB0b3IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJ0ZW1wRmlsZURlc2NyaXB0b3IgaXMgTlVMTCwgUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFIGZlYXR1cmUgbm90IHVzZWQiKTsKLSAgICB9Ci0KLSNlbHNlIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0gICAgLyogTm90IHVzZWQgOiBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSB0ZW1wRmlsZURlc2NyaXB0b3IsIE00RVJSX1BBUkFNRVRFUik7ICovCi0jZW5kaWYgLyogX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgKi8KLSAgICAvKiBOb3QgdXNlZCA6IEVSUl9DSEVDSyhNNE9TQV9OVUxMICE9IGZpbGVSZWFkZXJGdW5jdGlvbiwgTTRFUlJfUEFSQU1FVEVSKTsgKi8KLQotICAgIC8qIFRoZSBjb250ZXh0IHJldXNlIG1vZGUgd2FzIHN1cHByZXNzZWQqLwotCi0gICAgbU1wNEZpbGVEYXRhUHRyID0KLSAgICAgICAgKE00TVA0V19NcDRGaWxlRGF0YSAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRNUDRXX01wNEZpbGVEYXRhKSwKLSAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJNUDQgd3JpdGVyIGNvbnRleHQiKTsKLSAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICBtTXA0RmlsZURhdGFQdHItPnVybCA9IG91dHB1dEZpbGVEZXNjcmlwdG9yOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciA9IE00T1NBX05VTEw7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyID0gTTRPU0FfTlVMTDsKLSAgICBtTXA0RmlsZURhdGFQdHItPk1heENodW5rU2l6ZSA9IE00TVA0V19EZWZhdWx0TWF4Q2h1bmtTaXplOyAvKmRlZmF1bHQgICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhBVVNpemUgPSBNNE1QNFdfRGVmYXVsdE1heEF1U2l6ZTsgICAgICAgLypkZWZhdWx0ICAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1ciA9Ci0gICAgICAgIE00TVA0V19EZWZhdWx0SW50ZXJsZWF2ZUR1cjsgLypkZWZhdWx0ID0gMCwgaS5lLiBub3QgdXNlZCovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZSA9IDA7IC8qZGVmYXVsdCA9IDAsIGkuZS4gbm90IHVzZWQqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+Y2FtY29kZXJWZXJzaW9uID0gMDsgLypkZWZhdWx0IGlzICIgMC4wLjAiKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nID0KLSAgICAgICAgTTRPU0FfTlVMTDsgLypkZWZhdWx0IGlzIGluIEJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRFbWJlZGRlZFN0cmluZyAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcgPSBNNE9TQV9OVUxMOyAvKmRlZmF1bHQgaXMgMCAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZUR1cmF0aW9uID0gMDsgLypkZWZhdWx0ID0gMCwgaS5lLiBub3QgdXNlZCovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMgPSBmaWxlV3JpdGVyRnVuY3Rpb247Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9IE00T1NBX0ZBTFNFOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPSBNNE9TQV9GQUxTRTsKLSAgICBtTXA0RmlsZURhdGFQdHItPnN0YXRlID0gTTRNUDRXX29wZW5lZDsKLSAgICBtTXA0RmlsZURhdGFQdHItPmR1cmF0aW9uID0gMDsgLyppKi8KLSAgICAvKnBhdGNoIGZvciBpbnRlZ3JhdGlvblRhZyAxNzQgLT4gMjM4ICgrNjQpKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplID0KLSAgICAgICAgMjM4OyAvKmluaXRpYWxpemF0aW9uIHdpdGggY29uc3RhbnQgcGFydCBpbiBmdHlwK21kYXQrbW9vditza2lwKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPSBNNE9TQV9GQUxTRTsKLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNDaHVua0R1ciA9Ci0gICAgICAgIDA7IC8qc2V0IGFuZCB1c2VkIG9ubHkgd2hlbiBlc3RpbWF0ZUF1ZGlvU2l6ZSBpcyB0cnVlKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNTdG9wVGltZSA9Ci0gICAgICAgIDA7IC8qc2V0IGFuZCB1c2VkIG9ubHkgd2hlbiBlc3RpbWF0ZUF1ZGlvU2l6ZSBpcyB0cnVlKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIC8qICsgQ1JMVjY3NzUgLUguMjY0IHRyaW1taW5nICovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5iTVVMUFBTU1BTID0gTTRPU0FfRkFMU0U7Ci0gICAgLyogLSBDUkxWNjc3NSAtSC4yNjQgdHJpbW1pbmcgKi8KLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zID0KLSAgICAgICAgMzI7IC8qaW5pdCB3aXRoIGZ0eXAgKyBiZWdpbm5pbmcgb2YgbWRhdCBzaXplKi8KLQotI2VuZGlmCi0KLSNpZmRlZiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsID0gdGVtcEZpbGVEZXNjcmlwdG9yOwotICAgIG1NcDRGaWxlRGF0YVB0ci0+Y2xlYW5TYWZldHlGaWxlID0KLSAgICAgICAgTTRPU0FfRkFMU0U7IC8qIE5vIG5lZWQgdG8gY2xlYW4gaXQganVzdCB5ZXQuICovCi0KLSNlbmRpZiAgICAgICAgICAgICAgIC8qIF9NNE1QNFdfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFICovCi0KLSAgICAvKiBmdHlwIGF0b20gKi8KLQotICAgIG1lbXNldCgodm9pZCAqKSAmbU1wNEZpbGVEYXRhUHRyLT5mdHlwLDAsCi0gICAgICAgIHNpemVvZihtTXA0RmlsZURhdGFQdHItPmZ0eXApKTsKLQotICAgICpjb250ZXh0UHRyID0gbU1wNEZpbGVEYXRhUHRyOwotCi0gICAgTTRNUDRXX2luaXRpYWxpemVBbGxvY2F0aW9uUGFyYW1ldGVycyhtTXA0RmlsZURhdGFQdHIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX2FkZFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiAqc3RyZWFtRGVzY1B0ciApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0KLSAgICBFUlJfQ0hFQ0soTTRPU0FfTlVMTCAhPSBjb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgRVJSX0NIRUNLKCggbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfb3BlbmVkKQotICAgICAgICB8fCAobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfcmVhZHkpLCBNNEVSUl9TVEFURSk7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9IE00TVA0V19yZWFkeTsKLQotICAgIHN3aXRjaCAoc3RyZWFtRGVzY1B0ci0+c3RyZWFtVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotICAgICAgICBjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgLypBdWRpbyovCi0gICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+c3RyZWFtSUQgPT0gQXVkaW9TdHJlYW1JRCwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICAvKmNoZWNrIGlmIGFuIGF1ZGlvIHRyYWNrIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQqLwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfRkFMU0UsCi0gICAgICAgICAgICAgICAgTTRFUlJfQkFEX0NPTlRFWFQpOwotCi0gICAgICAgICAgICAvKmNoZWNrIGlmIGFsbG9jIG5lZWQgdG8gYmUgZG9uZSovCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyID09IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyID0gKE00TVA0V19BdWRpb1RyYWNrRGF0YQotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRNUDRXX0F1ZGlvVHJhY2tEYXRhKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJNNE1QNFdfQXVkaW9UcmFja0RhdGEiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV2UgbXVzdCBpbml0IHRoZXNlIHBvaW50ZXJzIGluIGNhc2UgYW4gYWxsb2MgYmVsbG93IGZhaWxzICovCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgLypub3cgZHluYW1pYyovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmsgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUNoYXIgKiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Q2h1bmsiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuayAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICoqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX1VDaGFyICopLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPkNodW5rIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbMF0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MgPSAxOwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuayA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gNDAyOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUgPQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4Q2h1bmtTaXplOyAvKiBpbml0IHZhbHVlICovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhBVVNpemU7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUyA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZSA9Ci0gICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+dGltZVNjYWxlOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVswXSA9IDA7ICAgICAvKmluaXQqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGVbMF0gPSAwOyAvKmluaXQqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlWzBdID0gMDsgICAvKmluaXQqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPQotICAgICAgICAgICAgICAgIDA7IC8qMXN0IGNodW5rIGlzIENodW5rWzBdKi8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyA9IDA7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYyA9IDA7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfcmVhZHk7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RTWiA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1heEJpdHJhdGUgPQotICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPm1heEJpdHJhdGU7Ci0KLSAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjUHRyLT5zdHJlYW1UeXBlID09IE00U1lTX2tBTVIpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+dGltZVNjYWxlID09IDgwMDAsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIDE2MDsgLypBTVI4K3RpbWVzY2FsZT04MDAwID0+IHNhbXBsZSBkdXJhdGlvbiAxNjAgY29uc3RhbnQqLwotCi0gICAgICAgICAgICAgICAgLypVc2UgZ2l2ZW4gRFNJIGlmIHBhc3NlZCwgZWxzZSB1c2UgZGVmYXVsdCB2YWx1ZSovCi0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKmFtciBEU0kgaXMgOSBieXRlcyBsb25nICEqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgOTsgLyphbHdheXMgOSBmb3IgYW1yKi8KLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplID09IDksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoOSwgTTRNUDRfV1JJVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgOSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7IC8qZGVmYXVsdCBzdGF0aWMgYmxvY2sgd2lsbCBiZSB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDA7IC8qYnV0IHRoZSBhY3R1YWwgc3RhdGljIGRzaSBpcyA5IGJ5dGVzICEqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGUgPT0gTTRTWVNfa0VWUkMpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRTWVNfa0VWUkM7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPnRpbWVTY2FsZSA9PSA4MDAwLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAxNjA7IC8qRVZSQyt0aW1lc2NhbGU9ODAwMCA9PiBzYW1wbGUgZHVyYXRpb24gMTYwIGNvbnN0YW50Ki8KLQotICAgICAgICAgICAgICAgIC8qVXNlIGdpdmVuIERTSSBpZiBwYXNzZWQsIGVsc2UgdXNlIGRlZmF1bHQgdmFsdWUqLwotICAgICAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypldnJjIERTSSBpcyA2IGJ5dGVzIGxvbmcgISovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICA2OyAvKmFsd2F5cyA2IGZvciBldnJjKi8KLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplID09IDYsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoNiwgTTRNUDRfV1JJVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiYXVkaW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgNik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7IC8qZGVmYXVsdCBzdGF0aWMgYmxvY2sgd2lsbCBiZSB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDA7IC8qYnV0IHRoZSBhY3R1YWwgc3RhdGljIGRzaSBpcyA2IGJ5dGVzICEqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLypNNFNZU19rQUFDKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKmF2ZyBiaXRyYXRlIHNob3VsZCBiZSBzZXQqLwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZSAhPSAtMSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+bWF4Qml0cmF0ZSAhPSAtMSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUgPQotICAgICAgICAgICAgICAgICAgICBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAwOyAvKmRvbid0IGtub3cgZm9yIGFhYywgc28gc2V0IDAqLwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotCi0gICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+ZHNpU2l6ZSAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypubyBkc2k6IHJldHVybiBiYWQgcGFyYW1ldGVyID8qLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRTWVNfa01QRUdfNCk6Ci0gICAgICAgIGNhc2UgKE00U1lTX2tIMjY0KToKLSAgICAgICAgY2FzZSAoTTRTWVNfa0gyNjMpOgotICAgICAgICAgICAgLypWaWRlbyovCi0gICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+c3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICAvKmNoZWNrIGlmIGEgdmlkZW8gdHJhY2sgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCovCi0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSwKLSAgICAgICAgICAgICAgICBNNEVSUl9CQURfQ09OVEVYVCk7Ci0KLSAgICAgICAgICAgIC8qY2hlY2sgaWYgYWxsb2MgbmVlZCB0byBiZSBkb25lKi8KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgPSAoTTRNUDRXX1ZpZGVvVHJhY2tEYXRhCi0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE1QNFdfVmlkZW9UcmFja0RhdGEpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopIk00TVA0V19WaWRlb1RyYWNrRGF0YSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBXZSBtdXN0IGluaXQgdGhlc2UgcG9pbnRlcnMgaW4gY2FzZSBhbiBhbGxvYyBiZWxsb3cgZmFpbHMgKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgIC8qbm93IGR5bmFtaWMqLwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICoqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VDaGFyICopLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkNodW5rIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotCi0jZWxzZQotICAgICAgICAgICAgICAgIC8qcmUtdXNlIHRoZSBzYW1lIGNodW5rIGFuZCBmbHVzaCBpdCB3aGVuIGZ1bGwqLwotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE9TQV9VQ2hhciAqKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5DaHVuayIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRNUDRXX0NIVU5LX0FMTE9DX05CCi0gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfQ0hVTktfQUxMT0NfTkIKLSAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUiKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE1QNFdfVGltZTMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19DSFVOS19BTExPQ19OQgotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihNNE1QNFdfVGltZTMyKSwKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlIik7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZQotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuayA9IDA7Ci0gICAgICAgICAgICAgICAgLyp0YWJsZXMgYXJlIG5vdyBkeW5hbWljKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFRTX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUyIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFMKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MgPSAxOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1ogPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFNaX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiIpOwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhNNE1QNFdfU1RTWl9BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1oiKTsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzID0gMTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKE00TVA0V19TVFNTX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUyIpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3NCbG9ja3MgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDQ2MjsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+d2lkdGggPSBNNE1QNFdfRGVmYXVsdFdpZHRoOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5oZWlnaHQgPSBNNE1QNFdfRGVmYXVsdEhlaWdodDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPk1heEFVU2l6ZTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUgPQotICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPnN0cmVhbVR5cGU7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZSA9Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhDaHVua1NpemU7IC8qIGluaXQgdmFsdWUgKi8KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVcGVyQ2h1bmsgPQotICAgICAgICAgICAgICAgIE00TVA0V19WSURFT19NQVhfQVVfUEVSX0NIVU5LOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbURlc2NQdHItPnRpbWVTY2FsZSA9PSAxMDAwLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZSA9IDEwMDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUyA9IDA7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVswXSA9IDA7ICAgICAvKmluaXQqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGVbMF0gPSAwOyAvKmluaXQqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlWzBdID0gMDsgICAvKmluaXQqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPQotICAgICAgICAgICAgICAgIDA7IC8qMXN0IGNodW5rIGlzIENodW5rWzBdKi8KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyA9IDA7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYyA9IDA7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIgPSAwOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX3JlYWR5OwotCi0gICAgICAgICAgICBpZiAoc3RyZWFtRGVzY1B0ci0+c3RyZWFtVHlwZSA9PSBNNFNZU19rSDI2MykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKCBzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKHN0cmVhbURlc2NQdHItPm1heEJpdHJhdGUgPT0gLTEpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyp0aGUgYml0cmF0ZSB3aWxsIG5vdCBiZSB3cml0dGVuIGlmIHRoZSBiaXRyYXRlIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICBpcyBub3QgZnVsbHkgc2V0ICovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSA9IC0xOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1heEJpdHJhdGUgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypwcm9wcmlldGFyeSBzdG9yYWdlIG9mIGgyNjMgYml0cmF0ZS4KLSAgICAgICAgICAgICAgICAgICAgIFdhcm5pbmc6IG5vdCB0aGUgYWN0dWFsIGJpdHJhdGUgKGJpdCBzZXQgdG8gMSkuKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5hdmdCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmF2ZXJhZ2VCaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1heEJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+bWF4Qml0cmF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKCAwICE9IHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKQotICAgICAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCAhPSBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qZGVjb2RlciBzcGVjaWZpYyBpbmZvIHNpemUgaXMgc3VwcG9zZWQgdG8gYmUgYWx3YXlzIDcgYnl0ZXMgbG9uZyAqLwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPT0gNywKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qdXNlIHRoZSBkZWZhdWx0IGRzaSovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjUHRyLT5zdHJlYW1UeXBlID09IE00U1lTX2tNUEVHXzQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSAyMjsgLypleHRyYSBieXRlcyAoZnJvbSBoMjYzKSovCi0gICAgICAgICAgICAgICAgLyogYWxsb3cgRFNJIHRvIGJlIE00T1NBX05VTEwsIGluIHdoaWNoIGNhc2UgdGhlIGFjdHVhbCBEU0kgd2lsbCBiZQotICAgICAgICAgICAgICAgICBzZXQgYnkgc2V0T3B0aW9uLiAqLwotICAgICAgICAgICAgICAgIGlmICgoIDAgPT0gc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm8pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1QNFYgc3BlY2lmaWMqLwotICAgICAgICAgICAgICAgICAgICAvKmRlY29kZXIgc3BlY2lmaWMgaW5mbyBzaXplIGlzIHN1cHBvc2VkIHRvIGJlIGFsd2F5cyA8Ci0gICAgICAgICAgICAgICAgICAgICAgICAxMDUgc28gdGhhdCBFU0Qgc2l6ZSBjYW4gYmUgY29kZWQgd2l0aCAxIGJ5dGUqLwotICAgICAgICAgICAgICAgICAgICAvKih0aGlzIHNob3VsZCBub3QgYmUgcmVzdHJpY3RpdmUgYmVjYXVzZSBkc2kgaXMgYWx3YXlzIHNob3J0ZXIgISkqLwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPCAxMDUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+RFNJIik7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyphdmcgYml0cmF0ZSBzaG91bGQgYmUgc2V0Ki8KLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0soc3RyZWFtRGVzY1B0ci0+YXZlcmFnZUJpdHJhdGUgIT0gLTEsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5hdmdCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5tYXhCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzdHJlYW1EZXNjUHRyLT5zdHJlYW1UeXBlID09IE00U1lTX2tIMjY0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEgyNjQgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5hdmVyYWdlQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1heEJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5tYXhCaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgaWYgKCgwICE9IHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKQotICAgICAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCAhPSBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qICsgSC4yNjQgdHJpbW1pbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX1RSVUUgPT0gbU1wNEZpbGVEYXRhUHRyLT5iTVVMUFBTU1BTKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYgU1BTTGVuZ3RoLCBQUFNMZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MTYgKkRTSTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIHRoZSBEU0kgc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDI0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBEU0kgKFNQUyArIFBQUykgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgRFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2ICopc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mbzsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNQU0xlbmd0aCA9IERTSVs2XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBQU0xlbmd0aCA9IERTSVsxMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgoc3RyZWFtRGVzY1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbykrMTIpLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0kpKzIpLCAodm9pZCAqKSgoc3RyZWFtRGVzY1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbykrMjgpLCBTUFNMZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJKSsyICsgU1BTTGVuZ3RoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgoc3RyZWFtRGVzY1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mbykrMjApLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU0kpKzQgKyBTUFNMZW5ndGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKChzdHJlYW1EZXNjUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvKSsyOCArIFNQU0xlbmd0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBTTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0gSC4yNjQgdHJpbW1pbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIHRoZSBEU0kgc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtRGVzY1B0ci0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIERTSSAoU1BTICsgUFBTKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VQ2hhciAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjUHRyLT5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1EZXNjUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2NQdHItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKnVzZSB0aGUgZGVmYXVsdCBkc2kqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfc3RhcnRXcml0aW5nKCBNNE9TQV9Db250ZXh0IGNvbnRleHQgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIGZpbGVNb2RlQWNjZXNzID0gTTRPU0Ffa0ZpbGVXcml0ZSB8IE00T1NBX2tGaWxlQ3JlYXRlOwotICAgIE00T1NBX1VJbnQzMiBpOwotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfcmVhZHkpLCBNNEVSUl9TVEFURSk7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9IE00TVA0V193cml0aW5nOwotCi0gICAgLyphdWRpbyBtaWNyb3N0YXRlICovCi0gICAgLyogICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKSovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8pCi0gICAgewotICAgICAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9PSBNNE1QNFdfcmVhZHkpLAotICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfd3JpdGluZzsKLQotICAgICAgICAvKiBGaXJzdCBhdWRpbyBjaHVuayBhbGxvY2F0aW9uICovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbMF0gPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5DaHVua1swXSIpOwotICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgIH0KLQotICAgIC8qdmlkZW8gbWljcm9zdGF0ZSovCi0gICAgLyogICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKSovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8pCi0gICAgewotICAgICAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9PSBNNE1QNFdfcmVhZHkpLAotICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfd3JpdGluZzsKLQotICAgICAgICAvKiBGaXJzdCB2aWRlbyBjaHVuayBhbGxvY2F0aW9uICovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0gPSAoTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5DaHVua1swXSIpOwotICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotICAgIH0KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX1RSVUUpCi0gICAgewotICAgICAgICAvKnNldCBhdWRpb01zQ2h1bmtEdXIgKGR1cmF0aW9uIGluIG1zIGJlZm9yZSBhIG5ldyBjaHVuayBpcyBjcmVhdGVkKQotICAgICAgICAgZm9yIGF1ZGlvIHNpemUgZXN0aW1hdGlvbiovCi0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvLCBNNEVSUl9CQURfQ09OVEVYVCk7Ci0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvLCBNNEVSUl9CQURfQ09OVEVYVCk7Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb01zQ2h1bmtEdXIgPQotICAgICAgICAgICAgMjAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZQotICAgICAgICAgICAgLyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZTsKLQotICAgICAgICBpZiAoKCBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIgIT0gMCkKLSAgICAgICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIKLSAgICAgICAgICAgIDwgMjAgKm1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplCi0gICAgICAgICAgICAvIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplKSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb01zQ2h1bmtEdXIgPSBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAvKm9wZW4gZmlsZSBpbiB3cml0ZSBiaW5hcnkgbW9kZSovCi0KLSAgICBlcnIgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPm9wZW5Xcml0ZSgKLSAgICAgICAgJm1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dXJsLCBmaWxlTW9kZUFjY2Vzcyk7Ci0gICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0KLSAgICAvKmZ0eXAgYXRvbSovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5tYWpvcl9icmFuZCAhPSAwKQotICAgIHsKLSAgICAgICAgLyogUHV0IGN1c3RvbWl6ZWQgZnR5cCBib3ggKi8KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKDE2ICsgKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5uYkNvbXBhdGlibGVCcmFuZHMgKiA0KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotICAgICAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyKSwgZXJyKTsKLSAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJFMzIoTTRNUEFDX0ZUWVBfVEFHLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotICAgICAgICBlcnIgPSBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmZ0eXAubWFqb3JfYnJhbmQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0gICAgICAgIGVyciA9IE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5taW5vcl92ZXJzaW9uLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbU1wNEZpbGVEYXRhUHRyLT5mdHlwLm5iQ29tcGF0aWJsZUJyYW5kczsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5mdHlwLmNvbXBhdGlibGVfYnJhbmRzW2ldLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFB1dCBkZWZhdWx0IGZ0eXAgYm94ICovCi0gICAgICAgIGVyciA9IE00TVA0V19wdXRCbG9jayhEZWZhdWx0X2Z0eXAsIHNpemVvZihEZWZhdWx0X2Z0eXApLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotICAgIH0KLQotICAgIC8qaW5pdCBtZGF0IHZhbHVlIHdpdGggMCBidXQgdGhlIHJpZ2h0IHZhbHVlIGlzIHNldCBqdXN0IGJlZm9yZSB0aGUgZmlsZSBpcyBjbG9zZWQqLwotICAgIGVyciA9IE00TVA0V19wdXRCRTMyKDAsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0gICAgZXJyID0gTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMiwgc2l6ZW9mKENvbW1vbkJsb2NrMiksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0gICAgRVJSX0NIRUNLKChNNE5PX0VSUk9SID09IGVyciksIGVycik7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSNpZmRlZiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotCi0gICAgaWYgKDAgIT0gbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZQotICAgICAgICAmJiBNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+c2FmZXR5RmlsZVVybCkKLSAgICB7Ci0gICAgICAgIE00T1NBX0VSUiBlcnIyID0gTTROT19FUlJPUjsKLSAgICAgICAgTTRPU0FfQ29udGV4dCBzYWZldHlGaWxlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBzYWZldHlGaWxlU2l6ZSA9IDAsIGFkZGVuZHVtID0gMDsKLSAgICAgICAgTTRPU0FfVUNoYXIgZHVtbXlEYXRhWzEwMF07IC8qIFRvIGZpbGwgdGhlIHNhZmV0eSBmaWxlIHdpdGggKi8KLQotICAgICAgICBlcnIgPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT5vcGVuV3JpdGUoJnNhZmV0eUZpbGVDb250ZXh0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsLCBmaWxlTW9kZUFjY2Vzcyk7Ci0gICAgICAgIEVSUl9DSEVDSygoTTROT19FUlJPUiA9PSBlcnIpLCBlcnIpOwotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+Y2xlYW5TYWZldHlGaWxlID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKiAxMCUgc2VlbXMgdG8gYmUgYSByZWFzb25hYmxlIHdvcnN0IGNhc2UsIGJ1dCBhbHNvIHByb3Zpc2lvbiBmb3IgMWtiIG9mIG1vb3Ygb3ZlcmhlYWQuKi8KLSAgICAgICAgc2FmZXR5RmlsZVNpemUgPSAxMDAwICsgKG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZVNpemUgKiAxMCArIDk5KSAvIDEwMDsKLQotICAgICAgICAvKiBIZXJlIHdlIGFkZCBzcGFjZSB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgZmFjdCB3ZSBoYXZlIHRvIGZsdXNoIGFueSBwZW5kaW5nCi0gICAgICAgIGNodW5rIGluIGNsb3NlV3JpdGUsIHRoaXMgc3BhY2UgaXMgdGhlIHN1bSBvZiB0aGUgbWF4aW11bSBjaHVuayBzaXplcywgZm9yIGVhY2gKLSAgICAgICAgdHJhY2suICovCi0KLSNpZm5kZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNhZmV0eUZpbGVTaXplICs9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYWZldHlGaWxlU2l6ZSArPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbXNldCgodm9pZCAqKWR1bW15RGF0YSwgMHhDQSxzaXplb2YoZHVtbXlEYXRhKSk7IC8qIEZvciBleHRyYSBzYWZldHkuICovCi0KLSAgICAgICAgZm9yICggaSA9IDA7Ci0gICAgICAgICAgICBpIDwgKHNhZmV0eUZpbGVTaXplICsgc2l6ZW9mKGR1bW15RGF0YSkgLSAxKSAvIHNpemVvZihkdW1teURhdGEpOwotICAgICAgICAgICAgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLT53cml0ZURhdGEoCi0gICAgICAgICAgICAgICAgc2FmZXR5RmlsZUNvbnRleHQsIGR1bW15RGF0YSwgc2l6ZW9mKGR1bW15RGF0YSkpOwotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiBEb24ndCByZXR1cm4gZnJvbSB0aGUgZnVuY3Rpb24geWV0LCBhcyB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBmaWxlIGZpcnN0LiAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSSBkb24ndCBuZWVkIHRvIGtlZXAgaXQgb3Blbi4gKi8KLSAgICAgICAgZXJyMiA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPmNsb3NlV3JpdGUoc2FmZXR5RmlsZUNvbnRleHQpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBFUlJfQ0hFQ0soKE00Tk9fRVJST1IgPT0gZXJyMiksIGVycjIpOwotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJTYWZldHkgZmlsZSBjb3JyZWN0bHkgY3JlYXRlZCIpOwotICAgIH0KLSNlbmRpZiAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX25ld0F1ZGlvQ2h1bmsoIE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKmxlZnRTcGFjZUluQ2h1bmsgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIE00T1NBX0RvdWJsZSBzY2FsZV9hdWRpbzsKLQotI2lmbmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgTTRPU0FfVUludDMyIHJlYWxsb2NOYjsKLQotI2VuZGlmCi0KLSAgICAvKiB2aWRlbyBvbmx5ICovCi0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyID09IE00T1NBX05VTEwpCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIiBNNE1QNFdfbmV3QXVkaW9DaHVuayAtIGZsdXNoIGF1ZGlvIik7Ci0gICAgTTRPU0FfVFJBQ0UxXzIoImN1cnJlbnQgY2h1bmsgPSAlZCAgb2Zmc2V0ID0gMHgleCIsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcyk7Ci0KLSAgICBzY2FsZV9hdWRpbyA9IDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSNpZm5kZWYgX000TVA0V19NT09WX0ZJUlNUCi0gICAgLypmbHVzaCBjaHVuayovCi0KLSAgICBlcnIgPSBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVua1swXSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHRlbXAgPSBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvczsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoCi0gICAgICAgICAgICAiTTRNUDRXX25ld0F1ZGlvQ2h1bms6IHB1dEJsb2NrIGVycm9yIHdoZW4gZmx1c2hpbmcgY2h1bms6ICUjWCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICAvKiBPdWNoLCB3ZSBnb3QgYW4gZXJyb3Igd3JpdGluZyB0byB0aGUgZmlsZSwgYnV0IHdlIG5lZWQgdG8gcHJvcGVybHkgcmVhY3Qgc28gdGhhdCB0aGUKLSAgICAgICAgIHN0YXRlIGlzIHN0aWxsIGNvbnNpc3RlbnQgYW5kIHdlIGNhbiBwcm9wZXJseSBjbG9zZSB0aGUgZmlsZSBzbyB0aGF0IHdoYXQgaGFzIGJlZW4KLSAgICAgICAgIHJlY29yZGVkIHNvIGZhciBpcyBub3QgbG9zdC4gWWF5IGVycm9yIHJlY292ZXJ5ISAqLwotCi0gICAgICAgIC8qIEZpcnN0LCB3ZSBkbyBub3Qga25vdyB3aGVyZSB3ZSBhcmUgaW4gdGhlIGZpbGUuIFB1dCB1cyBiYWNrIGF0IHdoZXJlIHdlIHdlcmUgYmVmb3JlCi0gICAgICAgIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIGRhdGEuIFRoYXQgd2F5LCB3ZSdyZSBjb25zaXN0ZW50IHdpdGggdGhlIGNodW5rIHN0YXRlIGRhdGEuICovCi0gICAgICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+c2VlaygKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZ0ZW1wKTsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMygKLSAgICAgICAgICAgICJCYWNrdHJhY2tpbmcgdG8gcG9zaXRpb24gMHglMDhYLCBzZWVrIHJldHVybmVkICVkIGFuZCBwb3NpdGlvbiAlMDhYIiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zLCBlcnIsIHRlbXApOwotCi0gICAgICAgIC8qIFRoZW4sIGRvIG5vdCB1cGRhdGUgYW55IGluZm8gd2hhdHNvZXZlciBpbiB0aGUgd3JpdGluZyBzdGF0ZS4gVGhpcyB3aWxsIGhhdmUgdGhlCi0gICAgICAgICBjb25zZXF1ZW5jZSB0aGF0IGl0IHdpbGwgYmUgYXMgaWYgdGhlIGNodW5rIGhhcyBub3QgYmVlbiBmbHVzaGVkIHlldCwgYW5kIHRoZXJlZm9yZQotICAgICAgICAgaXQgd2lsbCBiZSBkb25lIGFzIHBhcnQgb2YgY2xvc2VXcml0ZSAod2hlcmUgdGhlcmUgY291bGQgYmUgcm9vbSB0byBkbyBzbywKLSAgICAgICAgIGlmIHNvbWUgZW1lcmdlbmN5IHJvb20gaXMgZnJlZWQgZm9yIHRoYXQgcHVycG9zZSkuICovCi0KLSAgICAgICAgLyogQW5kIGxhc3RseSAoZm9yIGhlcmUpLCByZXR1cm4gdGhhdCB3ZSd2ZSByZWFjaGVkIHRoZSBsaW1pdCBvZiBhdmFpbGFibGUgc3BhY2UuICovCi0KLSAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgfQotCi0gICAgLyp1cGRhdGUgY2h1bmsgb2Zmc2V0Ki8KLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICBjaHVua09mZnNldFRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zOwotCi0gICAgLyphZGQgY2h1bmsgc2l6ZSB0byBhYnNvbHV0ZUN1cnJlbnRQb3MqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zICs9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvczsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIC8qdXBkYXRlIGNodW5rIGluZm8gKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2l6ZVRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvczsKLSAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICBjaHVua1RpbWVNc1RhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTOwotCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgKz0gMTsKLSAgICAvKmlmIGF1ZGlvIGFtb3VudCBvZiBkYXRhIGlzIG5vdCBlc3RpbWF0ZWQqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX0ZBTFNFKQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDE2OwotCi0gICAgLyphbGxvYyBuZXcgY2h1bmsqLwotICAgIC8qb25seSBpZiBub3QgYWxyZWFkeSBhbGxvY2F0ZWQqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuawotICAgICAgICAgICAgPiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuaykKLSAgICB7Ci0gICAgICAgIC8qdXBkYXRlIExhc3RBbGxvY2F0ZWRDaHVuayAoIC0+ID0gY3VycmVudENodW5rKSovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rICs9IDE7Ci0KLSAgICAgICAgLyptYXggbmIgb2YgY2h1bmsgaXMgbm93IGR5bmFtaWMqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rCi0gICAgICAgICAgICArIDMgPiBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfbmV3QXVkaW9DaHVuayA6IGF1ZGlvIGNodW5rIHRhYmxlIGlzIGZ1bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgaWYgKCgobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmspCi0gICAgICAgICAgICAlIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVhbGxvY05iID0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5MYXN0QWxsb2NhdGVkQ2h1bmsKLSAgICAgICAgICAgICAgICArIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQjsKLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKiogKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5DaHVuaywKLSAgICAgICAgICAgICAgICAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VQ2hhciAqKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUNoYXIgKikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmsgIT0gTTRPU0FfTlVMTCwKLSAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua09mZnNldFRhYmxlLAotICAgICAgICAgICAgICAgICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VJbnQzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtPZmZzZXRUYWJsZQotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua1NpemVUYWJsZSwKLSAgICAgICAgICAgICAgICAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VSW50MzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGUsCi0gICAgICAgICAgICAgICAgKCByZWFsbG9jTmIgLSBNNE1QNFdfQ0hVTktfQVVESU9fQUxMT0NfTkIpCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUludDMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGUKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00TVA0V19UaW1lMzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZSwKLSAgICAgICAgICAgICAgICAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BVURJT19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE1QNFdfVGltZTMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRNUDRXX1RpbWUzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZQotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgfQotI2VuZGlmIC8qX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUqLwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENodW5rW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUsCi0gICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopImF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayIpOwotICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENodW5rW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXQotICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICB9Ci0KLSAgICAvKnVwZGF0ZSBsZWZ0U3BhY2VJbkNodW5rLCBjdXJyZW50UG9zIGFuZCBjdXJyZW50Q2h1bmtEdXIqLwotICAgICpsZWZ0U3BhY2VJbkNodW5rID0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemU7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zID0gMDsKLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0gICAgLyogY2hlY2sgd2V0aGVyIHRvIHVzZSBhIG5ldyBzdHNjIG9yIG5vdCAqLwotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2MgPiAwKQotICAgIHsKLSAgICAgICAgaWYgKCggbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudFN0c2NdICYgMHhGRkYpICE9IChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2MKLSAgICAgICAgICAgIC0gMV0gJiAweEZGRikpCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjICs9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYyArPSAxOwotCi0gICAgLyogbWF4IG5iIG9mIGNodW5rIGlzIG5vdyBkeW5hbWljICovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2MKLSAgICAgICAgKyAzID4gTTRNUDRXX0NIVU5LX0FVRElPX0FMTE9DX05CKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19uZXdBdWRpb0NodW5rIDogYXVkaW8gc3RzYyB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgIH0KLQotICAgIC8qIHNldCBuYiBvZiBzYW1wbGVzIGluIHRoZSBuZXcgY2h1bmsgdG8gMCAqLwotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjXSA9Ci0gICAgICAgIDAgKyAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgPDwgMTIpOwotCi0jZWxzZQotICAgIC8qc2V0IG5iIG9mIHNhbXBsZXMgaW4gdGhlIG5ldyBjaHVuayB0byAwKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPSAwOwotCi0jZW5kaWYKLQotICAgIC8qc2V0IHRpbWUgb2YgdGhlIG5ldyBjaHVuayB0byBsYXN0Q1RTIChmb3IgaW5pdGlhbGl6YXRpb24sIGJ1dCB1cGRhdGVkIGZ1cnRoZXIgdG8gdGhlCi0gICAgQ1RTIG9mIHRoZSBsYXN0IHNhbXBsZSBpbiB0aGUgY2h1bmspKi8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgKE00T1NBX1VJbnQzMikobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMKLSAgICAgICAgKiBzY2FsZV9hdWRpbyk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfbmV3VmlkZW9DaHVuayggTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqbGVmdFNwYWNlSW5DaHVuayApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00TVA0V19NcDRGaWxlRGF0YSAqbU1wNEZpbGVEYXRhUHRyID0gKE00TVA0V19NcDRGaWxlRGF0YSAqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRG91YmxlIHNjYWxlX3ZpZGVvOwotCi0jaWZuZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICBNNE9TQV9VSW50MzIgcmVhbGxvY05iOwotCi0jZW5kaWYKLQotICAgIC8qIGF1ZGlvIG9ubHkgKi8KLQotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX25ld1ZpZGVvQ2h1bmsgLSBmbHVzaCB2aWRlbyIpOwotICAgIE00T1NBX1RSQUNFMV8yKCJjdXJyZW50IGNodW5rID0gJWQgIG9mZnNldCA9IDB4JXgiLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuaywKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MpOwotCi0gICAgc2NhbGVfdmlkZW8gPSAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0gICAgLyogc2FtcGxlcyBhcmUgYWxyZWFkeSB3cml0dGVuIHRvIGZpbGUgKi8KLSNlbHNlCi0gICAgLypmbHVzaCBjaHVuayovCi0KLSAgICBlcnIgPSBNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVua1swXSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHRlbXAgPSBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvczsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoCi0gICAgICAgICAgICAiTTRNUDRXX25ld1ZpZGVvQ2h1bms6IHB1dEJsb2NrIGVycm9yIHdoZW4gZmx1c2hpbmcgY2h1bms6ICUjWCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICAvKiBPdWNoLCB3ZSBnb3QgYW4gZXJyb3Igd3JpdGluZyB0byB0aGUgZmlsZSwgYnV0IHdlIG5lZWQgdG8gcHJvcGVybHkgcmVhY3Qgc28gdGhhdCB0aGUKLSAgICAgICAgIHN0YXRlIGlzIHN0aWxsIGNvbnNpc3RlbnQgYW5kIHdlIGNhbiBwcm9wZXJseSBjbG9zZSB0aGUgZmlsZSBzbyB0aGF0IHdoYXQgaGFzIGJlZW4KLSAgICAgICAgIHJlY29yZGVkIHNvIGZhciBpcyBub3QgbG9zdC4gWWF5IGVycm9yIHJlY292ZXJ5ISAqLwotCi0gICAgICAgIC8qIEZpcnN0LCB3ZSBkbyBub3Qga25vdyB3aGVyZSB3ZSBhcmUgaW4gdGhlIGZpbGUuIFB1dCB1cyBiYWNrIGF0IHdoZXJlIHdlIHdlcmUgYmVmb3JlCi0gICAgICAgIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIGRhdGEuIFRoYXQgd2F5LCB3ZSdyZSBjb25zaXN0ZW50IHdpdGggdGhlIGNodW5rIHN0YXRlIGRhdGEuICovCi0gICAgICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+c2VlaygKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZ0ZW1wKTsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMygKLSAgICAgICAgICAgICJCYWNrdHJhY2tpbmcgdG8gcG9zaXRpb24gMHglMDhYLCBzZWVrIHJldHVybmVkICVkIGFuZCBwb3NpdGlvbiAlMDhYIiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zLCBlcnIsIHRlbXApOwotICAgICAgICAvKiBUaGVuLCBkbyBub3QgdXBkYXRlIGFueSBpbmZvIHdoYXRzb2V2ZXIgaW4gdGhlIHdyaXRpbmcgc3RhdGUuIFRoaXMgd2lsbCBoYXZlIHRoZQotICAgICAgICAgY29uc2VxdWVuY2UgdGhhdCBpdCB3aWxsIGJlIGFzIGlmIHRoZSBjaHVuayBoYXMgbm90IGJlZW4gZmx1c2hlZCB5ZXQsIGFuZCB0aGVyZWZvcmUgaXQKLSAgICAgICAgIHdpbGwgYmUgZG9uZSBhcyBwYXJ0IG9mIGNsb3NlV3JpdGUgKHdoZXJlIHRoZXJlIGNvdWxkIGJlIHJvb20gdG8gZG8gc28sIGlmIHNvbWUKLSAgICAgICAgIGVtZXJnZW5jeSByb29tIGlzIGZyZWVkIGZvciB0aGF0IHB1cnBvc2UpLiAqLwotCi0gICAgICAgIC8qIEFuZCBsYXN0bHkgKGZvciBoZXJlKSwgcmV0dXJuIHRoYXQgd2UndmUgcmVhY2hlZCB0aGUgbGltaXQgb2YgYXZhaWxhYmxlIHNwYWNlLgotICAgICAgICAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgZXJyb3Igb3JpZ2luYWxseSByZXR1cm5lZCBieSBwdXRCbG9jay4gKi8KLQotICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgLyp1cGRhdGUgY2h1bmsgb2Zmc2V0Ki8KLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgIGNodW5rT2Zmc2V0VGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3M7Ci0KLSAgICAvKmFkZCBjaHVuayBzaXplIHRvIGFic29sdXRlQ3VycmVudFBvcyovCi0gICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MgKz0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgLyp1cGRhdGUgY2h1bmsgaW5mbyBiZWZvcmUgdG8gZ28gZm9yIGEgbmV3IG9uZSovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICBjaHVua1NpemVUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAoTTRPU0FfVUludDMyKShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAqIHNjYWxlX3ZpZGVvKTsKLQotICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rICs9IDE7Ci0gICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSAxNjsKLQotICAgIC8qYWxsb2MgbmV3IGNodW5rKi8KLSAgICAvKm9ubHkgaWYgbm90IGFscmVhZHkgYWxsb2NhdGVkKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsKLSAgICAgICAgPiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuaykKLSAgICB7Ci0gICAgICAgIC8qdXBkYXRlIExhc3RBbGxvY2F0ZWRDaHVuayAoIC0+ID0gY3VycmVudENodW5rKSovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rICs9IDE7Ci0KLSAgICAgICAgLyptYXggbmIgb2YgY2h1bmsgaXMgbm93IGR5bmFtaWMqLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgaWYgKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkxhc3RBbGxvY2F0ZWRDaHVuawotICAgICAgICAgICAgKyAzID4gTTRNUDRXX0NIVU5LX0FMTE9DX05CKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX25ld1ZpZGVvQ2h1bmsgOiB2aWRlbyBjaHVuayB0YWJsZSBpcyBmdWxsIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgIGlmICgoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rKQotICAgICAgICAgICAgJSBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlYWxsb2NOYiA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TGFzdEFsbG9jYXRlZENodW5rCi0gICAgICAgICAgICAgICAgKyBNNE1QNFdfQ0hVTktfQUxMT0NfTkI7Ci0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5DaHVuayA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyICoqIClNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmssCi0gICAgICAgICAgICAgICAgKCByZWFsbG9jTmIKLSAgICAgICAgICAgICAgICAtIE00TVA0V19DSFVOS19BTExPQ19OQikgKiBzaXplb2YoTTRPU0FfVUNoYXIgKiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VDaGFyICopKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rICE9IE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgTTRFUlJfQUxMT0MpOwotCi0jZWxzZQotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgY2h1bmtPZmZzZXRUYWJsZSwgKCByZWFsbG9jTmIgLSBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpCi0gICAgICAgICAgICAgICAgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICByZWFsbG9jTmIgKiBzaXplb2YoTTRPU0FfVUludDMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2l6ZVRhYmxlLCAoIHJlYWxsb2NOYiAtIE00TVA0V19DSFVOS19BTExPQ19OQikKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50MzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE9TQV9VSW50MzIpKTsKLSAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2FtcGxlTmJUYWJsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGUsICggcmVhbGxvY05iIC0gTTRNUDRXX0NIVU5LX0FMTE9DX05CKQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX1VJbnQzMiksCi0gICAgICAgICAgICAgICAgcmVhbGxvY05iICogc2l6ZW9mKE00T1NBX1VJbnQzMikpOwotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rVGltZU1zVGFibGUgPQotICAgICAgICAgICAgICAgIChNNE1QNFdfVGltZTMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rVGltZU1zVGFibGUsICggcmVhbGxvY05iCi0gICAgICAgICAgICAgICAgLSBNNE1QNFdfQ0hVTktfQUxMT0NfTkIpICogc2l6ZW9mKE00TVA0V19UaW1lMzIpLAotICAgICAgICAgICAgICAgIHJlYWxsb2NOYiAqIHNpemVvZihNNE1QNFdfVGltZTMyKSk7Ci0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1RpbWVNc1RhYmxlCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICB9Ci0jZW5kaWYgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZSwKLSAgICAgICAgICAgIE00TVA0X1dSSVRFUiwgKE00T1NBX0NoYXIgKikidmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplIik7Ci0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ2h1bmtbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdCi0gICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIH0KLQotICAgIC8qdXBkYXRlIGxlZnRTcGFjZUluQ2h1bmssIGN1cnJlbnRQb3MgYW5kIGN1cnJlbnRDaHVua0R1ciovCi0gICAgKmxlZnRTcGFjZUluQ2h1bmsgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZTsKLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MgPSAwOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICAvKiBjaGVjayB3ZXRoZXIgdG8gdXNlIGEgbmV3IHN0c2Mgb3Igbm90ICovCi0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYyA+IDApCi0gICAgewotICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGN1cnJlbnRTdHNjXSAmIDB4RkZGKSAhPSAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjCi0gICAgICAgICAgICAtIDFdICYgMHhGRkYpKQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYyArPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MgKz0gMTsKLQotICAgIC8qIG1heCBuYiBvZiBjaHVuayBpcyBub3cgZHluYW1pYyAqLwotICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjCi0gICAgICAgICsgMyA+IE00TVA0V19DSFVOS19BTExPQ19OQikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNFdfbmV3VmlkZW9DaHVuayA6IHZpZGVvIHN0c2MgdGFibGUgaXMgZnVsbCIpOwotICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICB9Ci0KLSAgICAvKiBzZXQgbmIgb2Ygc2FtcGxlcyBpbiB0aGUgbmV3IGNodW5rIHRvIDAgKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzY10gPQotICAgICAgICAwICsgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rIDw8IDEyKTsKLQotI2Vsc2UKLSAgICAvKnNldCBuYiBvZiBzYW1wbGVzIGluIHRoZSBuZXcgY2h1bmsgdG8gMCovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0gMDsKLQotI2VuZGlmCi0KLSAgICAvKnNldCB0aW1lIG9mIHRoZSBuZXcgY2h1bmsgdG8gbGFzdENUUyAoZm9yIGluaXRpYWxpemF0aW9uLCBidXQgdXBkYXRlZCBmdXJ0aGVyIHRvIHRoZQotICAgIENUUyBvZiB0aGUgbGFzdCBzYW1wbGUgaW4gdGhlIGNodW5rKSovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICBjaHVua1RpbWVNc1RhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgIChNNE9TQV9VSW50MzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTCi0gICAgICAgICogc2NhbGVfdmlkZW8pOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3N0YXJ0QVUoIE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCAqYXVQdHIgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotCi0gICAgTTRPU0FfVUludDMyIGxlZnRTcGFjZUluQ2h1bms7Ci0gICAgTTRNUDRXX1RpbWUzMiBjaHVua0R1ck1zOwotCi0gICAgTTRPU0FfRG91YmxlIHNjYWxlX2F1ZGlvOwotICAgIE00T1NBX0RvdWJsZSBzY2FsZV92aWRlbzsKLQotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgRVJSX0NIRUNLKGF1UHRyICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMCgiLS0tLS0gTTRNUDRXX3N0YXJ0QVUgLS0tLS0iKTsKLQotICAgIC8qY2hlY2sgbWFjcm8gc3RhdGUqLwotICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfd3JpdGluZyksIE00RVJSX1NUQVRFKTsKLQotICAgIGlmIChzdHJlYW1JRCA9PSBBdWRpb1N0cmVhbUlEKSAvKmF1ZGlvIHN0cmVhbSovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRNUDRXX3N0YXJ0QVUgLT4gYXVkaW8iKTsKLQotICAgICAgICBzY2FsZV9hdWRpbyA9Ci0gICAgICAgICAgICAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotCi0gICAgICAgIC8qYXVkaW8gbWljcm9zdGF0ZSovCi0gICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlCi0gICAgICAgICAgICA9PSBNNE1QNFdfd3JpdGluZyksIE00RVJSX1NUQVRFKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX3dyaXRpbmdfc3RhcnRBVTsKLQotICAgICAgICBsZWZ0U3BhY2VJbkNodW5rID0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUKLSAgICAgICAgICAgIC0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8yKCJhdWRpbyAlZCAgJWQiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zLCBsZWZ0U3BhY2VJbkNodW5rKTsKLQotICAgICAgICBjaHVua0R1ck1zID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCggbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFMKLSAgICAgICAgICAgICogc2NhbGVfYXVkaW8pIC0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGN1cnJlbnRDaHVua10pOwotCi0gICAgICAgIGlmICgobGVmdFNwYWNlSW5DaHVuayA8IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplKQotICAgICAgICAgICAgfHwgKCggbU1wNEZpbGVEYXRhUHRyLT5JbnRlcmxlYXZlRHVyICE9IDApCi0gICAgICAgICAgICAmJiAoY2h1bmtEdXJNcyA+PSBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIpKSkKLSAgICAgICAgewotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotICAgICAgICAgICAgLyogb25seSBpZiB0aGVyZSBpcyBhdCBsZWFzdCAxIHZpZGVvIHNhbXBsZSBpbiB0aGUgY2h1bmsgKi8KLQotICAgICAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHIgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zID4gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY2xvc2UgdGhlIG9wZW5lZCB2aWRlbyBjaHVuayBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgYXVkaW8gb25lICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRNUDRXX25ld1ZpZGVvQ2h1bmsoY29udGV4dCwgJmxlZnRTcGFjZUluQ2h1bmspOwotCi0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0jZW5kaWYKLSAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggc3BhY2UgaW4gY3VycmVudCBjaHVuazogY3JlYXRlIGEgbmV3IG9uZSAqLwotCi0gICAgICAgICAgICBlcnIgPSBNNE1QNFdfbmV3QXVkaW9DaHVuayhjb250ZXh0LCAmbGVmdFNwYWNlSW5DaHVuayk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgYXVQdHItPnNpemUgPSBsZWZ0U3BhY2VJbkNodW5rOwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0gKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENodW5rW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXQotICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyk7Ci0KLSNlbHNlCi0KLSAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbMF0KLSAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MpOwotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIH0KLSAgICBlbHNlIGlmIChzdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlEKSAvKnZpZGVvIHN0cmVhbSovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRNUDRXX3N0YXJ0QVUgLT4gdmlkZW8iKTsKLQotICAgICAgICBzY2FsZV92aWRlbyA9Ci0gICAgICAgICAgICAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotCi0gICAgICAgIC8qdmlkZW8gbWljcm9zdGF0ZSovCi0gICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlCi0gICAgICAgICAgICA9PSBNNE1QNFdfd3JpdGluZyksIE00RVJSX1NUQVRFKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5taWNyb1N0YXRlID0gTTRNUDRXX3dyaXRpbmdfc3RhcnRBVTsKLQotICAgICAgICBsZWZ0U3BhY2VJbkNodW5rID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemUKLSAgICAgICAgICAgIC0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotCi0gICAgICAgIGNodW5rRHVyTXMgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAgICAgKiBzY2FsZV92aWRlbykgLSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtUaW1lTXNUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudENodW5rXSk7Ci0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLQotICAgICAgICBsZWZ0U3BhY2VJbkNodW5rID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhDaHVua1NpemU7Ci0KLSNlbmRpZgotCi0gICAgICAgIE00T1NBX1RSQUNFMl8yKCJ2aWRlbyAlZCAgJWQiLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zLCBsZWZ0U3BhY2VJbkNodW5rKTsKLQotICAgICAgICBpZiAoKCBsZWZ0U3BhY2VJbkNodW5rIDwgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVVNpemUpCi0gICAgICAgICAgICB8fCAoKCBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIgIT0gMCkKLSAgICAgICAgICAgICYmIChjaHVua0R1ck1zID49IG1NcDRGaWxlRGF0YVB0ci0+SW50ZXJsZWF2ZUR1cikpCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgfHwgKCggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVXBlckNodW5rICE9IDApCi0gICAgICAgICAgICAmJiAoKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjdXJyZW50U3RzY10gJiAweEZGRikKLSAgICAgICAgICAgID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4QVVwZXJDaHVuaykpCi0KLSNlbmRpZgotCi0gICAgICAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qbm90IGVub3VnaCBzcGFjZSBpbiBjdXJyZW50IGNodW5rOiBjcmVhdGUgYSBuZXcgb25lKi8KLSAgICAgICAgICAgIGVyciA9IE00TVA0V19uZXdWaWRlb0NodW5rKGNvbnRleHQsICZsZWZ0U3BhY2VJbkNodW5rKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTJfMygic3RhcnRBVTogc2l6ZSAweCV4IHBvcyAweCV4IGNodW5rICV1IiwgYXVQdHItPnNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuayk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzEoImFkciA9IDB4JXAiLCBhdVB0ci0+ZGF0YUFkZHJlc3MpOwotCi0gICAgICAgIGlmIChhdVB0ci0+ZGF0YUFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18zKCIgZGF0YSA9ICUwOFggJTA4WCAlMDhYIiwgYXVQdHItPmRhdGFBZGRyZXNzWzBdLAotICAgICAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzc1sxXSwgYXVQdHItPmRhdGFBZGRyZXNzWzJdKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF1UHRyLT5zaXplID0gbGVmdFNwYWNlSW5DaHVuazsKLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0gyNjQpCi0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENodW5rW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXQotICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyArIDQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENodW5rW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXQotICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyk7Ci0KLSNlbHNlCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tIMjY0KQotICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0gKyA0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0pOwotCi0jZWxzZQotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rSDI2NCkKLSAgICAgICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdCi0gICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zCi0gICAgICAgICAgICArIDQpOyAvKiBJbiBIMjY0LCB3ZSBtdXN0IHN0YXJ0IGJ5IHRoZSBsZW5ndGggb2YgdGhlIE5BTFUsIGNvZGVkIGluIDQgYnl0ZXMgKi8KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXVQdHItPmRhdGFBZGRyZXNzID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbMF0KLSAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MpOwotCi0jZW5kaWYgLypfTTRNUDRXX1VOQlVGRkVSRURfVklERU8qLwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMygiTTRNUFdfc3RhcnRBVTogc3RhcnQgYWRkcmVzczolcCwgc2l6ZTolbHUsIHN0cmVhbTolZCIsCi0gICAgICAgIGF1UHRyLT5kYXRhQWRkcmVzcywgYXVQdHItPnNpemUsIHN0cmVhbUlEKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00TVA0V19wcm9jZXNzQVUoIE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0ICphdVB0ciApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE1QNFdfVGltZTMyIGRlbHRhOwotICAgIE00TVA0V19UaW1lMzIgbGFzdFNhbXBsZUR1cjsKLSAgICBNNE9TQV9VSW50MzIgaTsKLSAgICAvKmV4cGVjdGVkU2l6ZSBpcyB0aGUgbWF4IGZpbGVzaXplIHRvIGZvcmVjYXN0IHdoZW4gYWRkaW5nIGEgbmV3IEFVOiovCi0gICAgTTRPU0FfVUludDMyIGV4cGVjdGVkU2l6ZSA9Ci0gICAgICAgIDMyOyAvKmluaXRpYWxpemVkIHdpdGggYW4gZXN0aW1hdGlvbiBvZiB0aGUgbWF4IG1ldGFkYXRhIHNwYWNlIG5lZWRlZCBmb3IgYW4gQVUuKi8KLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfYXVkaW8gPSAwLjA7Ci0gICAgTTRPU0FfRG91YmxlIHNjYWxlX3ZpZGVvID0gMC4wOwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLypjaGVjayBtYWNybyBzdGF0ZSovCi0gICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V193cml0aW5nKSwgTTRFUlJfU1RBVEUpOwotCi0gICAgTTRPU0FfVFJBQ0UyXzAoIk00TVA0V19wcm9jZXNzQVUiKTsKLQotICAgIGlmIChzdHJlYW1JRCA9PSBBdWRpb1N0cmVhbUlEKQotICAgICAgICBzY2FsZV9hdWRpbyA9Ci0gICAgICAgIDEwMDAuMCAvIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50aW1lc2NhbGU7Ci0KLSAgICBpZiAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkKLSAgICAgICAgc2NhbGVfdmlkZW8gPQotICAgICAgICAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotCi0gICAgLyogUEwgMjcvMTAvMjAwODogYWZ0ZXIgdGhlIHJlc3VyZ2VuY2Ugb2YgdGhlIEFBQyAxMjggYnVnLCBJIGFkZGVkIGEgZGVidWcgY2hlY2sgdGhhdAotICAgICB0aGUgZW5jb2RlZCBkYXRhIGRpZG4ndCBvdmVyZmxvdyB0aGUgYXZhaWxhYmxlIHNwYWNlIGluIHRoZSBBVSAqLwotCi0gICAgc3dpdGNoKCBzdHJlYW1JRCApCi0gICAgewotICAgICAgICBjYXNlIEF1ZGlvU3RyZWFtSUQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoYXVQdHItPnNpemUKLSAgICAgICAgICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcwotICAgICAgICAgICAgPiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSwKLSAgICAgICAgICAgIE00RVJSX0NPTlRFWFRfRkFJTEVELAotICAgICAgICAgICAgIlVoIG9oLiBCdWZmZXIgb3ZlcmZsb3cgaW4gdGhlIHdyaXRlci4gQWJhbmRvbiBzaGlwISIpOwotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYyKGF1UHRyLT5zaXplCi0gICAgICAgICAgICAgICAgPiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZSwKLSAgICAgICAgICAgICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAiT29wcy4gQW4gQVUgd2VudCBvdmVyIHRoZSBkZWNsYXJlZCBNYXggQVUgc2l6ZS5cCi0gICAgICAgICAgICAgICAgIFlvdSBtaWdodCB3aXNoIHRvIGludmVzdGlnYXRlIHRoYXQuIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFZpZGVvU3RyZWFtSUQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoYXVQdHItPnNpemUKLSAgICAgICAgICAgICAgICArIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcwotICAgICAgICAgICAgICAgICAgICA+IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9DT05URVhUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgIlVoIG9oLiBCdWZmZXIgb3ZlcmZsb3cgaW4gdGhlIHdyaXRlci4gQWJhbmRvbiBzaGlwISIpOwotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYyKGF1UHRyLT5zaXplCi0gICAgICAgICAgICAgICAgICAgID4gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVVNpemUsCi0gICAgICAgICAgICAgICAgICAgIE00RVJSX0NPTlRFWFRfRkFJTEVELAotICAgICAgICAgICAgICAgICAgICAiT29wcy4gQW4gQVUgd2VudCBvdmVyIHRoZSBkZWNsYXJlZCBNYXggQVUgc2l6ZS5cCi0gICAgICAgICAgICAgICAgICAgICBZb3UgbWlnaHQgd2lzaCB0byBpbnZlc3RpZ2F0ZSB0aGF0LiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLypvbmx5IGlmIG5vdCBpbiB0aGUgY2FzZSBhdWRpbyB3aXRoIGVzdGltYXRlQXVkaW9TaXplCi0gICAgKGVsc2UsIHNpemUgYWxyZWFkeSBlc3RpbWF0ZWQgYXQgdGhpcyBwb2ludCkqLwotICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgfHwgKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpKQotICAgIHsKLSAgICAgICAgLypjaGVjayBmaWxlc2l6ZSBpZiBuZWVkZWQqLwotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlU2l6ZSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3RlZFNpemUgKz0gbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArIGF1UHRyLT5zaXplOwotCi0gICAgICAgICAgICBpZiAoKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpCi0gICAgICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgICAgICA9PSBNNFNZU19rSDI2NCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWRTaXplICs9IDQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChleHBlY3RlZFNpemUgPiBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJwcm9jZXNzQVUgOiAhISBGSUxFU0laRSBFWENFRURFRCAhISIpOwotCi0gICAgICAgICAgICAgICAgLyogcGF0Y2ggZm9yIGF1dG9zdG9wIGlzIE1heEZpbGVTaXplIGV4Y2VlZGVkICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0V19wcm9jZXNzQVUgOiBzdG9wIGF0IHRhcmdldGVkIGZpbGVzaXplIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKmNhc2UgYXVkaW9Nc1N0b3BUaW1lIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGR1cmluZyB2aWRlbyBwcm9jZXNzaW5nLAotICAgICBhbmQgbm93IGNoZWNrIGl0IGZvciBhdWRpbyovCi0gICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX1RSVUUpCi0gICAgICAgICYmIChzdHJlYW1JRCA9PSBBdWRpb1N0cmVhbUlEKSkKLSAgICB7Ci0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNTdG9wVGltZSA8PSAoYXVQdHItPkNUUyAqc2NhbGVfYXVkaW8pKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBidWdmaXg6IGlmIGEgbmV3IGNodW5rIHdhcyBqdXN0IGNyZWF0ZWQsIGNhbmNlbCBpdCBiZWZvcmUgdG8gY2xvc2UgKi8KLSAgICAgICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgIT0gMCkKLSAgICAgICAgICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50UG9zID09IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX3Byb2Nlc3NBVSA6IGF1ZGlvIHN0b3AgdGltZSByZWFjaGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzdHJlYW1JRCA9PSBBdWRpb1N0cmVhbUlEKSAvKmF1ZGlvIHN0cmVhbSovCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRNUDRXX3Byb2Nlc3NBVSAtPiBhdWRpbyIpOwotCi0gICAgICAgIC8qYXVkaW8gbWljcm9zdGF0ZSovCi0gICAgICAgIEVSUl9DSEVDSygobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlCi0gICAgICAgICAgICA9PSBNNE1QNFdfd3JpdGluZ19zdGFydEFVKSwgTTRFUlJfU1RBVEUpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm1pY3JvU3RhdGUgPSBNNE1QNFdfd3JpdGluZzsKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3MgKz0gYXVQdHItPnNpemU7Ci0gICAgICAgIC8qIFdhcm5pbmc6IHRpbWUgY29udmVyc2lvbiBjYXN0IDY0dG8zMiEgKi8KLSAgICAgICAgZGVsdGEgPSAoTTRNUDRXX1RpbWUzMilhdVB0ci0+Q1RTCi0gICAgICAgICAgICAtIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTOwotCi0gICAgICAgIC8qIERFQlVHIHN0dHMgZW50cmllcyB3aGljaCBhcmUgZXF1YWwgdG8gMCAqLwotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiQV9ERUxUQSA9ICVsZFxuIiwgZGVsdGEpOwotCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgID09IDApIC8qdGVzdCBpZiBmaXJzdCBBVSovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qc2V0IGF1IHNpemUqLwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUgPSBhdVB0ci0+c2l6ZTsKLQotICAgICAgICAgICAgLypzYW1wbGUgZHVyYXRpb24gaXMgYSBwcmlvcmkgY29uc3RhbnQgaW4gYXVkaW8gY2FzZSwgKi8KLSAgICAgICAgICAgIC8qYnV0IGlmIGFuIEF1IGF0IGxlYXN0IGhhcyBkaWZmZXJlbnQgc2l6ZSwgYSBzdHN6IHRhYmxlIHdpbGwgYmUgY3JlYXRlZCAqLwotCi0gICAgICAgICAgICAvKm1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24gPSBkZWx0YTsgKi8KLSAgICAgICAgICAgIC8qVE9ETyB0ZXN0IHNhbXBsZSBkdXJhdGlvbj8gKHNob3VsZCBiZSAyMG1zIGluIEFNUjgsIDE2MCB0aWNzIHdpdGggdGltZXNjYWxlIDgwMDApICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKmNoZWNrIGlmIGF1IHNpemUgaXMgY29uc3RhbnQgKGF1ZGlvKSAqLwotICAgICAgICAgICAgLyowIHNhbXBsZSBzaXplIG1lYW5zIG5vbiBjb25zdGFudCBzaXplKi8KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAhPSBhdVB0ci0+c2l6ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qZmlyc3QgQVUgd2l0aCBkaWZmZXJlbnQgc2l6ZSA9PiBub24gY29uc3RhbnQgc2l6ZSA9PiBTVFNaIHRhYmxlIG5lZWRlZCovCi0gICAgICAgICAgICAgICAgICAgIC8qY29tcHV0YXRpb24gb2YgdGhlIG5iIG9mIGJsb2NrIG9mIHNpemUgTTRNUDRXX1NUU1pfQUxMT0NfU0laRSB0byBhbGxvY2F0ZSovCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgMSArIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICAgICAgICAgICAgICAqIDQgLyBNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1ogPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3RzekJsb2NrcwotICAgICAgICAgICAgICAgICAgICAgICAgKiBNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJhdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaIik7Ci0gICAgICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1oKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKysgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1pbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zYW1wbGVTaXplOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFNaW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnNhbXBsZU5iXSA9IGF1UHRyLT5zaXplOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAwOyAvKnVzZWQgYXMgYSBmbGFnIGluIHRoYXQgY2FzZSovCi0gICAgICAgICAgICAgICAgICAgIC8qbW9yZSBieXRlcyBpbiB0aGUgZmlsZSBpbiB0aGF0IGNhc2U6Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyplbHNlIHRhYmxlIGFscmVhZHkgZXhpc3RzKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICAgICAgaWYgKDQgKihtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgKyAzKQotICAgICAgICAgICAgICAgICAgICA+PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICpNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3Byb2Nlc3NBVSA6IGF1ZGlvIHN0c3ogdGFibGUgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTVA0V19PVkVSU0laRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBpZiAoNCAqbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgKk00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAxOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1ogPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RTWiwgKCBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MgLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgKiBNNE1QNFdfU1RTWl9BVURJT19BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICAgICAqIE00TVA0V19TVFNaX0FVRElPX0FMTE9DX1NJWkUpOwotICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFNaW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc2FtcGxlTmJdID0gYXVQdHItPnNpemU7Ci0KLSAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlbHRhID4gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgLyoga2VlcCB0cmFjayBvZiByZWFsIHNhbXBsZSBkdXJhdGlvbiovCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uID0gZGVsdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICA9PSAwKSAvKnRlc3QgaWYgZmlyc3QgQVUqLwotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMF0gPSAxOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzFdID0gMDsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iID0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gODsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgICAgID09IDEpIC8qdGVzdCBpZiBzZWNvbmQgQVUqLwotICAgICAgICB7Ci0jaWZuZGVmIERVUExJQ0FURV9TVFRTX0lOX0xBU1RfQVUKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzBdICs9IDE7Ci0KLSNlbmRpZiAvKkRVUExJQ0FURV9TVFRTX0lOX0xBU1RfQVUqLwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMV0gPSBkZWx0YTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iICs9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKnJldHJpZXZlIGxhc3Qgc2FtcGxlIGRlbHRhKi8KLSAgICAgICAgICAgIGxhc3RTYW1wbGVEdXIgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICogKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkgLSAxXTsKLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIGlmICg4ICoobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICArIDMpID49IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAqTTRNUDRXX1NUVFNfQVVESU9fQUxMT0NfU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX3Byb2Nlc3NBVSA6IGF1ZGlvIHN0dHMgdGFibGUgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgICAgICBpZiAoOCAqbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICA+PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzCi0gICAgICAgICAgICAgICAgKk00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcyArPSAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFRTLCAoIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzCi0gICAgICAgICAgICAgICAgICAgIC0gMSkgKiBNNE1QNFdfU1RUU19BVURJT19BTExPQ19TSVpFLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3R0c0Jsb2NrcwotICAgICAgICAgICAgICAgICAgICAqIE00TVA0V19TVFRTX0FVRElPX0FMTE9DX1NJWkUpOwotICAgICAgICAgICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCwgTTRFUlJfQUxMT0MpOwotICAgICAgICAgICAgfQotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUqLwotCi0gICAgICAgICAgICBpZiAoZGVsdGEgIT0gbGFzdFNhbXBsZUR1cikgLypuZXcgZW50cnkgaW4gdGhlIHRhYmxlKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMiAqKAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKV0gPSAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUU1syICooCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpICsgMV0gPSBkZWx0YTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiArPQotICAgICAgICAgICAgICAgICAgICAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKmluY3JlYXNlIG9mIDEgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBBVXMgd2l0aCBzYW1lIGR1cmF0aW9uKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMiAqKAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKSAtIDJdICs9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICs9IDE7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2NdICs9Ci0gICAgICAgICAgICAxOwotCi0jZWxzZQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdICs9Ci0gICAgICAgICAgICAxOwotCi0jZW5kaWYKLSAgICAgICAgLyogV2FybmluZzogdGltZSBjb252ZXJzaW9uIGNhc3QgNjR0bzMyISAqLwotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTID0KLSAgICAgICAgICAgIChNNE1QNFdfVGltZTMyKWF1UHRyLT5DVFM7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpIC8qdmlkZW8gc3RyZWFtKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNE1QNFdfcHJvY2Vzc0FVIC0+IHZpZGVvIik7Ci0KLSAgICAgICAgLyogSW4gaDI2NCwgdGhlIHNpemUgb2YgdGhlIEFVIG11c3QgYmUgYWRkZWQgdG8gdGhlIGRhdGEgKi8KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tIMjY0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBBZGQgdGhlIHNpemUgb2YgdGhlIE5BTFUgaW4gQkUgKi8KLSAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IHBUbXBEYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBhdVB0ci0+ZGF0YUFkZHJlc3MgLT0gMTsKLSAgICAgICAgICAgIHBUbXBEYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOClhdVB0ci0+ZGF0YUFkZHJlc3M7Ci0KLSAgICAgICAgICAgIC8vIGJpdCBtYW5pcHVsYXRpb24KLSAgICAgICAgICAgICpwVG1wRGF0YUFkZHJlc3MrKyA9IChNNE9TQV9VSW50OCkoKGF1UHRyLT5zaXplID4+IDI0KSAmIDB4MDAwMDAwRkYpOwotICAgICAgICAgICAgKnBUbXBEYXRhQWRkcmVzcysrID0gKE00T1NBX1VJbnQ4KSgoYXVQdHItPnNpemUgPj4gMTYpICYgMHgwMDAwMDBGRik7Ci0gICAgICAgICAgICAqcFRtcERhdGFBZGRyZXNzKysgPSAoTTRPU0FfVUludDgpKChhdVB0ci0+c2l6ZSA+PiA4KSAgJiAweDAwMDAwMEZGKTsKLSAgICAgICAgICAgICpwVG1wRGF0YUFkZHJlc3MrKyA9IChNNE9TQV9VSW50OCkoKGF1UHRyLT5zaXplKSAgICAgICAmIDB4MDAwMDAwRkYpOwotCi0gICAgICAgICAgICBhdVB0ci0+c2l6ZSArPSA0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyp2aWRlbyBtaWNyb3N0YXRlKi8KLSAgICAgICAgRVJSX0NIRUNLKChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm1pY3JvU3RhdGUKLSAgICAgICAgICAgID09IE00TVA0V193cml0aW5nX3N0YXJ0QVUpLCBNNEVSUl9TVEFURSk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V193cml0aW5nOwotCi0jaWZkZWYgX000TVA0V19VTkJVRkZFUkVEX1ZJREVPCi0gICAgICAgIC8qIHNhbXBsZXMgYXJlIHdyaXR0ZW4gdG8gZmlsZSBub3cgKi8KLQotICAgICAgICBlcnIgPSBNNE1QNFdfcHV0QmxvY2soKE00T1NBX1VDaGFyICopYXVQdHItPmRhdGFBZGRyZXNzLCBhdVB0ci0+c2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpOwotCi0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfRmlsZVBvc2l0aW9uIHRlbXAgPSBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvcwotICAgICAgICAgICAgICAgICsgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoCi0gICAgICAgICAgICAgICAgIk00TVA0V19wcm9jZXNzQVU6IHB1dEJsb2NrIGVycm9yIHdoZW4gd3JpdGluZyB1bmJ1ZmZlcmVkIHZpZGVvIHNhbXBsZTogJSNYIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyogT3VjaCwgd2UgZ290IGFuIGVycm9yIHdyaXRpbmcgdG8gdGhlIGZpbGUsIGJ1dCB3ZSBuZWVkIHRvIHByb3Blcmx5IHJlYWN0IHNvIHRoYXQKLSAgICAgICAgICAgICB0aGUgc3RhdGUgaXMgc3RpbGwgY29uc2lzdGVudCBhbmQgd2UgY2FuIHByb3Blcmx5IGNsb3NlIHRoZSBmaWxlIHNvIHRoYXQgd2hhdCBoYXMKLSAgICAgICAgICAgICAgYmVlbiByZWNvcmRlZCBzbyBmYXIgaXMgbm90IGxvc3QuIFlheSBlcnJvciByZWNvdmVyeSEgKi8KLQotICAgICAgICAgICAgLyogRmlyc3QsIHdlIGRvIG5vdCBrbm93IHdoZXJlIHdlIGFyZSBpbiB0aGUgZmlsZS4gUHV0IHVzIGJhY2sgYXQgd2hlcmUgd2Ugd2VyZSBiZWZvcmUKLSAgICAgICAgICAgIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIGRhdGEuIFRoYXQgd2F5LCB3ZSdyZSBjb25zaXN0ZW50IHdpdGggdGhlIGNodW5rIGFuZCBzYW1wbGUKLSAgICAgICAgICAgICBzdGF0ZSBkYXRhLmFic29sdXRlQ3VycmVudFBvcyBpcyBvbmx5IHVwZGF0ZWQgZm9yIGNodW5rcywgaXQgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICBvZiB0aGUgY2h1bmssdGhlcmVmb3JlIHdlIG5lZWQgdG8gYWRkIHZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MgdG8ga25vdyB3aGVyZSB3ZQotICAgICAgICAgICAgIHdlcmUgaW4gdGhlIGZpbGUuICovCi0gICAgICAgICAgICBlcnIgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPnNlZWsoCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZ0ZW1wKTsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoCi0gICAgICAgICAgICAgICAgIkJhY2t0cmFja2luZyB0byBwb3NpdGlvbiAweCUwOFgsIHNlZWsgcmV0dXJuZWQgJWQgYW5kIHBvc2l0aW9uICUwOFgiLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zCi0gICAgICAgICAgICAgICAgKyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MsIGVyciwgdGVtcCk7Ci0KLSAgICAgICAgICAgIC8qIFRoZW4sIGRvIG5vdCB1cGRhdGUgYW55IGluZm8gd2hhdHNvZXZlciBpbiB0aGUgd3JpdGluZyBzdGF0ZS4gVGhpcyB3aWxsIGhhdmUgdGhlCi0gICAgICAgICAgICAgY29uc2VxdWVuY2UgdGhhdCBpdCB3aWxsIGJlIGFzIGlmIHRoZSBzYW1wbGUgaGFzIG5ldmVyIGJlZW4gd3JpdHRlbiwgc28gdGhlIGNodW5rCi0gICAgICAgICAgICAgd2lsbCBiZSBtZXJlbHkgY2xvc2VkIGFmdGVyIHRoZSBwcmV2aW91cyBzYW1wbGUgKHRoZSBzYW1wbGUgd2UgYXR0ZW1wdGVkIHRvIHdyaXRlCi0gICAgICAgICAgICAgaGVyZSBpcyBsb3N0KS4gKi8KLQotICAgICAgICAgICAgLyogQW5kIGxhc3RseSAoZm9yIGhlcmUpLCByZXR1cm4gdGhhdCB3ZSd2ZSByZWFjaGVkIHRoZSBsaW1pdCBvZiBhdmFpbGFibGUgc3BhY2UuCi0gICAgICAgICAgICAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgZXJyb3Igb3JpZ2luYWxseSByZXR1cm5lZCBieSBwdXRCbG9jay4gKi8KLQotICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgaWYgKChNNE1QNFdfVGltZTMyKWF1UHRyLT5DVFMgPCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUykgewotICAgICAgICAgICAgLy8gRG8gbm90IHJlcG9ydCBhcyBlcnJvciwgaXQgd2lsbCBhYm9ydCB0aGUgZW50aXJlIGZpbGV3cml0ZS4gSnVzdCBza2lwIHRoaXMgZnJhbWUuCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiU2tpcCBmcmFtZS4gVmlkZW8gZnJhbWUgaGFzIHRvbyBvbGQgdGltZXN0YW1wLiIpOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MgKz0gYXVQdHItPnNpemU7Ci0KLSAgICAgICAgLyogV2FybmluZzogdGltZSBjb252ZXJzaW9uIGNhc3QgNjR0bzMyISAqLwotICAgICAgICBkZWx0YSA9IChNNE1QNFdfVGltZTMyKWF1UHRyLT5DVFMKLSAgICAgICAgICAgIC0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLmxhc3RDVFM7Ci0KLSAgICAgICAgLyogREVCVUcgc3R0cyBlbnRyaWVzIHdoaWNoIGFyZSBlcXVhbCB0byAwICovCi0gICAgICAgIE00T1NBX1RSQUNFMl8xKCJWX0RFTFRBID0gJWxkXG4iLCBkZWx0YSk7Ci0KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIGlmICgyICoobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICsgMykKLSAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICpNNE1QNFdfU1RTWl9BTExPQ19TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX3Byb2Nlc3NBVSA6IHZpZGVvIHN0c3ogdGFibGUgaXMgZnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuIE00V0FSX01QNFdfT1ZFUlNJWkU7Ci0gICAgICAgIH0KLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgVEFCTEVfU1RTWlttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmJdID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MTYpYXVQdHItPnNpemU7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gNDsKLQotI2Vsc2UKLQotICAgICAgICBpZiAoNCAqbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICA+PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzCi0gICAgICAgICAgICAqTTRNUDRXX1NUU1pfQUxMT0NfU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3RzekJsb2NrcyArPSAxOwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1ogPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIgKilNNE1QNFdfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiwKLSAgICAgICAgICAgICAgICAoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3pCbG9ja3MKLSAgICAgICAgICAgICAgICAtIDEpICogTTRNUDRXX1NUU1pfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHN6QmxvY2tzCi0gICAgICAgICAgICAgICAgKiBNNE1QNFdfU1RTWl9BTExPQ19TSVpFKTsKLQotICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWiAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgIE00RVJSX0FMTE9DKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBUQUJMRV9TVFNaW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYl0gPQotICAgICAgICAgICAgYXVQdHItPnNpemU7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gNDsKLQotI2VuZGlmCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYgotICAgICAgICAgICAgPT0gMCkgLyp0ZXN0IGlmIGZpcnN0IEFVKi8KLSAgICAgICAgewotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgIE00TVA0V19wdXQzMl9MbygmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzBdLCAxKTsKLSAgICAgICAgICAgIE00TVA0V19wdXQzMl9IaSgmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzBdLCAwKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzBdID0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXSA9IDA7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiA9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICAgICA9PSAxICkgLyp0ZXN0IGlmIHNlY29uZCBBVSovCi0gICAgICAgIHsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBNNE1QNFdfcHV0MzJfSGkoJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1swXSwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KWRlbHRhKTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzFdID0gZGVsdGE7Ci0KLSNlbmRpZgotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKnJldHJpZXZlIGxhc3Qgc2FtcGxlIGRlbHRhKi8KLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgICAgICBsYXN0U2FtcGxlRHVyID0gTTRNUDRXX2dldDMyX0hpKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxXSk7Ci0KLSAgICAgICAgICAgIGlmICg0ICoobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgICAgICArIDMpID49IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAqTTRNUDRXX1NUVFNfQUxMT0NfU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX3Byb2Nlc3NBVSA6IHZpZGVvIHN0dHMgdGFibGUgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgICAgICBsYXN0U2FtcGxlRHVyID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAqIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpICsgMV07Ci0KLSAgICAgICAgICAgIGlmICg4ICptTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAqTTRNUDRXX1NUVFNfQUxMT0NfU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPm5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzICs9IDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiAqKU00TVA0V19yZWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFMsICggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0dHNCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgLSAxKSAqIE00TVA0V19TVFRTX0FMTE9DX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIG5iT2ZBbGxvY2F0ZWRTdHRzQmxvY2tzCi0gICAgICAgICAgICAgICAgICAgICogTTRNUDRXX1NUVFNfQUxMT0NfU0laRSk7Ci0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUwotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORSovCi0KLSAgICAgICAgICAgIGlmIChkZWx0YSAhPSBsYXN0U2FtcGxlRHVyKSAvKm5ldyBlbnRyeSBpbiB0aGUgdGFibGUqLwotICAgICAgICAgICAgewotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0MzJfTG8oJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iXSwgMSk7Ci0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dDMyX0hpKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYl0sIChNNE9TQV9VSW50MTYpZGVsdGEpOwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIgKigKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iKV0gPSAxOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgICAgICoobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iKSsxXSA9IGRlbHRhOwotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iICs9Ci0gICAgICAgICAgICAgICAgICAgIDE7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qaW5jcmVhc2Ugb2YgMSB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIEFVcyB3aXRoIHNhbWUgZHVyYXRpb24qLwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBUQUJMRV9TVFRTW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdICs9IDE7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMiAqKAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKV0gKz0gMTsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiArPSAxOwotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjXSArPQotICAgICAgICAgICAgMTsKLQotI2Vsc2UKLQotICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgY2h1bmtTYW1wbGVOYlRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSArPQotICAgICAgICAgICAgMTsKLQotI2VuZGlmCi0KLSAgICAgICAgaWYgKGF1UHRyLT5hdHRyaWJ1dGUgPT0gQVVfUkFQKQotICAgICAgICB7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgaWYgKDQgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIgKyAzKQotICAgICAgICAgICAgICAgID49IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3NCbG9ja3MKLSAgICAgICAgICAgICAgICAqTTRNUDRXX1NUU1NfQUxMT0NfU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX3Byb2Nlc3NBVSA6IHZpZGVvIHN0c3MgdGFibGUgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9NUDRXX09WRVJTSVpFOwotICAgICAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgICAgICBpZiAoNCAqbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgPj0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5uYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcwotICAgICAgICAgICAgICAgICpNNE1QNFdfU1RTU19BTExPQ19TSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bmJPZkFsbG9jYXRlZFN0c3NCbG9ja3MgKz0gMTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyICopTTRNUDRXX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RTUywgKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBuYk9mQWxsb2NhdGVkU3Rzc0Jsb2NrcwotICAgICAgICAgICAgICAgICAgICAtIDEpICogTTRNUDRXX1NUU1NfQUxMT0NfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgbmJPZkFsbG9jYXRlZFN0c3NCbG9ja3MKLSAgICAgICAgICAgICAgICAgICAgKiBNNE1QNFdfU1RTU19BTExPQ19TSVpFKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUqLwotCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIFRBQkxFX1NUU1NbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iXSA9Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iICs9IDE7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVzaXplICs9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBXYXJuaW5nOiB0aW1lIGNvbnZlcnNpb24gY2FzdCA2NHRvMzIhICovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTID0KLSAgICAgICAgICAgIChNNE1QNFdfVGltZTMyKWF1UHRyLT5DVFM7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0KLSAgICAvKiBJIG1vdmVkIHNvbWUgc3RhdGUgbW9kaWZpY2F0aW9uIHRvIGFmdGVyIHdlIGtub3cgdGhlIHNhbXBsZSBoYXMgYmVlbiB3cml0dGVuIGNvcnJlY3RseS4gKi8KLSAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+ZXN0aW1hdGVBdWRpb1NpemUgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgJiYgKHN0cmVhbUlEID09IFZpZGVvU3RyZWFtSUQpKQotICAgIHsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb01zU3RvcFRpbWUgPQotICAgICAgICAgICAgKE00TVA0V19UaW1lMzIpKGF1UHRyLT5DVFMgKiBzY2FsZV92aWRlbyk7Ci0gICAgfQotCi0gICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX0ZBTFNFKQotICAgICAgICB8fCAoc3RyZWFtSUQgPT0gVmlkZW9TdHJlYW1JRCkpCi0gICAgewotICAgICAgICAvKnVwZGF0ZSBmaWxlU2l6ZSovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgKz0gYXVQdHItPnNpemU7Ci0gICAgfQotCi0gICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplID09IE00T1NBX1RSVUUpCi0gICAgICAgICYmIChzdHJlYW1JRCA9PSBWaWRlb1N0cmVhbUlEKSkKLSAgICB7Ci0gICAgICAgIC8qdXBkYXRlIGZpbGVzaXplIHdpdGggZXN0aW1hdGVkIGF1ZGlvIGRhdGEgdGhhdCB3aWxsIGJlIGFkZGVkIGxhdGVyLiAgICAqLwotICAgICAgICAvKldhcm5pbmc6IEFzc3VtcHRpb24gaXMgbWFkZSB0aGF0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAtIGF1ZGlvIHNhbXBsZXMgaGF2ZSBjb25zdGFudCBzaXplIChlLmcuIG5vIHNpZCkuICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAtIG1heCBhdWRpbyBzYW1wbGUgc2l6ZSBoYXMgYmVlbiBzZXQsIGFuZCBpcyB0aGUgYWN0dWFsIHNhbXBsZSBzaXplLiAqLwotCi0gICAgICAgIEVSUl9DSEVDSyhtTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNDaHVua0R1ciAhPSAwLAotICAgICAgICAgICAgTTRXQVJfTVA0V19OT1RfRVZBTFVBQkxFKTsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSAtPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKCBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAgICAgKiBzY2FsZV92aWRlbykgKiAoMC4wNS8qYWx3YXlzIDUwIEFNUiBzYW1wbGVzIHBlciBzZWNvbmQqLwotICAgICAgICAgICAgKihNNE9TQV9Eb3VibGUpbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUKLSAgICAgICAgICAgICsgMTYvKmFkZGl0aW9uYWwgZGF0YSBmb3IgYSBuZXcgY2h1bmsqLwotICAgICAgICAgICAgLyAoTTRPU0FfRG91YmxlKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9Nc0NodW5rRHVyKSk7Ci0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPSAoTTRPU0FfVUludDMyKSgoIGF1UHRyLT5DVFMgKiBzY2FsZV92aWRlbykKLSAgICAgICAgICAgICogKDAuMDUvKmFsd2F5cyA1MCBBTVIgc2FtcGxlcyBwZXIgc2Vjb25kKi8KLSAgICAgICAgICAgICooTTRPU0FfRG91YmxlKW1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplCi0gICAgICAgICAgICArIDE2LyphZGRpdGlvbmFsIGRhdGEgZm9yIGEgbmV3IGNodW5rKi8KLSAgICAgICAgICAgIC8gKE00T1NBX0RvdWJsZSltTXA0RmlsZURhdGFQdHItPmF1ZGlvTXNDaHVua0R1cikpOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMV80KCJwcm9jZXNzQVUgOiBzaXplIDB4JXggbW9kZSAlZCBmaWxlc2l6ZSAlbHUgbGltaXQgJWx1IiwKLSAgICAgICAgYXVQdHItPnNpemUsIGF1UHRyLT5hdHRyaWJ1dGUsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZVNpemUpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX2Nsb3NlV3JpdGUoIE00T1NBX0NvbnRleHQgY29udGV4dCApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9FUlIgZXJyMiA9IE00Tk9fRVJST1IsIGVycjMgPSBNNE5PX0VSUk9SOwotCi0gICAgLypXYXJuaW5nOiB0ZXN0IHNob3VsZCBiZSBkb25lIGhlcmUgdG8gZW5zdXJlIGNvbnRleHQtPnBDb250ZXh0IGlzIG5vdCBNNE9TQV9OVUxMLAotICAgICBidXQgQyBpcyBub3QgQysrLi4uKi8KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotCi0gICAgTTRPU0FfVUNoYXIgY2FtY29kZXJfbWFqLCBjYW1jb2Rlcl9taW4sIGNhbWNvZGVyX3JldjsgLypjYW1jb2RlciB2ZXJzaW9uKi8KLSAgICBNNE9TQV9Cb29sIGJBdWRpbyA9Ci0gICAgICAgICgoIG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8pCi0gICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIKLSAgICAgICAgIT0gMCkpOyAvKigobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyICE9IE00T1NBX05VTEwpICYmCi0gICAgICAgICAgICAgICAgICAgIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgIT0gMCkpOyovCi0gICAgTTRPU0FfQm9vbCBiVmlkZW8gPQotICAgICAgICAoKCBtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvKQotICAgICAgICAmJiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iCi0gICAgICAgICE9IDApKTsgLyooKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKSAmJgotICAgICAgICAgICAgICAgICAgICAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICE9IDApKTsqLwotICAgIE00T1NBX0Jvb2wgYkgyNjMgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9Cb29sIGJIMjY0ID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQm9vbCBiTVA0ViA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkFBQyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkVWUkMgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qaW50ZXJtZWRpYXRlIHZhcmlhYmxlcyovCi0gICAgTTRPU0FfVUludDMyIEEsIEIsIE4sIEFCNE47Ci0KLSAgICAvKlRyYWsgdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgYV90cmFrSWQgPSBBdWRpb1N0cmVhbUlEOyAvKiAgICAgKGF1ZGlvPTEpKi8KLSAgICAvKiBmaXJzdCB0cmFrIG9mZnNldCBpcyAzMittb292U2l6ZSwgc2Vjb25kIGVxdWFscyAzMittb292U2l6ZSsxc3RfdHJhY2tfc2l6ZSovCi0gICAgTTRPU0FfVUludDMyIGFfdHJha09mZnNldCA9IDMyOwotICAgIE00T1NBX1VJbnQzMiBhX3N0dHNTaXplID0gMjQ7ICAgICAgICAgIC8qIEEgKGF1ZGlvPTI0KSovCi0gICAgTTRPU0FfVUludDMyIGFfc3RzelNpemUgPSAyMDsgICAgICAgICAgLyogQiAoYXVkaW89MjApKi8KLSAgICBNNE9TQV9VSW50MzIgYV90cmFrU2l6ZSA9IDQwMjsgICAgICAgICAvKiAgICAgKGF1ZGlvPTQwMikqLwotICAgIE00T1NBX1VJbnQzMiBhX21kaWFTaXplID0gMzAyOyAgICAgICAgIC8qICAgICAoYXVkaW89MzAyKSovCi0gICAgTTRPU0FfVUludDMyIGFfbWluZlNpemUgPSAyMjk7ICAgICAgICAgLyogICAgIChhdWRpbz0yMjkpKi8KLSAgICBNNE9TQV9VSW50MzIgYV9zdGJsU2l6ZSA9IDE2OTsgICAgICAgICAvKiAgICAgKGF1ZGlvPTE2OSkqLwotICAgIE00T1NBX1VJbnQzMiBhX3N0c2RTaXplID0gNjk7ICAgICAgICAgIC8qICAgICAoYXVkaW89NjkgKSovCi0gICAgTTRPU0FfVUludDMyIGFfZXNkU2l6ZSA9IDUzOyAgICAgICAgICAgLyogICAgIChhdWRpbz01MyApKi8KLSAgICBNNE9TQV9VSW50MzIgYV9kYXRhU2l6ZSA9IDA7ICAgICAgICAgICAvKiB0ZW1wOiBBdCB0aGUgZW5kLCA9IGN1cnJlbnRQb3MqLwotICAgIE00TVA0V19UaW1lMzIgYV90cmFrRHVyYXRpb24gPSAwOyAgICAgIC8qIGVxdWFscyBsYXN0Q1RTKi8KLSAgICBNNE1QNFdfVGltZTMyIGFfbXNUcmFrRHVyYXRpb24gPSAwOwotICAgIE00T1NBX1VJbnQzMiBhX3N0c2NTaXplID0gMjg7ICAgICAgICAgIC8qIDE2KzEyKm5iY2h1bmtzYXVkaW8qLwotICAgIE00T1NBX1VJbnQzMiBhX3N0Y29TaXplID0gMjA7ICAgICAgICAgIC8qIDE2KzQqbmJjaHVua3NhdWRpbyovCi0KLSAgICBNNE9TQV9VSW50MzIgdl90cmFrSWQgPSBWaWRlb1N0cmVhbUlEOyAvKiAodmlkZW89MikqLwotICAgIC8qIGZpcnN0IHRyYWsgb2Zmc2V0IGlzIDMyK21vb3ZTaXplLCBzZWNvbmQgZXF1YWxzIDMyK21vb3ZTaXplKzFzdF90cmFja19zaXplKi8KLSAgICBNNE9TQV9VSW50MzIgdl90cmFrT2Zmc2V0ID0gMzI7Ci0gICAgTTRPU0FfVUludDMyIHZfc3R0c1NpemUgPSAwOyAgICAgIC8qIEEgKHZpZGVvPTE2KzhKKSovCi0gICAgTTRPU0FfVUludDMyIHZfc3RzelNpemUgPSAwOyAgICAgIC8qIEIgKHZpZGVvPTIwKzRLKSovCi0gICAgTTRPU0FfVUludDMyIHZfdHJha1NpemUgPSAwOyAvKiAoaDI2Mz1BK0IrNE4rNDI2KSwgKG1wNHY9QStCK2RzaSs0Tis0NDgpICovCi0gICAgTTRPU0FfVUludDMyIHZfbWRpYVNpemUgPSAwOyAvKiAoaDI2Mz1BK0IrNE4rMzI2KSwgKG1wNHY9QStCK2RzaSs0TiszNDgpICovCi0gICAgTTRPU0FfVUludDMyIHZfbWluZlNpemUgPSAwOyAvKiAoaDI2Mz1BK0IrNE4rMjUzKSwgKG1wNHY9QStCK2RzaSs0TisyNzUpICovCi0gICAgTTRPU0FfVUludDMyIHZfc3RibFNpemUgPSAwOyAvKiAoaDI2Mz1BK0IrNE4rMTg5KSwgKG1wNHY9QStCK2RzaSs0TisyMTEpICovCi0gICAgTTRPU0FfVUludDMyIHZfc3RzZFNpemUgPSAwOyAgICAgIC8qIChoMjYzPTExNykgICAgICAgICwgKG1wNHY9MTM5K2RzaSAgICApKi8KLSAgICBNNE9TQV9VSW50MzIgdl9lc2RTaXplID0gMDsgICAgICAgLyogKGgyNjM9MTAxKSAgICAgICAgLCAobXA0dj0xNTMrZHNpICAgICkqLwotICAgIE00T1NBX1VJbnQzMiB2X2RhdGFTaXplID0gMDsgICAgICAvKiB0ZW1wOiBBdCB0aGUgZW5kLCA9IGN1cnJlbnRQb3MqLwotICAgIE00TVA0V19UaW1lMzIgdl90cmFrRHVyYXRpb24gPSAwOyAvKiBlcXVhbHMgbGFzdENUUyovCi0gICAgTTRNUDRXX1RpbWUzMiB2X21zVHJha0R1cmF0aW9uID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdl9zdHNjU2l6ZSA9IDI4OyAgICAgLyogMTYrMTIqbmJjaHVua3N2aWRlbyovCi0gICAgTTRPU0FfVUludDMyIHZfc3Rjb1NpemUgPSAyMDsgICAgIC8qIDE2KzQqbmJjaHVua3N2aWRlbyovCi0KLSAgICAvKnZpZGVvIHZhcmlhYmxlcyovCi0gICAgTTRPU0FfVUludDMyIHZfc3Rzc1NpemUgPSAwOyAvKiA0Kk4rMTYgICAgIFNUU1MqLwotCi0gICAgLyphYWMgJiBtcDR2IHRlbXAgdmFyaWFibGUqLwotICAgIE00T1NBX1VJbnQ4IGRzaSA9IDA7Ci0KLSAgICAvKkgyNjQgdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgdl9hdmNDU2l6ZSA9IDA7IC8qIGRzaSsxNSovCi0KLSAgICAvKk1QNFYgdmFyaWFibGVzKi8KLSAgICBNNE9TQV9VSW50MzIgdl9lc2RzU2l6ZSA9IDA7ICAgICAgICAvKiBkc2krMzcqLwotICAgIE00T1NBX1VJbnQ4IHZfRVNEZXNjcmlwdG9yU2l6ZSA9Ci0gICAgICAgIDA7IC8qIGRzaSsyMyAod2FybmluZzogY2hlY2sgZHNpPDEwNSBmb3IgY29kaW5nIHNpemUgb24gMSBieXRlKSovCi0gICAgTTRPU0FfVUludDggdl9EQ0Rlc2NyaXB0b3JTaXplID0gMDsgLyogZHNpKzE1Ki8KLQotICAgIC8qQUFDIHZhcmlhYmxlcyovCi0gICAgTTRPU0FfVUludDMyIGFfZXNkc1NpemUgPSAwOyAgICAgICAgLyogZHNpKzM3Ki8KLSAgICBNNE9TQV9VSW50OCBhX0VTRGVzY3JpcHRvclNpemUgPQotICAgICAgICAwOyAvKiBkc2krMjMgKHdhcm5pbmc6IGNoZWNrIGRzaTwxMDUgZm9yIGNvZGluZyBzaXplIG9uIDEgYnl0ZSkqLwotICAgIE00T1NBX1VJbnQ4IGFfRENEZXNjcmlwdG9yU2l6ZSA9IDA7IC8qIGRzaSsxNSovCi0KLSAgICAvKkdlbmVyYWwgdmFyaWFibGVzKi8KLQotICAgIC8qIGF1ZGlvIGNodW5rIHNpemUgKyB2aWRlbyBjaHVuayBzaXplKi8KLSAgICBNNE9TQV9VSW50MzIgbWRhdFNpemUgPSA4OwotICAgIE00T1NBX1VJbnQzMiBtb292U2l6ZSA9IDExNjsgLyogMTE2ICsgNDAyKGF1ZGlvKSArICAgIChBK0IrNE4rNDI2KShoMjYzKSBvciAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgKEErQitkc2krNE4rNDQ4KShtcDR2KSAgICAqLwotICAgIE00T1NBX1VJbnQzMiBjcmVhdGlvblRpbWU7IC8qIEMgKi8KLQotICAgIC8qZmxhZyB0byBzZXQgdXAgdGhlIGNodW5rIGludGVybGVhdmUgc3RyYXRlZ3kqLwotICAgIE00T1NBX0Jvb2wgYkludGVybGVhdmVBViA9Ci0gICAgICAgIChiQXVkaW8gJiYgYlZpZGVvICYmIChtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIgIT0gMCkpOwotCi0gICAgTTRPU0FfQ29udGV4dCBmaWxlV3JpdGVyQ29udGV4dCA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQ7Ci0KLSAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgIE00T1NBX0RvdWJsZSBzY2FsZV9hdWRpbyA9IDAuMDsKLSAgICBNNE9TQV9Eb3VibGUgc2NhbGVfdmlkZW8gPSAwLjA7Ci0gICAgTTRNUDRXX1RpbWUzMiBkZWx0YTsKLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLQotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiBtb292UG9zLCBtZGF0UG9zOwotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgRVJSX0NIRUNLKGNvbnRleHQgIT0gTTRPU0FfTlVMTCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8qbWFjcm8gc3RhdGUgKi8KLSAgICBtTXA0RmlsZURhdGFQdHItPnN0YXRlID0gTTRNUDRXX2Nsb3NlZDsKLQotICAgIC8qaWYgbm8gZGF0YSAhKi8KLSAgICBpZiAoKCFiQXVkaW8pICYmICghYlZpZGVvKSkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00Tk9fRVJST1I7IC8qd291bGQgYmUgYmV0dGVyIHRvIHJldHVybiBhIHdhcm5pbmcgPyovCi0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSNpZmRlZiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgIC8qIFJlbW92ZSBzYWZldHkgZmlsZSB0byBtYWtlIHJvb20gZm9yIHdoYXQgbmVlZHMgdG8gYmUgd3JpdHRlbiBvdXQgaGVyZQotICAgIChjaHVuayBmbHVzaGluZyBhbmQgbW9vdikuICovCi0KLSAgICBpZiAoTTRPU0FfVFJVRSA9PSBtTXA0RmlsZURhdGFQdHItPmNsZWFuU2FmZXR5RmlsZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0NvbnRleHQgdGVtcENvbnRleHQ7Ci0gICAgICAgIGVyciA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+b3BlbldyaXRlKCZ0ZW1wQ29udGV4dCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+c2FmZXR5RmlsZVVybCwKLSAgICAgICAgICAgIE00T1NBX2tGaWxlV3JpdGUgfCBNNE9TQV9rRmlsZUNyZWF0ZSk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICBlcnIgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPmNsb3NlV3JpdGUodGVtcENvbnRleHQpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5zYWZldHlGaWxlVXJsID0gTTRPU0FfTlVMTDsKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5jbGVhblNhZmV0eUZpbGUgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBfTTRNUDRXX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSAqLwotCi0gICAgaWYgKGJWaWRlbykKLSAgICB7Ci0gICAgICAgIGlmICgoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwKLSAgICAgICAgICAgID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwKLSAgICAgICAgICAgID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSkKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTWikKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUykKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RTUykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZSgKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCk7IC8qKjwgY2xvc2UgdGhlIHN0cmVhbSBhbnl3YXkgKi8KLSAgICAgICAgICAgIE00TVA0V19mcmVlQ29udGV4dChjb250ZXh0KTsgLyoqPCBGcmVlIHRoZSBjb250ZXh0IGNvbnRlbnQgKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qdmlkZW8gbWljcm9zdGF0ZSovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V19jbG9zZWQ7Ci0KLSAgICAgICAgLypjdXJyZW50IGNodW5rIGlzIHRoZSBsYXN0IG9uZSBhbmQgZ2l2ZXMgdGhlIHRvdGFsIG51bWJlciBvZiB2aWRlbyBjaHVua3MgKC0xKSovCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZfZGF0YVNpemUgKz0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXTsKLSAgICAgICAgfQotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotI2lmbmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLSAgICAgICAgLypmbHVzaCBjaHVuayovCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcyA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNodW5rWzBdLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFBvcywKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImZsdXNoIHZpZGVvIHwgQ0xPU0UiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzMoImN1cnJlbnQgY2h1bmsgPSAlZCAgb2Zmc2V0ID0gMHgleCBzaXplID0gMHglMDhYIiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MpOwotCi0gICAgICAgIC8qdXBkYXRlIGNodW5rIG9mZnNldCovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua09mZnNldFRhYmxlW21NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvczsKLQotICAgICAgICAvKmFkZCBjaHVuayBzaXplIHRvIGFic29sdXRlQ3VycmVudFBvcyovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zICs9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgIC8qdXBkYXRlIGxhc3QgY2h1bmsgc2l6ZSwgYW5kIGFkZCB0aGlzIHZhbHVlIHRvIHZfZGF0YVNpemUqLwotCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NpemVUYWJsZVttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVua10gPQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50UG9zOwotICAgICAgICB2X2RhdGFTaXplICs9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3M7IC8qYWRkIGxhc3QgY2h1bmsgc2l6ZSovCi0KLSAgICAgICAgdl90cmFrRHVyYXRpb24gPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ29tbW9uRGF0YS5sYXN0Q1RTOyAvKiBlcXVhbHMgbGFzdENUUyovCi0KLSAgICAgICAgLyogYnVnZml4OiBpZiBhIG5ldyBjaHVuayB3YXMganVzdCBjcmVhdGVkLCBjYW5jZWwgaXQgYmVmb3JlIHRvIGNsb3NlICovCi0gICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsgIT0gMCkKLSAgICAgICAgICAgICYmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRQb3MgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rLS07Ci0gICAgICAgIH0KLSNpZmRlZiBfTTRNUDRXX1VOQlVGRkVSRURfVklERU8KLQotICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGN1cnJlbnRTdHNjXSAmIDB4RkZGKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjLS07Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qX000TVA0V19VTkJVRkZFUkVEX1ZJREVPKi8KLQotICAgICAgICAvKiBMYXN0IHNhbXBsZSBkdXJhdGlvbiAqLwotICAgICAgICAvKiBJZiB3ZSBoYXZlIHRoZSBmaWxlIGR1cmF0aW9uIHdlIHVzZSBpdCwgZWxzZSB3ZSBkdXBsaWNhdGUgdGhlIGxhc3QgQVUgKi8KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlRHVyYXRpb24gPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiB1c2UgbWF4IGZpbGUgZHVyYXRpb24gdG8gY2FsY3VsYXRlIGRlbHRhIG9mIGxhc3QgQVUgKi8KLSAgICAgICAgICAgIGRlbHRhID0gbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlRHVyYXRpb24KLSAgICAgICAgICAgICAgICAtIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTOwotICAgICAgICAgICAgdl90cmFrRHVyYXRpb24gPSBtTXA0RmlsZURhdGFQdHItPk1heEZpbGVEdXJhdGlvbjsKLQotICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogaWYgbW9yZSB0aGFuIDEgZnJhbWUsIGNyZWF0ZSBhIG5ldyBzdHRzIGVudHJ5IChlbHNlIGFscmVhZHkgY3JlYXRlZCkgKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYisrOwotICAgICAgICAgICAgfQotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgTTRNUDRXX3B1dDMyX0xvKCZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIFRBQkxFX1NUVFNbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxXSwgMSk7Ci0gICAgICAgICAgICBNNE1QNFdfcHV0MzJfSGkoJm1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDFdLCBkZWx0YSk7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgIC0gMSldID0gMTsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1syCi0gICAgICAgICAgICAgICAgKihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYgotICAgICAgICAgICAgICAgIC0gMSkgKyAxXSA9IGRlbHRhOwotCi0jZW5kaWYKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogZHVwbGljYXRlIHRoZSBkZWx0YSBvZiB0aGUgcHJldmlvdXMgZnJhbWUgKi8KLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIgPiAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGlmIG1vcmUgdGhhbiAxIGZyYW1lLCBkdXBsaWNhdGUgdGhlIHN0dHMgZW50cnkgKGVsc2UgYWxyZWFkeSBleGlzdHMpICovCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICAgICAgICAgIHZfdHJha0R1cmF0aW9uICs9Ci0gICAgICAgICAgICAgICAgICAgIE00TVA0V19nZXQzMl9IaSgmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxXSk7Ci0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgVEFCTEVfU1RUU1ttTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxXSArPSAxOwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgdl90cmFrRHVyYXRpb24gKz0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAgICAgKiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkgKyAxXTsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMiAqKAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICBDb21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIgLSAxKV0gKz0gMTsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNUDRXX2Nsb3NlV3JpdGUgOiAhIHZpZGVvVHJhY2tQdHIsXAotICAgICAgICAgICAgICAgICAgICAgY2Fubm90IGtub3cgdGhlIGR1cmF0aW9uIG9mIHRoZSB1bmlxdWUgQVUgISIpOwotICAgICAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIGFuIGF1ZGlvIHRyYWNrLCB3ZSB1c2UgaXQgYXMgYSBmaWxlIGR1cmF0aW9uCi0gICAgICAgICAgICAgICAgKGFuZCBzbywgYXMgQVUgZHVyYXRpb24uLi4pICovCi0gICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ciAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX2Nsb3NlV3JpdGUgOiAhIExldCdzIHVzZSB0aGUgYXVkaW8gdHJhY2sgZHVyYXRpb24gISIpOwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEubGFzdENUUwotICAgICAgICAgICAgICAgICAgICAgICAgKiAoMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbkRhdGEudGltZXNjYWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHZfdHJha0R1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUU1sxXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogRWxzZSwgd2UgdXNlIGEgTUFHSUNBTCB2YWx1ZSAoNjYgbXMpICovCi0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX2Nsb3NlV3JpdGUgOiAhIE5vIGF1ZGlvIHRyYWNrIC0+IHVzZSBtYWdpY2FsIHZhbHVlICg2NikgISIpOyAvKiAgICAqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbMV0gPSA2NjsKLSAgICAgICAgICAgICAgICAgICAgdl90cmFrRHVyYXRpb24gPSA2NjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDYWxjdWxhdGUgdGFibGUgc2l6ZXMgKi8KLSAgICAgICAgQSA9IHZfc3R0c1NpemUgPSAxNiArIDggKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iOyAvKiBBICh2aWRlbz0xNis4SikqLwotICAgICAgICBCID0gdl9zdHN6U2l6ZSA9IDIwICsgNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBDb21tb25EYXRhLnNhbXBsZU5iOyAvKiBCICh2aWRlbz0yMCs0SykqLwotICAgICAgICBOID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iOwotICAgICAgICBBQjROID0gQSArIEIgKyA0ICogTjsKLQotICAgICAgICBzY2FsZV92aWRlbyA9Ci0gICAgICAgICAgICAxMDAwLjAgLyBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlOwotICAgICAgICB2X21zVHJha0R1cmF0aW9uID0gKE00T1NBX1VJbnQzMikodl90cmFrRHVyYXRpb24gKiBzY2FsZV92aWRlbyk7Ci0KLSAgICAgICAgLypDb252ZXJ0IGludGVnZXJzIGluIHRoZSB0YWJsZSBmcm9tIExFIGludG8gQkUqLwotI2lmbmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIE00TVA0V190YWJsZTMyVG9CRShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1osCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIpOwotICAgICAgICBNNE1QNFdfdGFibGUzMlRvQkUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTLAotICAgICAgICAgICAgMiAqIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYikpOwotCi0jZW5kaWYKLQotICAgICAgICBNNE1QNFdfdGFibGUzMlRvQkUobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNTLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5zdHNzVGFibGVFbnRyeU5iKTsKLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0gyNjMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJIMjYzID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHZfdHJha1NpemUgPSBBQjROICsgNDI2OyAvKiAoaDI2Mz1BK0IrNE4rNDI2KSovCi0gICAgICAgICAgICB2X21kaWFTaXplID0gQUI0TiArIDMyNjsgLyogKGgyNjM9QStCKzROKzMyNikqLwotICAgICAgICAgICAgdl9taW5mU2l6ZSA9IEFCNE4gKyAyNTM7IC8qIChoMjYzPUErQis0TisyNTMpKi8KLSAgICAgICAgICAgIHZfc3RibFNpemUgPSBBQjROICsgMTg5OyAvKiAoaDI2Mz1BK0IrNE4rMTg5KSovCi0gICAgICAgICAgICB2X3N0c2RTaXplID0gMTE3OyAgICAgICAgLyogKGgyNjM9MTE3KSovCi0gICAgICAgICAgICB2X2VzZFNpemUgPSAxMDE7ICAgICAgICAgLyogKGgyNjM9MTAxKSovCi0KLSAgICAgICAgICAgIG1vb3ZTaXplICs9IEFCNE4gKyA0MjY7Ci0KLSAgICAgICAgICAgIGlmICgoKE00T1NBX0ludDMyKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+YXZnQml0cmF0ZSkgIT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyp0aGUgb3B0aW9uYWwgJ2JpdHInIGF0b20gaXMgYXBwZW5kZWQgdG8gdGhlIGRzaSxzbyBmaWxlc2l6ZSBpcyAxNiBieXRlcyBiaWdnZXIqLwotICAgICAgICAgICAgICAgIHZfdHJha1NpemUgKz0gMTY7Ci0gICAgICAgICAgICAgICAgdl9tZGlhU2l6ZSArPSAxNjsKLSAgICAgICAgICAgICAgICB2X21pbmZTaXplICs9IDE2OwotICAgICAgICAgICAgICAgIHZfc3RibFNpemUgKz0gMTY7Ci0gICAgICAgICAgICAgICAgdl9zdHNkU2l6ZSArPSAxNjsKLSAgICAgICAgICAgICAgICB2X2VzZFNpemUgKz0gMTY7Ci0gICAgICAgICAgICAgICAgbW9vdlNpemUgKz0gMTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgPT0gTTRTWVNfa0gyNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJIMjY0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIC8qIEZvciBIMjY0IHRoZXJlIGlzIG5vIGRlZmF1bHQgRFNJLCBhbmQgaXRzIHByZXNlbmNlIGlzIG1hbmRhdG9yeSwKLSAgICAgICAgICAgIHNvIGNoZWNrIHRoZSBEU0kgaGFzIGJlZW4gc2V0Ki8KLSAgICAgICAgICAgIGlmICgwID09IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZQotICAgICAgICAgICAgICAgIHx8IE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1QNFdfY2xvc2VXcml0ZTogZXJyb3IsIG5vIEgyNjQgRFNJIGhhcyBiZWVuIHNldCEiKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qSDI2NCBzaXplcyBvZiB0aGUgYXRvbSovCi0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgaGFyZGNvZGVkIERTSSB2YWx1ZXMgb2YgSDI2NEJsb2NrMgotICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgYk1VTFBQU1NQUyBjYXNlCi0gICAgICAgICAgICB2X2F2Y0NTaXplID0gc2l6ZW9mKE00T1NBX1VJbnQzMikgKyBzaXplb2YoSDI2NEJsb2NrMikgKwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZTsKLQotICAgICAgICAgICAgdl90cmFrU2l6ZSA9IEFCNE4gKyB2X2F2Y0NTaXplICsgNDExOwotICAgICAgICAgICAgdl9tZGlhU2l6ZSA9IEFCNE4gKyB2X2F2Y0NTaXplICsgMzExOwotICAgICAgICAgICAgdl9taW5mU2l6ZSA9IEFCNE4gKyB2X2F2Y0NTaXplICsgMjM4OwotICAgICAgICAgICAgdl9zdGJsU2l6ZSA9IEFCNE4gKyB2X2F2Y0NTaXplICsgMTc0OwotICAgICAgICAgICAgdl9zdHNkU2l6ZSA9ICAgICAgICB2X2F2Y0NTaXplICsgMTAyOwotICAgICAgICAgICAgdl9lc2RTaXplICA9ICAgICAgICB2X2F2Y0NTaXplICsgODY7Ci0KLSAgICAgICAgICAgIG1vb3ZTaXplICAgKz0gQUI0TiArIHZfYXZjQ1NpemUgKyA0MTE7Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudHJhY2tUeXBlCi0gICAgICAgICAgICA9PSBNNFNZU19rTVBFR180KQotICAgICAgICB7Ci0gICAgICAgICAgICBiTVA0ViA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAvKiBGb3IgTVBFRzQgdGhlcmUgaXMgbm8gZGVmYXVsdCBEU0ksIGFuZCBpdHMgcHJlc2VuY2UgaXMgbWFuZGF0b3J5LAotICAgICAgICAgICAgc28gY2hlY2sgdGhlIERTSSBoYXMgYmVlbiBzZXQqLwotICAgICAgICAgICAgaWYgKDAgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplCi0gICAgICAgICAgICAgICAgfHwgTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TVA0V19jbG9zZVdyaXRlOiBlcnJvciwgbm8gTVBFRzQgRFNJIGhhcyBiZWVuIHNldCEiKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qTVA0ViB2YXJpYWJsZXMqLwotICAgICAgICAgICAgZHNpID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplOwotICAgICAgICAgICAgdl9lc2RzU2l6ZSA9IDM3ICsgZHNpOyAgICAgICAgIC8qIGRzaSszNyovCi0gICAgICAgICAgICB2X0VTRGVzY3JpcHRvclNpemUgPQotICAgICAgICAgICAgICAgIDIzCi0gICAgICAgICAgICAgICAgKyBkc2k7IC8qIGRzaSsyMyAod2FybmluZzogY2hlY2sgZHNpPDEwNSBmb3IgY29kaW5nIHNpemUgb24gMSBieXRlKSovCi0gICAgICAgICAgICB2X0RDRGVzY3JpcHRvclNpemUgPSAxNSArIGRzaTsgLyogZHNpKzE1Ki8KLQotICAgICAgICAgICAgdl90cmFrU2l6ZSA9IEFCNE4gKyBkc2kgKyA0NDg7IC8qIChtcDR2PUErQitkc2krNE4rNDQ4KSAgICAqLwotICAgICAgICAgICAgdl9tZGlhU2l6ZSA9IEFCNE4gKyBkc2kgKyAzNDg7IC8qIChtcDR2PUErQitkc2krNE4rMzQ4KSAgICAqLwotICAgICAgICAgICAgdl9taW5mU2l6ZSA9IEFCNE4gKyBkc2kgKyAyNzU7IC8qIChtcDR2PUErQitkc2krNE4rMjc1KSAgICAqLwotICAgICAgICAgICAgdl9zdGJsU2l6ZSA9IEFCNE4gKyBkc2kgKyAyMTE7IC8qIChtcDR2PUErQitkc2krNE4rMjExKSAgICAqLwotICAgICAgICAgICAgdl9zdHNkU2l6ZSA9IGRzaSArIDEzOTsgICAgICAgIC8qIChtcDR2PTEzOStkc2kpKi8KLSAgICAgICAgICAgIHZfZXNkU2l6ZSA9IGRzaSArIDEyMzsgICAgICAgICAvKiAobXA0dj0xMjMrZHNpKSovCi0KLSAgICAgICAgICAgIG1vb3ZTaXplICs9IEFCNE4gKyBkc2kgKyA0NDg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKnZpZGVvIHZhcmlhYmxlcyovCi0gICAgICAgIHZfc3Rzc1NpemUgPSAxNiArIDQgKiBOOyAvKiA0Kk4rMTYgICAgIFNUU1MqLwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICAgICAgLyogc3RzYyB1cGRhdGUgKi8KLQotICAgICAgICB2X3N0c2NTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgdl9zdGJsU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIHZfbWluZlNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICB2X21kaWFTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgdl90cmFrU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIG1vb3ZTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLQotICAgICAgICAvKiBzdGNvIHVwZGF0ZSAqLwotICAgICAgICB2X3N0Y29TaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9zdGJsU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfbWluZlNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X21kaWFTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl90cmFrU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIG1vb3ZTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLQotI2Vsc2UKLSAgICAgICAgLypzdHNjL3N0Y28gdXBkYXRlKi8KLQotICAgICAgICB2X3N0c2NTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfc3Rjb1NpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X3N0YmxTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIHZfbWluZlNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgdl9tZGlhU2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICB2X3RyYWtTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIG1vb3ZTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0KLSNlbmRpZgotCi0gICAgICAgIC8qdXBkYXRlIGxhc3QgY2h1bmsgdGltZSovCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgICAgIHZfbXNUcmFrRHVyYXRpb247Ci0gICAgfQotCi0gICAgaWYgKGJBdWRpbykKLSAgICB7Ci0gICAgICAgIGlmICgoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGUpCi0gICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwKLSAgICAgICAgICAgID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlKQotICAgICAgICAgICAgfHwgKE00T1NBX05VTEwKLSAgICAgICAgICAgID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtUaW1lTXNUYWJsZSkKLSAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZSgKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCk7IC8qKjwgY2xvc2UgdGhlIHN0cmVhbSBhbnl3YXkgKi8KLSAgICAgICAgICAgIE00TVA0V19mcmVlQ29udGV4dChjb250ZXh0KTsgLyoqPCBGcmVlIHRoZSBjb250ZXh0IGNvbnRlbnQgKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qYXVkaW8gbWljcm9zdGF0ZSovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWljcm9TdGF0ZSA9IE00TVA0V19jbG9zZWQ7Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUgPT0gTTRTWVNfa0FBQykKLSAgICAgICAgewotICAgICAgICAgICAgYkFBQyA9Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyplbHNlLCBhdWRpbyBpcyBpbXBsaWNpdGVseSBhbXIgaW4gdGhlIGZvbGxvd2luZyovCi0gICAgICAgICAgICBkc2kgPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemU7IC8qdmFyaWFibGUgc2l6ZSovCi0KLSAgICAgICAgICAgIGFfZXNkc1NpemUgPSAzNyArIGRzaTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHNpKzM3Ki8KLSAgICAgICAgICAgIGFfRVNEZXNjcmlwdG9yU2l6ZSA9Ci0gICAgICAgICAgICAgICAgMjMKLSAgICAgICAgICAgICAgICArIGRzaTsgLyogZHNpKzIzICh3YXJuaW5nOiBjaGVjayBkc2k8MTA1IGZvciBjb2Rpbmcgc2l6ZSBvbiAxIGJ5dGUpKi8KLSAgICAgICAgICAgIGFfRENEZXNjcmlwdG9yU2l6ZSA9IDE1ICsgZHNpOyAgICAgICAgICAgICAgICAgLyogZHNpKzE1Ki8KLQotICAgICAgICAgICAgYV9lc2RTaXplID0gZHNpICsgNzM7IC8qb3ZlcndyaXRlIGFfZXNkU2l6ZSB3aXRoIGFhYyB2YWx1ZSovCi0gICAgICAgICAgICAvKmFkZCBkaWYuIGJldHdlZW4gYW1yICYgYWFjIHNpemVzOiAoLSA1MyArIGRzaSArIDM3KSovCi0gICAgICAgICAgICBhX3N0c2RTaXplICs9IGRzaSArIDIwOwotICAgICAgICAgICAgYV9zdGJsU2l6ZSArPSBkc2kgKyAyMDsKLSAgICAgICAgICAgIGFfbWluZlNpemUgKz0gZHNpICsgMjA7Ci0gICAgICAgICAgICBhX21kaWFTaXplICs9IGRzaSArIDIwOwotICAgICAgICAgICAgYV90cmFrU2l6ZSArPSBkc2kgKyAyMDsKLSAgICAgICAgICAgIG1vb3ZTaXplICs9IGRzaSArIDIwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS50cmFja1R5cGUKLSAgICAgICAgICAgID09IE00U1lTX2tFVlJDKQotICAgICAgICB7Ci0gICAgICAgICAgICBiRVZSQyA9Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyplbHNlLCBhdWRpbyBpcyBpbXBsaWNpdGVseSBhbXIgaW4gdGhlIGZvbGxvd2luZyovCi0KLSAgICAgICAgICAgIC8qIGV2cmMgZHNpIGlzIG9ubHkgNiBieXRlcyB3aGlsZSBhbXIgZHNpIGlzIDkgYnl0ZXMsYWxsIG90aGVyIGJsb2NrcyBhcmUgdW5jaGFuZ2VkICovCi0gICAgICAgICAgICBhX2VzZFNpemUgLT0gMzsKLSAgICAgICAgICAgIGFfc3RzZFNpemUgLT0gMzsKLSAgICAgICAgICAgIGFfc3RibFNpemUgLT0gMzsKLSAgICAgICAgICAgIGFfbWluZlNpemUgLT0gMzsKLSAgICAgICAgICAgIGFfbWRpYVNpemUgLT0gMzsKLSAgICAgICAgICAgIGFfdHJha1NpemUgLT0gMzsKLSAgICAgICAgICAgIG1vb3ZTaXplIC09IDM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZVNpemUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZSgKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpOyAvKio8IGNsb3NlIHRoZSBzdHJlYW0gYW55d2F5ICovCi0gICAgICAgICAgICAgICAgTTRNUDRXX2ZyZWVDb250ZXh0KGNvbnRleHQpOyAvKio8IEZyZWUgdGhlIGNvbnRleHQgY29udGVudCAqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qQ29udmVydCBpbnRlZ2VycyBpbiB0aGUgdGFibGUgZnJvbSBMRSBpbnRvIEJFKi8KLSAgICAgICAgICAgIE00TVA0V190YWJsZTMyVG9CRShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUU1osCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iKTsKLSAgICAgICAgICAgIGFfc3RzelNpemUgKz0KLSAgICAgICAgICAgICAgICA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgYV9zdGJsU2l6ZSArPQotICAgICAgICAgICAgICAgIDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBhX21pbmZTaXplICs9Ci0gICAgICAgICAgICAgICAgNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgIGFfbWRpYVNpemUgKz0KLSAgICAgICAgICAgICAgICA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICAgICAgYV90cmFrU2l6ZSArPQotICAgICAgICAgICAgICAgIDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmI7Ci0gICAgICAgICAgICBtb292U2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iOwotICAgICAgICB9Ci0KLSAgICAgICAgbW9vdlNpemUgKz0gNDAyOwotCi0gICAgICAgIC8qY3VycmVudCBjaHVuayBpcyB0aGUgbGFzdCBvbmUgYW5kIGdpdmVzIHRoZSB0b3RhbCBudW1iZXIgb2YgYXVkaW8gY2h1bmtzICgtMSkqLwotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhX2RhdGFTaXplICs9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV07Ci0gICAgICAgIH0KLQotI2lmbmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICAgICAgLypmbHVzaCBjaHVuayovCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNodW5rWzBdLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcywKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiZmx1c2ggYXVkaW8gfCBDTE9TRSIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMigiY3VycmVudCBjaHVuayA9ICVkICBvZmZzZXQgPSAweCV4IiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hYnNvbHV0ZUN1cnJlbnRQb3MpOwotCi0gICAgICAgIC8qdXBkYXRlIGNodW5rIG9mZnNldCovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICBjaHVua09mZnNldFRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmFic29sdXRlQ3VycmVudFBvczsKLQotICAgICAgICAvKmFkZCBjaHVuayBzaXplIHRvIGFic29sdXRlQ3VycmVudFBvcyovCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zICs9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgLyp1cGRhdGUgbGFzdCBjaHVuayBzaXplLCBhbmQgYWRkIHRoaXMgdmFsdWUgdG8gYV9kYXRhU2l6ZSovCi0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2l6ZVRhYmxlW21NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rXSA9Ci0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRQb3M7Ci0gICAgICAgIGFfZGF0YVNpemUgKz0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvczsgLyphZGQgbGFzdCBjaHVuayBzaXplKi8KLQotICAgICAgICAvKiBidWdmaXg6IGlmIGEgbmV3IGNodW5rIHdhcyBqdXN0IGNyZWF0ZWQsIGNhbmNlbCBpdCBiZWZvcmUgdG8gY2xvc2UgKi8KLSAgICAgICAgaWYgKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuayAhPSAwKQotICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFBvcyA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmstLTsKLSAgICAgICAgfQotI2lmZGVmIF9NNE1QNFdfVU5CVUZGRVJFRF9WSURFTwotCi0gICAgICAgIGlmICgobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVttTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgY3VycmVudFN0c2NdICYgMHhGRkYpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2MtLTsKLSAgICAgICAgfQotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX1VOQlVGRkVSRURfVklERU8qLwotCi0gICAgICAgIGFfdHJha0R1cmF0aW9uID0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENvbW1vbkRhdGEubGFzdENUUzsgLyogZXF1YWxzIGxhc3RDVFMqLwotICAgICAgICAvKiBhZGQgbGFzdCBzYW1wbGUgZHVyICovCi0KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iICE9IDEpCi0gICAgICAgIHsKLSNpZmRlZiBEVVBMSUNBVEVfU1RUU19JTl9MQVNUX0FVCi0gICAgICAgICAgICAvKmluY3JlYXNlIG9mIDEgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBBVXMgd2l0aCBzYW1lIGR1cmF0aW9uKi8KLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFRTWzIKLSAgICAgICAgICAgICAgICAqKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iCi0gICAgICAgICAgICAgICAgLSAxKSAtIDJdICs9IDE7Ci0KLSNlbmRpZiAvKkRVUExJQ0FURV9TVFRTX0lOX0xBU1RfQVUqLwotCi0gICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiArPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFNbMgotICAgICAgICAgICAgICAgICogKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgQ29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkgLSAxXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5sYXN0Q1RTKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRyYWNrVHlwZQotICAgICAgICAgICAgICAgID09IE00U1lTX2tBTVIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKDEyMjAwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDMyCi0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKDEwMjAwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDI3Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKDc5NTAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMjEKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoNzQwMCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IGFfZGF0YVNpemUgLyAyMAotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICg2NzAwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDE4Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKDU5MDAgPT0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYV90cmFrRHVyYXRpb24gPSBhX2RhdGFTaXplIC8gMTYKLSAgICAgICAgICAgICAgICAgICAgICAgICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5zYW1wbGVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoNTE1MCA9PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmF2Z0JpdHJhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhX3RyYWtEdXJhdGlvbiA9IGFfZGF0YVNpemUgLyAxNAotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICg0NzUwID09IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFfdHJha0R1cmF0aW9uID0gYV9kYXRhU2l6ZSAvIDEzCi0gICAgICAgICAgICAgICAgICAgICAgICAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2NhbGVfYXVkaW8gPQotICAgICAgICAgICAgMTAwMC4wIC8gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZTsKLSAgICAgICAgYV9tc1RyYWtEdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKGFfdHJha0R1cmF0aW9uICogc2NhbGVfYXVkaW8pOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLSAgICAgICAgLyogc3RzYyB1cGRhdGUgKi8KLQotICAgICAgICBhX3N0c2NTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgYV9zdGJsU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIGFfbWluZlNpemUgKz0gMTIgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRTdHNjOwotICAgICAgICBhX21kaWFTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLSAgICAgICAgYV90cmFrU2l6ZSArPSAxMiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudFN0c2M7Ci0gICAgICAgIG1vb3ZTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsKLQotICAgICAgICAvKiBzdHNvIHVwZGF0ZSAqLwotICAgICAgICBhX3N0Y29TaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9zdGJsU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfbWluZlNpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX21kaWFTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV90cmFrU2l6ZSArPSA0ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIG1vb3ZTaXplICs9IDQgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLQotI2Vsc2UKLSAgICAgICAgLypzdHNjL3N0Y28gdXBkYXRlKi8KLQotICAgICAgICBhX3N0c2NTaXplICs9IDEyICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfc3Rjb1NpemUgKz0gNCAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX3N0YmxTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIGFfbWluZlNpemUgKz0gMTYgKiBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgYV9tZGlhU2l6ZSArPSAxNiAqIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOwotICAgICAgICBhX3RyYWtTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0gICAgICAgIG1vb3ZTaXplICs9IDE2ICogbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7Ci0KLSNlbmRpZgotCi0gICAgICAgIC8qIGNvbXB1dGUgdGhlIG5ldyBzaXplIG9mIHN0dHMqLwotCi0gICAgICAgIGFfc3R0c1NpemUgPSAxNiArIDggKiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIENvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiAtIDEpOwotCi0gICAgICAgIG1vb3ZTaXplICs9IGFfc3R0c1NpemUgLSAyNDsKLSAgICAgICAgYV9tZGlhU2l6ZSArPSBhX3N0dHNTaXplIC0gMjQ7Ci0gICAgICAgIGFfbWluZlNpemUgKz0gYV9zdHRzU2l6ZSAtIDI0OwotICAgICAgICBhX3N0YmxTaXplICs9IGFfc3R0c1NpemUgLSAyNDsKLSAgICAgICAgYV90cmFrU2l6ZSArPSBhX3N0dHNTaXplIC0gMjQ7Ci0KLSAgICAgICAgLyp1cGRhdGUgbGFzdCBjaHVuayB0aW1lKi8KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT4KLSAgICAgICAgICAgIGNodW5rVGltZU1zVGFibGVbbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmtdID0KLSAgICAgICAgICAgIGFfbXNUcmFrRHVyYXRpb247Ci0gICAgfQotCi0gICAgLyogY2hhbmdpbmcgdGhlIHdheSB0aGUgbWRhdCBzaXplIGlzIGNvbXB1dGVkLgotICAgIFRoZSByZWFsIHB1cnBvc2Ugb2YgdGhlIG1kYXQgc2l6ZSBpcyB0byBrbm93IHRoZSBhbW91bnQgdG8gc2tpcCB0byBnZXQgdG8gdGhlIG5leHQKLSAgICBhdG9tLCB3aGljaCBpcyB0aGUgbW9vdjsgdGhlIHNpemUgb2YgbWVkaWEgaW4gdGhlIG1kYXQgaXMgYWxtb3N0IHNlY29uZGFyeS4gVGhlcmVmb3JlLAotICAgIGl0IGlzIG9mIHV0bW9zdCBpbXBvcnRhbmNlIHRoYXQgdGhlIG1kYXQgc2l6ZSAicG9pbnRzIiB0byB3aGVyZSB0aGUgbW9vdiBhY3R1YWxseQotICAgIGJlZ2lucy4gTm93LCB0aGUgbW9vdiBiZWdpbnMgcmlnaHQgYWZ0ZXIgdGhlIGxhc3QgZGF0YSB3ZSB3cm90ZSwgc28gaG93IGNvdWxkIHRoZSBzdW0KLSAgICBvZiBhbGwgY2h1bmsgc2l6ZXMgYmUgZGlmZmVyZW50IGZyb20gdGhlIHRvdGFsIHNpemUgb2Ygd2hhdCBoYXMgYmVlbiB3cml0dGVuPyBXZWxsLCBpdAotICAgIGNhbiBoYXBwZW4gd2hlbiB0aGUgd3JpdGluZyB3YXMgdW5leHBlY3RlZGx5IHN0b3BwZWQgKGJlY2F1c2Ugb2YgbGFjayBvZiBkaXNrIHNwYWNlLAotICAgIGZvciBpbnN0YW5jZSksIGluIHRoaXMgY2FzZSBhIGNodW5rIG1heSBiZSBwYXJ0aWFsbHkgd3JpdHRlbiAodGhlIHBhcnRpYWwgd3JpdGUgaXMgbm90Ci0gICAgbmVjZXNzYXJpbHkgZXJhc2VkKSBidXQgaXQgbWF5IG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhlIGNodW5rIHNpemUgbGlzdCAod2hpY2ggbWF5Ci0gICAgYmVsaWV2ZSBpdCBoYXNuJ3QgYmVlbiB3cml0dGVuIG9yIG9uIHRoZSBjb250cmFyeSB0aGF0IGl0IGhhcyBiZWVuIGZ1bGx5IHdyaXR0ZW4pLiBJbgotICAgIHRoZSBjYXNlIG9mIHN1Y2ggYSBtaXNtYXRjaCwgdGhlcmUgaXMgZWl0aGVyIHVudXNlZCBkYXRhIGluIHRoZSBtZGF0IChub3QgdmVyeSBnb29kLAotICAgIGJ1dCB0b2xlcmFibGUpIG9yIHdoZW4gcmVhZGluZyB0aGUgbGFzdCBjaHVuayBpdCB3aWxsIHJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbW9vdgotICAgIGFzIHBhcnQgb2YgdGhlIGNodW5rICh3aGljaCBtZWFucyB0aGUgbGFzdCBjaHVuayB3b24ndCBiZSBjb3JyZWN0bHkgZGVjb2RlZCksIGJvdGggb2YKLSAgICB3aGljaCBhcmUgc3RpbGwgYmV0dGVyIHRoYW4gbG9zaW5nIHRoZSB3aG9sZSByZWNvcmRpbmcuIEluIHRoZSBsb25nIHJ1biBpdCdsbCBwcm9iYWJseQotICAgIGJlIGF0dGVtcHRlZCB0byBhbHdheXMgY2xlYW4gdXAgYmFjayB0byBhIGNvbnNpc3RlbnQgc3RhdGUsIGJ1dCBhdCBhbnkgcmF0ZSBpdCBpcwotICAgIGFsd2F5cyBzYWZlciB0byBoYXZlIHRoZSBtZGF0IHNpemUgYmUgY29tcHV0ZWQgdXNpbmcgdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBtb292Ci0gICAgYWN0dWFsbHkgYmVnaW5zLCByYXRoZXIgdGhhbiB1c2luZyB0aGUgc2l6ZSBpdCBpcyB0aG91Z2h0IHRoZSBtZGF0IGhhcy4KLQotICAgIFRoZXJlZm9yZSwgSSB3aWxsIHJlY29yZCB3aGVyZSB3ZSBhcmUganVzdCBiZWZvcmUgd3JpdGluZyB0aGUgbW9vdiwgdG8gc2VydmUgd2hlbgotICAgIHVwZGF0aW5nIHRoZSBtZGF0IHNpemUuICovCi0KLSAgICAvKiBtZGF0U2l6ZSArPSBhX2RhdGFTaXplICsgdl9kYXRhU2l6ZTsgKi8vKlRPRE8gYWxsb3cgZm9yIG11bHRpcGxlIGNodW5rcyovCi0KLSAgICAvKiBFbmQgb2YgUGllcnJlIExlYmVhdXBpbiAxOS8xMi8yMDA3OiBjaGFuZ2luZyB0aGUgd2F5IHRoZSBtZGF0IHNpemUgaXMgY29tcHV0ZWQuICovCi0KLSAgICAvKiBmaXJzdCB0cmFrIG9mZnNldCBpcyAzMittb292U2l6ZSwgc2Vjb25kIGVxdWFscyAzMittb292U2l6ZSsxc3RfdHJhY2tfc2l6ZSovCi0gICAgYV90cmFrT2Zmc2V0ICs9IG1vb3ZTaXplOwotICAgIHZfdHJha09mZnNldCArPSBtb292U2l6ZS8qKyBhX2RhdGFTaXplKi87Ci0KLSAgICBpZiAoYkludGVybGVhdmVBViA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgdl90cmFrT2Zmc2V0ICs9IGFfZGF0YVNpemU7Ci0KLSAgICAvKnN5c3RlbSB0aW1lIHNpbmNlIDE5NzAgKi8KLSNpZm5kZWYgX000TVA0V19ET05UX1VTRV9USU1FX0gKLQotICAgIHRpbWUoKHRpbWVfdCAqKSZjcmVhdGlvblRpbWUpOwotICAgIC8qY29udmVydCBpbnRvIHRpbWUgc2luY2UgMS8xLzE5MDQgMDBoMDAgKG5vcm1hdGl2ZSkqLwotICAgIGNyZWF0aW9uVGltZSArPSAyMDgyODQxNzYxOyAvKm5iIG9mIHNlYyBiZXR3ZWVuIDE5MDQgYW5kIDE5NzAqLwotCi0jZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX0RPTlRfVVNFX1RJTUVfSCovCi0KLSAgICBjcmVhdGlvblRpbWUgPQotICAgICAgICAweEJCRDA5MTAwOyAvKiA9IDcvMTEvMjAwMyAwMGgwMCA7IGluIGhleGEgYmVjYXVzZSBvZiBjb2RlIHNjcmFtYmxlciBsaW1pdGF0aW9uIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXJnZSBpbnRlZ2VycyAqLwotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX0RPTlRfVVNFX1RJTUVfSCovCi0KLSAgICBtTXA0RmlsZURhdGFQdHItPmR1cmF0aW9uID0KLSAgICAgICAgbWF4KGFfbXNUcmFrRHVyYXRpb24sIHZfbXNUcmFrRHVyYXRpb24pOyAvKm1heCBhdWRpby92aWRlbyovCi0KLSNpZmRlZiBfTTRNUDRXX01PT1ZfRklSU1QKLSAgICAvKm9wZW4gZmlsZSBpbiB3cml0ZSBiaW5hcnkgbW9kZSovCi0KLSAgICBlcnIgPSBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPm9wZW5Xcml0ZSgmZmlsZVdyaXRlckNvbnRleHQsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dXJsLCAweDIyKTsKLSAgICBFUlJfQ0hFQ0soZXJyID09IE00Tk9fRVJST1IsIGVycik7Ci0KLSAgICAvKmZ0eXAgYXRvbSovCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5tYWpvcl9icmFuZCAhPSAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAgICAgLyogUHV0IGN1c3RvbWl6ZWQgZnR5cCBib3ggKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKDE2Ci0gICAgICAgICAgICArIChtTXA0RmlsZURhdGFQdHItPmZ0eXAubmJDb21wYXRpYmxlQnJhbmRzICogNCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihNNE1QQUNfRlRZUF9UQUcsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmZ0eXAubWFqb3JfYnJhbmQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmZ0eXAubWlub3JfdmVyc2lvbiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5uYkNvbXBhdGlibGVCcmFuZHM7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPmZ0eXAuY29tcGF0aWJsZV9icmFuZHNbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBQdXQgZGVmYXVsdCBmdHlwIGJveCAqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKERlZmF1bHRfZnR5cCwgc2l6ZW9mKERlZmF1bHRfZnR5cCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgfQotCi0jZW5kaWYgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIC8qIHNlZWsgaXMgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotICAgIC8qIC4uLiBvciByYXRoZXIsIHNlZWsgdXNlZCB0byBiZSB1c2VkIGZvciB0aGF0LCBidXQgaXQgaGFzIGJlZW4gZm91bmQgdGhpcyBmdW5jdGlvbmFsaXR5Ci0gICAgaXMgbm90IHJlbGlhYmx5LCBvciBzb21ldGltZXMgbm90IGF0IGFsbCwgaW1wbGVtZW50ZWQgaW4gdGhlIHZhcmlvdXMgT1NBTHMsIHNvIHdlIG5vdyBhdm9pZAotICAgIHVzaW5nIGl0LiAqLwotICAgIC8qIE5vdGljZSB0aGlzIG5ldyBtZXRob2QgYXNzdW1lcyB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCB0aGlzIHdpbGwgYnJlYWsgaWYgZXZlciB3ZQotICAgIGFyZSBvdmVyd3JpdGluZyBhIGxhcmdlciBmaWxlLiAqLwotCi0gICAgQ0xFQU5VUG9uRVJSKG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Z2V0T3B0aW9uKAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJDb250ZXh0LAotICAgICAgICBNNE9TQV9rRmlsZVdyaXRlR2V0RmlsZVNpemUsIChNNE9TQV9EYXRhT3B0aW9uICopICZtb292UG9zKSk7Ci0gICAgLyogbW9vdlBvcyB3aWxsIGJlIHVzZWQgYWZ0ZXIgd3JpdGluZyB0aGUgbW9vdi4gKi8KLQotI2VuZGlmIC8qX000TVA0V19NT09WX0ZJUlNUKi8KLQotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihtb292U2l6ZSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2szLCBzaXplb2YoQ29tbW9uQmxvY2szKSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihjcmVhdGlvblRpbWUsCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazQsIHNpemVvZihDb21tb25CbG9jazQpLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+ZHVyYXRpb24sCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrNSwgc2l6ZW9mKENvbW1vbkJsb2NrNSksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgIGlmIChiQXVkaW8pCi0gICAgewotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV90cmFrU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazYsIHNpemVvZihDb21tb25CbG9jazYpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV90cmFrSWQsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s3LCBzaXplb2YoQ29tbW9uQmxvY2s3KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfbXNUcmFrRHVyYXRpb24sCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s3YmlzLCBzaXplb2YoQ29tbW9uQmxvY2s3YmlzKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBTVJCbG9jazEsIHNpemVvZihBTVJCbG9jazEpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfbWRpYVNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s4LCBzaXplb2YoQ29tbW9uQmxvY2s4KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfdHJha0R1cmF0aW9uLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrOSwgc2l6ZW9mKENvbW1vbkJsb2NrOSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQU1SQmxvY2sxXzEsIHNpemVvZihBTVJCbG9jazFfMSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYXVkaW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9taW5mU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazEwLCBzaXplb2YoQ29tbW9uQmxvY2sxMCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3N0YmxTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTEsIHNpemVvZihDb21tb25CbG9jazExKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfc3R0c1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxMiwgc2l6ZW9mKENvbW1vbkJsb2NrMTIpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgLyppbnZlcnQgdGhlIHRhYmxlIGRhdGEgdG8gYmlnZW5kaWFuKi8KLSAgICAgICAgTTRNUDRXX3RhYmxlMzJUb0JFKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+VEFCTEVfU1RUUywKLSAgICAgICAgICAgIDIgKiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIKLSAgICAgICAgICAgIC0gMSkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKChjb25zdCBNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKiltTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPlRBQkxFX1NUVFMsCi0gICAgICAgICAgICAoIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iIC0gMSkKLSAgICAgICAgICAgICogOCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyovCi0KLSAgICAgICAgLyogc3RzZCAqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV9zdHNkU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhTYW1wbGVEZXNjcmlwdGlvbkhlYWRlciwKLSAgICAgICAgICAgIHNpemVvZihTYW1wbGVEZXNjcmlwdGlvbkhlYWRlciksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX2VzZFNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgLyogc2FtcGxlIGRlc2MgZW50cnkgaW5zaWRlIHN0c2QgKi8KLSAgICAgICAgaWYgKGJBQUMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQUFDQmxvY2sxLCBzaXplb2YoQUFDQmxvY2sxKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGJFVlJDKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEVWUkM4QmxvY2sxLCBzaXplb2YoRVZSQzhCbG9jazEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmV2cmMqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgLypBTVI4Ki8KLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBTVI4QmxvY2sxLCBzaXplb2YoQU1SOEJsb2NrMSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYW1yOCovCi0gICAgICAgIH0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhTYW1wbGVEZXNjcmlwdGlvbkVudHJ5U3RhcnQsCi0gICAgICAgICAgICBzaXplb2YoU2FtcGxlRGVzY3JpcHRpb25FbnRyeVN0YXJ0KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBdWRpb1NhbXBsZURlc2NFbnRyeUJvaWxlcnBsYXRlLAotICAgICAgICAgICAgc2l6ZW9mKEF1ZGlvU2FtcGxlRGVzY0VudHJ5Qm9pbGVycGxhdGUpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnRpbWVzY2FsZQotICAgICAgICAgICAgPDwgMTYsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgLyogRFNJIGluc2lkZSBzYW1wbGUgZGVzYyBlbnRyeSAqLwotICAgICAgICBpZiAoYkFBQykKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfZXNkc1NpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMCwKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMCksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoYV9FU0Rlc2NyaXB0b3JTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazEsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazEpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKGFfRENEZXNjcmlwdG9yU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBQUNCbG9jazIsIHNpemVvZihBQUNCbG9jazIpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJFMjQobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5hdmdCaXRyYXRlICogNSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+bWF4Qml0cmF0ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+YXZnQml0cmF0ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2syLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2syKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmRzaVNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qYWFjKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5kc2lTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmFhYyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazMsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazMpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphYWMqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGJFVlJDKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50OCBsb2NhbERzaVs2XTsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBsb2NhbEk7Ci0KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soRVZSQ0Jsb2NrM18xLCBzaXplb2YoRVZSQ0Jsb2NrM18xKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyovCi0KLSAgICAgICAgICAgIC8qIGNvcHkgdGhlIGRlZmF1bHQgYmxvY2sgaW4gYSBsb2NhbCB2YXJpYWJsZSovCi0gICAgICAgICAgICBmb3IgKCBsb2NhbEkgPSAwOyBsb2NhbEkgPCA2OyBsb2NhbEkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9jYWxEc2lbbG9jYWxJXSA9IEVWUkNCbG9jazNfMltsb2NhbEldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogY29tcHV0ZXMgdGhlIG51bWJlciBvZiBzYW1wbGUgcGVyIGF1ICovCi0gICAgICAgICAgICAvKiBhbmQgc3RvcmVzIGl0IGluIHRoZSBEU0kqLwotICAgICAgICAgICAgLyogYXNzdW1lcyBhIGNoYXIgaXMgZW5vdWdoIHRvIHN0b3JlIHRoZSBkYXRhKi8KLSAgICAgICAgICAgIGxvY2FsRHNpWzVdID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+c2FtcGxlRHVyYXRpb24KLSAgICAgICAgICAgICAgICAvIDE2MCkvKkVWUkMgMSBmcmFtZSBkdXJhdGlvbiovOwotCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjb3B5IHZlbmRvciBuYW1lICovCi0gICAgICAgICAgICAgICAgZm9yICggbG9jYWxJID0gMDsgbG9jYWxJIDwgNDsgbG9jYWxJKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxEc2lbbG9jYWxJXSA9IChNNE9TQV9VSW50OCkoCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSVtsb2NhbEldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKGxvY2FsRHNpLCA2LAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8qQU1SOCovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQ4IGxvY2FsRHNpWzldOwotICAgICAgICAgICAgTTRPU0FfVUludDMyIGxvY2FsSTsKLQotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBTVJEU0lIZWFkZXIsIHNpemVvZihBTVJEU0lIZWFkZXIpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICAgICAgLyogY29weSB0aGUgZGVmYXVsdCBibG9jayBpbiBhIGxvY2FsIHZhcmlhYmxlKi8KLSAgICAgICAgICAgIGZvciAoIGxvY2FsSSA9IDA7IGxvY2FsSSA8IDk7IGxvY2FsSSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2NhbERzaVtsb2NhbEldID0gQU1SRGVmYXVsdERTSVtsb2NhbEldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogY29tcHV0ZXMgdGhlIG51bWJlciBvZiBzYW1wbGUgcGVyIGF1ICovCi0gICAgICAgICAgICAvKiBhbmQgc3RvcmVzIGl0IGluIHRoZSBEU0kqLwotICAgICAgICAgICAgLyogYXNzdW1lcyBhIGNoYXIgaXMgZW5vdWdoIHRvIHN0b3JlIHRoZSBkYXRhKi8KLSAgICAgICAgICAgIC8qIEFMRVJUISBUaGUgcG90ZW50aWFsIG9mIHRoZSBmb2xsb3dpbmcgbGluZSBvZiBjb2RlIHRvIGV4cGxvZGUgaW4gb3VyIGZhY2UKLSAgICAgICAgICAgIGlzIGVub3Jtb3VzIHdoZW4gYW55dGhpbmcgKHNhbXBsZSByYXRlIG9yIHdoYXRldmVyKSB3aWxsIGNoYW5nZS4gVGhpcwotICAgICAgICAgICAgY2FsY3VsYXRpb24gd291bGQgYmUgTVVDSCBiZXR0ZXIgaGFuZGxlZCBieSB0aGUgVkVTIG9yIHdoYXRldmVyIGRlYWxzIHdpdGgKLSAgICAgICAgICAgIHRoZSBlbmNvZGVyIG1vcmUgZGlyZWN0bHkuICovCi0gICAgICAgICAgICBsb2NhbERzaVs4XSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KShtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPnNhbXBsZUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgLyAxNjApLypBTVIgTkIgMSBmcmFtZSBkdXJhdGlvbiovOwotCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0kgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBjb3B5IHZlbmRvciBuYW1lICovCi0gICAgICAgICAgICAgICAgZm9yICggbG9jYWxJID0gMDsgbG9jYWxJIDwgNDsgbG9jYWxJKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxEc2lbbG9jYWxJXSA9IChNNE9TQV9VSW50OCkoCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkRTSVtsb2NhbEldKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBjb3B5IHRoZSBNb2RlIFNldCAqLwotICAgICAgICAgICAgICAgIGZvciAoIGxvY2FsSSA9IDU7IGxvY2FsSSA8IDc7IGxvY2FsSSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsRHNpW2xvY2FsSV0gPSAoTTRPU0FfVUludDgpKAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5EU0lbbG9jYWxJXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhsb2NhbERzaSwgOSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyovCi0gICAgICAgIH0KLQotICAgICAgICAvKmVuZCB0cmFrKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfc3RzelNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxNSwgc2l6ZW9mKENvbW1vbkJsb2NrMTUpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIC8qMCB2YWx1ZSBmb3Igc2FtcGxlc2l6ZSBtZWFucyBub3QgY29uc3RhbnQgQVUgc2l6ZSovCi0gICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlU2l6ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKChjb25zdCBNNE9TQV9VQ2hhcgotICAgICAgICAgICAgICAgICopbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5UQUJMRV9TVFNaLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYiAqIDQsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGFfc3RzY1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxNiwgc2l6ZW9mKENvbW1vbkJsb2NrMTYpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYwotICAgICAgICAgICAgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50U3RzYzsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgICAgICggbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGVbaV0KLSAgICAgICAgICAgID4+IDEyKSArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKChtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgIGNodW5rU2FtcGxlTmJUYWJsZVtpXSAmIDB4RkZGKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2Vsc2UKLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsKLSAgICAgICAgICAgICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoaSArIDEsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlW2ldLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihhX3N0Y29TaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTcsIHNpemVvZihDb21tb25CbG9jazE3KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rCi0gICAgICAgICAgICArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoYV90cmFrT2Zmc2V0LAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIGFfdHJha09mZnNldCArPSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldOwotCi0gICAgICAgICAgICBpZiAoKCBiSW50ZXJsZWF2ZUFWID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rID49IGkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFfdHJha09mZnNldCArPQotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bms7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rT2Zmc2V0VGFibGVbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhBTVJCbG9jazQsIHNpemVvZihBTVJCbG9jazQpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmF1ZGlvKi8KLSAgICB9Ci0KLSAgICBpZiAoYlZpZGVvKQotICAgIHsKLSAgICAgICAgLyp0cmFrKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfdHJha1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s2LCBzaXplb2YoQ29tbW9uQmxvY2s2KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKGNyZWF0aW9uVGltZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfdHJha0lkLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrNywgc2l6ZW9mKENvbW1vbkJsb2NrNyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X21zVHJha0R1cmF0aW9uLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrN2Jpcywgc2l6ZW9mKENvbW1vbkJsb2NrN2JpcyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgLyogSW4gdGhlIHRyYWNrIGhlYWRlciB3aWR0aCBhbmQgaGVpZ2h0IGFyZSAxNi4xNiBmaXhlZCBwb2ludCB2YWx1ZXMsCi0gICAgICAgIHNvIHNoaWZ0IGxlZnQgdGhlIHJlZ3VsYXIgaW50ZWdlciB2YWx1ZSBieSAxNi4gKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+d2lkdGggPDwgMTYsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5oZWlnaHQKLSAgICAgICAgICAgIDw8IDE2LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9tZGlhU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazgsIHNpemVvZihDb21tb25CbG9jazgpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoY3JlYXRpb25UaW1lLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEudGltZXNjYWxlLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl90cmFrRHVyYXRpb24sCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2s5LCBzaXplb2YoQ29tbW9uQmxvY2s5KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhWaWRlb0Jsb2NrMV8xLCBzaXplb2YoVmlkZW9CbG9jazFfMSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9taW5mU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazEwLCBzaXplb2YoQ29tbW9uQmxvY2sxMCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3N0YmxTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTEsIHNpemVvZihDb21tb25CbG9jazExKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3R0c1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxMiwgc2l6ZW9mKENvbW1vbkJsb2NrMTIpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc3R0c1RhYmxlRW50cnlOYiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSNpZmRlZiBfTTRNUDRXX09QVElNSVpFX0ZPUl9QSE9ORQotCi0gICAgICAgIGZvciAoIGkgPSAwOwotICAgICAgICAgICAgaSA8IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zdHRzVGFibGVFbnRyeU5iOwotICAgICAgICAgICAgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKE00TVA0V19nZXQzMl9MbygKLSAgICAgICAgICAgICAgICAmbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFRTW2ldKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoTTRNUDRXX2dldDMyX0hpKAotICAgICAgICAgICAgICAgICZtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUVFNbaV0pLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soKGNvbnN0IE00T1NBX1VDaGFyCi0gICAgICAgICAgICAqKW1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+VEFCTEVfU1RUUywKLSAgICAgICAgICAgICggbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnN0dHNUYWJsZUVudHJ5TmIpICogOCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0KLSNlbmRpZgotCi0gICAgICAgIC8qIHN0c2QgKi8KLQotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9zdHNkU2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhTYW1wbGVEZXNjcmlwdGlvbkhlYWRlciwKLSAgICAgICAgICAgIHNpemVvZihTYW1wbGVEZXNjcmlwdGlvbkhlYWRlciksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X2VzZFNpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAgICAgLyogc2FtcGxlIGRlc2MgZW50cnkgaW5zaWRlIHN0c2QgKi8KLSAgICAgICAgaWYgKGJNUDRWKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1wNHZCbG9jazEsIHNpemVvZihNcDR2QmxvY2sxKSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiSDI2MykKLSAgICAgICAgewotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjYzQmxvY2sxLCBzaXplb2YoSDI2M0Jsb2NrMSksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2MyovCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoYkgyNjQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soSDI2NEJsb2NrMSwgc2l6ZW9mKEgyNjRCbG9jazEpLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjQqLwotICAgICAgICB9Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soU2FtcGxlRGVzY3JpcHRpb25FbnRyeVN0YXJ0LAotICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZURlc2NyaXB0aW9uRW50cnlTdGFydCksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soU2FtcGxlRGVzY3JpcHRpb25FbnRyeVZpZGVvQm9pbGVycGxhdGUxLAotICAgICAgICAgICAgc2l6ZW9mKFNhbXBsZURlc2NyaXB0aW9uRW50cnlWaWRlb0JvaWxlcnBsYXRlMSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMTYobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT53aWR0aCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUxNihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmhlaWdodCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soVmlkZW9SZXNvbHV0aW9ucywgc2l6ZW9mKFZpZGVvUmVzb2x1dGlvbnMpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKFNhbXBsZURlc2NyaXB0aW9uRW50cnlWaWRlb0JvaWxlcnBsYXRlMiwKLSAgICAgICAgICAgIHNpemVvZihTYW1wbGVEZXNjcmlwdGlvbkVudHJ5VmlkZW9Cb2lsZXJwbGF0ZTIpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLQotICAgICAgICAvKiBEU0kgaW5zaWRlIHNhbXBsZSBkZXNjIGVudHJ5ICovCi0gICAgICAgIGlmIChiSDI2MykKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGhlIGgyNjMgZHNpIGdpdmVuIHRocm91Z2ggdGhlIGFwaSBtdXN0IGJlIDcgYnl0ZXMsIHRoYXQgaXMsIGl0IHNoYWxsIG5vdCBpbmNsdWRlCi0gICAgICAgICAgICAgdGhlIG9wdGlvbmFsIGJpdHJhdGUgYm94LiBIb3dldmVyLCBpZiB0aGUgYml0cmF0ZSBpbmZvcm1hdGlvbiBpcyBzZXQgaW4gdGhlIHN0cmVhbQotICAgICAgICAgICAgIGhhbmRsZXIsIGEgYml0cmF0ZSBib3ggaXMgYXBwZW5kZWQgaGVyZSB0byB0aGUgZHNpICovCi0gICAgICAgICAgICBpZiAoKChNNE9TQV9JbnQzMiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUpICE9IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soSDI2M0Jsb2NrMl9iaXRyLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoSDI2M0Jsb2NrMl9iaXRyKSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKiBkMjYzIGJveCB3aXRoIGJpdHIgYXRvbSAqLwotCi0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKEgyNjNCbG9jazMsIHNpemVvZihIMjYzQmxvY2szKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2MyovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjYzQmxvY2s0LCBzaXplb2YoSDI2M0Jsb2NrNCksCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjYzKi8KLSAgICAgICAgICAgICAgICAvKiBQaWVycmUgTGViZWF1cGluIDIwMDgvMDQvMjk6IHRoZSB0d28gZm9sbG93aW5nIGxpbmVzIHVzZWQgdG8gYmUgc3dhcHBlZDsKLSAgICAgICAgICAgICAgICBJIGNoYW5nZWQgdG8gdGhpcyBvcmRlciBpbiBvcmRlciB0byBjb25mb3JtIHRvIDNHUFAuICovCi0gICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjYzKi8KLSAgICAgICAgICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWF4Qml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjMqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soSDI2M0Jsb2NrMiwgc2l6ZW9mKEgyNjNCbG9jazIpLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qIGQyNjMgYm94ICovCi0KLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soSDI2M0Jsb2NrMywgc2l6ZW9mKEgyNjNCbG9jazMpLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLypoMjYzKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYk1QNFYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBidWZmZXJTaXplREIgPSA1ICogbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBhdmdCaXRyYXRlOyAvKmJ1ZmZlclNpemVEQiBzZXQgdG8gNSB0aW1lcyB0aGUgYml0cmF0ZSovCi0KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X2VzZHNTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2swLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2swKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUodl9FU0Rlc2NyaXB0b3JTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNUEVHQ29uZmlnQmxvY2sxLAotICAgICAgICAgICAgICAgIHNpemVvZihNUEVHQ29uZmlnQmxvY2sxKSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUodl9EQ0Rlc2NyaXB0b3JTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhNcDR2QmxvY2szLCBzaXplb2YoTXA0dkJsb2NrMyksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMjQoYnVmZmVyU2l6ZURCLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKAotICAgICAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWF4Qml0cmF0ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmF2Z0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKE1QRUdDb25maWdCbG9jazIsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE1QRUdDb25maWdCbG9jazIpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZShtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qbXA0diovCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyptcDR2Ki8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soTVBFR0NvbmZpZ0Jsb2NrMywKLSAgICAgICAgICAgICAgICBzaXplb2YoTVBFR0NvbmZpZ0Jsb2NrMyksIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKm1wNHYqLwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJIMjY0KQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MTYgcHBzTGVudGdoID0gMDsgLyogUFBTIGxlbmd0aCAqLwotICAgICAgICAgICAgTTRPU0FfVUludDE2IHNwc0xlbnRnaCA9IDA7IC8qIFNQUyBsZW5ndGggKi8KLSAgICAgICAgICAgIE00T1NBX1VDaGFyICp0bXBEU0kgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSTsgLyogRFNJICovCi0gICAgICAgICAgICBNNE9TQV9VSW50MTYgTnVtYmVyT2ZQUFM7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MTYgbENudFBQUzsKLQotICAgICAgICAgICAgLyogUHV0IHRoZSBhdmNDIChoZWFkZXIgKyBEU0kpIHNpemUgKi8KLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X2F2Y0NTaXplLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKmgyNjQqLwotICAgICAgICAgICAgLyogUHV0IHRoZSBhdmNDIGhlYWRlciAqLwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhIMjY0QmxvY2syLCBzaXplb2YoSDI2NEJsb2NrMiksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qaDI2NCovCi0gICAgICAgICAgICAvKiBQdXQgdGhlIERTSSAoU1BTICsgUFBTKSBpbnQgdGhlIDNncCBmb3JtYXQqLwotICAgICAgICAgICAgLyogU1BTIGxlbmd0aCBpbiBCRSAqLwotCi0gICAgICAgICAgICBpZiAoKDB4MDEgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0lbMF0pIHx8Ci0gICAgICAgICAgICAgICAgICgweDQyICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJWzFdKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiISEhIE00TVA0V19jbG9zZVdyaXRlIEVSUk9SIDogaW52YWxpZCBBVkNDIDB4JVggMHglWCIsCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJWzBdLAotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSVsxXSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIERvIG5vdCBzdHJpcCB0aGUgRFNJCi0gICAgICAgICAgICBDTEVBTlVQb25FUlIoIE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUsCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSApOy8qaDI2NCovCi0KLSAgICAgICAgfQotCi0gICAgICAgIC8qZW5kIHRyYWsqLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIodl9zdHN6U2l6ZSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhDb21tb25CbG9jazE1LCBzaXplb2YoQ29tbW9uQmxvY2sxNSksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoCi0gICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkNvbW1vbkRhdGEuc2FtcGxlTmIsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0jaWZkZWYgX000TVA0V19PUFRJTUlaRV9GT1JfUEhPTkUKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q29tbW9uRGF0YS5zYW1wbGVOYjsKLSAgICAgICAgICAgIGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICBNNE1QNFdfcHV0QkUzMihtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1pbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jaygoY29uc3QgTTRPU0FfVUNoYXIKLSAgICAgICAgICAgICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5UQUJMRV9TVFNaLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5Db21tb25EYXRhLnNhbXBsZU5iICogNCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0KLSNlbmRpZgotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3N0c2NTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMTYsIHNpemVvZihDb21tb25CbG9jazE2KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotI2lmZGVmIF9NNE1QNFdfT1BUSU1JWkVfRk9SX1BIT05FCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2MKLSAgICAgICAgICAgICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudFN0c2M7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigKLSAgICAgICAgICAgICAgICAoIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTYW1wbGVOYlRhYmxlW2ldCi0gICAgICAgICAgICA+PiAxMikgKyAxLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMigobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICBjaHVua1NhbXBsZU5iVGFibGVbaV0gJiAweEZGRiksCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICB9Ci0KLSNlbHNlCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rCi0gICAgICAgICAgICArIDEsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMihpICsgMSwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NhbXBsZU5iVGFibGVbaV0sCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfc3Rjb1NpemUsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQ29tbW9uQmxvY2sxNywgc2l6ZW9mKENvbW1vbkJsb2NrMTcpLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmsKLSAgICAgICAgICAgICsgMSwgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0jaWZkZWYgX000TVA0V19NT09WX0ZJUlNUCi0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKCBiSW50ZXJsZWF2ZUFWID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICAgICAgJiYgKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rID49IGkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZfdHJha09mZnNldCArPQotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmNodW5rU2l6ZVRhYmxlW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKHZfdHJha09mZnNldCwKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICB2X3RyYWtPZmZzZXQgKz0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua1NpemVUYWJsZVtpXTsKLSAgICAgICAgfQotCi0jZWxzZQotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDw9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIoCi0gICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5jaHVua09mZnNldFRhYmxlW2ldLAotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgICAgICB9Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypfTTRNUDRXX01PT1ZfRklSU1QqLwotCi0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QkUzMih2X3N0c3NTaXplLAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhWaWRlb0Jsb2NrNCwgc2l6ZW9mKFZpZGVvQmxvY2s0KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgIE00TVA0V19wdXRCRTMyKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+c3Rzc1RhYmxlRW50cnlOYiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7IC8qdmlkZW8qLwotICAgICAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKChjb25zdCBNNE9TQV9VQ2hhcgotICAgICAgICAgICAgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPlRBQkxFX1NUU1MsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPnN0c3NUYWJsZUVudHJ5TmIgKiA0LAotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOyAvKnZpZGVvKi8KLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhWaWRlb0Jsb2NrNSwgc2l6ZW9mKFZpZGVvQmxvY2s1KSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyovCi0gICAgfQotI2lmZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIC8qbWRhdCovCi0KLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJFMzIobWRhdFNpemUsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKENvbW1vbkJsb2NrMiwgc2l6ZW9mKENvbW1vbkJsb2NrMiksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLQotICAgIC8qd3JpdGUgZGF0YSwgYWNjb3JkaW5nIHRvIHRoZSBpbnRlcmxlYXZlIG1vZGUgKGRlZmF1bHQgaXMgbm90IGludGVybGVhdmVkKSovCi0gICAgaWYgKGJJbnRlcmxlYXZlQVYgPT0gTTRPU0FfRkFMU0UpCi0gICAgewotICAgICAgICBpZiAoYkF1ZGlvKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgICAgICAgICBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyAocHJldmlvdXNseSBhX2RhdGFTaXplKSovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYlZpZGVvKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuazsKLSAgICAgICAgICAgICAgICBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyAocHJldmlvdXNseSBhX2RhdGFTaXplKSovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvKmluIHRoaXMgbW9kZSwgd2UgaGF2ZSBhdWRpbyBhbmQgdmlkZW8gdG8gaW50ZXJsZWF2ZSovCi0gICAgewotICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBtYXgobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5jdXJyZW50Q2h1bmssCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmN1cnJlbnRDaHVuayk7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpIDw9IG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y3VycmVudENodW5rKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Q2h1bmtbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyphdWRpbyAocHJldmlvdXNseSBhX2RhdGFTaXplKSovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpIDw9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y3VycmVudENodW5rKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENMRUFOVVBvbkVSUigKLSAgICAgICAgICAgICAgICAgICAgTTRNUDRXX3B1dEJsb2NrKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Q2h1bmtbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Y2h1bmtTaXplVGFibGVbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsgLyp2aWRlbyAocHJldmlvdXNseSBhX2RhdGFTaXplKSovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNlbmRpZiAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLSAgICAvKnNraXAqLwotCi0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhCbG9ja1NpZ25hdHVyZVNraXBIZWFkZXIsCi0gICAgICAgIHNpemVvZihCbG9ja1NpZ25hdHVyZVNraXBIZWFkZXIpLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAvKiBXcml0ZSBlbWJlZGRlZCBzdHJpbmcgKi8KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0RW1iZWRkZWRTdHJpbmcsCi0gICAgICAgICAgICBzaXplb2YoQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEVtYmVkZGVkU3RyaW5nKSwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCbG9jayhtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nLCAxNiwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICB9Ci0KLSAgICAvKiBXcml0ZSB2ZXMgY29yZSB2ZXJzaW9uICovCi0gICAgY2FtY29kZXJfbWFqID0gKE00T1NBX1VDaGFyKShtTXA0RmlsZURhdGFQdHItPmNhbWNvZGVyVmVyc2lvbiAvIDEwMCk7Ci0gICAgY2FtY29kZXJfbWluID0KLSAgICAgICAgKE00T1NBX1VDaGFyKSgoIG1NcDRGaWxlRGF0YVB0ci0+Y2FtY29kZXJWZXJzaW9uIC0gMTAwICogY2FtY29kZXJfbWFqKQotICAgICAgICAvIDEwKTsKLSAgICBjYW1jb2Rlcl9yZXYgPQotICAgICAgICAoTTRPU0FfVUNoYXIpKG1NcDRGaWxlRGF0YVB0ci0+Y2FtY29kZXJWZXJzaW9uIC0gMTAwICogY2FtY29kZXJfbWFqIC0gMTAKLSAgICAgICAgKiBjYW1jb2Rlcl9taW4pOwotCi0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKCcgJywgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLAotICAgICAgICBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSgoTTRPU0FfVUNoYXIpKGNhbWNvZGVyX21haiArICcwJyksCi0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoJy4nLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCeXRlKChNNE9TQV9VQ2hhcikoY2FtY29kZXJfbWluICsgJzAnKSwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0Qnl0ZSgnLicsIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucywKLSAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpKTsKLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJ5dGUoKE00T1NBX1VDaGFyKShjYW1jb2Rlcl9yZXYgKyAnMCcpLAotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSAgICAvKiBXcml0ZSBpbnRlZ3JhdGlvbiB0YWcgKi8KLSAgICBDTEVBTlVQb25FUlIoTTRNUDRXX3B1dEJsb2NrKChjb25zdCBNNE9TQV9VQ2hhciAqKSIgLS0gIiwgNCwKLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyRnVuY3Rpb25zLCBmaWxlV3JpdGVyQ29udGV4dCkpOwotCi0gICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2soQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEludGVncmF0aW9uVGFnLAotICAgICAgICAgICAgc2l6ZW9mKEJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRJbnRlZ3JhdGlvblRhZyksCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIENMRUFOVVBvbkVSUihNNE1QNFdfcHV0QmxvY2sobU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZywgNjAsCi0gICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0gICAgfQotCi0jaWZuZGVmIF9NNE1QNFdfTU9PVl9GSVJTVAotICAgIC8qb3ZlcndyaXRlIG1kYXQgc2l6ZSovCi0KLSAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5mdHlwLm1ham9yX2JyYW5kICE9IDApCi0gICAgICAgIG1kYXRQb3M9IDE2ICsgbU1wNEZpbGVEYXRhUHRyLT5mdHlwLm5iQ29tcGF0aWJsZUJyYW5kcyAqIDQ7Ci0gICAgZWxzZQotICAgICAgICBtZGF0UG9zID0gMjQ7Ci0KLSAgICBtb292UG9zID0gbW9vdlBvcyAtIG1kYXRQb3M7Ci0gICAgbWRhdFNpemUgPSBtb292UG9zOwotCi0gICAgQ0xFQU5VUG9uRVJSKG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+c2VlayhmaWxlV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmbWRhdFBvcykpOyAvKnNlZWsgYWZ0ZXIgZnR5cC4uLiovCi0gICAgQ0xFQU5VUG9uRVJSKE00TVA0V19wdXRCRTMyKG1kYXRTaXplLCBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMsCi0gICAgICAgIGZpbGVXcml0ZXJDb250ZXh0KSk7Ci0KLSNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKl9NNE1QNFdfTU9PVl9GSVJTVCovCi0KLWNsZWFudXA6Ci0KLSAgICAvKioKLSAgICAqIENsb3NlIHRoZSBmaWxlIGV2ZW4gaWYgYW4gZXJyb3Igb2NjdXJlZCAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckNvbnRleHQpCi0gICAgewotICAgICAgICBlcnIyID0KLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+Y2xvc2VXcml0ZShtTXA0RmlsZURhdGFQdHItPgotICAgICAgICAgICAgZmlsZVdyaXRlckNvbnRleHQpOyAvKio8IGNsb3NlIHRoZSBzdHJlYW0gYW55d2F5ICovCi0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyMikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TVA0V19jbG9zZVdyaXRlOiBmaWxlV3JpdGVyRnVuY3Rpb25zLT5jbG9zZVdyaXRlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyMik7Ci0gICAgICAgIH0KLSAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0jaWZkZWYgX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAvKiBSZW1vdmUgc2FmZXR5IGZpbGUgaWYgc3RpbGwgcHJlc2VudCAoaGVyZSBpdCBpcyBjbGVhbnVwIGluIGNhc2Ugb2YgZXJyb3IgYW5kIE5PVCB0aGUgbm9ybWFsCi0gICAgcmVtb3ZhbCBvZiB0aGUgc2FmZXR5IGZpbGUgdG8gZnJlZSBlbWVyZ2VuY3kgc3BhY2UgZm9yIHRoZSBtb292KS4gKi8KLQotICAgIGlmIChNNE9TQV9UUlVFID09IG1NcDRGaWxlRGF0YVB0ci0+Y2xlYW5TYWZldHlGaWxlKQotICAgIHsKLSAgICAgICAgTTRPU0FfQ29udGV4dCB0ZW1wQ29udGV4dDsKLSAgICAgICAgZXJyMyA9IG1NcDRGaWxlRGF0YVB0ci0+ZmlsZVdyaXRlckZ1bmN0aW9ucy0+b3BlbldyaXRlKCZ0ZW1wQ29udGV4dCwKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+c2FmZXR5RmlsZVVybCwKLSAgICAgICAgICAgIE00T1NBX2tGaWxlV3JpdGUgfCBNNE9TQV9rRmlsZUNyZWF0ZSk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyMikKLSAgICAgICAgICAgIGVycjIgPSBlcnIzOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SCi0gICAgICAgICAgICAhPSBlcnIzKSAvKiBObyBzZW5zZSBjbG9zaW5nIGlmIHdlIGNvdWxkbid0IG9wZW4gaW4gdGhlIGZpcnN0IHBsYWNlLiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIzID0KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZpbGVXcml0ZXJGdW5jdGlvbnMtPmNsb3NlV3JpdGUodGVtcENvbnRleHQpOwotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIyKQotICAgICAgICAgICAgICAgIGVycjIgPSBlcnIzOwotICAgICAgICB9Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+c2FmZXR5RmlsZVVybCA9IE00T1NBX05VTEw7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+Y2xlYW5TYWZldHlGaWxlID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotCi0jZW5kaWYgLyogX000TVA0V19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UgKi8KLQotICAgIC8qIERlbGV0ZSBlbWJlZGRlZCBzdHJpbmcgKi8KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcpCi0gICAgewotICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcpOwotICAgICAgICBtTXA0RmlsZURhdGFQdHItPmVtYmVkZGVkU3RyaW5nID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBEZWxldGUgaW50ZWdyYXRpb24gdGFnICovCi0gICAgaWYgKE00T1NBX05VTEwgIT0gbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZykKLSAgICB7Ci0gICAgICAgIGZyZWUobU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyk7Ci0gICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogTTRNUDRXX2ZyZWVDb250ZXh0KCkgaXMgbm93IGEgcHJpdmF0ZSBtZXRob2QsIGNhbGxlZCBvbmx5IGZyb20gaGVyZSovCi0gICAgZXJyMyA9IE00TVA0V19mcmVlQ29udGV4dChjb250ZXh0KTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycjMpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2Nsb3NlV3JpdGU6IE00TVA0V19mcmVlQ29udGV4dCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaG9vc2Ugd2hpY2ggZXJyb3IgY29kZSB0byByZXR1cm4gKi8KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBnaXZlIHByaW9yaXR5IHRvIG1haW4gZXJyb3IgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TVA0V19jbG9zZVdyaXRlOiByZXR1cm5pbmcgZXJyPTB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlbHNlIGlmIChNNE5PX0VSUk9SICE9IGVycjIpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBFcnJvciBmcm9tIGNsb3NlV3JpdGUgaXMgcmV0dXJuZWQgaWYgdGhlcmUgaXMgbm8gbWFpbiBlcnJvciAqLwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2Nsb3NlV3JpdGU6IHJldHVybmluZyBlcnIyPTB4JXgiLCBlcnIyKTsKLSAgICAgICAgcmV0dXJuIGVycjI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEVycm9yIGZyb20gTTRNUDRXX2ZyZWVDb250ZXh0IGlzIHJldHVybmVkIG9ubHkgaWYgdGhlcmUgaXMgbm8gbWFpbiBlcnJvciBhbmQKLSAgICAgICAgICBubyBjbG9zZSBlcnJvciAqLwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNUDRXX2Nsb3NlV3JpdGU6IHJldHVybmluZyBlcnIzPTB4JXgiLCBlcnIzKTsKLSAgICAgICAgcmV0dXJuIGVycjM7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfZ2V0T3B0aW9uKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gKnZhbHVlUHRyICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRTWVNfU3RyZWFtSURWYWx1ZSAqc3RyZWFtSUR2YWx1ZVB0ciA9IE00T1NBX05VTEw7Ci0gICAgTTRNUDRXX1N0cmVhbUlEc2l6ZSAqc3RyZWFtSURzaXplUHRyID0gTTRPU0FfTlVMTDsKLSAgICBNNE1QNFdfbWVtQWRkciAqbWVtQWRkclB0ciA9IE00T1NBX05VTEw7Ci0gICAgLyogICAgTTRNUDRXX1dyaXRlQ2FsbEJhY2sqICAgIGNhbGxCYWNrUHRyID0gTTRPU0FfTlVMTDsqLwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgRVJSX0NIRUNLKCggbU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfb3BlbmVkKQotICAgICAgICB8fCAobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfcmVhZHkpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbiApCi0gICAgewotICAgICAgICBjYXNlIChNNE1QNFdfbWF4QVVwZXJDaHVuayk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19tYXhDaHVua1NpemUpOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKikoKnZhbHVlUHRyKTsKLQotICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAoQXVkaW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4Q2h1bmtTaXplOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgKFZpZGVvU3RyZWFtSUQpOgotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0gbU1wNEZpbGVEYXRhUHRyLT5NYXhDaHVua1NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19tYXhDaHVua0ludGVyKToKLQotICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKikoKnZhbHVlUHRyKTsKLQotICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAoMCk6IC8qYWxsIHN0cmVhbXMqLwotICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0gKE00T1NBX1VJbnQzMiltTXA0RmlsZURhdGFQdHItPgotICAgICAgICAgICAgICAgICAgICBJbnRlcmxlYXZlRHVyOyAvKnRpbWUgY29udmVyc2lvbiAhKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19lbWJlZGRlZFN0cmluZyk6Ci0gICAgICAgIG1lbUFkZHJQdHIgPSAoTTRNUDRXX21lbUFkZHIgKikoKnZhbHVlUHRyKTsKLSAgICAgICAgLyptZW1BZGRyUHRyIG11c3QgaGF2ZSBiZWVuIGFscmVhZHkgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIKLSAgICAgICAgYW5kIG1lbUFkZHJQdHItPnNpemUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbWF4IHBvc3NpYmxlIGxlbmd0aCBpbiBieXRlcyovCi0gICAgICAgIEVSUl9DSEVDSyhtZW1BZGRyUHRyLT5zaXplID49IDE2LCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICBFUlJfQ0hFQ0sobWVtQWRkclB0ci0+YWRkciAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAvKm1lbUFkZHJQdHItPnNpemUgaXMgdXBkYXRlZCB3aXRoIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgc3RyaW5nKi8KLSAgICAgICAgbWVtQWRkclB0ci0+c2l6ZSA9IDE2OwotICAgICAgICAvKmlmIG5vIHZhbHVlIHdhcyBzZXQsIHJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcgKi8KLSAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcsIDE2KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgICh2b2lkICopQmxvY2tTaWduYXR1cmVTa2lwRGVmYXVsdEVtYmVkZGVkU3RyaW5nLAotICAgICAgICAgICAgMTYpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19pbnRlZ3JhdGlvblRhZyk6Ci0gICAgICAgIG1lbUFkZHJQdHIgPSAoTTRNUDRXX21lbUFkZHIgKikoKnZhbHVlUHRyKTsKLSAgICAgICAgLyptZW1BZGRyUHRyIG11c3QgaGF2ZSBiZWVuIGFscmVhZHkgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIKLSAgICAgICAgYW5kIG1lbUFkZHJQdHItPnNpemUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbWF4IHBvc3NpYmxlIGxlbmd0aCBpbiBieXRlcyovCi0gICAgICAgIEVSUl9DSEVDSyhtZW1BZGRyUHRyLT5zaXplID49IDYwLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICBFUlJfQ0hFQ0sobWVtQWRkclB0ci0+YWRkciAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAvKm1lbUFkZHJQdHItPnNpemUgaXMgdXBkYXRlZCB3aXRoIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgc3RyaW5nKi8KLSAgICAgICAgbWVtQWRkclB0ci0+c2l6ZSA9IDYwOwotICAgICAgICAvKmlmIG5vIHZhbHVlIHdhcyBzZXQsIHJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcgMCAqLwotICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbWVtQWRkclB0ci0+YWRkciwKLSAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZywgNjApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgKHZvaWQgKilCbG9ja1NpZ25hdHVyZVNraXBEZWZhdWx0SW50ZWdyYXRpb25UYWcsCi0gICAgICAgICAgICA2MCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX0NhbWNvZGVyVmVyc2lvbik6Ci0KLSAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ciA9IChNNFNZU19TdHJlYW1JRFZhbHVlICopKCp2YWx1ZVB0cik7Ci0KLSAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgKDApOiAvKmFsbCBzdHJlYW1zKi8KLSAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZSA9IG1NcDRGaWxlRGF0YVB0ci0+Y2FtY29kZXJWZXJzaW9uOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAoTTRNUDRXX3ByZVdyaXRlQ2FsbEJhY2spOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAvKmNhbGxCYWNrUHRyID0gKE00TVA0V19Xcml0ZUNhbGxCYWNrKikoKnZhbHVlUHRyKTsKLSAgICAgICAgKmNhbGxCYWNrUHRyID0gbU1wNEZpbGVEYXRhUHRyLT5QcmVXcml0ZUNhbGxCYWNrOwotICAgICAgICBicmVhazsqLwotCi0gICAgY2FzZSAoTTRNUDRXX3Bvc3RXcml0ZUNhbGxCYWNrKToKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgLypjYWxsQmFja1B0ciA9IChNNE1QNFdfV3JpdGVDYWxsQmFjayopKCp2YWx1ZVB0cik7Ci0gICAgICAgICpjYWxsQmFja1B0ciA9IG1NcDRGaWxlRGF0YVB0ci0+UG9zdFdyaXRlQ2FsbEJhY2s7Ci0gICAgICAgIGJyZWFrOyovCi0KLSAgICBjYXNlIChNNE1QNFdfbWF4QVVzaXplKToKLQotICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKikoKnZhbHVlUHRyKTsKLQotICAgICAgICBzd2l0Y2goIHN0cmVhbUlEdmFsdWVQdHItPnN0cmVhbUlEICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAoQXVkaW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPQotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAoVmlkZW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPQotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAoMCk6IC8qYWxsIHN0cmVhbXMqLwotICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlID0gbU1wNEZpbGVEYXRhUHRyLT5NYXhBVVNpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9TVFJFQU1fSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19JT0QpOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgY2FzZSAoTTRNUDRXX0VTRCk6Ci0gICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICBjYXNlIChNNE1QNFdfU0RQKToKLSAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgIGNhc2UgKE00TVA0V190cmFja1NpemUpOgotICAgICAgICBzdHJlYW1JRHNpemVQdHIgPSAoTTRNUDRXX1N0cmVhbUlEc2l6ZSAqKSgqdmFsdWVQdHIpOwotICAgICAgICBzdHJlYW1JRHNpemVQdHItPndpZHRoID0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT53aWR0aDsKLSAgICAgICAgc3RyZWFtSURzaXplUHRyLT5oZWlnaHQgPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmhlaWdodDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIChNNE1QNFdfZXN0aW1hdGVBdWRpb1NpemUpOgotICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKikoKnZhbHVlUHRyKTsKLSAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMiltTXA0RmlsZURhdGFQdHItPmVzdGltYXRlQXVkaW9TaXplOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgKE00TVA0V19NT09WZmlyc3QpOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgY2FzZSAoTTRNUDRXX1YyX01PT0YpOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgY2FzZSAoTTRNUDRXX1YyX3RibENvbXByZXMpOgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX3NldE9wdGlvbiggTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHZhbHVlICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRTWVNfU3RyZWFtSURWYWx1ZSAqc3RyZWFtSUR2YWx1ZVB0ciA9IE00T1NBX05VTEw7Ci0gICAgTTRNUDRXX1N0cmVhbUlEc2l6ZSAqc3RyZWFtSURzaXplUHRyID0gTTRPU0FfTlVMTDsKLSAgICBNNE1QNFdfbWVtQWRkciAqbWVtQWRkclB0ciA9IE00T1NBX05VTEw7Ci0gICAgTTRTWVNfU3RyZWFtSURtZW1BZGRyICpzdHJlYW1JRG1lbUFkZHJQdHI7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvKiBWZXJpZnkgc3RhdGUgKi8KLSAgICBzd2l0Y2goIG9wdGlvbiApCi0gICAgewotICAgICAgICBjYXNlIE00TVA0V19tYXhGaWxlRHVyYXRpb246Ci0gICAgICAgIGNhc2UgTTRNUDRXX0RTSToKLSAgICAgICAgICAgIC8qIHRoaXMgcGFyYW0gY2FuIGJlIHNldCBhdCB0aGUgZW5kIG9mIGEgcmVjb3JkaW5nICovCi0gICAgICAgICAgICBFUlJfQ0hFQ0soKG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgIT0gTTRNUDRXX2Nsb3NlZCksIE00RVJSX1NUQVRFKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRNUDRXX3NldEZ0eXBCb3g6Ci0gICAgICAgICAgICAvKiB0aGlzIHBhcmFtIGNhbiBvbmx5IGJlIHNldCBiZWZvcmUgc3RhcnRpbmcgYW55IHdyaXRlICovCi0gICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5zdGF0ZSA9PSBNNE1QNFdfb3BlbmVkLCBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyogaW4gZ2VuZXJhbCBwYXJhbXMgY2FuIGJlIHNldCBhdCBvcGVuIG9yIHJlYWR5IHN0YWdlICovCi0gICAgICAgICAgICBFUlJfQ0hFQ0soKCBtTXA0RmlsZURhdGFQdHItPnN0YXRlID09IE00TVA0V19vcGVuZWQpCi0gICAgICAgICAgICAgICAgfHwgKG1NcDRGaWxlRGF0YVB0ci0+c3RhdGUgPT0gTTRNUDRXX3JlYWR5KSwgTTRFUlJfU1RBVEUpOwotICAgIH0KLQotICAgIC8qIFNldCBvcHRpb24gKi8KLSAgICBzd2l0Y2goIG9wdGlvbiApCi0gICAgewotICAgICAgICBjYXNlIChNNE1QNFdfbWF4QVVwZXJDaHVuayk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19tYXhDaHVua1NpemUpOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKil2YWx1ZTsKLQotICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAoQXVkaW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9CQURfU1RSRUFNX0lEOyAvKm1heWJlIHRoZSBzdHJlYW0gaGFzIG5vdCBiZWVuIGFkZGVkIHlldCovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhDaHVua1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIChWaWRlb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQ7IC8qbWF5YmUgdGhlIHN0cmVhbSBoYXMgbm90IGJlZW4gYWRkZWQgeWV0Ki8KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICgwKTogLyphbGwgc3RyZWFtcyovCi0KLSAgICAgICAgICAgICAgICAgICAgLypJbiBNNE1QNFdfb3BlbmVkIHN0YXRlLCBubyBzdHJlYW0gaXMgcHJlc2VudCB5ZXQsIHNvIG9ubHkgZ2xvYmFsIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIG5lZWRzIHRvIGJlIHVwZGF0ZWQuKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhDaHVua1NpemUgPSBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNBdWRpbyA9PSBNNE9TQV9UUlVFKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmF1ZGlvVHJhY2tQdHItPk1heENodW5rU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9UUlVFKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heENodW5rU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19tYXhDaHVua0ludGVyKToKLQotICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ciA9IChNNFNZU19TdHJlYW1JRFZhbHVlICopdmFsdWU7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggc3RyZWFtSUR2YWx1ZVB0ci0+c3RyZWFtSUQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgKDApOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYWxsIHN0cmVhbXMqLwotICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPkludGVybGVhdmVEdXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00TVA0V19UaW1lMzIpc3RyZWFtSUR2YWx1ZVB0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsgLyp0aW1lIGNvbnZlcnNpb24hKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgLypub3QgbWVhbmluZ2Z1bGwgdG8gc2V0IHRoaXMgcGFyYW1ldGVyIG9uIGEgc3RyZWFtSUQgYmFzaXMqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX21heEZpbGVTaXplKToKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4RmlsZVNpemUgPSAqKE00T1NBX1VJbnQzMiAqKXZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX2VtYmVkZGVkU3RyaW5nKToKLSAgICAgICAgICAgIG1lbUFkZHJQdHIgPSAoTTRNUDRXX21lbUFkZHIgKil2YWx1ZTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIElmIG1lbUFkZHJQdHItPnNpemUgPiAxNiBieXRlcywgdGhlbiB0aGUgc3RyaW5nIHdpbGwgYmUgdHJ1bmNhdGVkLgotICAgICAgICAgICAgKiBJZiBtZW1BZGRyUHRyLT5zaXplIDwgMTYgYnl0ZXMsIHRoZW4gcmV0dXJuIE00RVJSX1BBUkFNRVRFUgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEVSUl9DSEVDSyhtZW1BZGRyUHRyLT5zaXplID49IDE2LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZW1iZWRkZWRTdHJpbmcgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMTYsIE00TVA0X1dSSVRFUiwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiZW1iZWRkZWRTdHJpbmciKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZyAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKmVsc2UsIGp1c3Qgb3ZlcndyaXRlIHRoZSBwcmV2aW91c2x5IHNldCBzdHJpbmcqLwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5lbWJlZGRlZFN0cmluZywKLSAgICAgICAgICAgICAgICAodm9pZCAqKW1lbUFkZHJQdHItPmFkZHIsIDE2KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19pbnRlZ3JhdGlvblRhZyk6Ci0gICAgICAgICAgICBtZW1BZGRyUHRyID0gKE00TVA0V19tZW1BZGRyICopdmFsdWU7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgKiBJZiBtZW1BZGRyUHRyLT5zaXplID4gNjAgYnl0ZXMsIHRoZW4gdGhlIHN0cmluZyB3aWxsIGJlIHRydW5jYXRlZC4KLSAgICAgICAgICAgICogSWYgbWVtQWRkclB0ci0+c2l6ZSA8IDYwIGJ5dGVzLCB0aGVuIHBhZCB3aXRoIDAKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUNoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoNjAsIE00TVA0X1dSSVRFUiwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiaW50ZWdyYXRpb25UYWciKTsKLSAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZyAhPSBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKmVsc2UsIGp1c3Qgb3ZlcndyaXRlIHRoZSBwcmV2aW91c2x5IHNldCBzdHJpbmcqLwotICAgICAgICAgICAgaWYgKG1lbUFkZHJQdHItPnNpemUgPCA2MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPmludGVncmF0aW9uVGFnLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKUJsb2NrU2lnbmF0dXJlU2tpcERlZmF1bHRJbnRlZ3JhdGlvblRhZywKLSAgICAgICAgICAgICAgICAgICAgNjApOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKW1NcDRGaWxlRGF0YVB0ci0+aW50ZWdyYXRpb25UYWcsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopbWVtQWRkclB0ci0+YWRkciwgbWVtQWRkclB0ci0+c2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT5pbnRlZ3JhdGlvblRhZywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltZW1BZGRyUHRyLT5hZGRyLCA2MCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfQ2FtY29kZXJWZXJzaW9uKToKLQotICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ciA9IChNNFNZU19TdHJlYW1JRFZhbHVlICopdmFsdWU7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggc3RyZWFtSUR2YWx1ZVB0ci0+c3RyZWFtSUQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgKDApOiAvKmFsbCBzdHJlYW1zKi8KLSAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5jYW1jb2RlclZlcnNpb24gPSBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgLypub3QgbWVhbmluZ2Z1bGwgdG8gc2V0IHRoaXMgcGFyYW1ldGVyIG9uIGEgc3RyZWFtSUQgYmFzaXMqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX3ByZVdyaXRlQ2FsbEJhY2spOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgIC8qbU1wNEZpbGVEYXRhUHRyLT5QcmVXcml0ZUNhbGxCYWNrID0gKihNNE1QNFdfV3JpdGVDYWxsQmFjayopdmFsdWU7Ci0gICAgICAgICAgICBicmVhazsqLwotCi0gICAgICAgIGNhc2UgKE00TVA0V19wb3N0V3JpdGVDYWxsQmFjayk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgLyptTXA0RmlsZURhdGFQdHItPlBvc3RXcml0ZUNhbGxCYWNrID0gKihNNE1QNFdfV3JpdGVDYWxsQmFjayopdmFsdWU7Ci0gICAgICAgICAgICBicmVhazsqLwotCi0gICAgICAgIGNhc2UgKE00TVA0V19tYXhBVXNpemUpOgotCi0gICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyID0gKE00U1lTX1N0cmVhbUlEVmFsdWUgKil2YWx1ZTsKLQotICAgICAgICAgICAgc3dpdGNoKCBzdHJlYW1JRHZhbHVlUHRyLT5zdHJlYW1JRCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAoQXVkaW9TdHJlYW1JRCk6Ci0KLSAgICAgICAgICAgICAgICAgICAgLyppZiAobU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyID09IE00T1NBX05VTEwpKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5NYXhBVVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAoVmlkZW9TdHJlYW1JRCk6Ci0KLSAgICAgICAgICAgICAgICAgICAgLyppZiAobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyID09IE00T1NBX05VTEwpKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5NYXhBVVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAoMCk6IC8qYWxsIHN0cmVhbXMqLwotCi0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+TWF4QVVTaXplID0gc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YXVkaW9UcmFja1B0ci0+TWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEdmFsdWVQdHItPnZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPk1heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRHZhbHVlUHRyLT52YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX0lPRCk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19FU0QpOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBjYXNlIChNNE1QNFdfU0RQKToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX3RyYWNrU2l6ZSk6Ci0KLSAgICAgICAgICAgIHN0cmVhbUlEc2l6ZVB0ciA9IChNNE1QNFdfU3RyZWFtSURzaXplICopdmFsdWU7Ci0KLSAgICAgICAgICAgIGlmICgoc3RyZWFtSURzaXplUHRyLT5zdHJlYW1JRCAhPSBWaWRlb1N0cmVhbUlEKQotICAgICAgICAgICAgICAgIHx8IChtTXA0RmlsZURhdGFQdHItPmhhc1ZpZGVvID09IE00T1NBX0ZBTFNFKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPndpZHRoID0gc3RyZWFtSURzaXplUHRyLT53aWR0aDsKLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEc2l6ZVB0ci0+aGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX2VzdGltYXRlQXVkaW9TaXplKToKLQotICAgICAgICAgICAgc3RyZWFtSUR2YWx1ZVB0ciA9IChNNFNZU19TdHJlYW1JRFZhbHVlICopdmFsdWU7Ci0KLSAgICAgICAgICAgIC8qc2hhbGwgbm90IHNldCB0aGlzIG9wdGlvbiBiZWZvcmUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgd2VyZSBhZGRlZCovCi0gICAgICAgICAgICAvKm5vbnNlbnNlIHRvIHNldCB0aGlzIG9wdGlvbiBpZiBub3QgaW4gY2FzZSBhdWRpbyt2aWRlbyovCi0gICAgICAgICAgICBpZiAoKG1NcDRGaWxlRGF0YVB0ci0+aGFzQXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgfHwgKG1NcDRGaWxlRGF0YVB0ci0+aGFzVmlkZW8gPT0gTTRPU0FfRkFMU0UpKQotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLQotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5lc3RpbWF0ZUF1ZGlvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0Jvb2wpc3RyZWFtSUR2YWx1ZVB0ci0+dmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfTU9PVmZpcnN0KToKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX1YyX01PT0YpOgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLQotICAgICAgICBjYXNlIChNNE1QNFdfVjJfdGJsQ29tcHJlcyk6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotCi0gICAgICAgIGNhc2UgKE00TVA0V19tYXhGaWxlRHVyYXRpb24pOgotICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5NYXhGaWxlRHVyYXRpb24gPSAqKE00T1NBX1VJbnQzMiAqKXZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoTTRNUDRXX3NldEZ0eXBCb3gpOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplOwotCi0gICAgICAgICAgICAgICAgRVJSX0NIRUNLKCggKE00TVA0Q19GdHlwQm94ICopdmFsdWUpLT5tYWpvcl9icmFuZCAhPSAwLAotICAgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICAgICAgLyogQ29weSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPmZ0eXAgPSAqKE00TVA0Q19GdHlwQm94ICopdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgZ2xvYmFsIHBvc2l0aW9uIHZhcmlhYmxlcyB3aXRoIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY29tbW9uIGFuZAotICAgICAgICAgICAgICAgICB1c2VyIGJsb2NrICovCi0gICAgICAgICAgICAgICAgc2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZnR5cC5uYkNvbXBhdGlibGVCcmFuZHMgKiBzaXplb2YoTTRPU0FfVUludDMyKTsKLQotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+YWJzb2x1dGVDdXJyZW50UG9zID0gOC8qbWRhdCovICsgMTYgKyBzaXplOwotICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+ZmlsZXNpemUgPSAyMTgvKm1kYXQrbW9vditza2lwKi8gKyAxNiArIHNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChNNE1QNFdfRFNJKToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHIgPSAoTTRTWVNfU3RyZWFtSURtZW1BZGRyICopdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAvKiBOZXN0ZWQgc3dpdGNoISBXaGVlISAqLwotICAgICAgICAgICAgICAgIHN3aXRjaCggc3RyZWFtSURtZW1BZGRyUHRyLT5zdHJlYW1JRCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9OT1RfSU1QTEVNRU5URUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoVmlkZW9TdHJlYW1JRCk6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb3RlY3QgRFNJIHNldHRpbmcgOiBvbmx5IG9uY2UgYWxsb3dlZCBvbiBhIGdpdmVuIHN0cmVhbSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uRGF0YS50cmFja1R5cGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3NldE9wdGlvbjogZHNpIGFscmVhZHkgc2V0ICEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCA9PSBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRPU0FfTlVMTCA9PSBzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3NldE9wdGlvbjogQmFkIEgyNjMgZHNpISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZGVjb2RlciBzcGVjaWZpYyBpbmZvIHNpemUgaXMgc3VwcG9zZWQgdG8gYmUgYWx3YXlzIDcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIGxvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSA9PSA3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClzdHJlYW1JRG1lbUFkZHJQdHItPnNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0gKE00T1NBX1VDaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1QNF9XUklURVIsIChNNE9TQV9DaGFyICopInZpZGVvVHJhY2tQdHItPkRTSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiltTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdHJlYW1JRG1lbUFkZHJQdHItPmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAgIT0gbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19zZXRPcHRpb246IGRzaSBhbHJlYWR5IHNldCAhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAgPT0gc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKE00T1NBX05VTEwgPT0gc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TVA0V19zZXRPcHRpb246IEJhZCBNUEVHNCBkc2khIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypNUDRWIHNwZWNpZmljKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSA8IDEwNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZSArPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFNZU19rSDI2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwICE9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICsgSC4yNjQgdHJpbW1pbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9UUlVFID09IG1NcDRGaWxlRGF0YVB0ci0+Yk1VTFBQU1NQUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzdHJpcCB0aGUgRFNJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcmUgdGhlIERTSSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5kc2lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KXN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1QNFdfc2V0T3B0aW9uOiBpbiBzZXQgb3B0aW9uIERTSSBzaXplID0lZCJcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPmRzaVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIERTSSAoU1BTICsgUFBTKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VDaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSwgTTRNUDRfV1JJVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfQ0hFQ0sobU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0kgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwsIE00RVJSX0FMTE9DKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT5EU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JRG1lbUFkZHJQdHItPnNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLSBILjI2NCB0cmltbWluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNUDRXX3NldE9wdGlvbjogZHNpIGFscmVhZHkgc2V0ICEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCAwID09IHN0cmVhbUlEbWVtQWRkclB0ci0+c2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChNNE9TQV9OVUxMID09IHN0cmVhbUlEbWVtQWRkclB0ci0+YWRkcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1QNFdfc2V0T3B0aW9uOiBCYWQgSDI2NCBkc2khIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcmUgdGhlIERTSSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+ZHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgpc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIERTSSAoU1BTICsgUFBTKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXA0RmlsZURhdGFQdHItPnZpZGVvVHJhY2tQdHItPkRTSSA9IChNNE9TQV9VQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNUDRfV1JJVEVSLCAoTTRPU0FfQ2hhciAqKSJ2aWRlb1RyYWNrUHRyLT5EU0kiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX0NIRUNLKG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+RFNJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMLCBNNEVSUl9BTExPQyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1wNEZpbGVEYXRhUHRyLT52aWRlb1RyYWNrUHRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc3RyZWFtSURtZW1BZGRyUHRyLT5hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSURtZW1BZGRyUHRyLT5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qIEguMjY0IFRyaW1taW5nICAqLwotICAgICAgICBjYXNlIE00TVA0V19NVUxfUFBTX1NQUzoKLSAgICAgICAgICAgIG1NcDRGaWxlRGF0YVB0ci0+Yk1VTFBQU1NQUyA9ICooTTRPU0FfSW50OCAqKXZhbHVlOwotICAgICAgICAgICAgLyogSC4yNjQgVHJpbW1pbmcgICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0JBRF9PUFRJT05fSUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRNUDRXX2dldFN0YXRlKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00TVA0V19TdGF0ZSAqc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlEICkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRNUDRXX01wNEZpbGVEYXRhICptTXA0RmlsZURhdGFQdHIgPSAoTTRNUDRXX01wNEZpbGVEYXRhICopY29udGV4dDsKLSAgICBFUlJfQ0hFQ0soY29udGV4dCAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgc3dpdGNoKCBzdHJlYW1JRCApCi0gICAgewotICAgICAgICBjYXNlICgwKToKLSAgICAgICAgICAgICpzdGF0ZSA9IG1NcDRGaWxlRGF0YVB0ci0+c3RhdGU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIChBdWRpb1N0cmVhbUlEKToKLSAgICAgICAgICAgIGlmIChtTXA0RmlsZURhdGFQdHItPmhhc0F1ZGlvID09IE00T1NBX1RSVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnN0YXRlID0gbU1wNEZpbGVEYXRhUHRyLT5hdWRpb1RyYWNrUHRyLT5taWNyb1N0YXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoVmlkZW9TdHJlYW1JRCk6Ci0gICAgICAgICAgICBpZiAobU1wNEZpbGVEYXRhUHRyLT5oYXNWaWRlbyA9PSBNNE9TQV9UUlVFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpzdGF0ZSA9IG1NcDRGaWxlRGF0YVB0ci0+dmlkZW9UcmFja1B0ci0+bWljcm9TdGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNE1QNFdfZ2V0Q3VycmVudEZpbGVTaXplKCBNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnBDdXJyZW50RmlsZVNpemUgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE1QNFdfTXA0RmlsZURhdGEgKm1NcDRGaWxlRGF0YVB0ciA9IChNNE1QNFdfTXA0RmlsZURhdGEgKiljb250ZXh0OwotICAgIEVSUl9DSEVDSyhjb250ZXh0ICE9IE00T1NBX05VTEwsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBFUlJfQ0hFQ0socEN1cnJlbnRGaWxlU2l6ZSAhPSBNNE9TQV9OVUxMLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICpwQ3VycmVudEZpbGVTaXplID0gbU1wNEZpbGVEYXRhUHRyLT5maWxlc2l6ZTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLSNlbmRpZiAvKiBfTTRNUDRXX1VTRV9DU1RfTUVNT1JZX1dSSVRFUiAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy8zZ3B3cml0ZXIvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3MvM2dwd3JpdGVyL3NyYy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjFlZmEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzLzNncHdyaXRlci9zcmMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvQW5kcm9pZC5tayBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZDRlYzdmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaW5jbHVkZSAkKGNhbGwgYWxsLXN1YmRpci1tYWtlZmlsZXMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvRnJvbTJpVG9Nb25vXzE2LmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9Gcm9tMmlUb01vbm9fMTYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzZmZmIzZi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9Gcm9tMmlUb01vbm9fMTYuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9GUk9NMklUT01PTk9fMTZfSF8KLSNkZWZpbmUgX0ZST00ySVRPTU9OT18xNl9IXwotCi0KLXZvaWQgRnJvbTJpVG9Nb25vXzE2KCAgY29uc3Qgc2hvcnQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgbik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZW5kaWYgIC8qIF9GUk9NMklUT01PTk9fMTZfSF8gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL0xWTV9UeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTFZNX1R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEyODk3NGQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTFZNX1R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSBuYW1lOiAgICAgICAgICBMVk1fVHlwZXMuaAotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBIZWFkZXIgZmlsZSBkZWZpbmluZyB0aGUgc3RhbmRhcmQgTGlmZVZpYmVzIHR5cGVzIGZvciB1c2UgaW4gdGhlIGFwcGxpY2F0aW9uIGxheWVyICAqLwotLyogIGludGVyZmFjZSBvZiBhbGwgTGlmZVZpYmVzIG1vZHVsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIExWTV9UWVBFU19ICi0jZGVmaW5lIExWTV9UWVBFU19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExWTV9OVUxMICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBwb2ludGVyICovCi0KLSNkZWZpbmUgTFZNX1RSVUUgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAvKiBCb29sZWFucyAqLwotI2RlZmluZSBMVk1fRkFMU0UgICAgICAgICAgICAgICAwCi0KLSNkZWZpbmUgTFZNX01BWElOVF84ICAgICAgICAgICAgMTI3ICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIHBvc2l0aXZlIGludGVnZXIgc2l6ZSAqLwotI2RlZmluZSBMVk1fTUFYSU5UXzE2ICAgICAgICAgICAzMjc2NwotI2RlZmluZSBMVk1fTUFYSU5UXzMyICAgICAgICAgICAyMTQ3NDgzNjQ3Ci0jZGVmaW5lIExWTV9NQVhFTlVNICAgICAgICAgICAgIDIxNDc0ODM2NDcKLQotI2RlZmluZSBMVk1fTU9EVUxFSURfTUFTSyAgICAgICAweEZGMDAgICAgICAgICAgICAgIC8qIE1hc2sgdG8gZXh0cmFjdCB0aGUgY2FsbGluZyBtb2R1bGUgSUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBjYWxsYmFja0lkICovCi0jZGVmaW5lIExWTV9FVkVOVElEX01BU0sgICAgICAgIDB4MDBGRiAgICAgICAgICAgICAgLyogTWFzayB0byBleHRyYWN0IHRoZSBjYWxsYmFjayBldmVudCBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0lkICovCi0KLS8qIE1lbW9yeSB0YWJsZSovCi0jZGVmaW5lIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEgICAgICAwICAgLyogT2Zmc2V0IHRvIHRoZSBpbnN0YW5jZSBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEEgICAgICAxICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgbWVtb3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiAqLwotI2RlZmluZSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGICAgICAgMiAgIC8qIE9mZnNldCB0byB0aGUgcGVyc2lzdGVudCBjb2VmZmljaWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgICAgICAgICAgICAzICAgLyogT2Zmc2V0IHRvIHRlbXBvcmFyeSBtZW1vcnkgcmVnaW9uICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCYXNpYyB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiAgICAgY2hhciAgICAgICAgICAgICAgICBMVk1fQ0hBUjsgICAgICAgICAgIC8qIEFTQ0lJIGNoYXJhY3RlciAqLwotCi10eXBlZGVmICAgICBjaGFyICAgICAgICAgICAgICAgIExWTV9JTlQ4OyAgICAgICAgICAgLyogU2lnbmVkIDgtYml0IHdvcmQgKi8KLXR5cGVkZWYgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgTFZNX1VJTlQ4OyAgICAgICAgICAvKiBVbnNpZ25lZCA4LWJpdCB3b3JkICovCi0KLXR5cGVkZWYgICAgIHNob3J0ICAgICAgICAgICAgICAgTFZNX0lOVDE2OyAgICAgICAgICAvKiBTaWduZWQgMTYtYml0IHdvcmQgKi8KLXR5cGVkZWYgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgTFZNX1VJTlQxNjsgICAgICAgICAvKiBVbnNpZ25lZCAxNi1iaXQgd29yZCAqLwotCi10eXBlZGVmICAgICBsb25nICAgICAgICAgICAgICAgIExWTV9JTlQzMjsgICAgICAgICAgLyogU2lnbmVkIDMyLWJpdCB3b3JkICovCi10eXBlZGVmICAgICB1bnNpZ25lZCBsb25nICAgICAgIExWTV9VSU5UMzI7ICAgICAgICAgLyogVW5zaWduZWQgMzItYml0IHdvcmQgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFN0YW5kYXJkIEVudW1lcmF0ZWQgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBPcGVyYXRpbmcgbW9kZSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX01PREVfT0ZGICAgID0gMCwKLSAgICBMVk1fTU9ERV9PTiAgICAgPSAxLAotICAgIExWTV9NT0RFX0RVTU1ZICA9IExWTV9NQVhFTlVNCi19IExWTV9Nb2RlX2VuOwotCi0KLS8qIEZvcm1hdCAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX1NURVJFTyAgICAgICAgICA9IDAsCi0gICAgTFZNX01PTk9JTlNURVJFTyAgICA9IDEsCi0gICAgTFZNX01PTk8gICAgICAgICAgICA9IDIsCi0gICAgTFZNX1NPVVJDRV9EVU1NWSAgICA9IExWTV9NQVhFTlVNCi19IExWTV9Gb3JtYXRfZW47Ci0KLQotLyogV29yZCBsZW5ndGggKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV8xNl9CSVQgICAgICA9IDAsCi0gICAgTFZNXzMyX0JJVCAgICAgID0gMSwKLSAgICBMVk1fV09SRExFTkdUSF9EVU1NWSA9IExWTV9NQVhFTlVNCi19IExWTV9Xb3JkTGVuZ3RoX2VuOwotCi0KLS8qIExWTSBzYW1wbGluZyByYXRlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX0ZTXzgwMDAgID0gMCwKLSAgICBMVk1fRlNfMTEwMjUgPSAxLAotICAgIExWTV9GU18xMjAwMCA9IDIsCi0gICAgTFZNX0ZTXzE2MDAwID0gMywKLSAgICBMVk1fRlNfMjIwNTAgPSA0LAotICAgIExWTV9GU18yNDAwMCA9IDUsCi0gICAgTFZNX0ZTXzMyMDAwID0gNiwKLSAgICBMVk1fRlNfNDQxMDAgPSA3LAotICAgIExWTV9GU180ODAwMCA9IDgsCi0gICAgTFZNX0ZTX0lOVkFMSUQgPSBMVk1fTUFYRU5VTS0xLAotICAgIExWTV9GU19EVU1NWSA9IExWTV9NQVhFTlVNCi19IExWTV9Gc19lbjsKLQotCi0vKiBNZW1vcnkgVHlwZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9QRVJTSVNURU5UX1NMT1dfREFUQSAgICA9IExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEsCi0gICAgTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBICAgID0gTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQSwKLSAgICBMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUYgICAgPSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGLAotICAgIExWTV9URU1QT1JBUllfRkFTVCAgICAgICAgICA9IExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QsCi0gICAgTFZNX01FTU9SWVRZUEVfRFVNTVkgICAgICAgID0gTFZNX01BWEVOVU0KLX0gTFZNX01lbW9yeVR5cGVzX2VuOwotCi0KLS8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNpemUgaW4gYnl0ZXMgKi8KLSAgICBMVk1fTWVtb3J5VHlwZXNfZW4gICAgICAgICAgVHlwZTsgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHR5cGUgKi8KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAqLwotfSBMVk1fTWVtb3J5UmVnaW9uX3N0OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU3RhbmRhcmQgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIExWTV9JTlQzMiAoKkxWTV9DYWxsYmFjaykodm9pZCAgICAgICAgICAqcENhbGxiYWNrRGF0YSwgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZSwgICAvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiB0byBhIGRhdGEgc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCBpbiB0aGUgY2FsbGJhY2spICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBHZW5lcmFsUHVycG9zZSApOyAgIC8qIEdlbmVyYWwgcHVycG9zZSB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHRvIGJlIHVzZWQgYXMgY2FsbGJhY2sgSUQpICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBFbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmICAvKiBMVk1fVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBRF9Db21tb24uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QURfQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2ZTU5NmQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBRF9Db21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbCAgICAgICAgTTRBRF9Db21tb24uaAotICogQGJyaWVmICAgIEF1ZGlvIFNoZWxsIERlY29kZXIgY29tbW9uIGludGVyZmFjZSBkZWNsYXJhdGlvbgotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBjb21tb24gaW50ZXJmYWNlcyB0aGF0IGF1ZGlvIGRlY29kZXIgc2hlbGxzIG11c3QgaW1wbGVtZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000QURfQ09NTU9OX0hfXwotI2RlZmluZSBfX000QURfQ09NTU9OX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTREQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotdHlwZWRlZiBNNE9TQV9Wb2lkKiBNNEFEX0NvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRBRF9PcHRpb25JRAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBBdWRpbyBkZWNvZGVyIG9wdGlvbnMuCi0gKiBAbm90ZSAgICBUaGVzZSBvcHRpb25zIGNhbiBiZSByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBhIGRlY29kZXIgdmlhCi0gKiAgICAgICAgICAgIE00QURfZ2V0T3B0aW9uX2ZjdC9NNEFEX3NldE9wdGlvbl9mY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGZsYWcgb2YgcHJlc2VuY2Ugb2YgcHJvdGVjdGlvbiAqLwotICAgIE00QURfa09wdGlvbklEX1Byb3RlY3Rpb25BYnNlbnQgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNERFQ09ERVJfQVVESU8sIDB4MDEpLAotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBibG9jICovCi0gICAgTTRBRF9rT3B0aW9uSURfTmJGcmFtZVBlckJsb2MgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNERFQ09ERVJfQVVESU8sIDB4MDIpLAotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBBQUMgZGVjb2RlciB1c2VyIHBhcmFtZXRlcnMgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9Vc2VyUGFyYW0gICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9XUklURSwgTTRERUNPREVSX0FVRElPLCAweDAzKSwKLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBBQUMgc3RlYW0gdHlwZSAqLwotICAgIE00QURfa09wdGlvbklEX1N0cmVhbVR5cGUgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEICwgTTRERUNPREVSX0FVRElPLCAweDEwKSwKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHVzZWQgYnl0ZXMgaW4gdGhlIGxhdGVzdCBkZWNvZGUKLSAgICAgKHVzZWQgb25seSB3aGVuIGRlY29kaW5nIEFBQyBmcm9tIEFESUYgZmlsZSkgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9Vc2VkQnl0ZXMgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFEICwgTTRERUNPREVSX0FVRElPLCAweDExKSwKLQotICAgIC8qIFJlYWRlciBJbnRlcmZhY2UgKi8KLSAgICBNNEFEX2tPcHRpb25JRF8zZ3BSZWFkZXJJbnRlcmZhY2UgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9BVURJTywgMHgwMTIpLAotCi0gICAgLyogQXVkaW8gQWNjZXNzIFVuaXQgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9BdWRpb0FVID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVVESU8sIDB4MTMpLAotCi0gICAgLyogUmVhZGVyIGVycm9yIGNvZGUgKi8KLSAgICBNNEFEX2tPcHRpb25JRF9HZXRBdWRpb0FVRXJyQ29kZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0FVRElPLCAweDE0KSwKLQotICAgIC8qIE51bWJlciBvZiBjaGFubmVscyAqLwotICAgIE00QURfa09wdGlvbklEX0F1ZGlvTmJDaGFubmVscyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0FVRElPLCAweDE1KSwKLQotICAgIC8qIFNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgIE00QURfa09wdGlvbklEX0F1ZGlvU2FtcEZyZXF1ZW5jeSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0FVRElPLCAweDE2KSwKLQotICAgIC8qIEF1ZGlvIEFVIENUUyAqLwotICAgIE00QURfa09wdGlvbklEX0F1Q1RTID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQVVESU8sIDB4MTcpCi0KLX0gTTRBRF9PcHRpb25JRDsKLQotCi0KLXR5cGVkZWYgZW51bQotewotICAgIE00X2tVbmtub3duID0gMCwgICAgLyogVW5rbm93biBzdHJlYW0gdHlwZSAqLwotICAgIE00X2tBQUMsICAgICAgICAgICAgLyogTTRfa0FBQ19NQUlOIG9yIE00X2tBQUNfTEMgb3IgTTRfa0FBQ19TU1Igb3IgTTRfa0FBQ19MVFAgICAgKi8KLSAgICBNNF9rQUFDcGx1cywgICAgICAgIC8qIERlY29kZXIgdHlwZSBpcyBBQUMgcGx1cyAqLwotICAgIE00X2tlQUFDcGx1cyAgICAgICAgLyogRGVjb2RlciB0eXBlIGlzIGVuaGFuY2VkIEFBQyBwbHVzICovCi19IE00X0FBQ1R5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRBRF9UeXBlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF1ZGlvIHR5cGVzIHVzZWQgdG8gY3JlYXRlIGRlY29kZXJzCi0gKiBAbm90ZSAgICBUaGlzIGVudW0gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBWUFMgdG8gaWRlbnRpZnkgYSBjdXJyZW50bHkgc3VwcG9ydGVkCi0gKiAgICAgICAgICAgIGF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLiBFYWNoIGRlY29kZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIG9uZSBvZiB0aGlzIHR5cGUgYXNzb2NpYXRlZC4KLSAqICAgICAgICAgICAgV2hlbiBhIGRlY29kZXIgaW5zdGFuY2UgaXMgbmVlZGVkLCB0aGlzIHR5cGUgaXMgdXNlZCB0byBpZGVudGlmeQotICogICAgICAgICAgICBhbmQgcmV0cmlldmUgaXRzIGludGVyZmFjZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEFEX2tUeXBlQU1STkIgPSAwLAotICAgIE00QURfa1R5cGVBTVJXQiwKLSAgICBNNEFEX2tUeXBlQUFDLAotICAgIE00QURfa1R5cGVNUDMsCi0gICAgTTRBRF9rVHlwZVBDTSwKLSAgICBNNEFEX2tUeXBlQkJNdXNpY0VuZ2luZSwKLSAgICBNNEFEX2tUeXBlV01BLAotICAgIE00QURfa1R5cGVSTUEsCi0gICAgTTRBRF9rVHlwZUFEUENNLAotICAgIE00QURfa1R5cGVfTkIgIC8qIG51bWJlciBvZiBkZWNvZGVycywga2VlcCBpdCBhcyBsYXN0IGVudW0gZW50cnkgKi8KLQotfSBNNEFEX1R5cGUgOwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRBRF9CdWZmZXIKLSAqIEBicmllZiAgICAgICAgU3RydWN0dXJlIHRvIGRlc2NyaWJlIGEgYnVmZmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICBtX2RhdGFBZGRyZXNzOwotICAgIE00T1NBX1VJbnQzMiAgICBtX2J1ZmZlclNpemU7Ci0gICAgaW50NjRfdCAgICAgICAgIG1fdGltZVN0YW1wVXM7Ci19IE00QURfQnVmZmVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBkZWNvZGVyCi0gKiBAbm90ZSAgICBBbGxvY2F0ZXMgdGhlIGNvbnRleHQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoT1VUKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6ICAgIChJTikgICAgUG9pbnRlciB0byBhbiBhdWRpbyBzdHJlYW0gZGVzY3JpcHRpb24KLSAqIEBwYXJhbSAgICBwVXNlckRhdGE6ICAgICAgICAoSU4pICAgIFBvaW50ZXIgdG8gVXNlciBkYXRhCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi10eXBlZGVmIE00T1NBX0VSUiAgKE00QURfY3JlYXRlX2ZjdCkoTTRBRF9Db250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCB2b2lkKiBwVXNlckRhdGEpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIERlc3Ryb3lzIHRoZSBpbnN0YW5jZSBvZiB0aGUgZGVjb2RlcgotICogQG5vdGUgICAgQWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb250ZXh0IGlzIGludmFsaWQKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNEFEX2Rlc3Ryb3lfZmN0KSAgICAoTTRBRF9Db250ZXh0IGNvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIERlY29kZXMgdGhlIGdpdmVuIGF1ZGlvIGRhdGEKLSAqIEBub3RlICAgIFBhcnNlcyBhbmQgZGVjb2RlcyB0aGUgbmV4dCBhdWRpbyBmcmFtZSwgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLgotICogICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgcElucHV0QnVmZmVyU2l6ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGFtb3VudAotICogICAgICAgICAgICBvZiBkYXRhIGFjdHVhbGx5IHJlYWQuCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgaW5wdXRCdWZmZXI6ICAgICAgICAoSU4vT1VUKUlucHV0IERhdGEgYnVmZmVyLiBJdCBjb250YWlucyBhdCBsZWFzdCBvbmUgYXVkaW8gZnJhbWUuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgbXVzdCBiZSB1cGRhdGVkIGluc2lkZSB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdG8gcmVmbGVjdCB0aGUgc2l6ZSBvZiB0aGUgYWN0dWFsbHkgZGVjb2RlZCBkYXRhLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiB0aGUgZmlyc3QgZnJhbWUgaW4gcElucHV0QnVmZmVyKQotICogQHBhcmFtICAgZGVjb2RlZFBDTUJ1ZmZlcjogICAgKE9VVCkgICBPdXRwdXQgUENNIGJ1ZmZlciAoZGVjb2RlZCBkYXRhKS4KLSAqIEBwYXJhbSAgIGp1bXBpbmc6ICAgICAgICAgICAgKElOKSAgICBNNE9TQV9UUlVFIGlmIGEganVtcCB3YXMganVzdCBkb25lLCBNNE9TQV9GQUxTRSBvdGhlcndpc2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRBRF9zdGVwX2ZjdCkgICAgKE00QURfQ29udGV4dCBjb250ZXh0LCBNNEFEX0J1ZmZlciAqcElucHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00QURfQnVmZmVyICpwRGVjb2RlZFBDTUJ1ZmZlciwgTTRPU0FfQm9vbCBqdW1waW5nKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0cyB0aGUgZGVjb2RlciB2ZXJzaW9uCi0gKiBAbm90ZSAgICBUaGUgdmVyc2lvbiBpcyBnaXZlbiBpbiBhIE00X1ZlcnNpb25JbmZvIHN0cnVjdHVyZQotICoKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAoT1VUKSAgICAgICAgUG9pbnRlciB0byB0aGUgdmVyc2lvbiBzdHJ1Y3R1cmUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBUaGUgZ2l2ZW4gcG9pbnRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRBRF9nZXRWZXJzaW9uX2ZjdCkoTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHRoZSBBQUMgY29yZSBkZWNvZGVyIGFjY29yZGluZyB0bwotICogICAgICAgICAgICB0aGUgc3RyZWFtIHByb3BlcnRpZXMgYW5kIHRvIHRoZSBvcHRpb25zIHRoYXQgbWF5Ci0gKiAgICAgICAgICAgIGhhdmUgYmVlbiBzZXQgdXNpbmcgTTRBRF9zZXRPcHRpb25fZmN0Ci0gKiBAbm90ZSAgICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBBQUMgZGVjb2RlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGVzcGVjaWFsbHkgYnkgdGhlIEFBQyBkZWNvZGVyCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKElOL09VVCkgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gYW4gYXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNEFEX3N0YXJ0X2ZjdCkgICAgKE00QURfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFJlc2V0IHRoZSBpbnN0YW5jZSBvZiB0aGUgZGVjb2RlcgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgVGhlIGNvbnRleHQgaXMgaW52YWxpZCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00QURfcmVzZXRfZmN0KSAgICAoTTRBRF9Db250ZXh0IGNvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgc2V0IGVuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgYXVkaW8gZGVjb2RlcgotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAgICAoSU4pICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQgYnkgdXNlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QURfc2V0T3B0aW9uX2ZjdCkgKE00QURfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldCBlbiBvcHRpb24gdmFsdWUgb2YgdGhlIGF1ZGlvIGRlY29kZXIKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBzZXQKLSAqIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgICAgKE9VVCkgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRBRF9nZXRPcHRpb25fZmN0KSAoTTRBRF9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSk7Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNEFEX0ludGVyZmFjZQotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBnZW5lcmljIGF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBwb2ludGVycyB0byBmdW5jdGlvbnMgb2Ygb25lIGF1ZGlvIGRlY29kZXIgdHlwZS4KLSAqICAgICAgICAgICAgICAgIFRoZSBkZWNvZGVyIHR5cGUgaXMgb25lIG9mIHRoZSBNNEFEX1R5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRBRF9JbnRlcmZhY2UKLXsKLQotICAgIE00QURfY3JlYXRlX2ZjdCogICAgICAgIG1fcEZjdENyZWF0ZUF1ZGlvRGVjOwotICAgIE00QURfc3RhcnRfZmN0KiAgICAgICAgICAgIG1fcEZjdFN0YXJ0QXVkaW9EZWM7Ci0gICAgTTRBRF9zdGVwX2ZjdCogICAgICAgICAgICBtX3BGY3RTdGVwQXVkaW9EZWM7Ci0gICAgTTRBRF9nZXRWZXJzaW9uX2ZjdCogICAgbV9wRmN0R2V0VmVyc2lvbkF1ZGlvRGVjOwotICAgIE00QURfZGVzdHJveV9mY3QqICAgICAgICBtX3BGY3REZXN0cm95QXVkaW9EZWM7Ci0gICAgTTRBRF9yZXNldF9mY3QqICAgICAgICAgICAgbV9wRmN0UmVzZXRBdWRpb0RlYzsKLSAgICBNNEFEX3NldE9wdGlvbl9mY3QqICAgICAgICBtX3BGY3RTZXRPcHRpb25BdWRpb0RlYzsKLSAgICBNNEFEX2dldE9wdGlvbl9mY3QqICAgICAgICBtX3BGY3RHZXRPcHRpb25BdWRpb0RlYzsKLQotfSBNNEFEX0ludGVyZmFjZTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qX19NNEFEX0NPTU1PTl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFEX051bGwuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QURfTnVsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ODE0MGNkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QURfTnVsbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRBRF9OdWxsLmgKLSAqIEBicmllZiAgICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGVjb2RlciBwdWJsaWMgaW50ZXJmYWNlIHRoYXQgZG8gbm90aGluZwotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGdldEludGVyZmFjZSBmdW5jdGlvbi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRBRF9OVUxMX0hfXwotI2RlZmluZSBfX000QURfTlVMTF9IX18KLQotI2luY2x1ZGUgIk00QURfQ29tbW9uLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiBSZXRyaWV2ZXMgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGUgZGVjb2RlcgotICogQHBhcmFtIHBEZWNvZGVyVHlwZSAgICAgICAgOiBwb2ludGVyIG9uIGFuIE00QURfVHlwZSAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgZGVjb2RlciB0eXBlIHN1cHBvcnRlZCBieSB0aGlzIGRlY29kZXIKLSAqIEBwYXJhbSBwRGVjb2RlckludGVyZmFjZSAgIDogYWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoaXMgZGVjb2Rlci4gVGhlIGludGVyZmFjZSBpcyBhIHN0cnVjdHVyZSBhbGxvY2F0ZWQgYnkgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotICoKLSAqIEByZXR1cm4gOiBNNE5PX0VSUk9SICBpZiBPSwotICogICAgICAgICAgIE00RVJSX0FMTE9DIGlmIGFsbG9jYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QURfTlVMTF9nZXRJbnRlcmZhY2UoIE00QURfVHlwZSAqcERlY29kZXJUeXBlLCBNNEFEX0ludGVyZmFjZSAqKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qX19NNEFEX05VTExfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBSVJfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFJUl9BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzU0MTM2Mi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNEFJUl9BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNEFJUl9BUEkuaAotICogQGJyaWVmICBBcmVhIG9mIEludGVyZXN0IFJlc2l6ZXIgIEFQSQotICogQG5vdGUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIE00QUlSX0FQSV9ICi0jZGVmaW5lIE00QUlSX0FQSV9ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOQ0xVREVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX011dGV4LmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLSNpbmNsdWRlICJNNENvbW1vbl90eXBlcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqIE00QUlSIFRZUEVTIERFRklOSVRJT05TICoqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00QUlSX0lucHV0Rm9ybWF0VHlwZQotICogQGJyaWVmICAgICBUaGUgZm9sbG93aW5nIGVudW1lcmF0aW9uIGxpc3RzIHRoZSBkaWZmZXJlbnQgYWNjZXB0ZWQgZm9ybWF0IGZvciB0aGUgQUlSLgotICogVG8gYmUgYXZhaWxhYmxlLCB0aGUgYXNzb2NpYXRlZCBjb21waWxhdGlvbiBmbGFnIG11c3QgYmUgZGVmaW5lZCwgZWxzZSwKLSAqIHRoZSBBSVIgd2lsbCByZXR1cm4gYW4gZXJyb3IgKGNvbXBpbGF0aW9uIGZsYWcgOiBNNEFJUl9YWFhYWFhfRk9STUFUX1NVUFBPUlRFRCkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRBSVJfa1lVVjQyMFAsCi0gICAgTTRBSVJfa1lVVjQyMEFQLAotICAgIE00QUlSX2tKUEcKLX1NNEFJUl9JbnB1dEZvcm1hdFR5cGUgOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgICAgICAgTTRBSVJfQ29vcmRpbmF0ZXMKLSAqIEBicmllZiAgICAgVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXRyaWV2ZSBYIGFuZCBZIGNvb3JkaW5hdGVzIGluIGEgZ2l2ZW4gcGljdHVyZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICBtX3g7ICAgIC8qKjwgWCBjb29yZGluYXRlICovCi0gICAgTTRPU0FfVUludDMyICAgIG1feTsgICAgLyoqPCBZIGNvb3JkaW5hdGUgKi8KLX1NNEFJUl9Db29yZGluYXRlczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICAgICAgIE00QUlSX1NpemUKLSAqIEBicmllZiAgICAgVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGltZW5zaW9uIG9mIGEgZ2l2ZW4gcGljdHVyZSBhcmVhLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgIG1fd2lkdGg7ICAgIC8qKjwgV2lkdGggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9oZWlnaHQ7ICAgIC8qKjwgSGVpZ2h0ICovCi19TTRBSVJfU2l6ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICAgICAgIE00QUlSX1BhcmFtcwotICogQGJyaWVmICAgICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBwYXJhbWV0ZXJzIG5lZWRlZCB0byBnZXQgYSByZXNpemVkIFJPSSAoUmVnaW9uIG9mIGludGVyZXN0KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00QUlSX0Nvb3JkaW5hdGVzICAgICAgICBtX2lucHV0Q29vcmQ7ICAgICAgICAgICAgLyoqPCBYIGFuZCBZIHBvc2l0aW9ubmluZyBpbiB0aGUgaW5wdXQgb2YgdGhlIGZpcnN0IGludGVyZXN0aW5nIHBpeGVsICh0b3AtbGVmdCkgKi8KLSAgICBNNEFJUl9TaXplICAgICAgICAgICAgICAgIG1faW5wdXRTaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgaW50ZXJlc3RpbmcgYXJlYSBpbnNpZGUgaW5wdXQgKHdpZHRoIGFuZCBoZWlnaHQpKi8KLSAgICBNNEFJUl9TaXplICAgICAgICAgICAgICAgIG1fb3V0cHV0U2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIG91dHB1dCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgbV9iT3V0cHV0U3RyaXBlOyAgICAgICAgICAgIC8qKjwgRmxhZyB0byBrbm93IGlmIHdlIHdpbGwgaGF2ZSB0byBwcm92aWRlIG91dHB1dCBwZXIgc3RyaXBlIG9yIG5vdCAqLwotICAgIE00Q09NTU9OX09yaWVudGF0aW9uICAgICAgICBtX291dHB1dE9yaWVudGF0aW9uOyAgICAvKio8IERlc2lyZWQgb3JpZW50YXRpb24gb2YgdGhlIEFJUiBvdXRwdXQgKi8KLX1NNEFJUl9QYXJhbXM7Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiBNNEFJUiBFUlJPUlMgREVGSU5JVElPTlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhpcyBlcnJvciBtZWFucyB0aGF0IHRoZSByZXF1ZXN0ZWQgdmlkZW8gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuICovCi0jZGVmaW5lIE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNEFJUiwweDAwMDAwMSkKLQotLyogVGhpcyBlcnJvciBtZWFucyB0aGF0IHRoZSBpbnB1dCBvciBvdXRwdXQgc2l6ZSBpcyBpbmNvcnJlY3QgKi8KLSNkZWZpbmUgTTRFUlJfQUlSX0lMTEVHQUxfRlJBTUVfU0laRSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNEFJUiwweDAwMDAwMikKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIE00QUlSIFBVQkxJQyBBUEkgREVGSU5JVElPTlMgKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jcmVhdGUoTTRPU0FfQ29udGV4dCogcENvbnRleHQsTTRBSVJfSW5wdXRGb3JtYXRUeXBlIGlucHV0Rm9ybWF0KTsKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBBSVIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTi9PVVQpIEFkZHJlc3Mgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlCi0gKiBAcGFyYW0gICAgaW5wdXRGb3JtYXQ6ICAgIChJTikgaW5wdXQgZm9ybWF0IHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuIEludmFsaWQgZm9ybWF0VHlwZQotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgaXMgYXZhaWxhYmxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBkZXN0cm95cyBhbiBpbnN0YW5jZSBvZiB0aGUgQUlSIGNvbXBvbmVudAotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlIHRvIGRlc3Ryb3kKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6IEludGVybmFsIHN0YXRlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgZnVuY3Rpb24gY2FsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfY2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jb25maWd1cmUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRBSVJfUGFyYW1zKiBwUGFyYW1zKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBjb25maWd1cmUgdGhlIEFJUi4KLSAqIEBub3RlICAgIEl0IHdpbGwgc2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGNvb3JkaW5hdGVzIGFuZCBzaXplcywKLSAqICAgICAgICAgICAgYW5kIGluZGljYXRlcyBpZiB3ZSB3aWxsIHByb2NlZWQgaW4gc3RyaXBlIG9yIG5vdC4KLSAqICAgICAgICAgICAgSW4gY2FzZSBhIE00QUlSX2dldCBpbiBzdHJpcGUgbW9kZSB3YXMgb24gZ29pbmcsIGl0IHdpbGwgY2FuY2VsIHRoaXMgcHJldmlvdXMKLSAqICAgICAgICAgICAgcHJvY2Vzc2luZyBhbmQgcmVzZXQgdGhlIGdldCBwcm9jZXNzLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgICAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9iT3V0cHV0U3RyaXBlOihJTikgU3RyaXBlIG1vZGUuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9pbnB1dENvb3JkOiAgICAoSU4pIFgsWSBjb29yZGluYXRlcyBvZiB0aGUgZmlyc3QgdmFsaWQgcGl4ZWwgaW4gaW5wdXQuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9pbnB1dFNpemU6ICAgIChJTikgaW5wdXQgUk9JIHNpemUuCi0gKiBAcGFyYW0gICAgcFBhcmFtcy0+bV9vdXRwdXRTaXplOiAgICAoSU4pIG91dHB1dCBzaXplLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gICAgTTRFUlJfQUlSX0ZPUk1BVF9OT1RfU1VQUE9SVEVEOiB0aGUgcmVxdWVzdGVkIGlucHV0IGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFJUl9jb25maWd1cmUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRBSVJfUGFyYW1zKiBwUGFyYW1zKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHByb3ZpZGUgdGhlIHJlcXVlc3RlZCByZXNpemVkIGFyZWEgb2YgaW50ZXJlc3QgYWNjb3JkaW5nIHRvCi0gKiAgICAgICAgICAgIHNldHRpbmdzIHByb3ZpZGVkIGluIE00QUlSX2NvbmZpZ3VyZS4KLSAqIEBub3RlICAgIEluIGNhc2UgdGhlIGlucHV0IGZvcm1hdCB0eXBlIGlzIEpQRUcsIGlucHV0IHBsYW5lKHMpCi0gKiAgICAgICAgICAgIGluIHBJbiBpcyBub3QgdXNlZC4gSW4gbm9ybWFsIG1vZGUsIGRpbWVuc2lvbiBzcGVjaWZpZWQgaW4gb3V0cHV0IHBsYW5lKHMpIHN0cnVjdHVyZQotICogICAgICAgICAgICBtdXN0IGJlIHRoZSBzYW1lIHRoYW4gdGhlIG9uZSBzcGVjaWZpZWQgaW4gTTRBSVJfY29uZmlndXJlLiBJbiBzdHJpcGUgbW9kZSwgb25seQotICogICAgICAgICAgICB0aGUgd2lkdGggd2lsbCBiZSB0aGUgc2FtZSwgaGVpZ2h0IHdpbGwgYmUgdGFrZW4gYXMgdGhlIHN0cmlwZSBoZWlnaHQgKHR5cGljYWxseSAxNikuCi0gKiAgICAgICAgICAgIEluIG5vcm1hbCBtb2RlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGwgb25jZSB0byBnZXQgdGhlIGZ1bGwgb3V0cHV0IHBpY3R1cmUuIEluIHN0cmlwZQotICogICAgICAgICAgICBtb2RlLCBpdCBpcyBjYWxsZWQgZm9yIGVhY2ggc3RyaXBlIHRpbGwgdGhlIHdob2xlIHBpY3R1cmUgaGFzIGJlZW4gcmV0cmlldmVkLGFuZAotICogICAgICAgICAgICB0aGUgcG9zaXRpb24gb2YgdGhlIG91dHB1dCBzdHJpcGUgaW4gdGhlIG91dHB1dCBwaWN0dXJlIGlzIGludGVybmFsbHkgaW5jcmVtZW50ZWQKLSAqICAgICAgICAgICAgYXQgZWFjaCBzdGVwLgotICogICAgICAgICAgICBBbnkgY2FsbCB0byBNNEFJUl9jb25maWd1cmUgZHVyaW5nIHN0cmlwZSBwcm9jZXNzIHdpbGwgcmVzZXQgdGhpcyBvbmUgdG8gdGhlCi0gKiAgICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgcGljdHVyZS4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZQotICogQHBhcmFtICAgIHBJbjogICAgICAgICAgICAoSU4pIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIGlucHV0IFBsYW5lKHMpLgotICogQHBhcmFtICAgIHBPdXQ6ICAgICAgICAoSU4vT1VUKSAgUGxhbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgb3V0cHV0IFBsYW5lKHMpLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogTm8gbW9yZSBtZW1vcnkgc3BhY2UgdG8gYWRkIGEgbmV3IGVmZmVjdC4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBSVJfZ2V0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0KTsKLQotCi0KLSNlbmRpZiAvKiBNNEFJUl9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBTVJSX0NvcmVSZWFkZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000QU1SUl9Db3JlUmVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkNzEwZjMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRBTVJSX0NvcmVSZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRBTVJSX0NvcmVSZWFkZXIuaAotICogQGJyaWVmICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBBTVIgcGFyc2VyCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBBUEkgZGVmLiBmb3IgQU1SIFBhcnNlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRBTVJfQ09SRVJFQURFUl9IX18KLSNkZWZpbmUgX19NNEFNUl9DT1JFUkVBREVSX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFNZU19TdHJlYW0uaCIKLSNpbmNsdWRlICJNNFNZU19BY2Nlc3NVbml0LmgiCi0jaW5jbHVkZSAiTTRPU0FfVGltZS5oIgotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFNUiByZWFkZXIgRXJyb3JzICYgV2FybmluZ3MgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRSAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNEFNUl9SRUFERVIsIDB4MDAwMDAxKQotI2RlZmluZSBNNEVSUl9BTVJfTk9UX0NPTVBMSUFOVCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNEFNUl9SRUFERVIsIDB4MDAwMDAyKQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW1lcmF0aW9uICAgIE00QU1SUl9TdGF0ZQotICogQGJyaWVmICAgICAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgQU1SIHJlYWRlciBzdGF0ZXMKLSAqIEBub3RlICAgICAgICBUaGVzZSBzdGF0ZXMgYXJlIHVzZWQgaW50ZXJuYWx5LCBidXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIG91dHNpZGUgdGhlIHJlYWRlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW17Ci0gICAgTTRBTVJSX2tPcGVuaW5nICAgID0gMHgwMTAwLAotICAgIE00QU1SUl9rT3BlbmVkICAgID0gMHgwMTAxLAotICAgIE00QU1SUl9rUmVhZGluZyA9IDB4MDIwMCwKLSAgICBNNEFNUlJfa1JlYWRpbmdfbmV4dEFVID0gMHgwMjAxLAotICAgIE00QU1SUl9rQ2xvc2VkID0gMHgzMDAKLX1NNEFNUlJfU3RhdGU7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRBTVJSX29wZW5SZWFkIChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZGVyUG9pbnRlciogcEZpbGVGdW5jdGlvbik7Ci0qIEBicmllZiAgICBNNEFNUlJfT3BlblJlYWQgcGFyc2VzIHRoZSBtZXRhIGRhdGEgb2YgdGhlIEFNUiBhbmQgYWxsb2NhdGVzIGRhdGEgc3RydWN0dXJlCi0qIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG9wZW5zIHRoZSBmaWxlIGFuZCBjcmVhdGVzIGEgY29udGV4dCBmb3IgQU1SICBQYXJzZXIuCi0qICAgICAgICAgICAgLSBzZXRzIGNvbnRleHQgdG8gbnVsbCBpZiBlcnJvciBvY2N1cmVkLgotKiBAcGFyYW0gICAgcENvbnRleHQoT1VUKSAgICAgICAgOiBBTVIgUmVhZGVyIGNvbnRleHQgYWxsb2NhdGVkIGluIHRoZSBmdW5jdGlvbgotKiBAcGFyYW0gICAgcEZpbGVEZXNzY3JpcHRvcihJTik6IEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgaW5wdXQgZmlsZQotKiBAcGFyYW0gICAgcEZpbGVGdW5jdGlvbihJTikgICAgOiBwb2ludGVyIHRvIGZpbGUgZnVuY3Rpb24gZm9yIGZpbGUgYWNjZXNzCi0qCi0qIEByZXR1cm5zICAgIE00Tk9fRVJST1IgICAgICAgIDogVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogcENvbnRleHQgYW5kL29yIHBGaWxlRGVzY3JpcHRvciBpcyBOVUxMCi0qIEByZXR1cm5zICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICBNNEVSUl9GSUxFX05PVF9GT1VORCA6IGZpbGUgY2Fubm90IGJlIGZvdW5kCi0qIEByZXR1cm5zICAgIE00QU1SUl9FUlJfQU1SX05PVF9DT01QTElBTlQgOiBUdGhlIGlucHV0IGlzIG5vdCBhIEFNUiBmaWxlCi0qIEByZXR1cm5zICAgIE00T1NBX0ZJTEUgICAgICAgIDogU2VlIE9TQUwgZmlsZSBTcGVjLiBmb3IgZGV0YWlscy4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBTVJSX29wZW5SZWFkIChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVGdW5jdGlvbik7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBwU3RyZWFtRGVzYyApOwotKiBAYnJpZWYgICAgUmVhZHMgdGhlIG5leHQgYXZhaWxhYmxlIHN0cmVhbSBpbiB0aGUgZmlsZQotKiBAbm90ZSAgICAgICAgR2V0IHRoZSBzdHJlYW0gZGVzY3JpcHRpb24gb2YgdGhlIHN0cmVhbS4KLSogICAgICAgICAgICAtIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHN0cmVhbSBpbiBBTVIgZmlsZS4KLSogQHBhcmFtICAgIENvbnRleHQoSU4vT1VUKSAgICA6IEFNUiBSZWFkZXIgY29udGV4dAotKiBAcGFyYW0gICAgcFN0cmVhbURlc2MoT1VUKTogRGVzY3JpcHRpb24gb2YgdGhlIG5leHQgcmVhZCBzdHJlYW0KLSoKLSogQHJldHVybnMgICAgIE00Tk9fRVJST1IgICAgICAgIDogVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICA6IGF0bGVhc3Qgb25lIHBhcmFtZW50IGlzIE5VTEwKLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9DT05URVhUICAgIDogICAgVGhlIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IHZhbGlkCi0qIEByZXR1cm5zICAgICBNNEVSUl9BTExPQyAgICAgICAgOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgICAgIE00RVJSX1NUQVRFICAgICAgICA6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBpbiB0aGlzIHN0YXRlLgotKiBAcmV0dXJucyAgICAgTTRBTVJSX1dBUl9OT19NT1JFX1NUUkVBTSA6IFRoZXJlIGFyZSBubyBtb3JlIHN0cmVhbXMgaW4gdGhlIGZpbGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00T1NBX0VSUiBNNEFNUlJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBwU3RyZWFtRGVzYyApOwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRBTVJSX3N0YXJ0UmVhZGluZyhNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSURzICk7Ci0qIEBicmllZiAgICBQcmVwYXJlcyB0aGUgQU1SIHJlYWRpbmcgb2YgdGhlIHNwZWNpZmllZCBzdHJlYW0gSWRzCi0qIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZSByZWFkZXIgcmVhZGluZy4KLSogQHBhcmFtICAgIENvbnRleHQoSU4vT1VUKSAgICA6IEFNUiBSZWFkZXIgY29udGV4dAotKiBAcGFyYW0gICAgcFN0cmVhbUlEcyhJTikgICAgOiBBcnJheSBvZiBzdHJlYW0gSWRzIHRvIGJlIHByZXBhcmVkLgotKgotKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICAgTTRFUlJfU1RBVEUgICAgICAgIDogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGluIHRoaXMgc3RhdGUuCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgIDogQXRsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBTVJSX3N0YXJ0UmVhZGluZyhNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSURzICk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfbmV4dEFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSk7Ci0qIEBicmllZiAgICBSZWFkcyB0aGUgYWNjZXNzIHVuaXQgaW50byB0aGUgcHJvdmlkaW5nIHN0cmVhbQotKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgdGhlIG1lbW9yeSB0byBkYXRhQWRkcmVzcyBmaWxlZCBhbmQgY29waWVkIHRoZSBkYXRhLgotKiAgICAgICAgICAgIC1UaGUgQXBwbGljYXRpb24gc2hvdWxkIG5vdCBmcmVlIHRoZSBkYXRhQWRkcmVzcyBwb2ludGVyLgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBTdHJlYW1JRChJTikgICAgOiBTZWxlY3RzIHRoZSBzdHJlYW0KLSogQHBhcmFtICAgIHBBdShJTi9PVVQpICAgICAgICA6IEFjY2VzcyBVbml0Ci0qCi0qIEByZXR1cm5zICAgIE00Tk9fRVJST1IgICAgICAgIDogVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICA6IGF0bGVhc3Qgb25lIHBhcmFtZW50IGlzIE5VTEwKLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9DT05URVhUICAgIDogICAgVGhlIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IHZhbGlkCi0qIEByZXR1cm5zICAgICBNNEVSUl9BTExPQyAgICAgICAgOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgICAgIE00RVJSX1NUQVRFICAgICAgICA6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBpbiB0aGlzIHN0YXRlLgotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICA6IEF0bGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotKiBAcmV0dXJucyAgICAgTTRXQVJfTk9fREFUQV9ZRVQgICAgOiB0aGVyZSAgICBpcyBubyBlbm91Z2ggZGF0YSBvbiB0aGUgc3RyZWFtIGZvciBuZXcgYWNjZXNzIHVuaXQKLSogQHJldHVybnMgICAgIE00V0FSX0VORF9PRl9TVFJFQU0gICAgOiBUaGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtCi0qIEByZXR1cm5zICAgICBNNEFNUlJfRVJSX0lOVkFMSURfRlJBTUVfVFlQRSA6IGN1cnJlbnQgZnJhbWUgaGFzIG5vIHZhbGlkIGZyYW1lIHR5cGUuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBTVJSX25leHRBVShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEIFN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQXUpOwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRBTVJSX2ZyZWVBVShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEIFN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQXUpOwotKiBAYnJpZWYgICAgTm90aWZ5IHRoZSBBUk0gUmVhZGVyIHRoYXQgYXBwbGljYXRpb24gd2lsbCBubyBsb25nZXIgdXNlICJBVSIKLSogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIG1lbW9yeSBwb2ludGVkIGJ5IHBBdS0+ZGF0YUFkZHJlc3MgcG9pbnRlcgotKiAgICAgICAgICAgIC1DaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZGVyIGJhY2sgdG8gcmVhZGluZy4KLSogQHBhcmFtICAgIENvbnRleHQoSU4vT1VUKSAgICA6IEFNUiBSZWFkZXIgY29udGV4dAotKiBAcGFyYW0gICAgU3RyZWFtSUQoSU4pICAgIDogU2VsZWN0cyB0aGUgc3RyZWFtCi0qIEBwYXJhbSAgICBwQXUoSU4pICAgICAgICAgICAgOiBBY2Nlc3MgVW5pdAotKgotKiBAcmV0dXJucyAgICAgTTROT19FUlJPUiAgICAgICAgOiBUaGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgIDogYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0FMTE9DICAgICAgICA6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotKiBAcmV0dXJucyAgICAgTTRFUlJfU1RBVEUgICAgICAgIDogdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGluIHRoaXMgc3RhdGUuCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgIDogQXRsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRBTVJSX2ZyZWVBVShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEIFN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQXUpOwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRBTVJSX3NlZWsoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlELCBNNE9TQV9UaW1lIHRpbWUsCi0qICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfc2Vla0FjY2Vzc01vZGUgICAgc2Vla01vZGUsIE00T1NBX1RpbWUqIHBPYnRhaW5DVFMpOwotKiBAYnJpZWYgICAgVGhlIGZ1bmN0aW9uIHNlZWtzIHRoZSB0YXJnZXRlZCB0aW1lIGluIHRoZSBnaXZlIHN0cmVhbSBieSBzdHJlYW1JZC4KLSogQG5vdGUgICAgICAgIEVhY2ggZnJhbWUgaXMgb2YgMjAgbXMgZHVyYXRpb24sLCBidWlsZHMgdGhlIHNlZWsgdGFibGUgYW5kIHBvaW50cwotKiAgICAgICAgICAgIHRoZSBmaWxlIHBvaW50ZXIgdG8gc3RhcnRpbmcgZm9yIHRoZSByZXF1aXJlZCBBVS4KLSogQHBhcmFtICAgIENvbnRleHQoSU4vT1VUKSAgICA6IEFNUiBSZWFkZXIgY29udGV4dAotKiBAcGFyYW0gICAgU3RyZWFtSUQoSU4pICAgIDogQXJyYXkgb2Ygc3RyZWFtIElEcy4KLSogQHBhcmFtICAgIHRpbWUoSU4pICAgICAgICA6IHRhcmdldGVkIHRpbWUKLSogQHBhcmFtICAgIHNlZWtNb2RlKElOKSAgICA6IFNlbGVjdHMgdGhlIHNlZWsgbW9kZQotKiBAcGFyYW0gICAgcE9idGFpbkNUUyhPVVQpICAgIDogUmV0dXJuZWQgdGltZSBuZWFyZXN0IHRvIHRhcmdldC4KLSoKLSogQHJldHVybnMgICAgIE00Tk9fRVJST1IgICAgICAgIDogVGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybnMgICAgIE00RVJSX1BBUkFNRVRFUiAgICA6IGF0bGVhc3Qgb25lIHBhcmFtZW50IGlzIE5VTEwKLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9DT05URVhUICAgIDogICAgVGhlIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IHZhbGlkCi0qIEByZXR1cm5zICAgICBNNEVSUl9BTExPQyAgICAgICAgOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgICAgIE00RVJSX1NUQVRFICAgICAgICA6IHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBpbiB0aGlzIHN0YXRlLgotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICA6IEF0bGVhc3Qgb25lIG9mIHRoZSBzdHJlYW0gSWQuIGRvZXMgbm90IGV4aXN0LgotKiBAcmV0dXJucyAgICAgTTRXQVJfSU5WQUxJRF9USU1FICAgIDogdGltZSBjYW5ub3QgYmUgcmVhY2hlZC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfc2VlayhNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSUQsIE00T1NBX1RpbWUgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TZWVrQWNjZXNzTW9kZSAgICBzZWVrTW9kZSwgTTRPU0FfVGltZSogcE9idGFpbkNUUyk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfY2xvc2VSZWFkKE00T1NBX0NvbnRleHQgQ29udGV4dCk7Ci0qIEBicmllZiAgICBBTVIgcmVhZGVyIGNsb3NlcyB0aGUgZmlsZQotKiBAcGFyYW0gICAgQ29udGV4dChJTj9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEByZXR1cm5zICAgICBNNE5PX0VSUk9SICAgICAgICA6IFRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgOiBhdGxlYXN0IG9uZSBwYXJhbWVudCBpcyBOVUxMCi0qIEByZXR1cm5zICAgICBNNEVSUl9CQURfQ09OVEVYVCAgICA6ICAgIFRoZSBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCB2YWxpZAotKiBAcmV0dXJucyAgICAgTTRFUlJfQUxMT0MgICAgICAgIDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkCi0qIEByZXR1cm5zICAgICBNNEVSUl9TVEFURSAgICAgICAgOiB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhpcyBzdGF0ZS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfY2xvc2VSZWFkKE00T1NBX0NvbnRleHQgQ29udGV4dCk7Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE00T1NBX0VSUiBNNEFNUlJfZ2V0U3RhdGUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNEFNUlJfU3RhdGUqIHBTdGF0ZSwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWQpOwotKiBAYnJpZWYgICAgR2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgQU1SIHJlYWRlcgotKiBAcGFyYW0gICAgQ29udGV4dChJTi9PVVQpICAgIDogQU1SIFJlYWRlciBjb250ZXh0Ci0qIEBwYXJhbSAgICBwU3RhdGUoT1VUKSAgICAgICAgOiBDb3JlIEFNUiByZWFkZXIgc3RhdGUKLSogQHBhcmFtICAgIHN0cmVhbUlkKElOKSAgICA6IFNlbGVjdHMgdGhlIHN0cmVhbSAwIGZvciBhbGwKLSoKLSogQHJldHVybnMgICAgIE00Tk9fRVJST1IgICAgICAgICAgICA6ICAgIFRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm5zICAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgIDogICAgYXRsZWFzdCBvbmUgcGFyYW1lbnQgaXMgTlVMTAotKiBAcmV0dXJucyAgICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgOiAgICBUaGUgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgdmFsaWQKLSogQHJldHVybnMgICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgOiAgICBBdGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0U3RhdGUoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNEFNUlJfU3RhdGUqIHBTdGF0ZSwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QU1SUl9nZXRWZXJzaW9uICAgIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pCi0gKiBAYnJpZWYgICAgR2V0cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBBTVIgcmVhZGVyCi0gKiBAcGFyYW0gICAgdmVyc2lvbihPVVQpICAgIDogdGhlIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyB0aGUgdmVyc2lvbiBudW1iZXJzCi0gKgotICogQHJldHVybnMgICAgIE00Tk9fRVJST1IgICAgICAgICAgICA6ICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJucyAgICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICA6ICAgIHZlcnNpb24gaXMgTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0VmVyc2lvbiAgICAoTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBTVJSX2dldG1heEFVc2l6ZSAgICAoTTRPU0FfQ29udGV4dCBDb250ZXh0LCBNNE9TQV9VSW50MzIgKnBNYXhBdVNpemUpCi0gKiBAYnJpZWYgICAgQ29tcHV0ZXMgdGhlIG1heGltdW0gYWNjZXNzIHVuaXQgc2l6ZSBvZiBhIHN0cmVhbQotICoKLSAqIEBwYXJhbSAgICBDb250ZXh0ICAgICAgICAoSU4pICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwTWF4QXVTaXplICAgIChPVVQpIE1heGltdW0gQWNjZXNzIFVuaXQgc2l6ZSBpbiB0aGUgc3RyZWFtCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IE9uZSBvZiB0aGUgaW5wdXQgcG9pbnRlciBpcyBNNE9TQV9OVUxMIChEZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0bWF4QVVzaXplKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRPU0FfVUludDMyICpwTWF4QXVTaXplKTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyovCi0jZW5kaWYgLypfX000QU1SX0NPUkVSRUFERVJfSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRDb21tb25fdHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000Q29tbW9uX3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllNmEwZmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRDb21tb25fdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNENvbW1vbl9UeXBlcy5oCi0gKiBAYnJpZWYgIGRlZmluZXMgY29tbW9uIHN0cnVjdHVyZXMKLSAqIEBub3RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgTTRDT01NT05fVFlQRVNfSAotI2RlZmluZSBNNENPTU1PTl9UWVBFU19ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSBNNENPTU1PTl9NZXRhZGF0YVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNENPTU1PTl9rVW5rbm93bk1ldGFEYXRhVHlwZSwKLSAgICAvKiBMb2NhbCBmaWxlcyAqLwotICAgIE00Q09NTU9OX2tUYWdJRDN2MSwgICAgICAgICAgICAgICAgLyoqPCAgTWV0YWRhdGEgZnJvbSBUQUcgSUQzIFYxICovCi0gICAgTTRDT01NT05fa1RhZ0lEM3YyLCAgICAgICAgICAgICAgICAvKio8ICBNZXRhZGF0YSBmcm9tIFRBRyBJRDMgVjIgKi8KLSAgICBNNENPTU1PTl9rQVNGQ29udGVudERlc2MsICAgICAgICAvKio8ICBNZXRhZGF0YSBmcm9tIEFTRiBjb250ZW50IGRlc2NyaXB0aW9uICAqLwotCi0gICAgTTRDT01NT05fazNHcHBBc3NldE1vdmllQm94LCAgICAvKio8ICBNZXRhZGF0YSBmcm9tIGEgM2dwcCBmaWxlIChtb3ZpZSBib3gpICovCi0gICAgTTRDT01NT05fazNHcHBBc3NldFRyYWNrQm94LCAgICAvKio8ICBNZXRhZGF0YSBmcm9tIGEgM2dwcCBmaWxlICh0cmFjayBib3gpICovCi0KLSAgICAvKiBTdHJlYW1pbmcgKi8KLSAgICBNNENPTU1PTl9rTWV0YURhdGFTZHBTZXNzaW9uLCAgICAvKio8ICBNZXRhZGF0YSBmcm9tIGFuIFNEUCBmaWxlIChTZXNzaW9uIGxldmVsKSAqLwotICAgIE00Q09NTU9OX2tNZXRhRGF0YVNkcEF1ZGlvLCAgICAgICAgLyoqPCAgTWV0YWRhdGEgZnJvbSBhbiBTRFAgZmlsZSAobWVkaWEgYXVkaW8gbGV2ZWwpICovCi0gICAgTTRDT01NT05fa01ldGFEYXRhU2RwVmlkZW8sICAgICAgICAvKio8ICBNZXRhZGF0YSBmcm9tIGFuIFNEUCBmaWxlIChtZWRpYSB2aWRlbyBsZXZlbCkgKi8KLQotICAgIE00Q09NTU9OX2tKcGVnRXhpZiAgICAgICAgICAgICAgICAvKio8IEVYSUYgaW4gSlBFRyAqLwotfSBNNENPTU1PTl9NZXRhZGF0YVR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICAgTTRWUFNfRW5jb2RpbmdGb3JtYXQKLSAqIEBicmllZiAgICAgICAgVGV4dCBlbmNvZGluZyBmb3JtYXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNENPTU1PTl9rRW5jRm9ybWF0VW5rbm93biAgICA9IDAsICAgICAgLyoqPCBVbmtub3duIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTTRDT01NT05fa0VuY0Zvcm1hdEFTQ0lJICAgID0gMSwgICAgICAgIC8qKjwgSVNPLTg4NTktMS4gVGVybWluYXRlZCB3aXRoICQwMCAgICAgICAgICAgICAgICAqLwotICAgIE00Q09NTU9OX2tFbmNGb3JtYXRVVEY4ICAgICAgICA9IDIsICAgICAvKio8IFVURi04IGVuY29kZWQgVW5pY29kZSAuIFRlcm1pbmF0ZWQgd2l0aCAkMDAgICAgKi8KLSAgICBNNENPTU1PTl9rRW5jRm9ybWF0VVRGMTYgICAgPSAzICAgICAgICAgLyoqPCBVVEYtMTYgZW5jb2RlZCBVbmljb2RlLiBUZXJtaW5hdGVkIHdpdGggJDAwIDAwICovCi19ICBNNENPTU1PTl9FbmNvZGluZ0Zvcm1hdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWUFNfU3RyaW5nCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgc3RyaW5nIGF0dHJpYnV0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICBtX3BTdHJpbmc7ICAgICAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byB0ZXh0ICAgICAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV91aVNpemU7ICAgICAgICAgICAgICAgIC8qKjwgVGV4dCBzaXplIGluIGJ5dGVzICAgICAgICAqLwotICAgIE00Q09NTU9OX0VuY29kaW5nRm9ybWF0ICAgIG1fRW5jb2RpbmdGb3JtYXQ7ICAgIC8qKjwgVGV4dCBlbmNvZGluZyBmb3JtYXQgICAgKi8KLQotfSBNNENPTU1PTl9TdHJpbmc7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00Q09NTU9OX0J1ZmZlcgotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGdlbmVyaWMgYnVmZmVyIGF0dHJpYnV0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICBtX3BCdWZmZXI7ICAgICAgICAvKio8IFBvaW50ZXIgdG8gYnVmZmVyICAgICAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9zaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiBidWZmZXIgaW4gYnl0ZXMgICAgKi8KLX0gTTRDT01NT05fQnVmZmVyOwotCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNENPTU1PTl9rTWltZVR5cGVfTk9ORSwKLSAgICBNNENPTU1PTl9rTWltZVR5cGVfSlBHLAotICAgIE00Q09NTU9OX2tNaW1lVHlwZV9QTkcsCi0gICAgTTRDT01NT05fa01pbWVUeXBlX0JNUCwgICAvKiBiaXRtYXAsIHdpdGggaGVhZGVyICovCi0gICAgTTRDT01NT05fa01pbWVUeXBlX1JHQjI0LCAvKiByYXcgUkdCIDI0IGJpdHMgKi8KLSAgICBNNENPTU1PTl9rTWltZVR5cGVfUkdCNTY1LCAvKiByYXcsIFJHQiAxNiBiaXRzICovCi0gICAgTTRDT01NT05fa01pbWVUeXBlX1lVVjQyMCwKLSAgICBNNENPTU1PTl9rTWltZVR5cGVfTVBFRzRfSUZyYW1lIC8qIFJDOiB0byBzdXBwb3J0IFBWIGFydCAqLwotCi19IE00Q09NTU9OX01pbWVUeXBlOwotCi0vKiBwaWN0dXJlIHR5cGUgZGVmaW5pdGlvbiBmcm9tIGlkM3YyIHRhZyovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNENPTU1PTl9rUGljVHlwZV9PdGhlciAgICAgICAgICAgICAgICA9IDB4MDAsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfMzJfMzJfSWNvbiAgICAgICAgICAgID0gMHgwMSwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9PdGhlcl9JY29uICAgICAgICAgICAgPSAweDAyLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0Zyb250Q292ZXIgICAgICAgICAgICA9IDB4MDMsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfQmFja0NvdmVyICAgICAgICAgICAgPSAweDA0LAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0xlYWZsZXRQYWdlICAgICAgICAgICAgPSAweDA1LAotICAgIE00Q09NTU9OX2tQaWNUeXBlX01lZGlhICAgICAgICAgICAgICAgID0gMHgwNiwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9MZWFkQXJ0aXN0ICAgICAgICAgICAgPSAweDA3LAotICAgIE00Q09NTU9OX2tQaWNUeXBlX0FydGlzdCAgICAgICAgICAgICAgICA9IDB4MDgsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfQ29uZHVjdG9yICAgICAgICAgICAgPSAweDA5LAotICAgIE00Q09NTU9OX2tQaWNUeXBlX09yY2hlc3RyYSAgICAgICAgICAgID0gMHgwQSwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9Db21wb3NlciAgICAgICAgICAgID0gMHgwQiwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9MeXJpY2lzdCAgICAgICAgICAgID0gMHgwQywKLSAgICBNNENPTU1PTl9rUGljVHlwZV9SZWNvcmRpbmdMb2NhdGlvbiAgICA9IDB4MEQsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfRHVyaW5nUmVjb3JkaW5nICAgICAgICA9IDB4MEUsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfRHVyaW5nUGVyZm9ybWFuY2UgICAgPSAweDBGLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX01vdmllU2NyZWVuQ2FwdHVyZSAgICA9IDB4MTAsCi0gICAgTTRDT01NT05fa1BpY1R5cGVfQnJpZ2h0Q29sb3VyZWRGaXNoICAgID0gMHgxMSwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9JbGx1c3RyYXRpb24gICAgICAgID0gMHgxMiwKLSAgICBNNENPTU1PTl9rUGljVHlwZV9BcnRpc3RMb2dvICAgICAgICAgICAgPSAweDEzLAotICAgIE00Q09NTU9OX2tQaWNUeXBlX1N0dWRpb0xvZ28gICAgICAgICAgICA9IDB4MTQKLX0gTTRDT01NT05fUGljdHVyZVR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRDT01NT05fT3JpZW50YXRpb24KLSAqIEBicmllZiAgICAgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIHBvc3NpYmxlIG9yaWVudGF0aW9uIG9mIGEgZnJhbWUgYXMgZGVzY3JpYmVkCi0gKiAgICAgICAgICAgIGluIHRoZSBFWElGIHN0YW5kYXJkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvblVua25vd24gPSAwLAotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uVG9wUmlnaHQsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tUmlnaHQsCi0gICAgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tTGVmdCwKLSAgICBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0VG9wLAotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0VG9wLAotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tLAotICAgIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b20KLX1NNENPTU1PTl9PcmllbnRhdGlvbiA7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00RVhJRkNfTG9jYXRpb24KLSAqIEBicmllZiAgICAgICAgVGhlIEltYWdlIEdQUyBsb2NhdGlvbiAoZXhhbXBsZSA6IDQ4sDUyLjIxJyApCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9GbG9hdCAgICBkZWdyZWVzOwotICAgIE00T1NBX0Zsb2F0ICAgIG1pbnNlYzsKLX0gTTRDT01NT05fTG9jYXRpb247Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00Q09NTU9OX01ldGFEYXRhQWxidW1BcnQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBmaWVsZHMgb2YgYSBhbGJ1bSBhcnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00Q09NTU9OX01pbWVUeXBlICAgIG1fbWltZVR5cGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3VpU2l6ZTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgIG1fcERhdGE7Ci0KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgICAgIG1fcERlc2NyaXB0aW9uOwotCi19IE00Q09NTU9OX01ldGFEYXRhQWxidW1BcnQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00Q09NTU9OX01ldGFEYXRhRmllbGRzCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgZmllbGRzIG9mIG1ldGFkYXRhIGluZm9ybWF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNENPTU1PTl9NZXRhZGF0YVR5cGUgICAgbV9NZXRhZGF0YVR5cGU7Ci0KLSAgICAvKiBNZXRhIGRhdGEgZmllbGRzICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcFRpdGxlOyAgICAgICAgICAgIC8qKjwgVGl0bGUgZm9yIHRoZSBtZWRpYSAgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wQXJ0aXN0OyAgICAgICAgICAgIC8qKjwgUGVyZm9ybWVyIG9yIGFydGlzdCAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BBbGJ1bTsgICAgICAgICAgICAvKio8IEFsYnVtIHRpdGxlIGZvciB0aGUgbWVkaWEgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wQXV0aG9yOyAgICAgICAgICAgIC8qKjwgQXV0aG9yIG9mIHRoZSBtZWRpYSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BHZW5yZTsgICAgICAgICAgICAvKio8IEdlbnJlIChjYXRlZ29yeSBhbmQgc3R5bGUpIG9mIHRoZSBtZWRpYSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BEZXNjcmlwdGlvbjsgICAgICAgIC8qKjwgQ2FwdGlvbiBvciBkZXNjcmlwdGlvbiBmb3IgdGhlIG1lZGlhICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcENvcHlSaWdodHM7ICAgICAgICAvKio8IE5vdGljZSBhYm91dCBvcmdhbml6YXRpb24gaG9sZGluZyBjb3B5cmlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBtZWRpYSBmaWxlICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcFJlY29yZGluZ1llYXI7ICAgIC8qKjwgUmVjb3JkaW5nIHllYXIgZm9yIHRoZSBtZWRpYSAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BSYXRpbmc7ICAgICAgICAgICAgLyoqPCBNZWRpYSByYXRpbmcgKi8KLQotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BDbGFzc2lmaWNhdGlvbjsgICAgLyoqPCBDbGFzc2lmaWNhdGlvbiBvZiB0aGUgbWVkaWEgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wS2V5V29yZHM7ICAgICAgICAvKio8IE1lZGlhIGtleXdvcmRzICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcExvY2F0aW9uOyAgICAgICAgLyoqPCBMb2NhdGlvbiBpbmZvcm1hdGlvbiAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BVcmw7ICAgICAgICAgICAgICAgIC8qKjwgUmVmZXJlbmNlIG9mIHRoZSByZXNvdXJjZSAqLwotCi0gICAgTTRPU0FfVUludDggICAgICAgIG1fdWlUcmFja051bWJlcjsgICAgLyoqPCBUcmFjayBudW1iZXIgZm9yIHRoZSBtZWRpYSovCi0gICAgTTRPU0FfVUludDMyICAgIG1fdWlEdXJhdGlvbjsgICAgICAgIC8qKjwgVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAqLwotCi0gICAgTTRDT01NT05fTWV0YURhdGFBbGJ1bUFydCAgICBtX2FsYnVtQXJ0OyAgICAvKio8IEFsYnVtQXJ0IGRlc2NyaXB0aW9uICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgICAgICAgICAgICAgIG1fcE1vb2Q7ICAgIC8qKjwgTW9vZCBvZiB0aGUgbWVkaWEgKi8KLQotICAgIC8qKjwgTW9kaWZzIEFDTyA0LzEyLzA3IDogYWRkIEV4aWYgc3BlY2lmaWMgaW5mb3MgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wQ3JlYXRpb25EYXRlVGltZTsgICAgLyoqPCBkYXRlIGFuZCB0aW1lIG9yaWdpbmFsIGltYWdlIHdhcyBnZW5lcmF0ZWQgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTGFzdENoYW5nZURhdGVUaW1lOyAgICAvKio8IGZpbGUgY2hhbmdlIGRhdGUgYW5kIHRpbWUgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTWFudWZhY3R1cmVyOyAgICAgICAgLyoqPCBtYW51ZmFjdHVyZXIgb2YgaW1hZ2UgaW5wdXQgZXF1aXBtZW50ICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcE1vZGVsOyAgICAgICAgICAgICAgICAvKio8IG1vZGVsIG9mIGltYWdlIGlucHV0IGVxdWlwbWVudCAqLwotICAgIE00Q09NTU9OX1N0cmluZyAgICBtX3BTb2Z0d2FyZTsgICAgICAgICAgICAvKio8IHNvZnR3YXJlIHVzZWQgKi8KLSAgICBNNENPTU1PTl9PcmllbnRhdGlvbiBtX09yaWVudGF0aW9uOyAgICAgICAgLyoqPCBPcmllbnRhdGlvbiBvZiB0aGUgcGljdHVyZSAqLwotCi0gICAgLyoqPCBNb2RpZnMgRlMgMjkvMDgvMDggOiBhZGRpdGlvbm5hbCBFeGlmIGluZm9zICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fd2lkdGg7ICAgICAgICAgICAgLyoqPCBpbWFnZSB3aWR0aCBpbiBwaXhlbHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9oZWlnaHQ7ICAgICAgICAgICAgLyoqPCBpbWFnZSBoZWlnaHQgaW4gcGl4ZWxzICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fdGh1bWJuYWlsU2l6ZTsgICAgLyoqPCBzaXplIG9mIHRoZSB0aHVtYm5haWwgKi8KLSAgICBNNENPTU1PTl9TdHJpbmcgICAgbV9wTGF0aXR1ZGVSZWY7ICAgICAgICAvKio8IExhdGl0dWRlIHJlZmVyZW5jZSAqLwotICAgIE00Q09NTU9OX0xvY2F0aW9uIG1fbGF0aXR1ZGU7ICAgICAgICAvKio8IExhdGl0dWRlICovCi0gICAgTTRDT01NT05fU3RyaW5nICAgIG1fcExvbmdpdHVkZVJlZjsgICAgLyoqPCBMb25naXR1ZGUgcmVmZXJlbmNlICovCi0gICAgTTRDT01NT05fTG9jYXRpb24gbV9sb25naXR1ZGU7ICAgICAgICAvKio8IExvbmdpdHVkZSAgKi8KLQotfSBNNENPTU1PTl9NZXRhRGF0YUZpZWxkczsKLQotCi0jZW5kaWYgLypNNENPTU1PTl9UWVBFU19IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTREQV9UeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTREQV9UeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OGNhYjdlLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REFfVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTREQV9UeXBlcy5oCi0gKiBAYnJpZWYgICAgRGF0YSBhY2Nlc3MgdHlwZSBkZWZpbml0aW9uCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBtZWRpYSBzcGVjaWZpYyB0eXBlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBfX000REFfVFlQRVNfSF9fCi0jZGVmaW5lIF9fTTREQV9UWVBFU19IX18KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLypfX2NwbHVzcGx1cyovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bWVyYXRpb24gICAgTTRfU3RyZWFtVHlwZQotICogQGJyaWVmICAgICAgICBUeXBlIHVzZWQgdG8gZGVzY3JpYmUgYSBzdHJlYW0gKGF1ZGlvIG9yIHZpZGVvIGRhdGEgZmxvdykuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTREQV9TdHJlYW1UeXBlVW5rbm93biAgICAgICAgICAgICAgICA9IC0xLCAgICAvKio8IFVua25vdyB0eXBlICovCi0gICAgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNCAgICAgICAgICAgID0gMCwgICAgLyoqPCBNUEVHLTQgdmlkZW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjMgICAgICAgICAgICA9IDEsICAgIC8qKjwgSDI2MyB2aWRlbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZCAgICA9IDIsICAgIC8qKjwgQW1yIG5hcnJvdyBiYW5kIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJXaWRlQmFuZCAgICAgICAgPSAzLCAgICAvKio8IEFtciB3aWRlIGJhbmQgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgQUFDIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9NcDMgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE1QMyBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZVZpZGVvTUpwZWcgICAgICAgICAgICA9IDYsICAgIC8qKjwgTUpQRUcgdmlkZW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb1BjbSAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgV2F2IGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9NaWRpICAgICAgICAgICAgPSA4LCAgICAvKio8IE1pZGkgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjICAgICAgICA9IDksICAgIC8qKjwgTVBFRy00IEFWQyB2aWRlbyAoaDI2NCkgKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0FhY0FEVFMgICAgICAgICAgICA9IDEwLCAgICAvKio8IEFBQyBBRFRTIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWNBRElGICAgICAgICAgICAgPSAxMSwgICAgLyoqPCBBQUMgQURJRiBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvV21hICAgICAgICAgICAgICAgID0gMTIsICAgIC8qKjwgV01BIGF1ZGlvICovCi0gICAgTTREQV9TdHJlYW1UeXBlVmlkZW9XbXYgICAgICAgICAgICAgICAgPSAxMywgICAgLyoqPCBXTVYgdmlkZW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb1JlYWwgICAgICAgICAgICA9IDE0LCAgIC8qKjwgUkVBTCBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZVZpZGVvUmVhbCAgICAgICAgICAgID0gMTUsICAgLyoqPCBSRUFMIHZpZGVvICovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjICAgICAgICAgICAgPSAxNiwgICAvKio8IEV2cmMgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVUaW1lZFRleHQgICAgICAgICAgICA9IDIwLCAgICAvKio8IFRpbWVkIFRleHQgKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0JiYSAgICAgICAgICAgICAgICA9IDIxLCAgICAvKio8IEJlYXQgQnJldyBhdWRpbyBmb21hdCAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvU21hZiAgICAgICAgICAgID0gMjIsICAgIC8qKjwgU01BRiBhdWRpbyAqLwotICAgIE00REFfU3RyZWFtVHlwZUF1ZGlvSW1lbG9keSAgICAgICAgICAgID0gMjMsICAgIC8qKjwgSU1FTE9EWSBhdWRpbyovCi0gICAgTTREQV9TdHJlYW1UeXBlQXVkaW9YbWYgICAgICAgICAgICAgICAgPSAyNCwgICAgLyoqPCBYTUYgYXVkaW8gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0JwYyAgICAgICAgICAgICAgICA9IDI1LCAgICAvKio8IEJQQyBhdWRpbyAqLwotCi0gICAgLyogQURQQ00gKi8KLSAgICBNNERBX1N0cmVhbVR5cGVBdWRpb0FEUGNtICAgICAgICAgICAgPSAyNiwgICAgLyoqPCBBRFBDTSAqLwotCi0gICAgTTREQV9TdHJlYW1UeXBlVmlkZW9BUkdCODg4OCAgICAgICAgPSAyNwotfSBNNF9TdHJlYW1UeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9TdHJlYW1IYW5kbGVyCi0gKiBAYnJpZWYgICAgICAgIEJhc2Ugc3RydWN0dXJlIHRvIGRlc2NyaWJlIGEgc3RyZWFtLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRfU3RyZWFtVHlwZSAgICBtX3N0cmVhbVR5cGU7ICAgICAgICAgICAgICAgIC8qKjwgU3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9zdHJlYW1JZDsgICAgICAgICAgICAgICAgICAgIC8qKjwgU3RyZWFtIElkICh1bmlxdWUgbnVtYmVyIGRlZmlubmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RyZWFtKSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICBtX2R1cmF0aW9uOyAgICAgICAgICAgICAgICAgICAgLyoqPCBEdXJhdGlvbiBvZiB0aGUgc3RyZWFtIGluIG1pbGxpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fYXZlcmFnZUJpdFJhdGU7ICAgICAgICAgICAgLyoqPCBBdmVyYWdlIGJpdHJhdGUgaW4ga2IvcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX21heEFVU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIHNpemUgb2YgYW4gQWNjZXNzIFVuaXQgKi8KLSAgICBNNE9TQV9VSW50OCogICAgbV9wRGVjb2RlclNwZWNpZmljSW5mbzsgICAgICAgIC8qKjwgUG9pbnRlciBvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbiByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBjcmVhdGUgYSBkZWNvZGVyICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3BlY2lmaWMgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgYWJvdmUgKi8KLSAgICB2b2lkKiAgICAgICAgICAgIG1fcFVzZXJEYXRhOyAgICAgICAgICAgICAgICAvKio8IFBvaW50ZXIgb24gVXNlciBEYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluaXRpYWxpemVkIGJ5IHRoZSB1c2VyKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtX3N0cnVjdFNpemU7ICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgTTRPU0FfQm9vbCAgICAgIG1fYlN0cmVhbUlzT0s7ICAgICAgICAgICAgICAvKio8IEZsYWcgdG8ga25vdyBpZiBzdHJlYW0gaGFzIG5vIGVycm9ycyBhZnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzaW5nIGlzIGZpbmlzaGVkICovCi0gICAgTTRPU0FfVUludDgqICAgIG1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvOyAgICAgICAgLyoqPCBQb2ludGVyIG9uIHNwZWNpZmljIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCB0byBjcmVhdGUgYSBkZWNvZGVyICovCi0gICAgTTRPU0FfVUludDMyICAgIG1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplOyAgICAvKio8IFNpemUgb2YgdGhlIHNwZWNpZmljCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBwb2ludGVyIGFib3ZlICovCi0gICAgLy8gTVBFRzQgJiBBQUMgZGVjb2RlcnMgcmVxdWlyZSBFU0RTIGluZm8KLSAgICBNNE9TQV9VSW50OCogICAgbV9wRVNEU0luZm87ICAgICAgICAgICAgICAgIC8qKjwgUG9pbnRlciBvbiBNUEVHNCBvciBBQUMgRVNEUyBib3ggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9FU0RTSW5mb1NpemU7ICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgTVBFRzQgb3IgQUFDIEVTRFMgYm94ICovCi19IE00X1N0cmVhbUhhbmRsZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X1ZpZGVvU3RyZWFtSGFuZGxlcgotICogQGJyaWVmICAgICAgICBFeHRlbmRlZCBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSB2aWRlbyBzdHJlYW0uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNF9TdHJlYW1IYW5kbGVyICAgIG1fYmFzaWNQcm9wZXJ0aWVzOyAgICAgICAgLyoqPCBBdWRpby1WaWRlbyBzdHJlYW0gY29tbW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdmlkZW9XaWR0aDsgICAgICAgICAgICAvKio8IFdpZHRoIG9mIHRoZSB2aWRlbyBpbiB0aGUgc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3ZpZGVvSGVpZ2h0OyAgICAgICAgICAgIC8qKjwgSGVpZ2h0IG9mIHRoZSB2aWRlbyBpbiB0aGUgc3RyZWFtICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICBtX2F2ZXJhZ2VGcmFtZVJhdGU7ICAgICAgICAvKio8IEF2ZXJhZ2UgZnJhbWUgcmF0ZSBvZiB0aGUgdmlkZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgIHZpZGVvUm90YXRpb25EZWdyZWVzOyAgICAgICAgLyoqPCBWaWRlbyByb3RhdGlvbiBkZWdyZWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fc3RydWN0U2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotfSBNNF9WaWRlb1N0cmVhbUhhbmRsZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlcgotICogQGJyaWVmICAgICAgICBFeHRlbmRlZCBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYW4gYXVkaW8gc3RyZWFtLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAgICBtX2Jhc2ljUHJvcGVydGllczsgICAgICAgIC8qKjwgQXVkaW8tVmlkZW8gc3RyZWFtIGNvbW1vbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX25iQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGF1ZGlvIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMS1tb25vLCAyLXN0ZXJlbykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fYnl0ZUZyYW1lTGVuZ3RoOyAgICAgICAgLyoqPCBTaXplIG9mIGZyYW1lIHNhbXBsZXMgaW4gYnl0ZXMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fYnl0ZVNhbXBsZVNpemU7ICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3NhbXBsaW5nRnJlcXVlbmN5OyAgICAvKio8IFNhbXBsZSBmcmVxdWVuY3kgaW4ga0h6ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3N0cnVjdFNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLX0gTTRfQXVkaW9TdHJlYW1IYW5kbGVyOwotCi0jaWZkZWYgTTRWUFNfU1VQUE9SVF9UVEVYVAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9UZXh0U3RyZWFtSGFuZGxlcgotICogQGJyaWVmICAgICAgICBFeHRlbmRlZCBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSB0ZXh0IHN0cmVhbS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00X1N0cmVhbUhhbmRsZXIgICAgbV9iYXNpY1Byb3BlcnRpZXM7ICAgIC8qKjwgQXVkaW8tVmlkZW8gc3RyZWFtIGNvbW1vbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3RyYWNrV2lkdGg7ICAgICAgICAvKio8IFdpZHRoIG9mIHRoZSB2aWRlbyBpbiB0aGUgc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICBtX3RyYWNrSGVpZ2h0OyAgICAgICAgLyoqPCBIZWlnaHQgb2YgdGhlIHZpZGVvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdHJhY2tYcG9zOyAgICAgICAgLyoqPCBYIHBvc2l0aW9uIG9mIHRoZSB0ZXh0IHRyYWNrIGluIHZpZGVvIGFyZWEgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgIG1fdHJhY2tZcG9zOyAgICAgICAgLyoqPCBZIHBvc2l0aW9uIG9mIHRoZSB0ZXh0IHRyYWNrIGluIHZpZGVvIGFyZWEgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgIGJhY2tfY29sX3JnYmFbNF07ICAgIC8qKjwgdGhlIGJhY2tncm91bmQgY29sb3IgaW4gUkdCQSAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgdWlMZW5naHQ7ICAgICAgICAgICAgLyoqPCB0aGUgc3RyaW5nIGxlbmdodCBpbiBieXRlcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgZGlzcF9mbGFnOyAgICAgICAgICAgIC8qKjwgdGhlIHdheSB0ZXh0IHdpbGwgYmUgZGlzcGxheWVkICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICBob3Jpel9qdXN0aWY7ICAgICAgICAvKio8IHRoZSBob3Jpem9udGFsIGp1c3RpZmljYXRpb24gb2YgdGhlIHRleHQgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgIHZlcnRpX2p1c3RpZjsgICAgICAgIC8qKjwgdGhlIHZlcnRpY2FsIGp1c3RpZmljYXRpb24gb2YgdGhlIHRleHQgKi8KLSAgICAvKiBzdHlsZSAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgc3R5bF9zdGFydF9jaGFyOyAgICAvKio8IHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW1wYWN0ZWQgYnkgc3R5bGUgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgIHN0eWxfZW5kX2NoYXI7ICAgICAgICAvKio8IHRoZSBsYXN0IGNoYXJhY3RlciBpbXBhY3RlZCBieSBzdHlsZSAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgZm9udElEOyAgICAgICAgICAgICAgICAvKio8IElEIG9mIHRoZSBmb250ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICBmYWNlX3N0eWxlOyAgICAgICAgICAgIC8qKjwgdGhlIHRleHQgZmFjZS1zdHlsZTogYm9sZCwgaXRhbGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lZCwgcGxhaW4oZGVmYXVsdCkgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgIGZvbnRfc2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgaW4gcGl4ZWwgb2YgZm9udCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgdGV4dF9jb2xfcmdiYVs0XTsgICAgLyoqPCB0aGUgdGV4dCBjb2xvciBpbiBSR0JBICovCi0gICAgLyogYm94ICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBib3hfdG9wOyAgICAgICAgIC8qKjwgdGhlIHRvcCBwb3NpdGlvbiBvZiB0ZXh0IGJveCBpbiB0aGUgdHJhY2sgYXJlYSAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgYm94X2xlZnQ7ICAgICAgICAvKio8IHRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRleHQgYm94IGluIHRoZSB0cmFjayBhcmVhICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICBib3hfYm90dG9tOyAgICAgIC8qKjwgdGhlIGJvdHRvbSBwb3NpdGlvbiBvZiB0ZXh0IGJveCBpbiB0aGUgdHJhY2sgYXJlYSAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgYm94X3JpZ2h0OyAgICAgICAvKio8IHRoZSByaWdodCBwb3NpdGlvbiBvZiB0ZXh0IGJveCBpbiB0aGUgdHJhY2sgYXJlYSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV9zdHJ1Y3RTaXplOyAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwotfSBNNF9UZXh0U3RyZWFtSGFuZGxlcjsKLQotI2VuZGlmIC8qTTRWUFNfU1VQUE9SVF9UVEVYVCovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X0FjY2Vzc1VuaXQKLSAqIEBicmllZiAgICAgICAgU3RydWN0dXJlIHRvIGRlc2NyaWJlIGFuIGFjY2VzcyB1bml0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fc3RyZWFtSUQ7ICAgICAgIC8qKjwgSWQgb2YgdGhlIHN0cmVhbSB0byBnZXQgYW4gQVUgZnJvbSAqLwotICBNNE9TQV9NZW1BZGRyOCAgICAgICAgbV9kYXRhQWRkcmVzczsgICAgICAvKio8IFBvaW50ZXIgdG8gYSBtZW1vcnkgYXJlYSB3aXRoIHRoZSBlbmNvZGVkIGRhdGEgKi8KLSAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9zaXplOyAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBkYXRhQWRyZXNzIGFyZWEgKi8KLSAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbV9DVFM7ICAgICAgICAgICAgLyoqPCBDb21wb3NpdGlvbiBUaW1lIFN0YW1wIGZvciB0aGUgQWNjZXNzIFVuaXQgKi8KLSAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbV9EVFMgOyAgICAgICAgICAgLyoqPCBEZWNvZGVkIFRpbWUgU3RhbXAgZm9yIHRoZSBBY2Nlc3MgVW5pdCAqLwotICBNNE9TQV9VSW50OCAgICAgICAgICAgIG1fYXR0cmlidXRlOyAgICAgICAvKio8IFJBUCBpbmZvcm1hdGlvbiAmIEFVIGNvcnJ1cHRlZCAqLwotICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX21heHNpemU7ICAgICAgICAvKio8IE1heGltdW0gc2l6ZSBvZiB0aGUgQVUgKi8KLSAgTTRPU0FfVUludDMyICAgICAgICAgICAgbV9zdHJ1Y3RTaXplOyAgICAgLyoqPCBTdHJ1Y3R1cmUgc2l6ZSAqLwotfSBNNF9BY2Nlc3NVbml0OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKl9fY3BsdXNwbHVzKi8KLQotI2VuZGlmIC8qIF9fTTREQV9UWVBFU19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRERUNPREVSX0NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRERUNPREVSX0NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5M2UzMDYyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000REVDT0RFUl9Db21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNERFQ09ERVJfQ29tbW9uLmgKLSAqIEBicmllZiAgU2hlbGwgRGVjb2RlciBjb21tb24gaW50ZXJmYWNlIGRlY2xhcmF0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgY29tbW9uIGludGVyZmFjZXMgdGhhdCBkZWNvZGVyIHNoZWxscyBtdXN0IGltcGxlbWVudAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRERUNPREVSX0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNERFQ09ERVJfQ09NTU9OX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX09wdGlvbklELmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIKLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotCi0jaW5jbHVkZSAiTTRfVXRpbHMuaCIKLQotLyogLS0tLS0gRXJyb3JzIGFuZCBXYXJuaW5ncyAtLS0tLSAqLwotCi0vKioKLSAqIFdhcm5pbmc6IHRoZXJlIGlzIG5vIG5ldyBkZWNvZGVkIGZyYW1lIHRvIHJlbmRlciBzaW5jZSB0aGUgbGFzdCByZW5kZXJpbmcKLSAqLwotI2RlZmluZSBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRERUNPREVSX0NPTU1PTiwgMHgwMDAxKQotLyoqCi0gKiBXYXJuaW5nOiB0aGUgZGVibG9ja2luZyBmaWx0ZXIgaXMgbm90IGltcGxlbWVudGVkCi0gKi8KLSNkZWZpbmUgTTRXQVJfREVCTE9DS0lOR19GSUxURVJfTk9UX0lNUExFTUVOVEVEIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNERFQ09ERVJfQ09NTU9OLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyKQotCi0KLS8qIEVycm9yOiBTdHJlYW0gSDI2MyBwcm9maWxlcyAob3RoZXIgdGhhbiAgMCkgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgTTRFUlJfREVDT0RFUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX01QRUc0LCAweDAwMDEpCi0vKiBFcnJvcjogU3RyZWFtIEgyNjMgbm90IGJhc2VsaW5lIG5vdCBzdXBwb3J0ZWQgKFN1cHBvcnRlZCBzaXplcyBhcmUgQ0lGLCBRQ0lGIG9yIFNRQ0lGKSAqLwotI2RlZmluZSBNNEVSUl9ERUNPREVSX0gyNjNfTk9UX0JBU0VMSU5FICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfTVBFRzQsIDB4MDAwMikKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNERFQ09ERVJfQVZDUHJvZmlsZUxldmVsCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIEFWQyBkZWNvZGVyIHByb2ZpbGUgYW5kIGxldmVsIGZvciB0aGUgY3VycmVudCBpbnN0YW5jZQotICogQG5vdGUgICAgVGhpcyBvcHRpb25zIGNhbiBiZSByZWFkIGZyb20gZGVjb2RlciB2aWEgTTRERUNPREVSX2dldE9wdGlvbl9mY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMSA9IDAsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzFiLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8xXzEsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzFfMiwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMV8zLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8yLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8yXzEsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzJfMiwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfMywKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfM18xLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF8zXzIsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzQsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV8wX0xldmVsXzRfMSwKLSAgICBNNERFQ09ERVJfQVZDX2tQcm9maWxlXzBfTGV2ZWxfNF8yLAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF81LAotICAgIE00REVDT0RFUl9BVkNfa1Byb2ZpbGVfMF9MZXZlbF81XzEsCi0gICAgTTRERUNPREVSX0FWQ19rUHJvZmlsZV9hbmRfTGV2ZWxfT3V0X09mX1JhbmdlID0gMjU1Ci19IE00REVDT0RFUl9BVkNQcm9maWxlTGV2ZWw7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRERUNPREVSX09wdGlvbklECi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGRlY29kZXIgb3B0aW9ucwotICogQG5vdGUgICAgVGhlc2Ugb3B0aW9ucyBjYW4gYmUgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gYSBkZWNvZGVyIHZpYSBNNERFQ09ERVJfZ2V0T3B0aW9uX2ZjdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qKgotICAgIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgY29yZSBkZWNvZGVyCi0gICAgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX1ZlcnNpb24gICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDAxKSwKLSAgICAvKioKLSAgICBHZXQgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnRseSBkZWNvZGVkIHZpZGVvCi0gICAgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX1ZpZGVvU2l6ZSAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwMiksCi0gICAgLyoqCi0gICAgU2V0IHRoZSBjb252ZXJzaW9uIGZpbHRlciB0byB1c2UgYXQgcmVuZGVyaW5nCi0gICAgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX091dHB1dEZpbHRlciA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwMyksCi0gICAgLyoqCi0gICAgQWN0aXZhdGUgdGhlIERlYmxvY2tpbmcgZmlsdGVyCi0gICAgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX0RlYmxvY2tpbmdGaWx0ZXIgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDQpLAotICAgIC8qKgotICAgIEdldCBuZXggcmVuZGVyZWQgZnJhbWUgQ1RTCi0gICAgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX05leHRSZW5kZXJlZEZyYW1lQ1RTID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1KSwKLQotICAgIC8qKgotICAgIFNldCB0aGUgWVVWIGRhdGEgdG8gdGhlIGR1bW15IHZpZGVvIGRlY29kZXIKLSAgICAqLwotICAgIE00REVDT0RFUl9rT3B0aW9uSURfRGVjWXV2RGF0YSA9Ci0gICAgICAgIE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRERUNPREVSX0NPTU1PTiwgMHgwNiksCi0gICAgLyoqCi0gICAgU2V0IHRoZSBZVVYgZGF0YSB3aXRoIGNvbG9yIGVmZmVjdCBhcHBsaWVkIHRvIHRoZSBkdW1teSB2aWRlbyBkZWNvZGVyCi0gICAgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3ROb25Db250aWd1b3VzID0KLSAgICAgICAgTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDA3KSwKLQotICAgIE00REVDT0RFUl9rT3B0aW9uSURfWXV2V2l0aEVmZmVjdENvbnRpZ3VvdXMgPQotICAgICAgICBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MDgpLAotCi0gICAgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0ID0KLSAgICAgICAgTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNERFQ09ERVJfQ09NTU9OLCAweDA5KSwKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3VwcG9ydGVkIHZpZGVvIGRlY29kZXJzIGFuZCBjYXBhYmlsaXRpZXMgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX1ZpZGVvRGVjb2RlcnNBbmRDYXBhYmlsaXRpZXMgPQotICAgICAgICBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9DT01NT04sIDB4MTApLAotCi0gICAgLyogY29tbW9uIHRvIE1QRUc0IGRlY29kZXJzICovCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBEZWNvZGVyQ29uZmlnSW5mbyAqLwotICAgIE00REVDT0RFUl9NUEVHNF9rT3B0aW9uSURfRGVjb2RlckNvbmZpZ0luZm8gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX01QRUc0LCAweDAxKSwKLQotICAgIC8qIGxhc3QgZGVjb2RlZCBjdHMgKi8KLSAgICBNNERFQ09ERVJfa09wdGlvbklEX0FWQ0xhc3REZWNvZGVkRnJhbWVDVFMgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00REVDT0RFUl9BVkMsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxKQotLyogTGFzdCBkZWNvZGVkIGN0cyAqLwotCi19IE00REVDT0RFUl9PcHRpb25JRDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8KLSAqIEBicmllZiAgICBDb250YWlucyBpbmZvIHJlYWQgZnJvbSB0aGUgTVBFRy00IFZpZGVvT2JqZWN0TGF5ZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgdWlQcm9maWxlOyAgICAgICAgICAgICAgICAvKio8IHByb2ZpbGUgYW5kIGxldmVsIGFzIGRlZmluZWQgaW4gdGhlIFZpc3VhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IFNlcXVlbmNlIGhlYWRlciwgaWYgcHJlc2VudCAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aVRpbWVTY2FsZTsgICAgICAgICAgICAvKio8IHRpbWUgc2NhbGUgYXMgcGFyc2VkIGluIFZPTCBoZWFkZXIgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgdWlVc2VPZlJlc3luY2hNYXJrZXI7ICAgIC8qKjwgVXNhZ2Ugb2YgcmVzeW5jaHJvbml6YXRpb24gbWFya2VyICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgYkRhdGFQYXJ0aXRpb247ICAgICAgICAgICAgLyoqPCBJZiAxIGRhdGEgcGFydGl0aW9uaW5nIGlzIHVzZWQuICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgYlVzZU9mUlZMQzsgICAgICAgICAgICAgICAgLyoqPCBVc2FnZSBvZiBSVkxDIGZvciB0aGUgc3RyZWFtICovCi0KLX0gTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRERUNPREVSX1ZpZGVvU2l6ZQotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSB2aWRlbyBzaXplICh3aWR0aCBhbmQgaGVpZ2h0KQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmV0cmlldmUgdmlhIHRoZSBNNERFQ09ERVJfZ2V0T3B0aW9uX2ZjdAotICogICAgICAgICAgICAgICAgZnVuY3Rpb24gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZGVjb2RlZCB2aWRlbwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNERFQ09ERVJfVmlkZW9TaXplCi17Ci0gICAgTTRPU0FfVUludDMyICAgbV91aVdpZHRoOyAgICAvKio8IHZpZGVvIHdpZHRoICBpbiBwaXhlbHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICBtX3VpSGVpZ2h0OyAgICAvKio8IHZpZGVvIGhlaWdodCBpbiBwaXhlbHMgKi8KLQotfSBNNERFQ09ERVJfVmlkZW9TaXplOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNERFQ09ERVJfT3V0cHV0RmlsdGVyCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnZlcnNpb24gZmlsdGVyCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICBwb2ludGVyIGFuZCBpdHMgdXNlciBkYXRhIHZpYSB0aGUgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgIE00REVDT0RFUl9nZXRPcHRpb25fZmN0ICAgIHdpdGggdGhlIG9wdGlvbgotICogICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRERUNPREVSX091dHB1dEZpbHRlcgotewotICAgIE00T1NBX1ZvaWQgICAqbV9wRmlsdGVyRnVuY3Rpb247ICAgIC8qKjwgcG9pbnRlciB0byB0aGUgZmlsdGVyIGZ1bmN0aW9uICovCi0gICAgTTRPU0FfVm9pZCAgICptX3BGaWx0ZXJVc2VyRGF0YTsgICAgLyoqPCB1c2VyIGRhdGEgb2YgdGhlIGZpbHRlciAgICAgICAgKi8KLQotfSBNNERFQ09ERVJfT3V0cHV0RmlsdGVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00REVDT0RFUl9WaWRlb1R5cGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgdmlkZW8gdHlwZXMgdXNlZCB0byBjcmVhdGUgZGVjb2RlcnMKLSAqIEBub3RlICAgIFRoaXMgZW51bSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFZQUyB0byBpZGVudGlmeSBhIGN1cnJlbnRseSBzdXBwb3J0ZWQKLSAqICAgICAgICAgICAgdmlkZW8gZGVjb2RlciBpbnRlcmZhY2UuIEVhY2ggZGVjb2RlciBpcyByZWdpc3RlcmVkIHdpdGggb25lIG9mIHRoaXMgdHlwZSBhc3NvY2lhdGVkLgotICogICAgICAgICAgICBXaGVuIGEgZGVjb2RlciBpbnN0YW5jZSBpcyBuZWVkZWQsIHRoaXMgdHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuZAotICogICAgICAgICAgICBhbmQgcmV0cmlldmUgaXRzIGludGVyZmFjZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNERFQ09ERVJfa1ZpZGVvVHlwZU1QRUc0ID0gMCwKLSAgICBNNERFQ09ERVJfa1ZpZGVvVHlwZU1KUEVHLAotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlQVZDLAotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlV01WLAotICAgIE00REVDT0RFUl9rVmlkZW9UeXBlUkVBTCwKLSAgICBNNERFQ09ERVJfa1ZpZGVvVHlwZVlVVjQyMFAsCi0KLSAgICBNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQiAgLyogbnVtYmVyIG9mIGRlY29kZXJzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSAqLwotCi19IE00REVDT0RFUl9WaWRlb1R5cGUgOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDMyIG1Qcm9maWxlOwotICAgIE00T1NBX1VJbnQzMiBtTGV2ZWw7Ci19IFZpZGVvUHJvZmlsZUxldmVsOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVmlkZW9Qcm9maWxlTGV2ZWwgKnByb2ZpbGVMZXZlbDsKLSAgICBNNE9TQV9VSW50MzIgcHJvZmlsZU51bWJlcjsKLX0gVmlkZW9Db21wb25lbnRDYXBhYmlsaXRpZXM7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNF9TdHJlYW1UeXBlIGNvZGVjOwotICAgIFZpZGVvQ29tcG9uZW50Q2FwYWJpbGl0aWVzICpjb21wb25lbnQ7Ci0gICAgTTRPU0FfVUludDMyIGNvbXBvbmVudE51bWJlcjsKLX0gVmlkZW9EZWNvZGVyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVmlkZW9EZWNvZGVyICpkZWNvZGVyOwotICAgIE00T1NBX1VJbnQzMiBkZWNvZGVyTnVtYmVyOwotfSBNNERFQ09ERVJfVmlkZW9EZWNvZGVyczsKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlY29kZXIKLSAqIEBub3RlICAgIGFsbG9jYXRlcyB0aGUgY29udGV4dAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChPVVQpICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogICAgKElOKSAgICBQb2ludGVyIHRvIGEgdmlkZW8gc3RyZWFtIGRlc2NyaXB0aW9uCi0gKiBAcGFyYW0gICAgcEdsb2JhbEludGVyZmFjZTogIChJTikgICAgUG9pbnRlciB0byB0aGUgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlIHN0cnVjdHVyZSB0aGF0IG11c3QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCBieSB0aGUgZGVjb2RlciB0byByZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtCi0gKiBAcGFyYW0gICAgcERhdGFJbnRlcmZhY2U6ICAgIChJTikgICAgUG9pbnRlciB0byB0aGUgTTRSRUFERVJfRGF0YUludGVyZmFjZSBzdHJ1Y3R1cmUgdGhhdCBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgYnkgdGhlIGRlY29kZXIgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHN0cmVhbQotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0ICAgICAgICAoSU4pICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHRoZSBkZWNvZGVkIGRhdGEgYXJlIHN0b3JlZAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRERUNPREVSX2NyZWF0ZV9mY3QpICAgIChNNE9TQV9Db250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqcERhdGFJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZGVzdHJveSB0aGUgaW5zdGFuY2Ugb2YgdGhlIGRlY29kZXIKLSAqIEBub3RlICAgIGFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBUaGUgY29udGV4dCBpcyBpbnZhbGlkIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRERUNPREVSX2Rlc3Ryb3lfZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZ2V0IGFuIG9wdGlvbiB2YWx1ZSBmcm9tIHRoZSBkZWNvZGVyCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNldC9nZXQgb3B0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gT1NBTCAzLjAKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHJldHJpZXZlIGEgcHJvcGVydHkgdmFsdWU6Ci0gKiAgICAgICAgICAtdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBkZWNvZGVyCi0gKiAgICAgICAgICAtdGhlIHNpemUgKHdpZHRoeGhlaWdodCkgb2YgdGhlIGltYWdlCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgKElOKSAgICAgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgKElOL09VVCkgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKSB3aGVyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiBpcyBzdG9yZWQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAoTTRERUNPREVSX2dldE9wdGlvbl9mY3QpKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgc2V0IGFuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgZGVjb2RlcgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqICAgICAgICAgIC10aGUgY29udmVyc2lvbiBmaWx0ZXIgdG8gdXNlIGF0IHJlbmRlcmluZwotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgIG9wdGlvbklkOiAgIChJTikgICAgICAgIElkZW50aWZpZXIgaW5kaWNhdGluZyB0aGUgb3B0aW9uIHRvIHNldAotICogQHBhcmFtICAgcFZhbHVlOiAgICAgKElOKSAgICAgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3B0aW9uIGlzIHN0b3JlZAotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9PUFRJT05fSUQgICAgIFRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBvcHRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgKE00REVDT0RFUl9zZXRPcHRpb25fZmN0KShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX09wdGlvbklEIG9wdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBEZWNvZGUgQWNjZXNzIFVuaXRzIHVwIHRvIGEgdGFyZ2V0IHRpbWUKLSAqIEBub3RlICAgIFBhcnNlIGFuZCBkZWNvZGUgdGhlIHN0cmVhbSB1bnRpbCBpdCBpcyBwb3NzaWJsZSB0byBvdXRwdXQgYSBkZWNvZGVkIGltYWdlIGZvciB3aGljaAotICogICAgICAgICAgICB0aGUgY29tcG9zaXRpb24gdGltZSBpcyBlcXVhbCBvciBncmVhdGVyIHRvIHRoZSBwYXNzZWQgdGFyZ2V0ZWQgdGltZQotICogICAgICAgICAgVGhlIGRhdGEgYXJlIHJlYWQgZnJvbSB0aGUgcmVhZGVyIGRhdGEgaW50ZXJmYWNlCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwVGltZTogICAgICAgIChJTi9PVVQpICAgIElOOiBUaW1lIHRvIGRlY29kZSB1cCB0byAoaW4gbWlsbGkgc2Vjb25kZXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDpUaW1lIG9mIHRoZSBsYXN0IGRlY29kZWQgZnJhbWUgKGluIG1zKQotICogQHBhcmFtICAgYkp1bXA6ICAgICAgKElOKSAgICAgICAgMCBpZiBubyBqdW1wIG9jY3VyZWQganVzdCBiZWZvcmUgdGhpcyBjYWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIGlmIGEgYSBqdW1wIGhhcyBqdXN0IGJlZW4gbWFkZQotICogQHBhcmFtICAgdG9sZXJhbmNlOiAgICAgIChJTikgICAgICAgIFdlIG1heSBkZWNvZGUgYW4gZWFybGllciBmcmFtZSB3aXRoaW4gdGhlIHRvbGVyYW5jZS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdGltZSBkaWZmZXJlbmNlIGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRXQVJfTk9fTU9SRV9BVSAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBhY2Nlc3MgdW5pdCB0byBkZWNvZGUgKGVuZCBvZiBzdHJlYW0pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNERFQ09ERVJfZGVjb2RlX2ZjdCkgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfTWVkaWFUaW1lKiBwVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJKdW1wLCBNNE9TQV9VSW50MzIgdG9sZXJhbmNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgUmVuZGVycyB0aGUgdmlkZW8gYXQgdGhlIHNwZWNpZmllZCB0aW1lLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2RlcgotICogQHBhcmFtICAgcFRpbWU6ICAgICAgIChJTi9PVVQpICAgSU46IFRpbWUgdG8gcmVuZGVyIHRvIChpbiBtaWxsaSBzZWNvbmRlcykKLSAqICAgICAgICAgICAgICAgIE9VVDpUaW1lIG9mIHRoZSBhY3R1YWxseSByZW5kZXJlZCBmcmFtZSAoaW4gbXMpCi0gKiBAcGFyYW0gICAgcE91dHB1dFBsYW5lOihPVVQpICAgICAgICBPdXRwdXQgcGxhbmUgZmlsbGVkIHdpdGggZGVjb2RlZCBkYXRhIChjb252ZXJ0ZWQpCi0gKiBAcGFyYW0gICBiRm9yY2VSZW5kZXI6KElOKSAgICAgICAxIGlmIHRoZSBpbWFnZSBtdXN0IGJlIHJlbmRlcmVkIGV2ZW4gaXQgaGFzIGFscmVhZHkgYmVlbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBpZiBub3QgKGluIHdoaWNoIGNhc2UgdGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gICAgTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgICAgSWYgdGhlIGZyYW1lIHRvIHJlbmRlciBoYXMgYWxyZWFkeSBiZWVuIHJlbmRlcmVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgIChNNERFQ09ERVJfcmVuZGVyX2ZjdCkgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRfTWVkaWFUaW1lKiBwVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcE91dHB1dFBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkZvcmNlUmVuZGVyKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGdlbmVyaWMgdmlkZW8gZGVjb2RlciBpbnRlcmZhY2UKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBvZiBvbmUgdmlkZW8gZGVjb2RlciB0eXBlLgotICogICAgICAgICAgICAgICAgVGhlIGRlY29kZXIgdHlwZSBpcyBvbmUgb2YgdGhlIE00REVDT0RFUl9WaWRlb1R5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlCi17Ci0gICAgTTRERUNPREVSX2NyZWF0ZV9mY3QqICAgICAgICBtX3BGY3RDcmVhdGU7Ci0gICAgTTRERUNPREVSX2Rlc3Ryb3lfZmN0KiAgICAgICAgbV9wRmN0RGVzdHJveTsKLSAgICBNNERFQ09ERVJfZ2V0T3B0aW9uX2ZjdCogICAgbV9wRmN0R2V0T3B0aW9uOwotICAgIE00REVDT0RFUl9zZXRPcHRpb25fZmN0KiAgICBtX3BGY3RTZXRPcHRpb247Ci0gICAgTTRERUNPREVSX2RlY29kZV9mY3QqICAgICAgICBtX3BGY3REZWNvZGU7Ci0gICAgTTRERUNPREVSX3JlbmRlcl9mY3QqICAgICAgICBtX3BGY3RSZW5kZXI7Ci19IE00REVDT0RFUl9WaWRlb0ludGVyZmFjZTsKLQotI2VuZGlmIC8qX19NNERFQ09ERVJfQ09NTU9OX0hfXyovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERFQ09ERVJfTnVsbC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRERUNPREVSX051bGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3ZDg1Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNERFQ09ERVJfTnVsbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VkRfTnVsbC5oCi0gKiBAYnJpZWYgICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYSAibnVsbCIgdmlkZW8gZGVjb2RlcixpLmUuIGEgZGVjb2RlcgotICogICAgICAgICAgdGhhdCBkb2VzIG5vdCBkbyBhY3R1YWwgZGVjb2RpbmcuCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZ2V0SW50ZXJmYWNlIGZ1bmN0aW9uLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNERFQ09ERVJfTlVMTF9IX18KLSNkZWZpbmUgX19NNERFQ09ERVJfTlVMTF9IX18KLQotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmIFJldHJpZXZlcyB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gcERlY29kZXJUeXBlICAgICAgICA6IFBvaW50ZXIgdG8gYSBNNERFQ09ERVJfVmlkZW9UeXBlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgZGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gcERlY29kZXJJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGRlY29kZXIuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gYW5kIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLSAqCi0gKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgIGlmIE9LCi0gKiAgICAgICAgICAgIE00RVJSX0FMTE9DIGlmIGFsbG9jYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX2dldEludGVyZmFjZSggTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICoqcERlY29kZXJJbnRlcmZhY2UpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000REVDT0RFUl9OVUxMX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000RU5DT0RFUl9BdWRpb0NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiYTAyYTAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00RU5DT0RFUl9BdWRpb0NvbW1vbi5oCi0gKiBAYnJpZWYgICAgVkVTIGF1ZGlvIGVuY29kZXJzIHNoZWxsIGludGVyZmFjZS4KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB0eXBlcyBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIFZFUyB0byBhYnN0cmFjdCBhdWRpbyBlbmNvZGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNEVOQ09ERVJfQVVESU9DT01NT05fSF9fCi0jZGVmaW5lIF9fTTRFTkNPREVSX0FVRElPQ09NTU9OX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlICJNNE9TQV9PcHRpb25JRC5oIiAgICAgLyogZm9yIE00T1NBX09QVElPTl9JRF9DUkVBVEUoKSAqLwotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0jZGVmaW5lIE00RU5DT0RFUl9BVURJT19OQl9DSEFOTkVMU19NQVggMgotLyogV0FSTklORzogdGhpcyB2YWx1ZSBtdXN0IGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBncmFiYmVkICovCi0vLyNkZWZpbmUgTTRFTkNPREVSX0FVRElPX1BDTV9TQU1QTEVfTlVNQkVSIDk2MCAgICAvKiBpbXBvc2VkIGJ5IHRoZSBBQUMgZW5jb2Rlci4gKi8KLSNkZWZpbmUgTTRFTkNPREVSX0FVRElPX1BDTV9TQU1QTEVfTlVNQkVSIDEwMjQgICAgLyogaW1wb3NlZCBieSB0aGUgQUFDIGVuY29kZXIuICovCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtZXJhdGlvbiAgICBNNEVOQ09ERVJfQXVkaW9fT3B0aW9uSUQKLSAqIEBicmllZiAgICAgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGNvcmUgQUFDIHNoZWxsIGVuY29kZXIgb3B0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotIC8qIE1heGltdW0gZ2VuZXJhdGVkIEFVIHNpemUgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9fbWF4QVVzaXplICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxNNEVOQ09ERVJfQVVESU8sIDB4MDEpCi0KLX0gTTRFTkNPREVSX0F1ZGlvX09wdGlvbklEOwotCi0KLSAvKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9TYW1wbGluZ0ZyZXF1ZW5jeQotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSBhdWRpbyBzYW1wbGluZyBmcmVxdWVuY3kuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2s4MDAwSHogPSA4MDAwLAotICAgIE00RU5DT0RFUl9rMTEwMjVIeiA9IDExMDI1LAotICAgIE00RU5DT0RFUl9rMTIwMDBIeiA9IDEyMDAwLAotICAgIE00RU5DT0RFUl9rMTYwMDBIeiA9IDE2MDAwLAotICAgIE00RU5DT0RFUl9rMjIwNTBIeiA9IDIyMDUwLAotICAgIE00RU5DT0RFUl9rMjQwMDBIeiA9IDI0MDAwLAotICAgIE00RU5DT0RFUl9rMzIwMDBIeiA9IDMyMDAwLAotICAgIE00RU5DT0RFUl9rNDQxMDBIeiA9IDQ0MTAwLAotICAgIE00RU5DT0RFUl9rNDgwMDBIeiA9IDQ4MDAwCi19IE00RU5DT0RFUl9TYW1wbGluZ0ZyZXF1ZW5jeTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdWRpbyBjb21wcmVzc2lvbiBmb3JtYXRzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rQU1STkIgPSAwLAotICAgIE00RU5DT0RFUl9rQUFDLAotICAgIE00RU5DT0RFUl9rQXVkaW9OVUxMLCAgICAvKio8IE5vIGNvbXByZXNzaW9uICovCi0gICAgTTRFTkNPREVSX2tNUDMsCi0gICAgTTRFTkNPREVSX2tBdWRpb19OQiAgICAgICAgLyogbnVtYmVyIG9mIGVuY29kZXJzLCBrZWVwIGl0IGFzIGxhc3QgZW51bSBlbnRyeSAqLwotCi19IE00RU5DT0RFUl9BdWRpb0Zvcm1hdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfQ2hhbm5lbE51bWJlcgotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tNb25vICA9IDAsCi0gICAgTTRFTkNPREVSX2tTdGVyZW8sCi0gICAgTTRFTkNPREVSX2tTdGVyZW9Ob0ludGVybGVhdmUKLX0gTTRFTkNPREVSX0NoYW5uZWxOdW1iZXI7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0F1ZGlvQml0cmF0ZQotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgYml0cmF0ZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tBdWRpb180Xzc1X0tCUFMgICAgPSA0NzUwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fNV8xNV9LQlBTICAgID0gNTE1MCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzVfOV9LQlBTICAgID0gNTkwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzZfN19LQlBTICAgID0gNjcwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzdfNF9LQlBTICAgID0gNzQwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzdfOTVfS0JQUyAgICA9IDc5NTAsCi0gICAgTTRFTkNPREVSX2tBdWRpb184X0tCUFMgICAgICAgID0gODAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzEwXzJfS0JQUyAgICA9IDEwMjAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTJfMl9LQlBTICAgID0gMTIyMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xNl9LQlBTICAgID0gMTYwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18yNF9LQlBTICAgID0gMjQwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18zMl9LQlBTICAgID0gMzIwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb180MF9LQlBTICAgID0gNDAwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb180OF9LQlBTICAgID0gNDgwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb181Nl9LQlBTICAgID0gNTYwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb182NF9LQlBTICAgID0gNjQwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb184MF9LQlBTICAgID0gODAwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb185Nl9LQlBTICAgID0gOTYwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xMTJfS0JQUyAgICA9IDExMjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzEyOF9LQlBTICAgID0gMTI4MDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMTQ0X0tCUFMgICAgPSAxNDQwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18xNjBfS0JQUyAgICA9IDE2MDAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzE5Ml9LQlBTICAgID0gMTkyMDAwLAotICAgIE00RU5DT0RFUl9rQXVkaW9fMjI0X0tCUFMgICAgPSAyMjQwMDAsCi0gICAgTTRFTkNPREVSX2tBdWRpb18yNTZfS0JQUyAgICA9IDI1NjAwMCwKLSAgICBNNEVOQ09ERVJfa0F1ZGlvXzMyMF9LQlBTICAgID0gMzIwMDAwCi19IE00RU5DT0RFUl9BdWRpb0JpdHJhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRFTkNPREVSX0FhY1JlZ3VsYXRpb24KLSAqIEBicmllZiAgICAgICAgVGhlIGN1cnJlbnQgbW9kZSBvZiB0aGUgYml0cmF0ZSByZWd1bGF0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rQWFjUmVndWxOb25lID0gMCwgICAgLyoqPCBubyBiaXRyYXRlIHJlZ3VsYXRpb24gKi8KLSAgICBNNEVOQ09ERVJfa0FhY0JpdFJlc2Vydm9pciAgICAgICAgLyoqPCBiZXR0ZXIgcXVhbGl0eSwgYnV0IG1vcmUgQ1BVIGNvbnN1bWVkICovCi19IE00RU5DT0RFUl9BYWNSZWd1bGF0aW9uOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9BbXJTSUQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgU0lEIG9mIHRoZSBBTVIgZW5jb2Rlci4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa0Ftck5vU0lEID0gMCAgICAgLyoqPCBubyBTSUQgKi8KLX0gTTRFTkNPREVSX0FtclNJRDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0FhY1BhcmFtcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYWxsIHRoZSBzZXR0aW5ncyBzcGVjaWZpYyB0byB0aGUgQUFDIGVuY29kZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNEVOQ09ERVJfQWFjUmVndWxhdGlvbiAgICBSZWd1bGF0aW9uOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYkhpZ2hTcGVlZDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJUTlM7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBiUE5TOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYklTOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYk1TOwotfSBNNEVOQ09ERVJfQWFjUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfQXVkaW9QYXJhbXMKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFsbCB0aGUgc2V0dGluZ3MgYXZhbGFpYmxlIHdoZW4gZW5jb2RpbmcgYXVkaW8uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgc19NNEVOQ09ERVJfQXVkaW9QYXJhbXMKLXsKLSAgICBNNEVOQ09ERVJfU2FtcGxpbmdGcmVxdWVuY3kgICAgRnJlcXVlbmN5OyAgICAvKio8IHRoZSBzYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICBNNEVOQ09ERVJfQ2hhbm5lbE51bWJlciAgICAgICAgQ2hhbm5lbE51bTsgICAgLyoqPCB0aGUgbnVtYmUgb2YgY2hhbm5lbHMgKG1vbm8sIHN0ZXJlbywgLi4pICovCi0gICAgTTRFTkNPREVSX0F1ZGlvQml0cmF0ZSAgICAgICAgQml0cmF0ZTsgICAgLyoqPCAgYml0cmF0ZSwgc2VlIGVudW0gICovCi0gICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0ICAgICAgICBGb3JtYXQ7ICAgICAgICAvKio8ICBhdWRpbyBjb21wcmVzc2lvbiBmb3JtYXQsIEFNUiwgQUFDIC4uLiAgKi8KLSAgICB1bmlvbiB7Ci0gICAgICAgIE00RU5DT0RFUl9BYWNQYXJhbXMgICAgICAgIEFhY1BhcmFtOwotICAgICAgICBNNEVOQ09ERVJfQW1yU0lEICAgICAgICBBbXJTSUQ7Ci0gICAgfSBTcGVjaWZQYXJhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB0aGUgYXVkaW8gZW5jb2RlciBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCi19IE00RU5DT0RFUl9BdWRpb1BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0F1ZGlvRGVjU3BlY2lmaWNJbmZvCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBkZWNvZGVyIHNwZWNpZmljIGluZm8gYnVmZmVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfTWVtQWRkcjggICAgcEluZm87ICAgICAgICAvKio8IHRoZSBidWZmZXIgYWRyZXNzICovCi0gICAgTTRPU0FfVUludDMyICAgIGluZm9TaXplOyAgICAvKio8IHRoZSBidWZmZXIgc2l6ZSBpbiBieXRlcyAqLwotfSBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm87Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlcgotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGRhdGEgYnVmZmVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCB0aGUgdGFibGUgb2YgYnVmZmVycyAodW51c2VkIGJ1ZmZlcnMgYXJlIHNldCB0byBOVUxMKSAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgIHBUYWJsZUJ1ZmZlcltNNEVOQ09ERVJfQVVESU9fTkJfQ0hBTk5FTFNfTUFYXTsKLSAgICAvKio8IHRoZSB0YWJsZSBvZiB0aGUgc2l6ZSBvZiBjb3JyZXNwb25kaW5nIGJ1ZmZlciBhdCBzYW1lIGluZGV4ICovCi0gICAgTTRPU0FfVUludDMyICAgIHBUYWJsZUJ1ZmZlclNpemVbTTRFTkNPREVSX0FVRElPX05CX0NIQU5ORUxTX01BWF07Ci19IE00RU5DT0RFUl9BdWRpb0J1ZmZlcjsKLQotdHlwZWRlZiBNNE9TQV9FUlIgKE00QUVfaW5pdCkgICAgICAgIChNNE9TQV9Db250ZXh0KiBoQ29udGV4dCwgTTRPU0FfVm9pZCogcFVzZXJEYXRhKTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFFX2NsZWFuVXApICAgIChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFFX29wZW4pICAgICAgICAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRFTkNPREVSX0F1ZGlvUGFyYW1zICpwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvRGVjU3BlY2lmaWNJbmZvICpkZWNTcGVjSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0IGdyYWJiZXJDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNEFFX2Nsb3NlKSAgICAgICAgKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00QUVfc3RlcCkgICAgICAgICAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRFTkNPREVSX0F1ZGlvQnVmZmVyICppbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgKm91dEJ1ZmZlcik7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRBRV9nZXRPcHRpb24pICAgIChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9PcHRpb25JRCAgICBvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiAqdmFsdWVQdHIpOwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgRGVmaW5lcyBhbGwgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgYW4gYXVkaW8gZW5jb2RlciBzaGVsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlCi17Ci0gICAgTTRBRV9pbml0KiAgICAgICAgcEZjdEluaXQ7Ci0gICAgTTRBRV9jbGVhblVwKiAgICBwRmN0Q2xlYW5VcDsKLSAgICBNNEFFX29wZW4qICAgICAgICBwRmN0T3BlbjsKLSAgICBNNEFFX2Nsb3NlKiAgICAgICAgcEZjdENsb3NlOwotICAgIE00QUVfc3RlcCogICAgICAgIHBGY3RTdGVwOwotICAgIE00QUVfZ2V0T3B0aW9uKiAgICBwRmN0R2V0T3B0aW9uOwotfSBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2U7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qX19NNEVOQ09ERVJfQVVESU9DT01NT05fSF9fKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRFTkNPREVSX2NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRFTkNPREVSX2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MDY0NjAyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000RU5DT0RFUl9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRFTkNPREVSX2NvbW1vbi5oCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdHlwZXMgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBWRVMgdG8gYWJzdHJhY3QgZW5jb2RlcnMKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNEVOQ09ERVJfQ09NTU9OX0hfXwotI2RlZmluZSBfX000RU5DT0RFUl9DT01NT05fSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCi0vKioKLSAqIFZpZGVvIHByZXByb2Nlc3NpbmcgY29tbW9uIGludGVyZmFjZSAqLwotI2luY2x1ZGUgIk00VlBQX0FQSS5oIgotCi0vKioKLSAqIFdyaXRlciBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRXUklURVJfY29tbW9uLmgiCi0KLS8qIElNQUdFIFNUQUIgKi8KLS8qIHBlcmNlbnRhZ2Ugb2YgaW1hZ2Ugc3VwcHJlc3NlZCAoY29tcHV0ZWQgZnJvbSB0aGUgc3RhbmRhcmQgZGltZW5zaW9uKS4qLwotI2RlZmluZSBNNEVOQ09ERVJfU1RBQl9GSUxURVJfQ1JPUF9QRVJDRU5UQUdFIDEwCi0gICAgICAgIC8qIFdBUk5JTkc6IHRha2UgdGhlIGluZmVyaW9yIGV2ZW4gZGltZW5zaW9uLCBleDogMTAlIGZvciBRQ0lGIG91dHB1dCA9PiAxOTJ4MTU4ICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX09wZW5Nb2RlCi0gKiBAYnJpZWYgICAgRGVmaW5pdGlvbiBvZiBvcGVuIG1vZGUgZm9yIHRoZSBlbmNvZGVyLgotICogQG5vdGUgICAgREVGQVVMVCAgOiBwb2ludGVyIHRvIE00RU5DT0RFUl9vcGVuKCkgd2hpY2ggdXNlIGRlZmF1bHQgcGFyYW1ldGVycwotICogICAgICAgICAgQURWQU5DRUQgOiBwb2ludGVyIHRvIE00RU5DT0RFUl9vcGVuX2FkdmFuY2VkKCkgd2hpY2ggYWxsb3cgdG8gY3VzdG9taXplCi0gKiAgICAgICAgICAgICAgICAgICAgIHZhcmlvdXMgZW5jb2RpbmcgcGFyYW1ldGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9PUEVOX0RFRkFVTFQsCi0gICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQKLX0gTTRFTkNPREVSX09wZW5Nb2RlOwotCi0gLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfRnJhbWVSYXRlCi0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIGVuY29kZWQgdmlkZW8gZnJhbWVyYXRlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfazVfRlBTLAotICAgIE00RU5DT0RFUl9rN181X0ZQUywKLSAgICBNNEVOQ09ERVJfazEwX0ZQUywKLSAgICBNNEVOQ09ERVJfazEyXzVfRlBTLAotICAgIE00RU5DT0RFUl9rMTVfRlBTLAotICAgIE00RU5DT0RFUl9rMjBfRlBTLAotICAgIE00RU5DT0RFUl9rMjVfRlBTLAotICAgIE00RU5DT0RFUl9rMzBfRlBTLAotICAgIE00RU5DT0RFUl9rVkFSSUFCTEVfRlBTLCAgICAgICAgICAgIC8qKjwgVmFyaWFibGUgdmlkZW8gYml0cmF0ZSAqLwotICAgIE00RU5DT0RFUl9rVVNFX1RJTUVTQ0FMRSAgICAgICAgICAgIC8qKjwgQWR2YW5jZWQgZW5jb2RpbmcsIHVzZSB0aW1lc2NhbGUgaW5kaWNhdGlvbiByYXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gZnJhbWVyYXRlICovCi19IE00RU5DT0RFUl9GcmFtZVJhdGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0lucHV0Rm9ybWF0Ci0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIHZpZGVvIGZvcm1hdCBvZiB0aGUgZ3JhYmJpbmcuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2tJWVVWNDIwPTAsIC8qKjwgWVVWIDQ6MjowIHBsYW5hciAoc3RhbmRhcmQgaW5wdXQgZm9yIG1wZWctNCB2aWRlbykgKi8KLSAgICBNNEVOQ09ERVJfa0lZVVY0MjIsICAgLyoqPCBZVVY0MjIgcGxhbmFyICovCi0gICAgTTRFTkNPREVSX2tJWVVZViwgICAgIC8qKjwgWVVWNDIyIGludGVybGFjZWQsIGx1bWEgZmlyc3QgKi8KLSAgICBNNEVOQ09ERVJfa0lVWVZZLCAgICAgLyoqPCBZVVY0MjIgaW50ZXJsYWNlZCwgY2hyb21hIGZpcnN0ICovCi0gICAgTTRFTkNPREVSX2tJSlBFRywgICAgIC8qKjwgSlBFRyBjb21wcmVzc2VkIGZyYW1lcyAqLwotICAgIE00RU5DT0RFUl9rSVJHQjQ0NCwgICAvKio8IFJHQiAxMiBiaXRzIDQ6NDo0ICovCi0gICAgTTRFTkNPREVSX2tJUkdCNTU1LCAgIC8qKjwgUkdCIDE1IGJpdHMgNTo1OjUgKi8KLSAgICBNNEVOQ09ERVJfa0lSR0I1NjUsICAgLyoqPCBSR0IgMTYgYml0cyA1OjY6NSAqLwotICAgIE00RU5DT0RFUl9rSVJHQjI0LCAgICAvKio8IFJHQiAyNCBiaXRzIDg6ODo4ICovCi0gICAgTTRFTkNPREVSX2tJUkdCMzIsICAgIC8qKjwgUkdCIDMyIGJpdHMgICovCi0gICAgTTRFTkNPREVSX2tJQkdSNDQ0LCAgIC8qKjwgQkdSIDEyIGJpdHMgNDo0OjQgKi8KLSAgICBNNEVOQ09ERVJfa0lCR1I1NTUsICAgLyoqPCBCR1IgMTUgYml0cyA1OjU6NSAqLwotICAgIE00RU5DT0RFUl9rSUJHUjU2NSwgICAvKio8IEJHUiAxNiBiaXRzIDU6Njo1ICovCi0gICAgTTRFTkNPREVSX2tJQkdSMjQsICAgIC8qKjwgQkdSIDI0IGJpdHMgODo4OjggKi8KLSAgICBNNEVOQ09ERVJfa0lCR1IzMiAgICAgLyoqPCBCR1IgMzIgYml0cyAgKi8KLX0gTTRFTkNPREVSX0lucHV0Rm9ybWF0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00RU5DT0RFUl9Gb3JtYXQKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgdmlkZW8gY29tcHJlc3Npb24gZm9ybWF0cy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa01QRUc0ID0gMCwKLSAgICBNNEVOQ09ERVJfa0gyNjMsCi0gICAgTTRFTkNPREVSX2tIMjY0LAotICAgIE00RU5DT0RFUl9rSlBFRywKLSAgICBNNEVOQ09ERVJfa01KUEVHLAotICAgIE00RU5DT0RFUl9rTlVMTCwKLSAgICBNNEVOQ09ERVJfa1lVVjQyMCwgICAgICAgICAgICAvKio8IE5vIGNvbXByZXNzaW9uICovCi0gICAgTTRFTkNPREVSX2tZVVY0MjIsICAgICAgICAgICAgLyoqPCBObyBjb21wcmVzc2lvbiAqLwotCi0gICAgTTRFTkNPREVSX2tWaWRlb19OQiAvKiBudW1iZXIgb2YgZGVjb2RlcnMsIGtlZXAgaXQgYXMgbGFzdCBlbnVtIGVudHJ5ICovCi19IE00RU5DT0RFUl9Gb3JtYXQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0ZyYW1lV2lkdGgKLSAqIEBicmllZiAgICBUaGllIGVudW0gZGVmaW5lcyB0aGUgYXZhbGFpYmxlIGZyYW1lIFdpZHRoLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9TUUNJRl9XaWR0aCA9IDEyOCwgLyoqPCBTUUNJRiAxMjh4OTYgKi8KLSAgICBNNEVOQ09ERVJfUVFWR0FfV2lkdGggPSAxNjAsIC8qKjwgUVFWR0EgMTYweDEyMCAqLwotICAgIE00RU5DT0RFUl9RQ0lGX1dpZHRoICA9IDE3NiwgLyoqPCBRQ0lGIDE3NngxNDQgKi8KLSAgICBNNEVOQ09ERVJfUVZHQV9XaWR0aCAgPSAzMjAsIC8qKjwgUVZHQSAzMjB4MjQwICovCi0gICAgTTRFTkNPREVSX0NJRl9XaWR0aCAgID0gMzUyLCAvKio8IENJRiAzNTJ4Mjg4ICovCi0gICAgTTRFTkNPREVSX1ZHQV9XaWR0aCAgID0gNjQwLCAvKio8IFZHQSA2NDB4NDgwICovCi0gICAgTTRFTkNPREVSX1NWR0FfV2lkdGggID0gODAwLCAvKio8IFNWR0EgODAweDYwMCAqLwotICAgIE00RU5DT0RFUl9YR0FfV2lkdGggICA9IDEwMjQsIC8qKjwgWEdBIDEwMjR4NzY4ICovCi0gICAgTTRFTkNPREVSX1hWR0FfV2lkdGggID0gMTI4MCwgLyoqPCBYVkdBIDEyODB4MTAyNCAqLwotLyogK1BSIExWNTgwNyAqLwotICAgIE00RU5DT0RFUl9XVkdBX1dpZHRoICA9IDgwMCwgLyoqPCBXVkdBIDgwMCB4IDQ4MCAqLwotICAgIE00RU5DT0RFUl9OVFNDX1dpZHRoICA9IDcyMCwgLyoqPCBOVFNDIDcyMCB4IDQ4MCAqLwotLyogLVBSIExWNTgwNyAqLwotCi0vKiArQ1IgR29vZ2xlICovCi0gICAgTTRFTkNPREVSXzY0MF8zNjBfV2lkdGggICA9IDY0MCwgIC8qKjwgNjQweDM2MCAqLwotICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSAgICBNNEVOQ09ERVJfODU0XzQ4MF9XaWR0aCAgID0gODQ4LCAgLyoqPCA4NDh4NDgwICovCi0gICAgTTRFTkNPREVSXzEyODBfNzIwX1dpZHRoICA9IDEyODAsIC8qKjwgNzIwcCAxMjgweDcyMCAqLwotICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSAgICBNNEVOQ09ERVJfMTA4MF83MjBfV2lkdGggID0gMTA4OCwgLyoqPCA3MjBwIDEwODh4NzIwICovCi0gICAgTTRFTkNPREVSXzk2MF83MjBfV2lkdGggICA9IDk2MCwgIC8qKjwgNzIwcCA5NjB4NzIwICovCi0gICAgTTRFTkNPREVSXzE5MjBfMTA4MF9XaWR0aCA9IDE5MjAgIC8qKjwgMTA4MHAgMTkyMHgxMDgwICovCi0vKiAtQ1IgR29vZ2xlICovCi0KLX0gTTRFTkNPREVSX0ZyYW1lV2lkdGg7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0Ci0gKiBAYnJpZWYgICAgVGhpZSBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBmcmFtZSBIZWlnaHQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX1NRQ0lGX0hlaWdodCA9IDk2LCAgLyoqPCBTUUNJRiAxMjh4OTYgKi8KLSAgICBNNEVOQ09ERVJfUVFWR0FfSGVpZ2h0ID0gMTIwLCAvKio8IFFRVkdBIDE2MHgxMjAgKi8KLSAgICBNNEVOQ09ERVJfUUNJRl9IZWlnaHQgID0gMTQ0LCAvKio8IFFDSUYgMTc2eDE0NCAqLwotICAgIE00RU5DT0RFUl9RVkdBX0hlaWdodCAgPSAyNDAsIC8qKjwgUVZHQSAzMjB4MjQwICovCi0gICAgTTRFTkNPREVSX0NJRl9IZWlnaHQgICA9IDI4OCwgLyoqPCBDSUYgMzUyeDI4OCAqLwotICAgIE00RU5DT0RFUl9WR0FfSGVpZ2h0ICAgPSA0ODAsIC8qKjwgVkdBIDM0MHg0ODAgKi8KLSAgICBNNEVOQ09ERVJfU1ZHQV9IZWlnaHQgID0gNjAwLCAvKio8IFNWR0EgODAweDYwMCAqLwotICAgIE00RU5DT0RFUl9YR0FfSGVpZ2h0ICAgPSA3NjgsIC8qKjwgWEdBIDEwMjR4NzY4ICovCi0gICAgTTRFTkNPREVSX1hWR0FfSGVpZ2h0ICA9IDEwMjQsIC8qKjwgWFZHQSAxMjgweDEwMjQgKi8KLS8qICtQUiBMVjU4MDcgKi8KLSAgICBNNEVOQ09ERVJfV1ZHQV9IZWlnaHQgID0gNDgwLCAvKio8IFdWR0EgODAwIHggNDgwICovCi0gICAgTTRFTkNPREVSX05UU0NfSGVpZ2h0ICA9IDQ4MCwgLyoqPCBOVFNDIDcyMCB4IDQ4MCAqLwotLyogLVBSIExWNTgwNyAqLwotCi0vKiArQ1IgR29vZ2xlICovCi0gICAgTTRFTkNPREVSXzY0MF8zNjBfSGVpZ2h0ICA9IDM2MCwgLyoqPCA2NDB4MzYwICovCi0gICAgTTRFTkNPREVSXzg1NF80ODBfSGVpZ2h0ICA9IDQ4MCwgLyoqPCA4NTR4NDgwICovCi0gICAgTTRFTkNPREVSXzEyODBfNzIwX0hlaWdodCA9IDcyMCwgLyoqPCA3MjBwIDEyODB4NzIwICovCi0gICAgTTRFTkNPREVSXzEwODBfNzIwX0hlaWdodCA9IDcyMCwgLyoqPCA3MjBwIDEwODB4NzIwICovCi0gICAgTTRFTkNPREVSXzk2MF83MjBfSGVpZ2h0ICA9IDcyMCwgLyoqPCA3MjBwIDk2MHg3MjAgKi8KLSAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0gICAgTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQgPSAxMDg4IC8qKjwgMTA4MHAgMTkyMHgxMDgwICovCi0vKiAtQ1IgR29vZ2xlICovCi19IE00RU5DT0RFUl9GcmFtZUhlaWdodDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNEVOQ09ERVJfQml0cmF0ZQotICogQGJyaWVmICAgIFRoaWUgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgYml0cmF0ZXMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRFTkNPREVSX2syOF9LQlBTICA9IDI4MDAwLAotICAgIE00RU5DT0RFUl9rNDBfS0JQUyAgPSA0MDAwMCwKLSAgICBNNEVOQ09ERVJfazY0X0tCUFMgID0gNjQwMDAsCi0gICAgTTRFTkNPREVSX2s5Nl9LQlBTICA9IDk2MDAwLAotICAgIE00RU5DT0RFUl9rMTI4X0tCUFMgPSAxMjgwMDAsCi0gICAgTTRFTkNPREVSX2sxOTJfS0JQUyA9IDE5MjAwMCwKLSAgICBNNEVOQ09ERVJfazI1Nl9LQlBTID0gMjU2MDAwLAotICAgIE00RU5DT0RFUl9rMzg0X0tCUFMgPSAzODQwMDAsCi0gICAgTTRFTkNPREVSX2s1MTJfS0JQUyA9IDUxMjAwMCwKLSAgICBNNEVOQ09ERVJfazgwMF9LQlBTID0gODAwMDAwCi0KLX0gTTRFTkNPREVSX0JpdHJhdGU7Ci0KLS8qIElNQUdFIFNUQUIgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRFTkNPREVSX1N0YWJNb2RlCi0gKiBAYnJpZWYgICAgICAgIFRoZSBjdXJyZW50IG1vZGUgb2YgdGhlIHN0YWJpbGl6YXRpb24gZmlsdGVyLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00RU5DT0RFUl9rU3RhYk9mZiA9IDAsICAgICAgICAvKio8IHN0YWJpbGl6YXRpb24gZmlsdGVyIGlzIGRpc2FibGVkICovCi0gICAgTTRFTkNPREVSX2tTdGFiQ2VudGVyZWQsICAgIC8qKjwgc3RhYmlsaXphdGlvbiBmaWx0ZXIgaXMgZW5hYmxlZC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWaWRlbyBpbnB1dCBhbmQgb3V0cHV0IG11c3QgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb25zLiBPdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpbGwgaGF2ZSBibGFjayBib3JkZXJzICovCi0gICAgTTRFTkNPREVSX2tTdGFiR3JhYk1vcmUgICAgICAgIC8qKjwgc3RhYmlsaXphdGlvbiBmaWx0ZXIgaXMgZW5hYmxlZC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWaWRlbyBpbnB1dCBkaW1lbnNpb25zIG11c3QgYmUgYmlnZ2VyIHRoYW4gb3V0cHV0LiBUaGUgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBpbmRpY2F0ZWQgYnkgTTRFTkNPREVSX1NUQUJfRklMVEVSX0NST1BfUEVSQ0VOVEFHRSAqLwotCi19IE00RU5DT0RFUl9TdGFiTW9kZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRFTkNPREVSX0ZyYW1lTW9kZQotICogQGJyaWVmICAgICAgICBWYWx1ZXMgdG8gZHJpdmUgdGhlIGVuY29kZXIgYmVoYXZpb3VyICh0eXBlIG9mIGZyYW1lcyBwcm9kdWNlZCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNEVOQ09ERVJfa05vcm1hbEZyYW1lID0gMCwgICAvKio8IGxldCB0aGUgZW5jb2RlciBkZWNpZGUgd2hpY2ggdHlwZSBvZiBmcmFtZSB0byBlbmNvZGUgKi8KLSAgICBNNEVOQ09ERVJfa0xhc3RGcmFtZSAgID0gMSwgICAvKio8IGZvcmNlIGVuY29kZXIgdGhlIGZsdXNoIGFsbCBpdHMgYnVmZmVycyBiZWNhdXNlIGl0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgZnJhbWUgICovCi0gICAgTTRFTkNPREVSX2tJRnJhbWUgICAgICA9IDIgICAgLyoqPCBmb3JjZSBlbmNvZGVyIHRvIGdlbmVyYXRlIGFuIEkgZnJhbWUgKi8KLQotfSBNNEVOQ09ERVJfRnJhbWVNb2RlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfUGFyYW1zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbGwgdGhlIHNldHRpbmdzIGF2YWxhaWJsZSB3aGVuIGVuY29kaW5nLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogSW5wdXQgKi8KLSAgICBNNEVOQ09ERVJfSW5wdXRGb3JtYXQgICAgSW5wdXRGb3JtYXQ7ICAgICAgICAvKio8IElucHV0IHZpZGVvIGZvcm1hdCAoZ3JhYmJpbmcpICovCi0gICAgTTRFTkNPREVSX0ZyYW1lV2lkdGggICAgSW5wdXRGcmFtZVdpZHRoOyAgICAvKio8IElucHV0IEZyYW1lIHdpZHRoIChncmFiYmluZykgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVIZWlnaHQgICAgSW5wdXRGcmFtZUhlaWdodDsgICAgLyoqPCBJbnB1dCBGcmFtZSBoZWlnaHQgKGdyYWJiaW5nKSAqLwotCi0gICAgLyogT3V0cHV0ICovCi0gICAgTTRFTkNPREVSX0ZyYW1lV2lkdGggICAgRnJhbWVXaWR0aDsgICAgICAgICAgICAvKio8IEZyYW1lIHdpZHRoICAqLwotICAgIE00RU5DT0RFUl9GcmFtZUhlaWdodCAgICBGcmFtZUhlaWdodDsgICAgICAgIC8qKjwgRnJhbWUgaGVpZ2h0ICAqLwotICAgIE00RU5DT0RFUl9CaXRyYXRlICAgICAgICBCaXRyYXRlOyAgICAgICAgICAgIC8qKjwgQml0cmF0ZSwgc2VlIGVudW0gICovCi0gICAgTTRFTkNPREVSX0ZyYW1lUmF0ZSAgICAgICAgRnJhbWVSYXRlOyAgICAgICAgICAgIC8qKjwgRnJhbWVyYXRlLCBzZWUgZW51bSAgKi8KLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICBGb3JtYXQ7ICAgICAgICAgICAgICAgIC8qKjwgVmlkZW8gY29tcHJlc3Npb24gZm9ybWF0LCBIMjYzLCBNUEVHNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1KUEVHIC4uLiAgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgIHZpZGVvUHJvZmlsZTsgLyoqIHZpZGVvIHByb2ZpbGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgIHZpZGVvTGV2ZWw7ICAgLyoqIHZpZGVvIGxldmVsICovCi19IE00RU5DT0RFUl9QYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGFkdmFuY2VkIHNldHRpbmdzIGF2YWlsYWJsZSBmb3IgTVBFRy00IGVuY29kaW5nLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqCi0gICAgICogSW5wdXQgcGFyYW1ldGVycyAoZ3JhYmJlciBjb3VwbGVkIHdpdGggZW5jb2Rlcik6ICovCi0gICAgTTRFTkNPREVSX0lucHV0Rm9ybWF0ICAgIElucHV0Rm9ybWF0OyAgICAgICAgICAgICAgICAvKio8IElucHV0IHZpZGVvIGZvcm1hdCAqLwotICAgIE00RU5DT0RFUl9GcmFtZVdpZHRoICAgIElucHV0RnJhbWVXaWR0aDsgICAgICAgICAgICAvKio8IElucHV0IEZyYW1lIHdpZHRoICovCi0gICAgTTRFTkNPREVSX0ZyYW1lSGVpZ2h0ICAgIElucHV0RnJhbWVIZWlnaHQ7ICAgICAgICAgICAgLyoqPCBJbnB1dCBGcmFtZSBoZWlnaHQgKi8KLQotICAgIC8qKgotICAgICAqIENvbW1vbiBzZXR0aW5ncyBmb3IgSDI2MyBhbmQgTVBFRy00OiAqLwotICAgIE00RU5DT0RFUl9GcmFtZVdpZHRoICAgIEZyYW1lV2lkdGg7ICAgICAgICAgICAgICAgICAgICAvKio8IEZyYW1lIHdpZHRoICAqLwotICAgIE00RU5DT0RFUl9GcmFtZUhlaWdodCAgICBGcmFtZUhlaWdodDsgICAgICAgICAgICAgICAgLyoqPCBGcmFtZSBoZWlnaHQgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgQml0cmF0ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgRnJlZSB2YWx1ZSBmb3IgdGhlIGJpdHJhdGUgKi8KLSAgICAvKio8IEZyYW1lcmF0ZSAoaWYgc2V0IHRvIE00RU5DT0RFUl9rVVNFX1RJTUVTQ0FMRSB1c2UgdWlSYXRlRmFjdG9yICYgdWlUaW1lU2NhbGUgaW5zdGVhZCkgKi8KLSAgICBNNEVOQ09ERVJfRnJhbWVSYXRlICAgICAgICBGcmFtZVJhdGU7Ci0gICAgLyoqPCBWaWRlbyBjb21wcmVzc2lvbiBmb3JtYXQ6IEgyNjMgb3IgTVBFRzQgKi8KLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICBGb3JtYXQ7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICB2aWRlb1Byb2ZpbGU7IC8qKiBvdXRwdXQgdmlkZW8gcHJvZmlsZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgdmlkZW9MZXZlbDsgICAvKiogb3V0cHV0IHZpZGVvIGxldmVsICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlIb3Jpem9udGFsU2VhcmNoUmFuZ2U7IC8qKjwgU2V0IHRvIDAgd2lsbCB1c2UgZGVmYXVsdCB2YWx1ZSAoMTUpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlWZXJ0aWNhbFNlYXJjaFJhbmdlOyAgIC8qKjwgU2V0IHRvIDAgd2lsbCB1c2UgZGVmYXVsdCB2YWx1ZSAoMTUpICovCi0gICAgLyoqPCBTZXQgdG8gMCB3aWxsIHVzZSBkZWZhdWx0IHZhbHVlICgweDdGRkYgaS5lLiBsZXQgZW5naW5lIGRlY2lkZSB3aGVuIHRvIHB1dCBhbiBJKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZTsKLSAgICAvKio8IEVuYWJsZSBpZiBwcmlvcml0eSBpcyBxdWFsaXR5LCBEaXNhYmxlIGlmIHByaW9yaXR5IGlzIGZyYW1lcmF0ZSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYkludGVybmFsUmVndWxhdGlvbjsKLSAgICAvKio8IFJhdGlvIGJldHdlZW4gdGhlIGVuY29kZXIgZnJhbWUgcmF0ZSBhbmQgdGhlIGFjdHVhbCBmcmFtZSByYXRlICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgdWlSYXRlRmFjdG9yOwotICAgIC8qKjwgSSBmcmFtZXMgcGVyaW9kaWNpdHksIHNldCB0byAwIHdpbGwgdXNlIGRlZmF1bHQgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aUlWb3BQZXJpb2Q7Ci0gICAgLyoqPCBNb3Rpb24gZXN0aW1hdGlvbiBbZGVmYXVsdD0wIChhbGwgdG9vbHMpLCBkaXNhYmxlPTggKG5vIHRvb2wpXSAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgIHVpTW90aW9uRXN0aW1hdGlvblRvb2xzOwotCi0gICAgLyoqCi0gICAgICogU2V0dGluZ3MgZm9yIE1QRUctNCBvbmx5OiAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpVGltZVNjYWxlOyAgICAgICAgICAgICAgICAvKio8IEZyZWUgdmFsdWUgZm9yIHRoZSB0aW1lc2NhbGUgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJFcnJvclJlc2lsaWVuY2U7ICAgICAgICAgICAvKio8IERpc2FibGVkIGJ5IGRlZmF1bHQgKi8KLSAgICAvKio8IERpc2FibGVkIGJ5IGRlZmF1bHQgKGlmIGVuYWJsZWQsIGJFcnJvclJlc2lsaWVuY2Ugc2hvdWxkIGJlIGVuYWJsZWQgdG9vISkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJEYXRhUGFydGl0aW9uaW5nOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJBY1ByZWRpY3Rpb247ICAgICAgICAgICAvKio8IEFDIHByZWRpY3Rpb24gW2RlZmF1bHQ9MSwgZGlzYWJsZT0wXSAqLwotCi19IE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRFTkNPREVSX1N0aWxsUGljdHVyZVBhcmFtcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYWxsIHRoZSBzZXR0aW5ncyBhdmFsYWlibGUgd2hlbiBlbmNvZGluZyBzdGlsbAotICogICAgICAgICAgICBwaWN0dXJlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRFTkNPREVSX0ZyYW1lV2lkdGggICAgRnJhbWVXaWR0aDsgICAgICAgICAgICAvKio8IEZyYW1lIHdpZHRoICAqLwotICAgIE00RU5DT0RFUl9GcmFtZUhlaWdodCAgICBGcmFtZUhlaWdodDsgICAgICAgIC8qKjwgRnJhbWUgaGVpZ2h0ICAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIFF1YWxpdHk7ICAgICAgICAgICAgLyoqPCBCaXRyYXRlLCBzZWUgZW51bSAgKi8KLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICBJbnB1dEZvcm1hdDsgICAgICAgIC8qKjwgWVVWIDQyMCBvciA0MjIgICovCi0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgRm9ybWF0OyAgICAgICAgICAgICAgICAvKio8IFZpZGVvIGNvbXByZXNzaW9uIGZvcm1hdCwgSDI2MywgTVBFRzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSlBFRyAuLi4gICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBQcmVQcm9jZXNzTmVlZGVkOyAgICAvKio8IElzIHRoZSBjYWxsIHRvIHRoZSBWUFAgaXMgbmVjZXNzYXJ5ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBFbmNvZGluZ1BlclN0cmlwZXM7ICAgIC8qKjwgSXMgZW5jb2RpbmcgcGVyIHN0cmlwZXMgKi8KLQotfSBNNEVOQ09ERVJfU3RpbGxQaWN0dXJlUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfSGVhZGVyCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYnVmZmVyIHdoZXJlIHRoZSBzZXF1ZW5jZSBoZWFkZXIgaXMgcHV0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfTWVtQWRkcjggICAgcEJ1ZjsgICAgICAgIC8qKjwgQnVmZmVyIGZvciB0aGUgaGVhZGVyICovCi0gICAgTTRPU0FfVUludDMyICAgIFNpemU7ICAgICAgICAvKio8IFNpemUgb2YgdGhlIGRhdGEgKi8KLQotfSBNNEVOQ09ERVJfSGVhZGVyOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgTTRFTkNPREVSX09wdGlvbklECi0gKiBAYnJpZWYgVGhpcyBlbnVtcyBkZWZpbmVzIGFsbCBhdmFsYWlibGUgb3B0aW9ucy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICAvKio8IHNldCB0aGUgZnJhZ21lbnQgc2l6ZSwgb3B0aW9uIHZhbHVlIGlzIE00T1NBX1VJbnQzMiB0eXBlICovCi0gICAgTTRFTkNPREVSX2tPcHRpb25JRF9WaWRlb0ZyYWdtZW50U2l6ZSAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwMSksCi0KLSAgICAvKio8IHNldCB0aGUgc3RhYmlsaXphdGlvbiBmaWx0ZXJpbmcsIG9wdGlvbiB2YWx1ZSBpcyBNNEVOQ09ERVJfU3RhYk1vZGUgdHlwZSAqLwotICAgIE00RU5DT0RFUl9rT3B0aW9uSURfSW1hZ2VTdGFiaWxpemF0aW9uICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9DT01NT04sIDB4MDIpLAotCi0gICAgLyoqPCBwcmV2ZW50IHdyaXR0aW5nIG9mIGFueSBBVSwgb3B0aW9uIHZhbHVlIGlzIE00T1NBX0Jvb2wgdHlwZSAqLwotICAgIE00RU5DT0RFUl9rT3B0aW9uSURfSW5zdGFudFN0b3AgICAgICAgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9DT01NT04sIDB4MDMpLAotCi0gICAgLyoqPCBnZXQgdGhlIERTSSAoZW5jb2RlciBoZWFkZXIpIGdlbmVyYXRlZCBieSB0aGUgZW5jb2RlciAqLwotICAgIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEICxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwNCksCi0vKisgQ1IgTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAgKi8KLQotICAgIE00RU5DT0RFUl9rT3B0aW9uSURfU2V0SDI2NFByb2Nlc3NOQUxVZmN0c1B0cj0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfUkVBRCAsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9DT01NT04sIDB4MDUpLAotICAgIE00RU5DT0RFUl9rT3B0aW9uSURfSDI2NFByb2Nlc3NOQUxVQ29udGV4dCAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEICxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0NPTU1PTiwgMHgwNikKLS8qLUNSIExWNjc3NSAtSC4yNjQgVHJpbW1pbmcgICovCi19IE00RU5DT0RFUl9PcHRpb25JRDsKLQotLyorIENSIExWNjc3NSAtSC4yNjQgVHJpbW1pbmcgICovCi10eXBlZGVmIE00T1NBX0VSUiAoSDI2NE1DU19Qcm9jZXNzRW5jb2RlZE5BTFVfZmN0KShNNE9TQV9Wb2lkKmFpbnN0YW5jZSxNNE9TQV9VSW50OCogaW5idWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICBpbmJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpvdXRidWZmLCBNNE9TQV9JbnQzMiAqb3V0YnVmX3NpemUpOwotLy8qLSBDUiBMVjY3NzUgLUguMjY0IFRyaW1taW5nICAqLwotCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00RU5DT0RFUl9Db250ZXh0OwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX2luaXQpICgKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludGVyZmFjZSwKLSAgICAgICAgTTRWUFBfYXBwbHlfZmN0KiBwVlBQZmN0LAotICAgICAgICBNNFZQUF9Db250ZXh0IHBWUFBjdHh0LAotICAgICAgICBNNE9TQV9Wb2lkKiBwRXh0ZXJuYWxBUEksCi0gICAgICAgIE00T1NBX1ZvaWQqIHBVc2VyRGF0YQotKTsKLQotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9vcGVuKSAoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUsCi0gICAgICAgIE00T1NBX1ZvaWQqIHBQYXJhbXMgICAgIC8qIENhbiBiZSBNNEVOQ09ERVJfUGFyYW1zLCBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9TdGlsbFBpY3R1cmVQYXJhbXMgKi8KLSk7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfc3RhcnQpIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX3N0b3ApIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX3BhdXNlKSAoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9yZXN1bWUpIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX2Nsb3NlKSAoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9jbGVhbnVwKSAoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00RU5DT0RFUl9yZWd1bEJpdFJhdGUpIChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCk7Ci0KLXR5cGVkZWYgTTRPU0FfRVJSIChNNEVOQ09ERVJfZW5jb2RlKSAoCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEluUGxhbmUsCi0gICAgICAgIE00T1NBX0RvdWJsZSBDdHMsCi0gICAgICAgIE00RU5DT0RFUl9GcmFtZU1vZGUgRnJhbWVNb2RlCi0pOwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX3NldE9wdGlvbikgICAgKAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELAotICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlCi0pOwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRFTkNPREVSX2dldE9wdGlvbikgICAgKAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELAotICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlCi0pOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgRGVmaW5lcyBhbGwgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgYW4gZW5jb2RlciBzaGVsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgc3RydWN0IF9NNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlCi17Ci0gICAgTTRFTkNPREVSX2luaXQqICAgICAgICAgICAgICAgIHBGY3RJbml0OwotICAgIE00RU5DT0RFUl9vcGVuKiAgICAgICAgICAgICAgICBwRmN0T3BlbjsKLQotICAgIE00RU5DT0RFUl9zdGFydCogICAgICAgICAgICBwRmN0U3RhcnQ7ICAgICAgICAgIC8qIEdyYWJiZXIgbW9kZSAqLwotICAgIE00RU5DT0RFUl9zdG9wKiAgICAgICAgICAgICAgICBwRmN0U3RvcDsgICAgICAgICAgIC8qIEdyYWJiZXIgbW9kZSAqLwotCi0gICAgTTRFTkNPREVSX3BhdXNlKiAgICAgICAgICAgIHBGY3RQYXVzZTsgICAgICAgICAgLyogR3JhYmJlciBtb2RlICovCi0gICAgTTRFTkNPREVSX3Jlc3VtZSogICAgICAgICAgICBwRmN0UmVzdW1lOyAgICAgICAgIC8qIEdyYWJiZXIgbW9kZSAqLwotCi0gICAgTTRFTkNPREVSX2Nsb3NlKiAgICAgICAgICAgIHBGY3RDbG9zZTsKLSAgICBNNEVOQ09ERVJfY2xlYW51cCogICAgICAgICAgICBwRmN0Q2xlYW51cDsKLQotICAgIE00RU5DT0RFUl9yZWd1bEJpdFJhdGUqICAgICBwRmN0UmVndWxCaXRSYXRlOwotICAgIE00RU5DT0RFUl9lbmNvZGUqICAgICAgICAgICAgcEZjdEVuY29kZTsgICAgICAgICAvKiBTdGFuZGFsb25lIG1vZGUgKi8KLQotICAgIE00RU5DT0RFUl9zZXRPcHRpb24qICAgICAgICBwRmN0U2V0T3B0aW9uOwotICAgIE00RU5DT0RFUl9nZXRPcHRpb24qICAgICAgICBwRmN0R2V0T3B0aW9uOwotfSBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKl9fTTRFTkNPREVSX0NPTU1PTl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNE9TQV9Db3JlSUQuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000T1NBX0NvcmVJRC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NDA4ZmM4Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000T1NBX0NvcmVJRC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00T1NBX0NvcmVJRC5oCi0gKiBAYnJpZWYgIGRlZmluZXMgdGhlIHVuaXF1ZXMgY29tcG9uZW50IGlkZW50aWZpZXJzIHVzZWQgZm9yIG1lbW9yeSBtYW5hZ2VtZW50Ci0gKiAgICAgICAgIGFuZCBvcHRpb25JRCBtZWNoYW5pc20KLSAqIEBub3RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNE9TQV9DT1JFSURfSF9fCi0jZGVmaW5lIF9fTTRPU0FfQ09SRUlEX0hfXwotCi0vKiBDb3JlSWQgYXJlIGRlZmluZWQgb24gMTQgYml0cyAqLwotLyogd2Ugc3RhcnQgZnJvbSAweDAxMDAsIGxvd2VyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIG9zYWwgY29yZSBjb21wb25lbnRzICovCi0KLS8qIHJlYWRlciBzaGVsbHMqLwotI2RlZmluZSBNNFJFQURFUl9DT01NT04gICAgIDB4MDEwMAotI2RlZmluZSBNNFJFQURFUl9BVkkgICAgICAgIDB4MDEwMQotI2RlZmluZSBNNFJFQURFUl9BTVIgICAgICAgIDB4MDEwMgotI2RlZmluZSBNNFJFQURFUl8zR1AgICAgICAgIDB4MDEwMwotI2RlZmluZSBNNFJFQURFUl9ORVQgICAgICAgIDB4MDEwNAotI2RlZmluZSBNNFJFQURFUl8zR1BfSFRUUCAgIDB4MDEwNQotI2RlZmluZSBNNFJFQURFUl9NUDMgICAgICAgIDB4MDEwNgotI2RlZmluZSBNNFJFQURFUl9XQVYgICAgICAgIDB4MDEwNwotI2RlZmluZSBNNFJFQURFUl9NSURJICAgICAgIDB4MDEwOAotI2RlZmluZSBNNFJFQURFUl9BU0YgICAgICAgIDB4MDEwOQotI2RlZmluZSBNNFJFQURFUl9SRUFMICAgICAgICAweDAxMEEKLSNkZWZpbmUgTTRSRUFERVJfQUFDICAgICAgICAweDAxMEIKLSNkZWZpbmUgTTRSRUFERVJfRkxFWCAgICAgICAgMHgwMTBDCi0jZGVmaW5lIE00UkVBREVSX0JCQSAgICAgICAgMHgwMTBECi0jZGVmaW5lIE00UkVBREVSX1NZTlRIRVNJU19BVURJTyAgICAweDAxMEUKLSNkZWZpbmUgTTRSRUFERVJfSlBFRyAgICAgICAgMHgwMTBGCi0KLQotLyogd3JpdGVyIHNoZWxscyovCi0jZGVmaW5lIE00V1JJVEVSX0NPTU1PTiAgICAgMHgwMTEwCi0jZGVmaW5lIE00V1JJVEVSX0FWSSAgICAgICAgMHgwMTExCi0jZGVmaW5lIE00V1JJVEVSX0FNUiAgICAgICAgMHgwMTEyCi0jZGVmaW5lIE00V1JJVEVSXzNHUCAgICAgICAgMHgwMTEzCi0jZGVmaW5lIE00V1JJVEVSX0pQRUcgICAgICAgIDB4MDExNgotI2RlZmluZSBNNFdSSVRFUl9NUDMgICAgICAgIDB4MDExNwotCi0vKiBkZWNvZGVyIHNoZWxscyAqLwotI2RlZmluZSBNNERFQ09ERVJfQ09NTU9OICAgIDB4MDEyMAotI2RlZmluZSBNNERFQ09ERVJfSlBFRyAgICAgIDB4MDEyMQotI2RlZmluZSBNNERFQ09ERVJfTVBFRzQgICAgIDB4MDEyMgotI2RlZmluZSBNNERFQ09ERVJfQVVESU8gICAgIDB4MDEyMwotI2RlZmluZSBNNERFQ09ERVJfQVZDICAgICAgIDB4MDEyNAotI2RlZmluZSBNNERFQ09ERVJfTUlESSAgICAgIDB4MDEyNQotI2RlZmluZSBNNERFQ09ERVJfV01BICAgICAgICAweDAxMjYKLSNkZWZpbmUgTTRERUNPREVSX1dNViAgICAgICAgMHgwMTI3Ci0jZGVmaW5lIE00REVDT0RFUl9STVYgICAgICAgIDB4MDEyOAotI2RlZmluZSBNNERFQ09ERVJfUk1BICAgICAgICAweDAxMjkKLSNkZWZpbmUgTTRERUNPREVSX0FBQyAgICAgICAweDAxMkEKLSNkZWZpbmUgTTRERUNPREVSX0JFQVRCUkVXICAweDAxMkIKLSNkZWZpbmUgTTRERUNPREVSX0VYVEVSTkFMICAweDAxMkMKLQotLyogZW5jb2RlciBzaGVsbHMgKi8KLSNkZWZpbmUgTTRFTkNPREVSX0NPTU1PTiAgICAweDAxMzAKLSNkZWZpbmUgTTRFTkNPREVSX0pQRUcgICAgICAweDAxMzEKLSNkZWZpbmUgTTRFTkNPREVSX01QRUc0ICAgICAweDAxMzIKLSNkZWZpbmUgTTRFTkNPREVSX0FVRElPICAgICAweDAxMzMKLSNkZWZpbmUgTTRFTkNPREVSX1ZJRF9OVUxMICAweDAxMzQKLSNkZWZpbmUgTTRFTkNPREVSX01KUEVHICAgICAgICAweDAxMzUKLSNkZWZpbmUgTTRFTkNPREVSX01QMyAgICAgICAgMHgwMTM2Ci0jZGVmaW5lIE00RU5DT0RFUl9IMjY0ICAgICAgICAweDAxMzcKLSNkZWZpbmUgTTRFTkNPREVSX0FBQyAgICAgICAgMHgwMTM4Ci0jZGVmaW5lIE00RU5DT0RFUl9BTVJOQiAgICAgICAgMHgwMTM5Ci0jZGVmaW5lIE00RU5DT0RFUl9BVURfTlVMTCAgMHgwMTNBCi0jZGVmaW5lIE00RU5DT0RFUl9FWFRFUk5BTCAgMHgwMTNCCi0KLS8qIGNvcmVzICovCi0jZGVmaW5lIE00SlBHX0RFQ09ERVIgICAgICAgMHgwMTQwCi0jZGVmaW5lIE00SlBHX0VOQ09ERVIgICAgICAgMHgwMTQxCi0KLSNkZWZpbmUgTTRNUDRfREVDT0RFUiAgICAgICAweDAxNDIKLSNkZWZpbmUgTTRNUDRfRU5DT0RFUiAgICAgICAweDAxNDMKLQotI2RlZmluZSBNNEFWSV9DT01NT04gICAgICAgIDB4MDE0NAotI2RlZmluZSBNNEFWSV9SRUFERVIgICAgICAgIDB4MDE0NQotI2RlZmluZSBNNEFWSV9XUklURVIgICAgICAgIDB4MDE0NgotCi0jZGVmaW5lIE00SFRUUF9FTkdJTkUgICAgICAgMHgwMTQ3Ci0KLSNkZWZpbmUgTTRPU0FfVE1QRklMRSAgICAgICAweDAxNDgKLSNkZWZpbmUgTTRUT09MX1RJTUVSICAgICAgICAweDAxNDkKLQotI2RlZmluZSBNNEFNUl9SRUFERVIgICAgICAgIDB4MDE0QQotCi0jZGVmaW5lIE00TVAzX1JFQURFUiAgICAgICAgMHgwMTRCCi0KLSNkZWZpbmUgTTRXQVZfUkVBREVSICAgICAgICAweDAxNEMKLSNkZWZpbmUgTTRXQVZfV1JJVEVSICAgICAgICAweDAxNEQKLSNkZWZpbmUgTTRXQVZfQ09NTU9OICAgICAgICAweDAxNEUKLQotI2RlZmluZSBNNEFEVFNfUkVBREVSICAgICAgICAweDAxNEYKLSNkZWZpbmUgTTRBRElGX1JFQURFUiAgICAgICAgMHgwMTZBCi0KLSNkZWZpbmUgTTRTUFMgICAgICAgICAgICAgICAweDAxNTAKLSNkZWZpbmUgTTRFWElGX0RFQ09ERVIgICAgICAweDAxNTEKLSNkZWZpbmUgTTRFWElGX0VOQ09ERVIgICAgICAweDAxNTIKLSNkZWZpbmUgTTRHSUZfREVDT0RFUiAgICAgICAweDAxNTMKLSNkZWZpbmUgTTRHSUZfRU5DT0RFUiAgICAgICAweDAxNTQKLSNkZWZpbmUgTTRQTkdfREVDT0RFUiAgICAgICAweDAxNTUKLSNkZWZpbmUgTTRQTkdfRU5DT0RFUiAgICAgICAweDAxNTYKLSNkZWZpbmUgTTRXQk1QX0RFQ09ERVIgICAgICAweDAxNTcKLSNkZWZpbmUgTTRXQk1QX0VOQ09ERVIgICAgICAweDAxNTgKLQotI2RlZmluZSBNNEFNUl9XUklURVIgICAgICAgIDB4MDE1OSAgICAvKio8IG5vIHJvb20gdG8gcHV0IGl0IGFsb25nIE00QU1SX1JFQURFUiAqLwotCi0KLSNkZWZpbmUgTTRBVkNfREVDT0RFUiAgICAgICAweDAxNUEKLSNkZWZpbmUgTTRBVkNfRU5DT0RFUiAgICAgICAweDAxNUIKLQotI2RlZmluZSBNNEFTRl9SRUFERVIgICAgICAgIDB4MDE1QwotI2RlZmluZSBNNFdNRFJNX0FHRU5UICAgICAgICAweDAxNUQKLSNkZWZpbmUgTTRNSURJX1JFQURFUiAgICAgICAgMHgwMTYyICAgIC8qKjwgbm8gcm9vbSBiZWZvcmUgdGhlIHByZXNlbnRlcnMgKi8KLSNkZWZpbmUgTTRSTV9SRUFERVIgICAgICAgICAweDE2MwotI2RlZmluZSBNNFJNVl9ERUNPREVSICAgICAgICAweDE2NAotI2RlZmluZSBNNFJNQV9ERUNPREVSICAgICAgICAweDE2NQotCi0jZGVmaW5lIE00VE9PTF9YTUwgICAgICAgICAgICAweDAxNjYKLSNkZWZpbmUgTTRUT09MX0VGUiAgICAgICAgICAgIDB4MDE2NyAgICAvKio8IERlY3J5cHRpb24gbW9kdWxlIGZvciBWaWRlbyBBcnRpc3QgKi8KLSNkZWZpbmUgTTRJQUxfRlROICAgICAgICAgICAgMHgwMTY4ICAgIC8qIEZUTiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUFMICovCi0jZGVmaW5lIE00RlROICAgICAgICAgICAgICAgIDB4MDE2OSAgICAvKiBGVE4gbGlicmFyeSAqLwotCi0vKiBwcmVzZW50ZXIgKi8KLSNkZWZpbmUgTTRQUkVTRU5URVJfQVVESU8gICAweDAxNjAKLSNkZWZpbmUgTTRQUkVTRU5URVJfVklERU8gICAweDAxNjEKLQotLyogaGlnaCBsZXZlbCBpbnRlcmZhY2VzICh2cHMsIGV0Yy4uKSovCi0jZGVmaW5lIE00VlBTICAgICAgICAgICAgICAgMHgwMTcwCi0jZGVmaW5lIE00VlRTICAgICAgICAgICAgICAgMHgwMTcxCi0jZGVmaW5lIE00VlhTICAgICAgICAgICAgICAgMHgwMTcyCi0jZGVmaW5lIE00Q0FMTEJBQ0sgICAgICAgICAgMHgwMTczCi0jZGVmaW5lIE00VkVTICAgICAgICAgICAgICAgMHgwMTc0Ci0jZGVmaW5lIE00UFJFUFJPQ0VTU19WSURFTyAgMHgwMTc1Ci0jZGVmaW5lIE00R1JBQl9BVURJTyAgICAgICAgMHgwMTc2Ci0jZGVmaW5lIE00R1JBQl9WSURFTyAgICAgICAgMHgwMTc3Ci0jZGVmaW5lIE00VlNTQVZJICAgICAgICAgICAgMHgwMTc4Ci0jZGVmaW5lIE00VlNTM0dQUCAgICAgICAgICAgMHgwMTc5Ci0jZGVmaW5lIE00UFRPM0dQUCAgICAgICAgICAgMHgwMTdBCi0jZGVmaW5lIE00UFZYX1BBUlNFUiAgICAgICAgMHgwMTdCCi0jZGVmaW5lIE00VkNTICAgICAgICAgICAgICAgIDB4MDE3QwotI2RlZmluZSBNNE1DUyAgICAgICAgICAgICAgICAweDAxN0QKLSNkZWZpbmUgTTRNTk1DICAgICAgICAgICAgICAgIDB4MDE4MCAgICAvKio8IG1ubSBjb250cm9sbGVyICovCi0jZGVmaW5lIE00VFRFWFRfUEFSU0VSICAgICAgMHgwMTgxICAgIC8qKjwgdGltZWQgdGV4dCAqLwotI2RlZmluZSBNNE1NICAgICAgICAgICAgICAgIDB4MDE4MiAgICAvKio8IE11c2ljIG1hbmFnZXIgKi8KLSNkZWZpbmUgTTRNRFAgICAgICAgICAgICAgICAgMHgwMTgzICAgIC8qKjwgTWV0YWRhdGEgcGFyc2VyICovCi0jZGVmaW5lIE00TU1TUUxDT1JFICAgICAgICAgICAgMHgwMTg0Ci0jZGVmaW5lIE00VlBTSUwgICAgICAgICAgICAgICAgMHgwMTg1Ci0jZGVmaW5lIE00RklMRUlMICAgICAgICAgICAgMHgwMTg2IC8qIElMIGZpbGUgSW50ZXJmYWNlICovCi0jZGVmaW5lIE00TVUgICAgICAgICAgICAgICAgMHgwMTg3Ci0jZGVmaW5lIE00VkVFICAgICAgICAgICAgICAgIDB4MDE4OCAgLyoqPCBWaWRlbyBlZmZlY3QgZW5naW5lICovCi0jZGVmaW5lIE00VkEgICAgICAgICAgICAgICAgMHgwMTg5IC8qIFZpZGVvQXJ0aXN0ICovCi0jZGVmaW5lIE00SlRTICAgICAgICAgICAgICAgIDB4MDE4QQotI2RlZmluZSBNNEpUU0lMICAgICAgICAgICAgICAgIDB4MDE4QgotI2RlZmluZSBNNEFJUiAgICAgICAgICAgICAgICAweDAxOEMgIC8qKjwgQUlSICovCi0jZGVmaW5lIE00U1BFICAgICAgICAgICAgICAgIDB4MDE4RCAgLyoqPCBTdGlsbCBwaWN0dXJlIGVkaXRvciAqLwotI2RlZmluZSBNNFZTICAgICAgICAgICAgICAgIDB4MDE4RSAgICAvKio8IFZpZGVvIFN0dWRpbyAoeFZTUykgKi8KLSNkZWZpbmUgTTRWRVNJTCAgICAgICAgICAgICAgICAweDAxOEYgICAgLyoqPCBWRVMgaWwgKi8KLSNkZWZpbmUgTTRJRDMgICAgICAgICAgICAgICAgMHgwMTkwICAgIC8qKjwgSUQzIFRhZyBNb2R1bGUgKi8KLSNkZWZpbmUgTTRTQyAgICAgICAgICAgICAgICAweDAxOTEgICAgLyoqPCBNZWRpYSBTY2FubmVyICovCi0jZGVmaW5lIE00VEcgICAgICAgICAgICAgICAgMHgwMTkyICAvKio8IFRodW1ibmFpbCBHZW5lcmF0b3IqLwotI2RlZmluZSBNNFRTICAgICAgICAgICAgICAgIDB4MDE5MyAgICAvKio8IFRodW1ibmFpbCBzdG9yYWdlICovCi0jZGVmaW5lIE00TUIgICAgICAgICAgICAgICAgMHgwMTk0ICAgIC8qKjwgTWVkaWEgYnJvd3NlciAqLwotCi0vKiBoaWdoIGxldmVsIGFwcGxpY2F0aW9uICh0ZXN0IG9yIGNsaWVudCBhcHApICovCi0jZGVmaW5lIE00QVBQTEkgICAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIE00VkFfQVBQTEkgICAgICAgICAgICAweDAyMDEgICAgLyoqPCBWaWRlbyBBcnRpc3QgdGVzdCBhcHBsaWNhdGlvbiAqLwotCi0vKiBleHRlcm5hbCBjb21wb25lbnRzIChIVyB2aWRlbyBjb2RlY3MsIGV0Yy4pICovCi0jZGVmaW5lIE00VkRfRVhURVJOQUwgICAgICAgIDB4MDMwMAotI2RlZmluZSBNNFZFX0VYVEVSTkFMICAgICAgICAweDAzMDEKLQotCi0vKiBwcmlvcml0eSB0byBjb21iaW5lIHdpdGggbW9kdWxlIGlkcyAqLwotI2RlZmluZSBNNEhJR0hfUFJJT1JJVFkgICAgIDB4QzAwMAotI2RlZmluZSBNNE1FRElVTV9QUklPUklUWSAgIDB4ODAwMAotI2RlZmluZSBNNExPV19QUklPUklUWSAgICAgIDB4NDAwMAotI2RlZmluZSBNNERFRkFVTFRfUFJJT1JJVFkgIDB4MDAwMAotCi0KLSNlbmRpZiAvKl9fTTRPU0FfQ09SRUlEX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UENNUl9Db3JlUmVhZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFBDTVJfQ29yZVJlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YWZjNTBjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UENNUl9Db3JlUmVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00V0FWX1dhdlJlYWRlci5oCi0gKiBAYnJpZWYgICBXQVYgUmVhZGVyIGRlY2xhcmF0aW9ucwotICogQG5vdGUgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIG9mIHRoZSBXQVYgcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotCi0KLSNkZWZpbmUgTTRQQ01DX0VSUl9QQ01fTk9UX0NPTVBMSUFOVCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRXQVZfQ09NTU9OLDB4MDAwMDAxKQotI2RlZmluZSBNNFBDTUNfRVJSX1BDTV9OT19TUEFDRV9BVkFJTCAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFdBVl9DT01NT04sMHgwMDAwMDIpCi0jZGVmaW5lIE00UENNQ19FUlJfUENNX05PVF9TVVBQT1JURUQgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIE00V0FWX0NPTU1PTiwweDAwMDAwMykKLQotI2RlZmluZSBNNFBDTUNfV0FSX0VORF9PRl9TVFJFQU0gICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNFdBVl9DT01NT04gLDB4MDAwMDAxKQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFdBVkNfRGVjb2RlclNwZWNpZmljSW5mbwotICogQGJyaWVmICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGRlY29kZXIgU3BlY2lmaWMgaW5mb3JtYXRpb25zCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgV0FWIHJlYWRlciB0byBzdG9yZSBhbGwKLSAqICAgICAgICAgICAgICBkZWNvZGVyIHNwZWNpZmljIGluZm9ybWF0aW9uczoKLSAqICAgICAgICAgICAgICAtIFNhbXBsZSBGcmVxdWVuY3kKLSAqICAgICAgICAgICAgICAtIEF2ZXJhZ2UgQnl0ZXMgcGVyIHNlY29uZAotICogICAgICAgICAgICAgIC0gTnVtYmVyIG9mIGNoYW5uZWxzICgxIG9yIDIpCi0gKiAgICAgICAgICAgICAgLSBOdW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlICg4IG9yIDE2KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9VSW50MzIgICAgU2FtcGxlRnJlcXVlbmN5OwotICAgIE00T1NBX1VJbnQzMiAgICBBdmdCeXRlc1BlclNlYzsKLSAgICBNNE9TQV9VSW50MzIgICAgRGF0YUxlbmd0aDsKLSAgICBNNE9TQV9VSW50MTYgICAgbmJDaGFubmVsczsKLSAgICBNNE9TQV9VSW50MTYgICAgQml0c1BlclNhbXBsZTsKLX0gTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm87Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRXQVZSX1N0YXRlCi0gKiBAYnJpZWYgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgV0FWIFJlYWRlciBTdGF0ZXMKLSAqIEBub3RlICAgIFRoZSBzdGF0ZSBhdXRvbWF0b24gaXMgZG9jdW1lbnRlZCBzZXBhcmF0ZWx5Ci0gKiAgICAgICAgICBjb25zdWx0IHRoZSBkZXNpZ24gc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTRQQ01SX2tJbml0ICAgID0gMHgwMDAwLAotICAgIE00UENNUl9rT3BlbmluZyA9IDB4MDEwMCwKLSAgICBNNFBDTVJfa09wZW5pbmdfc3RyZWFtUmV0cmlldmVkID0gMHgwMTAxLAotICAgIE00UENNUl9rUmVhZGluZyA9IDB4MDIwMCwKLSAgICBNNFBDTVJfa1JlYWRpbmdfbmV4dEFVICA9IDB4MDIwMSwKLSAgICBNNFBDTVJfa0Nsb3NlZCAgPSAweDAzMDAKLX0gTTRQQ01SX1N0YXRlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00V0FWUl9PcHRpb25JRAotICogQGJyaWVmICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIFdBViBSZWFkZXIgb3B0aW9ucwotICogQG5vdGUgICAgT25seSBvbmUgb3B0aW9uIGlzIGF2YWlsYWJsZToKLSAqICAgICAgICAgIC0gTTRXQVZSX2tQQ01ibG9ja1NpemU6IHNldHMgdGhlIHNpemUgb2YgdGhlIFBDTSBibG9jayB0byByZWFkCi0gKiAgICAgICAgICAgIGZyb20gV0FWIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0gewotICAgIE00UENNUl9rUENNYmxvY2tTaXplICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFdBVl9SRUFERVIsIDB4MDEpCi19IE00UENNUl9PcHRpb25JRDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRXQVZSX0NvbnRleHQKLSAqIEBicmllZiAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBXQVYgUmVhZGVyIGNvbnRleHQKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgV0FWIFJlYWRlciBjYWxscyB0byBzdG9yZQotICogICAgICAgICAgICAgIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX01lbUFkZHIzMiAgICAgICAgICAgICBtX3BEZWNvZGVyU3BlY0luZm87LyoqPCBQb2ludGVyIHRvIHRoZSBkZWNvZGVyIHNwZWNpZmljIGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGNvbnRhaW5lZCBpbiBwU3RyZWFtRGVzYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSB1c2VkIHRvIGZyZWUuLi4pICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgIG1fcEZpbGVSZWFkRnVuYzsvKio8IFRoZSBPU0FMIHNldCBvZiBwb2ludGVyIHRvIGZ1bmN0aW9uIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBtYW5hZ2VtZW50ICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgIG1fZmlsZUNvbnRleHQ7ICAvKio8IFRoZSBjb250ZXh0IG5lZWRlZCBieSBPU0FMIHRvIG1hbmFnZSBGaWxlICovCi0gICAgTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8gIG1fZGVjb2RlckNvbmZpZzsvKio8IFNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIGRlY29kZXIgKi8KLSAgICBNNFBDTVJfU3RhdGUgICAgICAgICAgICAgICAgbV9zdGF0ZTsgICAgICAgIC8qKjwgc3RhdGUgb2YgdGhlIHdhdiByZWFkZXIgKi8KLSAgICBNNFBDTVJfU3RhdGUgICAgICAgICAgICAgICAgbV9taWNyb1N0YXRlOyAgIC8qKjwgc3RhdGUgb2YgdGhlIHJlYWQgd2F2IHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBtX2Jsb2NrU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSByZWFkIGJsb2NrICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1fb2Zmc2V0OyAgICAgICAvKio8IE9mZnNldCBvZiB0aGUgUENNIHJlYWQgKGkuZSBtX29mZnNldCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSB3aXRob3V0IHdhdiBoZWFkZXIpICovCi0gICAgTTRPU0FfTWVtQWRkcjMyICAgICAgICAgICAgIG1fcEF1QnVmZmVyOyAgICAvKio8IFJlLXVzZWQgYnVmZmVyIGZvciBBVSBjb250ZW50IHN0b3JhZ2UgKi8KLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgICAgICAgbV9kYXRhU3RhcnRPZmZzZXQ7LyoqPCBvZmZzZXQgb2YgdGhlIHBjbSBkYXRhIGJlZ2lubmluZyBpbnRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSAqLwotfSBNNFBDTVJfQ29udGV4dDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgUHJvdG90eXBlcyBvZiBhbGwgV0FWIHJlYWRlciBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UENNUl9vcGVuUmVhZChNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwgTTRPU0FfVm9pZCogcFVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZUZ1bmN0aW9uKTsKLU00T1NBX0VSUiBNNFBDTVJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBwU3RyZWFtRGVzYyk7Ci1NNE9TQV9FUlIgTTRQQ01SX3N0YXJ0UmVhZGluZyhNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSURzKTsKLU00T1NBX0VSUiBNNFBDTVJfbmV4dEFVKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSk7Ci1NNE9TQV9FUlIgTTRQQ01SX2ZyZWVBVShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQVUpOwotTTRPU0FfRVJSIE00UENNUl9zZWVrKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRCwgTTRPU0FfVGltZSB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1NlZWtBY2Nlc3NNb2RlIHNlZWtBY2Nlc3NNb2RlLCBNNE9TQV9UaW1lKiBwT2J0YWluQ1RTKTsKLU00T1NBX0VSUiBNNFBDTVJfY2xvc2VSZWFkKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci1NNE9TQV9FUlIgTTRQQ01SX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UENNUl9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBWYWx1ZSk7Ci1NNE9TQV9FUlIgTTRQQ01SX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UENNUl9PcHRpb25JRCBvcHRpb25JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gVmFsdWUpOwotTTRPU0FfRVJSIE00UENNUl9nZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbik7CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl8zZ3BDb20uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSXzNncENvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMmE1YTAzLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSXzNncENvbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFJFQURFUl8zZ3BDb20uaAotICogQGJyaWVmICAgIEdlbmVyaWMgZW5jYXBzdWxhdGlvbiBvZiB0aGUgY29yZSAzZ3AgcmVhZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGdlbmVyaWMgc2hlbGwgaW50ZXJmYWNlIHJldHJpZXZpbmcgZnVuY3Rpb24KLSAqICAgICAgICAgICAgb2YgdGhlIDNHUCByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgX19NNFJFQURFUl8zR1BDT01fSF9fCi0jZGVmaW5lIF9fTTRSRUFERVJfM0dQQ09NX0hfXwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICogRXJyb3I6IEZ1bmN0aW9uIE00UkVBREVSX0NvbTNHUF9nZXROZXh0U3RyZWFtSGFuZGxlciBtdXN0IGJlIGNhbGxlZCBiZWZvcmUuCi0gKi8KLSNkZWZpbmUgTTRFUlJfTk9fVklERU9fU1RSRUFNX1JFVFJJRVZFRF9ZRVQgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNFJFQURFUl8zR1AsIDB4MDAwMDAxKQotCi0vKioKLSAqIEVycm9yOiBObyB2aWRlbyBzdHJlYW0gSDI2MyBpbiBmaWxlLgotICovCi0jZGVmaW5lIE00RVJSX1ZJREVPX05PVF9IMjYzICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRSRUFERVJfM0dQLCAweDAwMDAwMikKLQotLyoqCi0gKiBUaGVyZSBoYXMgYmVlbiBhIHByb2JsZW0gd2l0aCB0aGUgZGVjb2RlciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLCBzZWVtcyB0byBiZSBpbnZhbGlkICovCi0jZGVmaW5lIE00RVJSX1JFQURFUjNHUF9ERUNPREVSX0NPTkZJR19FUlJPUiAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRSRUFERVJfM0dQLCAweDAwMDAwMykKLQotI2RlZmluZSBNNFJFQURFUl9DT00zR1BfTUFYVklERU9TVFJFQU0gIDUKLSNkZWZpbmUgTTRSRUFERVJfQ09NM0dQX01BWEFVRElPU1RSRUFNICA1Ci0jZGVmaW5lIE00UkVBREVSX0NPTTNHUF9NQVhURVhUU1RSRUFNICAgNQotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgbV9wRkZDb250ZXh0OyAgICAvKio8IGNvcmUgZmlsZSBmb3JtYXQgY29udGV4dCAqLwotCi0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgICAgICBtX0F1ZGlvU3RyZWFtc1tNNFJFQURFUl9DT00zR1BfTUFYQVVESU9TVFJFQU1dOwotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgICAgICAgbV9wQXVkaW9TdHJlYW07ICAgIC8qKjwgcG9pbnRlciB0byB0aGUgY3VycmVudCBhbGxvY2F0ZWQgYXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBoYW5kbGVyICovCi0KLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgIG1fVmlkZW9TdHJlYW1zW000UkVBREVSX0NPTTNHUF9NQVhWSURFT1NUUkVBTV07Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgICAgICBtX3BWaWRlb1N0cmVhbTsgICAgLyoqPCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGFsbG9jYXRlZCB2aWRlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGhhbmRsZXIgKi8KLQotI2lmZGVmIE00VlBTX1NVUFBPUlRfVFRFWFQKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgIG1fVGV4dFN0cmVhbXNbTTRSRUFERVJfQ09NM0dQX01BWFRFWFRTVFJFQU1dOwotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgICAgICAgbV9wVGV4dFN0cmVhbTsgICAgLyoqPCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGFsbG9jYXRlZCB0ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gaGFuZGxlciAqLwotI2VuZGlmIC8qTTRWUFNfU1VQUE9SVF9UVEVYVCovCi0KLX0gTTRSRUFERVJfQ29tM0dQX0NvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIE00UkVBREVSXzNHUF9CdWZmZXIgKGJ1dCBub3RoaW5nIHNwZWNpZmljIHRvIDNHUCwgbm9yIHRvIGEgcmVhZGVyICEpCi0gKiBAYnJpZWYgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBidWZmZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBleGNoYW5nZSBkYXRhIChzaG91bGQgYmUgaW4gT1NBTCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICBzaXplOyAgICAgICAgICAgIC8qKjwgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgIGRhdGFBZGRyZXNzOyAgICAvKio8IHRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgKi8KLX0gTTRSRUFERVJfM0dQX0J1ZmZlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFJFQURFUl8zR1BfT3B0aW9uSUQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgcmVhZGVyIG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhlIDNHUCBmb3JtYXQuCi0gKiBAbm90ZSAgICBUaGVzZSBvcHRpb25zIGNhbiBiZSByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBhIDNHUCByZWFkZXIgdmlhIE00UkVBREVSXzNHUF9nZXRPcHRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgLyoqCi0gICAgICogR2V0IHRoZSBEZWNvZGVyQ29uZmlnSW5mbyBmb3IgSDI2MywKLSAgICAgKiBvcHRpb24gdmFsdWUgbXVzdCBiZSBhIHBvaW50ZXIgdG8gTTRSRUFERVJfM0dQX0gyNjNQcm9wZXJ0aWVzIGFsbG9jYXRlZCBieSBjYWxsZXIgKi8KLSAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0gyNjNQcm9wZXJ0aWVzID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl8zR1AsIDB4MDEpLAotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBQdXJwbGUgTGFicyBkcm0gaW5mb3JtYXRpb24gKi8KLSAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX1B1cnBsZUxhYnNEcm0gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSXzNHUCwgMHgwMiksCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIEZhc3Qgb3BlbiBtb2RlIChPbmx5IHRoZSBmaXJzdCBBVSBvZiBlYWNoIHN0cmVhbSB3aWxsIGJlIHBhcnNlZCAtPiBsZXNzIENQVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3MgUkFNKS4gKi8KLSAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX0Zhc3RPcGVuTW9kZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfV1JJVEUsIE00UkVBREVSXzNHUCwgMHgwMyksCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIEF1ZGlvIG9ubHkgbW9kZSAodGhlIHZpZGVvIHN0cmVhbSB3b24ndCBiZSBvcGVuZWQpICovCi0gICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9BdWRpb09ubHkgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNFJFQURFUl8zR1AsIDB4MDQpLAotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBWaWRlbyBvbmx5IG1vZGUgKHRoZSBhdWRpbyBzdHJlYW0gd29uJ3QgYmUgb3BlbmVkKSAqLwotICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfVmlkZW9Pbmx5ID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9XUklURSwgTTRSRUFERVJfM0dQLCAweDA1KSwKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmV4dCB2aWRlbyBDVFMgKi8KLSAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX2dldE5leHRWaWRlb0NUUyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfM0dQLCAweDA2KQotCi19IE00UkVBREVSXzNHUF9PcHRpb25JRDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMKLSAqIEBicmllZiAgICBDb250YWlucyBpbmZvIGFib3V0IEgyNjMgc3RyZWFtIHJlYWQgZnJvbSB0aGUgM0dQIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IHRoZSBwcm9maWxlIGFzIGRlZmluZWQgaW4gdGhlIFZpc3VhbCBPYmplY3QgU2VxdWVuY2UgaGVhZGVyLCBpZiBwcmVzZW50ICovCi0gICAgTTRPU0FfVUludDggICAgICAgIHVpUHJvZmlsZTsKLSAgICAvKio8IHRoZSBsZXZlbCBhcyBkZWZpbmVkIGluIHRoZSBWaXN1YWwgT2JqZWN0IFNlcXVlbmNlIGhlYWRlciwgaWYgcHJlc2VudCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICB1aUxldmVsOwotCi19IE00UkVBREVSXzNHUF9IMjYzUHJvcGVydGllczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgM2dwIGZpbGUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBNZWRpYUZhbWlseTogICAgKE9VVCkgICAgUG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkIE00UkVBREVSX01lZGlhRmFtaWx5IHRoYXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGZpbGxlZCB3aXRoIHRoZSBtZWRpYSBmYW1pbHkgb2YgdGhlIGZvdW5kIHN0cmVhbQotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAgICAoT1VUKSAgICBQb2ludGVyIHRvIGEgc3RyZWFtIGhhbmRsZXIgdGhhdCB3aWxsIGJlIGFsbG9jYXRlZCBhbmQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIGZvdW5kIHN0cmVhbSBkZXNjcmlwdGlvbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICAgTm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYSAoYWxsIHN0cmVhbXMgZm91bmQpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0NvbTNHUF9nZXROZXh0U3RyZWFtSGFuZGxlcihNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgKnBNZWRpYUZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICoqcFN0cmVhbUhhbmRsZXIpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBQcmVwYXJlIHRoZSAgYWNjZXNzIHVuaXQgKEFVKQotICogQG5vdGUgICAgQW4gQVUgaXMgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGFtb3VudCBvZiBkYXRhIHRvIGJlIGRlY29kZWQgYnkgYSBkZWNvZGVyLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICAgICAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQgICAgICAgIChJTi9PVVQpICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQgdG8gZmlsbCB3aXRoIHJlYWQgZGF0YQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlIGF1IHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIsIGFuZCBtdXN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgTTRSRUFERVJfZmlsbEF1U3RydWN0X2ZjdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciBjcmVhdGlvbikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm5zICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQ29tM0dQX2ZpbGxBdVN0cnVjdChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIENsZWFucyB1cCB0aGUgc3RyZWFtIGhhbmRsZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogKElOL09VVCkgQ29udGV4dCBvZiB0aGUgcmVhZGVyIHNoZWxsCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6IChJTi9PVVQpIFN0cmVhbSBoYW5kbGVyCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgVGhlIGNvbnRleHQgaXMgbnVsbAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0NvbTNHUF9jbGVhblVwSGFuZGxlcihNNF9TdHJlYW1IYW5kbGVyKiBwU3RyZWFtSGFuZGxlcik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBfX000UkVBREVSXzNHUENPTV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfQW1yLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9BbXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjZlN2Y5Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9BbXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRSRUFERVJfQW1yLmgKLSAqIEBicmllZiAgR2VuZXJpYyBlbmNhcHN1bGF0aW9uIG9mIHRoZSBjb3JlIGFtciByZWFkZXIKLSAqIEBub3RlICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBnZW5lcmljIHNoZWxsIGludGVyZmFjZSByZXRyaWV2aW5nIGZ1bmN0aW9uCi0gKiAgICAgICAgIG9mIHRoZSBBTVIgcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000UkVBREVSX0FNUl9IX18KLSNkZWZpbmUgX19NNFJFQURFUl9BTVJfSF9fCi0KLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmIFJldHJpZXZlcyB0aGUgZ2VuZXJpYyBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZSByZWFkZXIKLSoKLSogQHBhcmFtIHBNZWRpYVR5cGUgICAgICAgICAgICAgOiBQb2ludGVyIG9uIGEgTTRSRUFERVJfTWVkaWFUeXBlIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgcmVhZGVyCi0qIEBwYXJhbSBwUmRyR2xvYmFsSW50ZXJmYWNlIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZ2xvYmFsIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoaXMgcmVhZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSogQHBhcmFtIHBSZHJEYXRhSW50ZXJmYWNlICAgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBkYXRhIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoaXMgcmVhZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSoKLSogQHJldHVybnMgOiBNNE5PX0VSUk9SICAgICBpZiBPSwotKiAgICAgICAgICAgICBFUlJfQUxMT0MgICAgICBpZiBhbiBhbGxvY2F0aW9uIGZhaWxlZAotKiAgICAgICAgICAgIEVSUl9QQVJBTUVURVIgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLypfX000UkVBREVSX0FNUl9IX18qLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFJFQURFUl9Db21tb24uaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX0NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODYzYTdlLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX0NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00UkVBREVSX0NvbW1vbi5oCi0gKiBAYnJpZWYgIFNoZWxsIFJlYWRlciBjb21tb24gaW50ZXJmYWNlIGRlY2xhcmF0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgY29tbW9uIGludGVyZmFjZXMgdGhhdCByZWFkZXIgc2hlbGxzIG11c3QgaW1wbGVtZW50Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNFJFQURFUl9DT01NT05fSF9fCi0jZGVmaW5lIF9fTTRSRUFERVJfQ09NTU9OX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLSNpbmNsdWRlICJNNERBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRDb21tb25fdHlwZXMuaCIKLQotLyogRVJST1JTICovCi0jZGVmaW5lIE00RVJSX1JFQURFUl9VTktOT1dOX1NUUkVBTV9UWVBFICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUiwgTTRSRUFERVJfQ09NTU9OLCAweDAwMDEpCi0KLS8qIFdBUk5JTkdTICovCi0jZGVmaW5lIE00V0FSX1JFQURFUl9OT19NRVRBREFUQSAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRSRUFERVJfQ09NTU9OLCAweDAwMDEpCi0jZGVmaW5lIE00V0FSX1JFQURFUl9JTkZPUk1BVElPTl9OT1RfUFJFU0VOVCAgICBNNE9TQV9FUlJfQ1JFQVRFKE00X1dBUiwgTTRSRUFERVJfQ09NTU9OLCAweDAwMDIpCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgTWVkaWEgdHlwZXMgdXNlZCB0byBjcmVhdGUgbWVkaWEgcmVhZGVycwotICogQG5vdGUgICAgVGhpcyBlbnVtIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgVlBTIHRvIGlkZW50aWZ5IGEgY3VycmVudGx5IHN1cHBvcnRlZAotICogICAgICAgICAgbWVkaWEgcmVhZGVyIGludGVyZmFjZS4gRWFjaCByZWFkZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIG9uZSBvZiB0aGlzIHR5cGUgYXNzb2NpYXRlZC4KLSAqICAgICAgICAgIFdoZW4gYSByZWFkZXIgaW5zdGFuY2UgaXMgbmVlZGVkLCB0aGlzIHR5cGUgaXMgdXNlZCB0byBpZGVudGlmeSBhbmQKLSAqICAgICAgICAgIGFuZCByZXRyaWV2ZSBpdHMgaW50ZXJmYWNlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00UkVBREVSX2tNZWRpYVR5cGVVbmtub3duICAgICAgICA9IC0xLCAgICAvKio8IFVua25vd24gbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGUzR1BQICAgICAgICAgICAgPSAwLCAgICAvKio8IDNHUFAgZmlsZSBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUFWSSAgICAgICAgICAgID0gMSwgICAgLyoqPCBBVkkgZmlsZSBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUFNUiAgICAgICAgICAgID0gMiwgICAgLyoqPCBBTVIgZmlsZSBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZU1QMyAgICAgICAgICAgID0gMywgICAgLyoqPCBNUDMgZmlsZSBtZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZVJUU1AgICAgICAgICAgICA9IDQsICAgIC8qKjwgUlRTUCBuZXR3b3JrIGFjY2Vzc2VkIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlM0dQUEhUVFAgICAgICAgID0gNSwgICAgLyoqPCBQcm9ncmVzc2l2ZWx5IGRvd25sb2FkZWQgM0dQUCBmaWxlIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlUFZIVFRQICAgICAgICA9IDYsICAgIC8qKjwgUGFja2V0IFZpZGVvIEhUVFAgcHJvcHJpZXRhcnkgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVXQVYgICAgICAgICAgICA9IDcsICAgIC8qKjwgV0FWIGZpbGUgbWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGUzR1BFWFRIVFRQICAgID0gOCwgICAgLyoqPCBBbiBleHRlcm5hbCBwcm9ncmVzc2l2ZWx5IGRvd25sb2FkZWQgM0dQUCBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQUFDICAgICAgICAgICAgPSA5LCAgICAvKio8IEFEVFMgYW5kIEFESUYgQUFDIHN1cHBvcnQgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlUkVBTCAgICAgICAgICAgID0gMTAsICAgIC8qKjwgUkVBTCBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUFTRiAgICAgICAgICAgID0gMTEsICAgIC8qKjwgQVNGIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlRkxFWFRJTUUgICAgICAgID0gMTIsICAgIC8qKjwgRmxleFRpbWUgTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVCQkEgICAgICAgICAgICA9IDEzLCAgICAvKio8IEJlYXRicmV3IGF1ZGlvIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlU1lOVEhBVURJTyAgICA9IDE0LCAgICAvKio8IFN5bnRoZXNpcyBhdWRpbyBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZVBDTSAgICAgICAgICAgID0gMTUsICAgIC8qKjwgUENNIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlSlBFRyAgICAgICAgICAgID0gMTYsICAgIC8qKjwgSlBFRyBNZWRpYSB0eXBlICovCi0gICAgTTRSRUFERVJfa01lZGlhVHlwZUdJRiAgICAgICAgICAgID0gMTcsICAgIC8qKjwgR0lGIE1lZGlhIHR5cGUgKi8KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlQURJRiAgICAgICAgICAgID0gMTgsICAgIC8qKjwgQUFDLUFEVFMgTWVkaWEgdHlwZSAqLwotICAgIE00UkVBREVSX2tNZWRpYVR5cGVBRFRTICAgICAgICAgICAgPSAxOSwgICAgLyoqPCBBQUMtQURUUyBNZWRpYSB0eXBlICovCi0KLSAgICBNNFJFQURFUl9rTWVkaWFUeXBlX05CICAvKiBudW1iZXIgb2YgcmVhZGVycywga2VlcCBpdCBhcyBsYXN0IGVudW0gZW50cnkgKi8KLQotfSBNNFJFQURFUl9NZWRpYVR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRSRUFERVJfTWVkaWFGYW1pbHkKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgTWVkaWEgZmFtaWx5IG9mIGEgc3RyZWFtCi0gKiBAbm90ZSAgICBUaGlzIGVudW0gaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBWUFMgdG8gaWRlbnRpZnkgd2hhdCBraW5kIG9mIHN0cmVhbQotICogICAgICAgICAgaGFzIGJlZW4gcmV0cmlldmVkIHZpYSBnZXROZXh0U3RyZWFtKCkgZnVuY3Rpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRSRUFERVJfa01lZGlhRmFtaWx5VW5rbm93biAgID0gLTEsCi0gICAgTTRSRUFERVJfa01lZGlhRmFtaWx5VmlkZW8gICAgID0gMCwKLSAgICBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbyAgICAgPSAxLAotICAgIE00UkVBREVSX2tNZWRpYUZhbWlseVRleHQgICAgICA9IDIKLX0gTTRSRUFERVJfTWVkaWFGYW1pbHk7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00UkVBREVSX09wdGlvbklECi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIHJlYWRlciBvcHRpb25zCi0gKiBAbm90ZSAgICBUaGVzZSBvcHRpb25zIGNhbiBiZSByZWFkIGZyb20gYSByZWFkZXIgdmlhIE00UkVBREVSX2dldE9wdGlvbl9mY3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICAvKioKLSAgICBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSBtb3ZpZSAoaW4gbXMpCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfRHVyYXRpb24gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMCksCi0KLSAgICAvKioKLSAgICBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIGNvcmUgcmVhZGVyCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfVmVyc2lvbiAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMSksCi0KLSAgICAvKioKLSAgICBHZXQgdGhlIGNvcHlyaWdodCBmcm9tIHRoZSBtZWRpYSAoaWYgcHJlc2VudCkKLSAgICAoY3VycmVudGx5IGltcGxlbWVudGVkIGZvciAzR1BQIG9ubHk6IGNvcHlyaWdodCBnZXQgZnJvbSB0aGUgY3BydCBhdG9tIGluIHRoZSB1ZHRhIGlmIHByZXNlbnQpCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfQ29weXJpZ2h0PSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMiksCi0KLQotICAgIC8qKgotICAgIFNldCB0aGUgT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMgdG8gdGhlIHJlYWRlciAodHlwZSBvZiB2YWx1ZTogTTRPU0FfRmlsZVJlYWRQb2ludGVyKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0ciA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0NPTU1PTiwgMyksCi0KLSAgICAvKioKLSAgICBTZXQgdGhlIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zIHRvIHRoZSByZWFkZXIgKHR5cGUgb2YgdmFsdWU6IE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlV3JpdGVyRmN0c1B0ciA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0NPTU1PTiwgNCksCi0KLSAgICAvKioKLSAgICBTZXQgdGhlIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zIHRvIHRoZSByZWFkZXIgKHR5cGUgb2YgdmFsdWU6IE00T1NBX05ldEZ1bmN0aW9uKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FOZXRGY3RzUHRyID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDUpLAotCi0gICAgLyoqCi0gICAgQ3JlYXRpb24gdGltZSBpbiBzZWMuIHNpbmNlIG1pZG5pZ2h0LCBKYW4uIDEsIDE5NzAgKHR5cGUgb2YgdmFsdWU6IE00T1NBX1VJbnQzMiopCi0gICAgKGF2YWlsYWJsZSBvbmx5IGZvciAzR1BQIGNvbnRlbnQsIGluY2x1ZGluZyBQR0QpCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfQ3JlYXRpb25UaW1lID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDYpLAotCi0gICAgLyoqCi0gICAgQml0cmF0ZSBpbiBicHMgKHR5cGUgb2YgdmFsdWU6IE00T1NBX0RvdWJsZSopCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCA3KSwKLQotICAgIC8qKgotICAgIFRhZyBJRDN2MSBvZiBNUDMgc291cmNlICh0eXBlIG9mIHZhbHVlOiBNNE1QM1JfSUQzVGFnKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MVRhZyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCA4KSwKLQotICAgIC8qKgotICAgIFRhZyBJRDN2MiBvZiBNUDMgc291cmNlICh0eXBlIG9mIHZhbHVlOiBNNE1QM1JfSUQzVGFnKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MlRhZyA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCA5KSwKLQotICAgIC8qKgotICAgIE51bWJlciBvZiBBY2Nlc3MgVW5pdCBpbiB0aGUgQXVkaW8gc3RyZWFtICh0eXBlIG9mIHZhbHVlOiBNNE9TQV9VSW50MzIqKQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0dldE51bWJlck9mQXVkaW9BdSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweEEpLAotCi0gICAgLyoqCi0gICAgTnVtYmVyIG9mIGZyYW1lcyBwZXIgYmxvYwotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0dldE5iZnJhbWVQZXJCbG9jICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9DT01NT04sIDB4QiksCi0KLSAgICAvKioKLSAgICBGbGFnIGZvciBwcm90ZWN0aW9uIHByZXNlbmNlCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfR2V0UHJvdGVjdFByZXNlbmNlICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9DT01NT04sIDB4QyksCi0KLSAgICAvKioKLSAgICBTZXQgRFJNIENvbnRleHQKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9TZXREUk1Db250ZXh0ICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4RCksCi0KLSAgICAvKioKLSAgICBHZXQgQVNGIENvbnRlbnQgRGVzY3JpcHRpb24gT2JqZWN0Ci0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfQ29udGVudERlc2NyaXB0aW9uID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4RSksCi0KLSAgICAvKioKLSAgICBHZXQgQVNGIENvbnRlbnQgRGVzY3JpcHRpb24gT2JqZWN0Ci0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfRXh0ZW5kZWRDb250ZW50RGVzY3JpcHRpb24gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0NPTU1PTiwgMHhGKSwKLQotICAgIC8qKgotICAgIEdldCBBc3NldCAzZ3BwIEZpZWxkcwotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEXzNncEFzc2V0RmllbGRzID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MTApLAotCi0gICAgLyoqCi0gICAgU2V0IHRoZSBtYXggbWV0YWRhdGEgc2l6ZSBzdXBwb3J0ZWQgaW4gdGhlIHJlYWRlcgotICAgIE9ubHkgcmVsZXZhbnQgaW4gM2dwIHBhcnNlciB0aWxsIG5vdywgYnV0IGNhbiBiZSB1c2VkIGZvciBvdGhlciByZWFkZXJzCi0gICAgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfTWF4TWV0YWRhdGFTaXplID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9XUklURSwgTTRSRUFERVJfQ09NTU9OLCAweDExKSwKLQotICAgIE00UkVBREVSX2tPcHRpb25JRF9HZXRNZXRhZGF0YSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDEyKSwKLSAgICAvKioKLSAgICBHZXQgM2dwcCAnZnR5cCcgYXRvbQotICAgICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEXzNncEZ0eXBCb3ggID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MTMpLAotCi0KLSAgICAvKiB2YWx1ZSBpcyBNNE9TQV9Cb29sKiAqLwotICAgIC8qIHJldHVybiB0aGUgZHJtIHByb3RlY3Rpb24gc3RhdHVzIG9mIHRoZSBmaWxlKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfaXNQcm90ZWN0ZWQgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxNCksCi0KLSAgICAvKiB2YWx1ZSBpcyBhIHZvaWQqICovCi0gICAgLyogcmV0dXJuIHRoZSBhZ2dyZWdhdGUgcmlnaHRzIG9mIHRoZSBmaWxlKi8KLSAgICAvKiBUaGUgYnVmZmVyIG11c3QgYmUgYWxsb2NhdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhbmQgbXVzdCBiZSBiaWcgZW5vdWdoKi8KLSAgICAvKiBCeSBkZWZhdWx0LCB0aGUgc2l6ZSBmb3IgV01EUk0gaXMgNzYgYnl0ZXMgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfZ2V0QWdncmVnYXRlUmlnaHRzID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MTUpLAotICAgIC8qKgotICAgIEdldCBBU0YgQ29udGVudCBEZXNjcmlwdGlvbiBPYmplY3QKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9FeHRlbmRlZENvbnRlbnRFbmNyeXB0aW9uID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0NPTU1PTiwgMHgxNiksCi0KLSAgICAvKioKLSAgICBOdW1iZXIgb2YgQWNjZXNzIFVuaXQgaW4gdGhlIFZpZGVvIHN0cmVhbSAodHlwZSBvZiB2YWx1ZTogTTRPU0FfVUludDMyKikKLSAgICAqLwotICAgIE00UkVBREVSX2tPcHRpb25JRF9HZXROdW1iZXJPZlZpZGVvQXUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxNyksCi0KLSAgICAvKioKLSAgICBDaHVuayBtb2RlIGFjdGl2YXRpb24gIHNpemUgaW4gY2FzZSBvZiBKUEcgcmVhZGVyICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0pwZWdDaHVuY2tTaXplID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURShNNF9SRUFELCBNNFJFQURFUl9DT01NT04sIDB4MTgpLAotCi0gICAgLyoqCi0gICAgQ2hlY2sgaWYgQVNGIGZpbGUgY29udGFpbnMgdmlkZW8gKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfaGFzVmlkZW8gPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgxOSksCi0KLSAgICAvKioKLSAgICAgU2V0IHNwZWNpZmljIHJlYWQgbW9kZSBmb3IgUmFuZG9tIEFjY2VzcyBKUEVHICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0pwZWdSQU1vZGUgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1dSSVRFLCBNNFJFQURFUl9DT01NT04sIDB4MjApLAotCi0gICAgLyoqCi0gICAgR2V0IFRodW1ibmFpbCBidWZmZXIgaW4gY2FzZSBvZiBKUEcgcmVhZGVyICovCi0gICAgTTRSRUFERVJfa09wdGlvbklEX0pwZWdUaHVtYm5haWwgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFKE00X1JFQUQsIE00UkVBREVSX0NPTU1PTiwgMHgyMSksCi0KLSAgICAvKioKLSAgICBHZXQgRlBEQVRBIGJ1ZmZlciBpbiBjYXNlIG9mIEpQRyByZWFkZXIgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfSnBlZ0ZQRGF0YSA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDIyKSwKLQotICAgIC8qKgotICAgIEdldCBKUEVHIGluZm8gKHByb2dyZXNzaXZlLCBzdWJzYW1wbGluZykgKi8KLSAgICBNNFJFQURFUl9rT3B0aW9uSURfSnBlZ0luZm89IE00T1NBX09QVElPTl9JRF9DUkVBVEUoTTRfUkVBRCwgTTRSRUFERVJfQ09NTU9OLCAweDIzKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLX0gTTRSRUFERVJfT3B0aW9uSUQ7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX0NvcHlSaWdodAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGEgY29weVJpZ2h0IGRlc2NyaXB0aW9uCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgY29weVJpZ2h0IG9mIHRoZSBtZWRpYQotICogICAgICAgICAgICAgIChpZiBwcmVzZW50KSB2aWEgdGhlIGdldE9wdGlvbigpIGZ1bmN0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000UkVBREVSX0NvcHlSaWdodAotewotICAgIC8qKgotICAgIFBvaW50ZXIgdG8gY29weXJpZ2h0IGRhdGEgKGFsbG9jYXRlZCBieSB1c2VyKQotICAgICovCi0gICAgTTRPU0FfVUludDgqICAgbV9wQ29weVJpZ2h0OwotCi0gICAgLyoqCi0gICAgUG9pbnRlciB0byBjb3B5cmlnaHQgc2l6ZS4gVGhlIHBDb3B5UmlnaHRTaXplIG11c3QKLSAgICBiZSBJbml0aWFsaXplZCB3aXRoIHRoZSBzaXplIGF2YWlsYWJsZSBpbiB0aGUgcENvcHlSaWdodCBidWZmZXIKLSAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgIG1fdWlDb3B5UmlnaHRTaXplOwotCi19IE00UkVBREVSX0NvcHlSaWdodDsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX1N0cmVhbURhdGFPcHRpb24KLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIGdlbmVyaWMgc3RyZWFtIGRhdGEgb3B0aW9uCi0gKiBAbm90ZSAgICAgICAgSXQgaXMgdXNlZCBpcyB1c2VkIHRvIHNldCBvciBnZXQgYSBzdHJlYW0gc3BlY2lmaWMgZGF0YSBkZWZpbmVkCi0gKiAgICAgICAgICAgICAgYnkgYSByZWxldmFudCByZWFkZXIgb3B0aW9uIElELgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9NNFJFQURFUl9TdHJlYW1EYXRhT3B0aW9uCi17Ci0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgIG1fcFN0cmVhbUhhbmRsZXI7IC8qKjwgaWRlbnRpZmllciBvZiB0aGUgc3RyZWFtICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgIG1fcE9wdGlvblZhbHVlOyAgIC8qKjwgdmFsdWUgb2YgdGhlIGRhdGEgb3B0aW9uIHRvIGdldCBvciB0byBzZXQgKi8KLQotfSBNNFJFQURFUl9TdHJlYW1EYXRhT3B0aW9uOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW1lcmF0aW9uICAgIE00X0VuY29kaW5nRm9ybWF0Ci0gKiBAYnJpZWYgICAgICAgIFRleHQgZW5jb2RpbmcgZm9ybWF0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLy8gdHlwZWRlZiBlbnVtCi0vLyB7Ci0vLyAgICAgTTRfa0VuY0Zvcm1hdFVua25vd24gICAgPSAwLCAgICAvKio8IFVua25vd24gZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8vICAgICBNNF9rRW5jRm9ybWF0QVNDSUkgICAgICAgID0gMSwgIC8qKjwgSVNPLTg4NTktMS4gVGVybWluYXRlZCB3aXRoICQwMCAgICAgICAgICAgICAgICAgICAqLwotLy8gICAgIE00X2tFbmNGb3JtYXRVVEY4ICAgICAgICA9IDIsICAgLyoqPCBVVEYtOCBlbmNvZGVkIFVuaWNvZGUgLiBUZXJtaW5hdGVkIHdpdGggJDAwICAgICAgICovCi0vLyAgICAgTTRfa0VuY0Zvcm1hdFVURjE2ICAgICAgICA9IDMgICAvKio8IFVURi0xNiBlbmNvZGVkIFVuaWNvZGUuIFRlcm1pbmF0ZWQgd2l0aCAkMDAgMDAgICAgKi8KLS8qfSAgTTRfRW5jb2RpbmdGb3JtYXQ7Ki8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfU3RyaW5nQXR0cmlidXRlcwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHN0cmluZyBhdHRyaWJ1dGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vLyB0eXBlZGVmIHN0cnVjdAotLy8gewotLy8gICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgbV9wU3RyaW5nOyAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byB0ZXh0ICAgICAgICAqLwotLy8gICAgIE00T1NBX1VJbnQzMiAgICAgICAgbV91aVNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRleHQgICAgICAgICAgICAqLwotLy8gICAgIE00X0VuY29kaW5nRm9ybWF0ICAgIG1fRW5jb2RpbmdGb3JtYXQ7ICAgIC8qKjwgVGV4dCBlbmNvZGluZyBmb3JtYXQgICAgKi8KLS8vIH0gTTRfU3RyaW5nQXR0cmlidXRlczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFJFQURFUl9CdWZmZXIKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIGJ1ZmZlciBpbiBhbGwgcmVhZGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDgqICAgbV9wRGF0YTsKLSAgICBNNE9TQV9VSW50MzIgICBtX3VpQnVmZmVyU2l6ZTsKLX0gTTRSRUFERVJfQnVmZmVyOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3VpU2Vzc2lvbklkOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlNZWRpYUlkOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlOYkluc3RhbmNlOwotICAgIE00T1NBX0NoYXIqKiAgICAgICAgICAgIG1fcEluc3RhbmNlOwotfSBNNF9TZHBBc3NldEluc3RhbmNlOwotLyoKLXR5cGVkZWYgZW51bQotewotICAgICBNNFJFQURFUl9rVW5rbm93bkZvcm1hdCAgICA9IDAsCi0gICAgIE00UkVBREVSX2tUYWdJRDNWMSwKLSAgICAgTTRSRUFERVJfa1RhZ0lEM1YyLAotICAgIE00UkVBREVSX2tBU0ZDb250ZW50RGVzYywKLSAgICBNNFJFQURFUl9rM0dwcEFzc2V0Qm94RnJvbVVEVEEsCi0gICAgTTRSRUFERVJfazNHcHBBc3NldEJveEZyb21TRFAsCi0gICAgTTRSRUFERVJfa0pwZWdFeGlmCi19IE00UkVBREVSX01ldGFEYXRhVHlwZTsqLwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00XzNncEFzc2V0RmllbGRzCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgZmllbGRzIG9mIGEgM2dwcCBhc3NldCBpbmZvcm1hdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRDT01NT05fTWV0YURhdGFGaWVsZHMgICAgbV9tZXRhZGF0YTsKLQotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlTZXNzaW9uSUQ7ICAgIC8qIEZvciBTRFAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3VpTWVkaWFJRDsgICAgLyogRm9yIFNEUCAqLwotCi0KLSAgICAvKiBOb3RlOiBUaGUgdHdvIGZvbGxvd2luZyBmaWVsZHMgd2VyZSBhZGRlZCBmb3IgaW50ZXJuYWwgdXNlCi0gICAgICAgIChGb3IgTXVzaWMgbWFuYWdlciBwcm9qZWN0Li4pICEhICovCi0gICAgTTRfU3RyZWFtVHlwZSAgICAgICBtX1ZpZGVvU3RyZWFtVHlwZTsgICAgLyoqPCBWaWRlbyBzdHJlYW0gdHlwZSAqLwotICAgIE00X1N0cmVhbVR5cGUgICAgICAgbV9BdWRpb1N0cmVhbVR5cGU7ICAgIC8qKjwgQXVkaW8gc3RyZWFtIHR5cGUgKi8KLQotfSBNNF9NZXRhRGF0YUZpZWxkczsKLQotCi0jZGVmaW5lIE00X01FVEFEQVRBX1NUUl9OQiAgICAyMiAvKiBvbmUgc3RyaW5nIGluIGFsYnVtIGFydCBzdHJ1Y3R1cmUqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fdWlOYkJ1ZmZlcjsKLSAgICBNNF9TZHBBc3NldEluc3RhbmNlKiAgICBtX3BBc3NldEluZm9JbnN0OyAgICAvKiBTZXQgb2YgM2dwcCBhc3NldCBib3hlcyAqLwotICAgIE00Q09NTU9OX01ldGFEYXRhQWxidW1BcnQgICAgICAgIG1fYWxidW1BcnQ7ICAgICAgICAgICAgLyogUkM6IFBWIHNwZWNpZmljIGFsYnVtIGFydDphZGRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSBiZWNhdXNlIHRoaXMgdHlwZSBpcyB1c2VkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBiZWxvdyBpbiBzdHJlYW1pbmcgKi8KLQotfSBNNFJFQURFUl9uZXRJbmZvczsKLQotCi10eXBlZGVmIHVuaW9uCi17Ci0gICAgTTRSRUFERVJfQnVmZmVyICAgICAgICBtX3BUYWdJRDNCdWZmZXJbMl07ICAgICAgICAvKiBUYWcgSUQzIFYxLCBWMiAqLwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgICAgTTRSRUFERVJfQnVmZmVyICAgICAgICBtX3BBc2ZEZXNjQ29udGVudDsgICAgLyogQVNGIGRlc2NyaXB0aW9uIGNvbnRlbnQgYnVmZmVyICovCi0gICAgICAgIE00UkVBREVSX0J1ZmZlciAgICAgICAgbV9wQXNmRXh0RGVzY0NvbnRlbnQ7IC8qIEFTRiBleHRlbmRlZCBkZXNjcmlwdGlvbiBjb250ZW50IGJ1ZmZlciAqLwotICAgIH0gbV9hc2Y7Ci0gICAgTTRfTWV0YURhdGFGaWVsZHMgICAgbV9wTWV0YWRhdGFGaWVsZHM7ICAgICAgLyogQWxyZWFkeSBwYXJzZWQgYW5kIGZpbGxlZCAzZ3BwIGFzc2V0IGZpZWxkcyAqLwotICAgIE00UkVBREVSX25ldEluZm9zICAgIG1fcEFzc2V0SW5mb0luc3RhbmNlOyAgIC8qIFNldCBvZiAzZ3BwIGFzc2V0IGJveGVzIGluIHRoZSBzZHAgZmlsZSAqLwotCi19IE00X01ldGFkYXRhQnVmZmVyOwotCi0KLQotCi0vKioqKioqKioqKiogUkVBREVSIEdMT0JBTCBJbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlYWRlcgotICogQG5vdGUgICAgY3JlYXRlIHRoZSBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgKE9VVCkgICAgcG9pbnRlciBvbiBhIHJlYWRlciBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfY3JlYXRlX2ZjdCkgICAgICAgICAgKE00T1NBX0NvbnRleHQqIHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZGVzdHJveSB0aGUgaW5zdGFuY2Ugb2YgdGhlIHJlYWRlcgotICogQG5vdGUgICAgYWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb250ZXh0IGlzIGludmFsaWQKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX2Rlc3Ryb3lfZmN0KSAgICAgICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIG9wZW4gdGhlIHJlYWRlciBhbmQgaW5pdGlhbGl6ZXMgaXRzIGNyZWF0ZWQgaW5zdGFuY2UKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24sIGZvciB0aGUgbmV0d29yayByZWFkZXIsIHNlbmRzIHRoZSBERVNDUklCRQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwRmlsZURlc2NyaXB0b3I6ICAgIChJTikgICAgUG9pbnRlciB0byBwcm9wcmlldGFyeSBkYXRhIGlkZW50aWZ5aW5nIHRoZSBtZWRpYSB0byBvcGVuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX29wZW5fZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNsb3NlIHRoZSByZWFkZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgICAoTTRSRUFERVJfY2xvc2VfZmN0KSAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldCB0aGUgbmV4dCBzdHJlYW0gZm91bmQgaW4gdGhlIG1lZGlhCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBNZWRpYUZhbWlseTogICAgKE9VVCkgICAgcG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkIE00UkVBREVSX01lZGlhRmFtaWx5IHRoYXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIGZhbWlseSBvZiB0aGUgZm91bmQgc3RyZWFtCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6ICAgIChPVVQpICAgIHBvaW50ZXIgdG8gYSBzdHJlYW0gaGFuZGxlciB0aGF0IHdpbGwgYmUgYWxsb2NhdGVkIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgd2l0aCB0aGUgZm91bmQgc3RyZWFtIGRlc2NyaXB0aW9uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYSAoYWxsIHN0cmVhbXMgZm91bmQpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UkVBREVSX2dldE5leHRTdHJlYW1fZmN0KSAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX01lZGlhRmFtaWx5ICpwTWVkaWFGYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKipwU3RyZWFtSGFuZGxlcik7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZmlsbCB0aGUgYWNjZXNzIHVuaXQgc3RydWN0dXJlIHdpdGggaW5pdGlhbGl6YXRpb24gdmFsdWVzCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogICAgKElOKSAgICAgcG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgdG8gd2hpY2ggdGhlIGFjY2VzcyB1bml0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGFzc29jaWF0ZWQKLSAqIEBwYXJhbSAgICBwQWNjZXNzVW5pdDogICAgKElOL09VVCkgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaW5pdGlhbGl6ZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfZmlsbEF1U3RydWN0X2ZjdCkgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBzdGFydHMgdGhlIGluc3RhbmNlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIG9ubHkgbmVlZGVkIGZvciBuZXR3b3JrIHVudGlsIG5vdy4uLgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9zdGFydF9mY3QpICAgKE00T1NBX0NvbnRleHQgY29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIHN0b3AgcmVhZGluZwotICogQG5vdGUgICAgb25seSBuZWVkZWQgZm9yIG5ldHdvcmsgdW50aWwgbm93Li4uIChtYWtlcyBhIHBhdXNlKQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9zdG9wX2ZjdCkgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBnZXQgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIHJlYWRlcgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLXRoZSBkdXJhdGlvbiBvZiB0aGUgbG9uZ2VzdCBzdHJlYW0gb2YgdGhlIG1lZGlhCi0gKiAgICAgICAgICAtdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSByZWFkZXIKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIGdldAotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAgICAoT1VUKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFJFQURFUl9nZXRPcHRpb25fZmN0KSAgICAgICAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgc2V0IGVuIG9wdGlvbiB2YWx1ZSBvZiB0aGUgcmVhZGRlcgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZToKLSAqICAgICAgICAgIC0gbm90aGluZyBmb3IgdGhlIG1vbWVudAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgICAgIChJTikgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKSB3aGVyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgICAgIHdoZW4gdGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoTTRSRUFERVJfc2V0T3B0aW9uX2ZjdCkgICAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBqdW1wIGludG8gdGhlIHN0cmVhbSBhdCB0aGUgc3BlY2lmaWVkIHRpbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAgIChJTikgICAgIHRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgIHBUaW1lICAgICAgICAgICAgKElOL09VVCkgSU46ICB0aGUgdGltZSB0byBqdW1wIHRvIChpbiBtcykKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogdGhlIHRpbWUgdG8gd2hpY2ggdGhlIHN0cmVhbSByZWFsbHkganVtcGVkCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgICAgIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAgKE00UkVBREVSX2p1bXBfZmN0KSAgICAgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIqIHBUaW1lKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICByZXNldCB0aGUgc3RyZWFtLCB0aGF0IGlzIHNlZWsgaXQgdG8gYmVnaW5uaW5nIGFuZCBtYWtlIGl0IHJlYWR5IHRvIGJlIHJlYWQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIgICAgKElOKSAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byByZXNldAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgICAgICB0aGUgc3RyZWFtSUQgZG9lcyBub3QgZXhpc3QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgIChNNFJFQURFUl9yZXNldF9mY3QpICAgIChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcik7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZ2V0IHRoZSB0aW1lIG9mIHRoZSBjbG9zZXN0IFJBUCBhY2Nlc3MgdW5pdCBiZWZvcmUgdGhlIGdpdmVuIHRpbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAgIChJTikgICAgIHRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIHNlYXJjaAotICogQHBhcmFtICAgIHBUaW1lICAgICAgICAgICAgKElOL09VVCkgSU46ICB0aGUgdGltZSB0byBzZWFyY2ggZnJvbSAoaW4gbXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IHRoZSB0aW1lIChjdHMpIG9mIHRoZSBwcmVjZWRpbmcgUkFQIEFVLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgICAgIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSICAgKE00UkVBREVSX2dldFByZXZSYXBUaW1lX2ZjdCkgKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiogcFRpbWUpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZQotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBnZW5lcmljIG1lZGlhIHJlYWRlciBHTE9CQUwgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBwb2ludGVycyB0byBmdW5jdGlvbnMgY29uY2VybmluZwotICogICAgICAgICAgICAgICAgY3JlYXRpb24gYW5kIGNvbnRyb2wgb2Ygb25lIHJlYWRlciB0eXBlLgotICogICAgICAgICAgICAgICAgVGhlIHJlYWRlciB0eXBlIGlzIG9uZSBvZiB0aGUgTTRSRUFERVJfTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000UkVBREVSX0dsb2JhbEludGVyZmFjZQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00UkVBREVSX2NyZWF0ZV9mY3QqICAgICAgICAgICAgbV9wRmN0Q3JlYXRlOwotICAgIE00UkVBREVSX2Rlc3Ryb3lfZmN0KiAgICAgICAgICAgbV9wRmN0RGVzdHJveTsKLSAgICBNNFJFQURFUl9vcGVuX2ZjdCogICAgICAgICAgICAgIG1fcEZjdE9wZW47Ci0gICAgTTRSRUFERVJfY2xvc2VfZmN0KiAgICAgICAgICAgICBtX3BGY3RDbG9zZTsKLSAgICBNNFJFQURFUl9nZXRPcHRpb25fZmN0KiAgICAgICAgIG1fcEZjdEdldE9wdGlvbjsKLSAgICBNNFJFQURFUl9zZXRPcHRpb25fZmN0KiAgICAgICAgIG1fcEZjdFNldE9wdGlvbjsKLSAgICBNNFJFQURFUl9nZXROZXh0U3RyZWFtX2ZjdCogICAgIG1fcEZjdEdldE5leHRTdHJlYW07Ci0gICAgTTRSRUFERVJfZmlsbEF1U3RydWN0X2ZjdCogICAgICBtX3BGY3RGaWxsQXVTdHJ1Y3Q7Ci0gICAgTTRSRUFERVJfc3RhcnRfZmN0KiAgICAgICAgICAgICBtX3BGY3RTdGFydDsKLSAgICBNNFJFQURFUl9zdG9wX2ZjdCogICAgICAgICAgICAgIG1fcEZjdFN0b3A7Ci0gICAgTTRSRUFERVJfanVtcF9mY3QqICAgICAgICAgICAgICBtX3BGY3RKdW1wOwotICAgIE00UkVBREVSX3Jlc2V0X2ZjdCogICAgICAgICAgICAgbV9wRmN0UmVzZXQ7Ci0gICAgTTRSRUFERVJfZ2V0UHJldlJhcFRpbWVfZmN0KiAgICBtX3BGY3RHZXRQcmV2UmFwVGltZTsKLQotfSBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2U7Ci0KLQotLyoqKioqKioqKioqKiogUkVBREVSIERBVEEgSW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEdldHMgYW4gYWNjZXNzIHVuaXQgKEFVKSBmcm9tIHRoZSBzdHJlYW0gaGFuZGxlciBzb3VyY2UuCi0gKiBAbm90ZSAgICBBbiBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBhIGRlY29kZXIgKGF1ZGlvL3ZpZGVvKS4KLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAgIChJTikgICAgICAgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0ICAgICAgICAoSU4vT1VUKSAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQgdG8gZmlsbCB3aXRoIHJlYWQgZGF0YQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgYXUgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSB0aGUgdXNlciwgYW5kIG11c3QgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCBieSBjYWxsaW5nIE00UkVBREVSX2ZpbGxBdVN0cnVjdF9mY3QgYWZ0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybnMgICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybnMgICAgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSAqIEByZXR1cm5zICAgIE00V0FSX05PX0RBVEFfWUVUICAgICAgICAgICAgdGhlcmUgaXMgbm8gZW5vdWdoIGRhdGEgb24gdGhlIHN0cmVhbSBmb3IgbmV3Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyB1bml0Ci0gKiBAcmV0dXJucyAgICBNNFdBUl9OT19NT1JFX0FVICAgICAgICAgICAgdGhlcmUgYXJlIG5vIG1vcmUgYWNjZXNzIHVuaXQgaW4gdGhlIHN0cmVhbQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW5kIG9mIHN0cmVhbSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAgIChNNFJFQURFUl9nZXROZXh0QXVfZmN0KShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGdlbmVyaWMgbWVkaWEgcmVhZGVyIERBVEEgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBwb2ludGVycyB0byBmdW5jdGlvbnMgY29uY2VybmluZwotICogICAgICAgICAgICAgICAgZGF0YSBhY2Nlc3MgZm9yIG9uZSByZWFkZXIgdHlwZS4odGhvc2UgZnVuY3Rpb25zIGFyZSB0eXBpY2FsbHkgY2FsbGVkIGZyb20KLSAqICAgICAgICAgICAgICAgIGEgZGVjb2RlcikgVGhlIHJlYWRlciB0eXBlIGlzIG9uZSBvZiB0aGUgTTRSRUFERVJfTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000UkVBREVSX0RhdGFJbnRlcmZhY2UKLXsKLSAgICBNNFJFQURFUl9nZXROZXh0QXVfZmN0KiAgIG1fcEZjdEdldE5leHRBdTsKLQotICAgIC8qKgotICAgIHN0b3JlcyB0aGUgY29udGV4dCBjcmVhdGVkIGJ5IHRoZSBNNFJFQURFUl9jcmVhdGVfZmN0KCkgZnVuY3Rpb24KLSAgICBzbyBpdCBpcyBhY2Nlc3NpYmxlIHdpdGhvdXQgIGRlY29kZXIKLSAgICAqLwotICAgIE00T1NBX0NvbnRleHQgbV9yZWFkZXJDb250ZXh0OwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotfSBNNFJFQURFUl9EYXRhSW50ZXJmYWNlOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNlbmRpZiAvKl9fTTRSRUFERVJfQ09NTU9OX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000UkVBREVSX1BjbS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfUGNtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYwZmM4NTcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRSRUFERVJfUGNtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRSRUFERVJfUGNtLmgKLSAqIEBicmllZiAgICBHZW5lcmljIGVuY2Fwc3VsYXRpb24gb2YgdGhlIGNvcmUgd2F2IHJlYWRlcgotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBnZW5lcmljIHNoZWxsIGludGVyZmFjZSByZXRyaWV2aW5nIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgIG9mIHRoZSB3YXYgcmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000UkVBREVSX1BDTV9IX18KLSNkZWZpbmUgX19NNFJFQURFUl9QQ01fSF9fCi0KLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmIFJldHJpZXZlcyB0aGUgZ2VuZXJpYyBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZSByZWFkZXIKLSoKLSogQHBhcmFtIHBNZWRpYVR5cGUgICAgICAgICAgICAgOiBQb2ludGVyIG9uIGEgTTRSRUFERVJfTWVkaWFUeXBlIChhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlcikKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgcmVhZGVyCi0qIEBwYXJhbSBwUmRyR2xvYmFsSW50ZXJmYWNlIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZ2xvYmFsIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoaXMgcmVhZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSogQHBhcmFtIHBSZHJEYXRhSW50ZXJmYWNlICAgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBkYXRhIGludGVyZmFjZQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoaXMgcmVhZGVyLiBUaGUgaW50ZXJmYWNlIGlzIGEgc3RydWN0dXJlIGFsbG9jYXRlZAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSoKLSogQHJldHVybnMgOiBNNE5PX0VSUk9SICAgICBpZiBPSwotKiAgICAgICAgICAgICBFUlJfQUxMT0MgICAgICBpZiBhbiBhbGxvY2F0aW9uIGZhaWxlZAotKiAgICAgICAgICAgIEVSUl9QQVJBTUVURVIgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qX19NNFJFQURFUl9QQ01fSF9fKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000U1lTX0FjY2Vzc1VuaXQuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000U1lTX0FjY2Vzc1VuaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjUwMzY3Yy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFNZU19BY2Nlc3NVbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgICBNNFNZU19BY2Nlc3NVbml0LmgKLSAqIEBicmllZiAgICAgICAgQWNjZXNzIHVuaXQgbWFuaXB1bGF0aW9uCi0gKiBAbm90ZSAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBhY2Nlc3MgdW5pdCBzdHJ1Y3R1cmUsCi0gKiAgICAgICAgICAgICAgIGFuZCBkZWNsYXJlcyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBpdC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRTWVNfQUNDRVNTVU5JVF9ICi0jZGVmaW5lIE00U1lTX0FDQ0VTU1VOSVRfSAotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX1RpbWUuaCIKLSNpbmNsdWRlICJNNFNZU19TdHJlYW0uaCIKLQotLyoqIFRoZSBhdHRyaWJ1dGUgb2YgYSBmcmFnbWVudCovCi10eXBlZGVmIGVudW0gewotICBNNFNZU19rRnJhZ0F0dHJPayAgICAgICAgPSAwMSwgLyoqPCBUaGUgZnJhZ21lbnQgaXMgY29ycmVjdCwgdGhlcmUgaXMgbm8gZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemUgY2Fubm90IGJlIDApKi8KLSAgTTRTWVNfa0ZyYWdBdHRyQ29ycnVwdGVkID0gMDIsIC8qKjwgVGhlIGZyYWdtZW50IGlzIGNvcnJ1cHRlZCAodGhlcmUgaXMgYXQgbGVhc3QgYSBiaXQgb3IgYnl0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIHNvbWV3aGVyZSBpbiB0aGUgZnJhZ21lbnQgKHNpemUgY2Fubm90IGJlIDApKi8KLSAgTTRTWVNfa0ZyYWdBdHRyTG9zdCAgICAgID0gMDMgIC8qKjwgVGhlIGZyYWdtZW50IGlzIGxvc3QsIHNvIHRoZSBzaXplIG11c3QgYmUgMC4qLwotfSBNNFNZU19GcmFnQXR0cjsKLQotCi0vKiogQSBGcmFnbWVudCBpcyBhIHBpZWNlIG9mIGFjY2VzcyB1bml0LiBJdCBjYW4gYmUgZGVjb2RlZCB3aXRob3V0IGRlY29kaW5nIHRoZSBvdGhlcnMqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBNNE9TQV9NZW1BZGRyOCAgZnJhZ0FkZHJlc3M7ICAgLyoqPCBUaGUgZGF0YSBwb2ludGVyLiBBbGwgZnJhZ21lbnRzIG9mIHRoZSBzYW1lIGFjY2VzcyB1bml0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBjb250aWd1b3VzIGluIG1lbW9yeSovCi0gIE00T1NBX1VJbnQzMiAgICBzaXplOyAgICAgICAgICAvKio8IFRoZSBzaXplIG9mIHRoZSBmcmFnbWVudC4gSXQgbXVzdCBiZSAwIGlmIGZyYWdtZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ2dlZCAnbG9zdCcqLwotICBNNFNZU19GcmFnQXR0ciAgaXNDb3JydXB0ZWQ7ICAgLyoqPCBUaGUgYXR0cmlidXRlIG9mIHRoaXMgZnJhZ21lbnQqLwotfSBNNFNZU19GcmFnOwotCi0vKio8IFRoZSBhdHRyaWJ1dGUgb2YgYW4gYWNjZXNzIHVuaXQqLwotdHlwZWRlZiBNNE9TQV9VSW50OCBNNFNZU19BVV9BdHRyOwotCi0jZGVmaW5lIEFVX0NvcnJ1cHRlZCAgIDB4MDEgLyoqPCBBdCBsZWFzdCBvbmUgZnJhZ21lbnQgb2YgdGhlIGFjY2VzcyB1bml0IGlzIGZsYWdnZWQgY29ycnVwdGVkLiovCi0jZGVmaW5lIEFVX1BfRnJhbWUgICAgIDB4MDIgLyoqPCBUaGUgYWNjZXNzIHVuaXQgaXMgYSBQX2ZyYW1lKi8KLSNkZWZpbmUgQVVfUkFQICAgICAgICAgMHgwNCAvKio8IFRoZSBhY2Nlc3MgdW5pdCBpcyBhIHJhbmRvbSBhY2Nlc3MgcG9pbnQuKi8KLQotCi0vKiogQW4gYWNjZXNzIHVuaXQgaXMgdGhlIHNtYWxsZXN0IHBpZWNlIG9mIGRhdGEgd2l0aCB0aW1pbmcgaW5mb3JtYXRpb24uKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qICAgIHN0cmVhbSA7Ci0gIE00T1NBX01lbUFkZHIzMiAgICAgICAgICAgICBkYXRhQWRkcmVzczsgLyoqPCBUaGUgZGF0YSBwb2ludGVyLiBUaGUgc2l6ZSBvZiB0aGlzIGJsb2NrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY2F0ZWQgc2l6ZSkgbXVzdCBiZSBhIDMyLWJpdHMgaW50ZWdlciBtdWx0aXBsZSovCi0gIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBzaXplOyAgICAgICAgLyoqPCBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZGF0YUFkZHJlc3MuIFRoZSBzaXplIG1heQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtYXRjaCBhIDMyLWJpdHMgd29yZCBib3VuZGFyeS4qLwotICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgQ1RTOyAgICAgICAgIC8qKjwgVGhlIENvbXBvc2l0aW9uIFRpbWUgU3RhbXAqLwotICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgRFRTOyAgICAgICAgIC8qKjwgVGhlIERlY29kZWQgVGltZSBTdGFtcCovCi0gIE00U1lTX0FVX0F0dHIgICAgICAgICAgICAgICBhdHRyaWJ1dGU7ICAgLyoqPCBUaGUgYXR0cmlidXRlIG9mIHRoZSBhY2Nlc3MgdW5pdCovCi0gIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICBuYkZyYWc7ICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGZyYWdtZW50cy4gSXQgY2FuIGJlIDAgaWYgdGhlcmUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGZyYWdtZW50LiovCi0gIE00U1lTX0ZyYWcqKiAgICAgICAgICAgICAgICBmcmFnOyAgICAgICAgLyoqPCBBbiBhcnJheSBvZiAnbmJGcmFnJyBmcmFnbWVudHMuIEl0IHN0b3JlcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50cyBzdHJ1Y3R1cmUuIFRoZSBvcmlnaW5hbCBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCBvZiBmcmFnIGhhcyBiZWVuIGNoYW5nZWQgZnJvbSBNNFNZU19GcmFnKiBmcmFnW10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIE00U1lTX0ZyYWcqKiBmcmFnIHNpbmNlIHRoZSBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCBvZiBzdWNoIHN5bnRheCBpcyBvbmx5IGEgTWljcm9zb2Z0IGV4dGVuc2lvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEMgY29tcGlsZXIuICovCi19IE00U1lTX0FjY2Vzc1VuaXQ7Ci0KLS8qIEVycm9yIGNvZGVzICovCi0jZGVmaW5lIE00RVJSX0FVX05PX01PUkVfRlJBRyAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00U1lTX0NNQVBJLDB4MDAwMDAxKQotI2RlZmluZSBNNEVSUl9BVV9CVUZGRVJfT1ZFUkZMT1cgICBNNE9TQV9FUlJfQ1JFQVRFKE00X0VSUixNNFNZU19DTUFQSSwweDAwMDAwMikKLSNkZWZpbmUgTTRFUlJfQVVfQkFEX0lOREVYICAgICAgICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsTTRTWVNfQ01BUEksMHgwMDAwMDMpCi0jZGVmaW5lIE00RVJSX05PVF9FTk9VR0hfRlJBRyAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLE00U1lTX0NNQVBJLDB4MDAwMDA0KQotCi0KLQotI2VuZGlmIC8qTTRTWVNfQUNDRVNTVU5JVF9IKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRTWVNfU3RyZWFtLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFNZU19TdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmFiMGNlNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFNZU19TdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICAgTTRTWVNfU3RyZWFtLmgKLSAqIEBicmllZiAgICAgICAgU3RyZWFtIG1hbmlwdWxhdGlvbgotICogQG5vdGUgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgc3RyZWFtIHN0cnVjdHVyZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRTWVNfU1RSRUFNX0gKLSNkZWZpbmUgTTRTWVNfU1RSRUFNX0gKLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfVGltZS5oIgotCi10eXBlZGVmIE00T1NBX1VJbnQzMiBNNFNZU19TdHJlYW1JRDsKLQotLyoqIFRoZSBzdHJlYW1UeXBlIHR5cGUgcHJvdmlkZXMgYSB3YXkgdG8gZGlzdGluZ3Vpc2ggYWxsIHN0cmVhbXMgKEFBQywgQU1SLCBZVVY0MjAsIE1QRUctNCBWaWRlbywKLSAgICAgSDI2MykuIFN0cmVhbSB0eXBlcyBjYW4gYmUgc29ydGVkIGluIDIgd2F5czoKLUBhcmcgICBTb21lIG9mIHRoZW0gYXJlIHJhdyBkYXRhLCBvdGhlcnMgYXJlIGVuY29kZWQKLUBhcmcgICBTb21lIG9mIHRoZW0gYXJlIHJlbGF0ZWQgdG8gYW4gYXVkaW8gbWVkaWEsIGEgdmlkZW8gbWVkaWEuLi4KLUBuIFNvIGEgc3BlY2lmaWMgbmFtaW5nIGNvbnZlbnRpb24gaGFzIGJlZW4gZGVzaWduZWQgdG8gYWxsb3cgYSBxdWljayBwYXJzaW5nIG9mIHRoZSBzdHJlYW1UeXBlCi0gICAgdmFsdWUgdG8gcmV0dXJuIHRoZSBhYm92ZSBjYXRlZ29yaWVzLiBTdHJlYW1UeXBlIGlzIGFuIHVuLXNpZ25lZCBpbnRlZ2VyIG9uIDE2IGJpdHMuCi1AYXJnICAgVGhlIGZpcnN0IGJ5dGUgKE1TQikgZGVmaW5lcyB0aGUgY29kZWMgdHlwZS4gSXQgY2FuIGJlIGVpdGhlciBBdWRpbyxWaWRlbywgUGljdHVyZSwKLSAgICAgICAgIFRleHQgb3IgU2NlbmUuCi1AYXJnICAgVGhlIHNlY29uZCBieXRlIChMU0IpIGRlZmluZXMgdGhlIHN1Yi1jb2RlY3MgdHlwZSAoaWUgWVVWNDIwLCBQQ01fMTYgYml0cywgQU1SLi4uKS4KLSAgICAgICAgTW9yZW92ZXIgaWYgdGhpcyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMHg4MCB0aGUgc3RyZWFtIGlzIGEgcmF3IHN0cmVhbSwgZWxzZSB0aGUgc3RyZWFtCi0gICAgICAgIGlzIGFuIGVuY29kZWQgb25lCi1AbiAgIDB4MDAwMCBpcyBhIGZvcmJpZGRlbiB2YWx1ZSwgaXQgZGVzY3JpYmVzIGFuIHVua25vd24gc3RyZWFtICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICBNNFNZU19rVW5rbm93biAgICAgICA9IDB4MDAwMCwKLSAgIC8qIFN0cmVhbSB0eXBlIGRlZmluaXRpb24KLSAgICAgICAweFlZWlogICA6IFlZIGlzIHRoZSBjb2RlYyB0eXBlIChBdWRpbywgVmlkZW8sIFBpY3R1cmUsIFNjZW5lIC4uLikKLSAgICAgICAgICAgICAgICAgIFpaIGlzIHRoZSBzdWItY29kZWMgdHlwZSAoQUFDLCBBTVIgLCAuLi4pCi0gICAgICAgICAgICAgICAgICAgICBpZiBaWiBpcyBncmVhdGVyIHRoYW4gMHg4MCBpdCBpcyBhIHJhdyBmb3JtYXQqLwotCi0gICAvKiBBdWRpbyBvbmVzICAgOiBSYW5nZSBmcm9tIFsweDAxMDAtMHgwMUZGXSovCi0gICBNNFNZU19rQXVkaW9Vbmtub3duICA9IDB4MDEwMCwKLSAgIE00U1lTX2tBQUMgICAgICAgICAgID0gMHgwMTAxLAotICAgTTRTWVNfa0NFTFAgICAgICAgICAgPSAweDAxMDIsCi0gICBNNFNZU19rQU1SICAgICAgICAgICA9IDB4MDEwMywKLSAgIE00U1lTX2tBTVJfV0IgICAgICAgID0gMHgwMTA0LAotICAgTTRTWVNfa01QMyAgICAgICAgICAgPSAweDAxMDUsCi0gICBNNFNZU19rTUlESSAgICAgICAgICA9IDB4MDEwNiwKLSAgIE00U1lTX2tXTUEgICAgICAgICAgID0gMHgwMTA3LAotICAgTTRTWVNfa1JFQUxBVURJTyAgICAgPSAweDAxMDgsCi0gICBNNFNZU19rRVZSQyAgICAgICAgICAgID0gMHgwMTA5LAotICAgTTRTWVNfa1BDTV8xNmJpdHNTICAgPSAweDAxODEsIC8qIFBDTSAxNiBiaXRzIFNpZ25lZCAqLwotICAgTTRTWVNfa1BDTV8xNmJpdHNVICAgPSAweDAxODIsIC8qIFBDTSAxNiBiaXRzIFVuLXNpZ25lZCAqLwotICAgTTRTWVNfa1BDTV84Yml0c1UgICAgPSAweDAxODMsIC8qIFBDTSAgOCBiaXRzIFVuLXNpZ25lZCAqLwotLyogRml4QUEgMjAwOC8wMy8wMyB0eXBlczogTTRTWVNfa1BDTV8xNmJpdHNTLCBNNFNZU19rUENNXzE2Yml0c1UgYW5kIE00U1lTX2tQQ01fOGJpdHNVCi0gICBhcmUgbm93IG9ubHkgdXNlZCBieSBBdWRpb01peGVyIGFuZCBSZWFkZXJBVkkgPT4gQW4gdXBkYXRlIGlzIG5lY2Vzc2FyeSBpbiB0aGUgZnV0dXJlIGZvciB1c2UKLSAgIHR5cGUgTTRTWVNfa1BDTSAqLwotICAgTTRTWVNfa1hNRiAgICAgICAgICAgID0gMHgwMTg0LAotICAgTTRTWVNfa1NNQUYgICAgICAgICAgPSAweDAxODUsCi0gICBNNFNZU19rSU1FTCAgICAgICAgICA9IDB4MDE4NiwKLSAgIE00U1lTX2tCQkEgICAgICAgICAgICA9IDB4MDE4NywKLSAgIE00U1lTX2tCUEMgICAgICAgICAgICA9IDB4MDE4OCwKLSAgIE00U1lTX2tBRFBDTSAgICAgICAgID0gMHgwMTg5LCAgLyogQURQQ00gYWRkZWQgKi8KLSAgIE00U1lTX2tQQ00gICAgICAgICAgID0gMHgwMTkwLCAgLyogc3RyZWFtIHR5cGUgYWRkZWQ6IFBDTTsgIFBSMjU2OSBmaXhBQSAqLwotICAgTTRTWVNfa0F1ZGlvQWxsICAgICAgICA9IDB4MDFGRiwgIC8qIGFsbCBhdWRpbyBzdHJlYW1zICovCi0KLSAgIC8qIFZpZGVvIG9uZXMgICA6IFJhbmdlIFsweDAyMDAtMHgwMkZGXSovCi0gICBNNFNZU19rVmlkZW9Vbmtub3duICA9IDB4MDIwMCwKLSAgIE00U1lTX2tNUEVHXzQgICAgICAgID0gMHgwMjAxLAotICAgTTRTWVNfa0gyNjMgICAgICAgICAgPSAweDAyMDIsCi0gICBNNFNZU19rSDI2M3BwICAgICAgICA9IDB4MDIwMywKLSAgIE00U1lTX2tIMjY0ICAgICAgICAgID0gMHgwMjA0LAotICAgTTRTWVNfa1JFQUxWSURFTyAgICAgPSAweDAyMDUsCi0gICBNNFNZU19rWVVWNDIwICAgICAgICA9IDB4MDI4MSwKLSAgIE00U1lTX2tSR0IzMiAgICAgICAgID0gMHgwMjgyLAotICAgTTRTWVNfa0JHUjMyICAgICAgICAgPSAweDAyODMsCi0gICBNNFNZU19rUkdCMjQgICAgICAgICA9IDB4MDI4NCwKLSAgIE00U1lTX2tCR1IyNCAgICAgICAgID0gMHgwMjg1LAotICAgTTRTWVNfa1ZpZGVvQWxsICAgICAgICA9IDB4MDJGRiwgIC8qIGFsbCB2aWRlbyBzdHJlYW1zICovCi0KLSAgLyogUGljdHVyZSBvbmVzIDogUmFuZ2UgWzB4MDMwMC0weDAzRkZdKi8KLSAgIE00U1lTX2tQaWN0dXJlVW5rbm93biA9IDB4MDMwMCwKLSAgIE00U1lTX2tKUEVHICAgICAgICAgICA9IDB4MDMwMSwKLSAgIE00U1lTX2tHSUYgICAgICAgICAgICA9IDB4MDMwMiwKLSAgIE00U1lTX2tCTVAgICAgICAgICAgICA9IDB4MDM4MywKLSAgIE00U1lTX2tTdGlsbEFsbCAgICAgICAgID0gMHgwM0ZGLCAgLyogYWxsIHN0aWxsIHBpY3R1cmUgc3RyZWFtcyAqLwotCi0gICAvKiBUZXh0IG9uZXMgICAgOiBSYW5nZSBbMHgwNDAwLTB4MDRGRl0qLwotICAgTTRTWVNfa1RleHRVbmtub3duICA9IDB4MDQwMCwKLSAgIE00U1lTX2tUaW1lZFRleHQgICAgPSAweDA0MDEsCi0gICBNNFNZU19rVVRGOCAgICAgICAgID0gMHgwNDgxLAotICAgTTRTWVNfa1VURjE2ICAgICAgICA9IDB4MDQ4MiwKLSAgIE00U1lTX2tVQ1MyICAgICAgICAgPSAweDA0ODMsCi0gICBNNFNZU19rVGV4dEFsbCAgICAgICA9IDB4MDRGRiwgIC8qIGFsbCB0ZXh0IHN0cmVhbXMgKi8KLQotICAgLyogU2NlbmUgJiBHcmFwaGljcyBvbmVzICAgOiBSYW5nZSBbMHgwNTAwLTB4MDVGRl0qLwotICAgTTRTWVNfa1NjZW5lVW5rbm93biAgPSAweDA1MDAsCi0gICBNNFNZU19rU01JTCAgICAgICAgICA9IDB4MDUwMSwKLSAgIE00U1lTX2tCSUZTICAgICAgICAgID0gMHgwNTAyLAotICAgTTRTWVNfa1NjZW5lQWxsICAgICAgICA9IDB4MDVGRiwgIC8qIGFsbCBzY2VuZSBzdHJlYW1zICovCi0KLSAgIC8qIGhpbnRlZCBvbmVzICAgOiBSYW5nZSBbMHgwNjAwLTB4MDZGRl0qLwotICAgTTRTWVNfa0hpbnRlZFVua25vd24gPSAweDA2MDAsCi0gICBNNFNZU19rUlRQICAgICAgICAgICA9IDB4MDYwMSwKLSAgIE00U1lTX2tNUEVHMl9UUyAgICAgID0gMHgwNjAyLAotICAgTTRTWVNfa0hpbnRlZEFsbCAgICAgICAgPSAweDA2RkYsICAvKiBhbGwgcGFja2V0aXplZCBzdHJlYW1zICovCi0KLSAgIC8qIE1QRUctNCBzeXN0ZW0gb25lcyA6IFJhbmdlIFsweDA3MDAtMHgwN0ZGXSovCi0gICBNNFNZU19rU3lzVW5rbm93biAgICA9IDB4MDcwMCwKLSAgIE00U1lTX2tPRFMgICAgICAgICAgID0gMHgwNzAxLAotICAgTTRTWVNfa0lQTVAgICAgICAgICAgPSAweDA3MDIsCi0gICBNNFNZU19rT0NJICAgICAgICAgICA9IDB4MDcwMywKLSAgIE00U1lTX2tTeXNBbGwgICAgICAgID0gMHgwN0ZGIC8qIGFsbCBzeXN0ZW0gc3RyZWFtcyovCi19IE00U1lTX1N0cmVhbVR5cGUgOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBNNFNZU19TdHJlYW1JRCAgICAgc3RyZWFtSUQgOwotICAgTTRPU0FfVUludDMyICAgICAgdmFsdWUgOwotfSBNNFNZU19TdHJlYW1JRFZhbHVlIDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgTTRTWVNfU3RyZWFtSUQgICAgc3RyZWFtSUQgOwotICAgTTRPU0FfVUludDMyICAgICAgc2l6ZSA7Ci0gICBNNE9TQV9NZW1BZGRyMzIgICBhZGRyIDsKLX0gTTRTWVNfU3RyZWFtSURtZW1BZGRyIDsKLQotLyoqIFRoaXMgc3RydWN1cmUgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgdG8gYSBzdHJlYW0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICBNNFNZU19TdHJlYW1JRCAgIHN0cmVhbUlEOyAgICAvKio8IFRoZSBJRCBvZiB0aGUgc3RyZWFtLiBJdCBtdXN0IGJlIHVuaXF1ZSBmb3IgYSBtZWRpYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWUgaW4gYSBNUDQgZmlsZSwgdHdvIHRyYWNrcyBjYW4gbm90IGhhdmUgdHdvIHRpbWVzIHRoZSBzYW1lIElEKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgaXMgZm9yYmlkZGVuLiovCi0gIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZTsgICAgLyoqPCBUaGUgc3RyZWFtIHR5cGUgb2YgdGhlIHN0cmVhbSovCi0gIE00T1NBX1VJbnQ4ICAgICAgcHJvZmlsZUxldmVsOyAgLyoqPCBUaGUgcHJvZmlsZSAmIGxldmVsIG9mIGEgc3RyZWFtLiBJdCBpcyByZWxhdGVkIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHR5cGUgJiB0aGUgZGVmaW5pdGlvbiBjb21lcyBmcm9tIHRoZSBzdGFuZGFyZCBib2RpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIE1QRUctNCBWaWRlbyAmIE1QRUctNCBBdWRpbykuIFNvbWUgdmFsdWVzIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlLWRlZmluZWQ6IDB4RkU9dXNlclByaXZhdGUgMHhGRj1ubyBQcm9maWxlICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsIHNwZWNpZmllZCovCi0gIE00T1NBX1VJbnQzMiAgICAgZGVjb2RlclNwZWNpZmljSW5mb1NpemU7ICAvKio8IFRoZSBkZWNvZGVyIGNvbmZpZ3VyYXRpb24uIFRoZXNlIGJ5dGVzIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHRvIGluaXRpYWxpc2UgYSBkZWNvZGVyLiovCi0gIE00T1NBX01lbUFkZHIzMiAgZGVjb2RlclNwZWNpZmljSW5mbzsgLyoqPCBUaGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBkZWNvZGVyIHNwZWNpZmljIGluZm8uKi8KLSAgTTRPU0FfVUludDMyICAgICB0aW1lU2NhbGU7ICAgICAvKio8IFRoZSB0aW1lIHNjYWxlIG9mIHRoZSBzdHJlYW0uIEl0IG1lYW5zIHRoYXQgYWxsIHRpbWluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uIG9mIHRoaXMgc3RyZWFtIGFyZSBjb21wdXRlZCBpbiB0aGlzIHRpbWVzY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZSB0aW1lU2NhbGUgPSA4MDAwLCBtZWFucyB0aGVyZSBhcmUgODAwMCB0aWNrcyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBzZWNvbmQpKi8KLSAgTTRPU0FfVGltZSAgICAgICBkdXJhdGlvbjsgICAgICAgIC8qKjwgVGhlIHN0cmVhbSBkdXJhdGlvbiBvZiB0aGlzIHN0cmVhbS4gVGhlIHRpbWUgdW5pdCBpcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lIHNjYWxlLiBUaGUgdmFsdWUgY2FuIGJlIHNldCB0byBNNFNZU19Vbmtub3duVGltZSBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkdXJhdGlvbiBpcyBub3Qga25vd24uKi8KLSAgTTRPU0FfSW50MzIgICAgICBhdmVyYWdlQml0cmF0ZTsgIC8qKjwgVGhlIGF2ZXJhZ2UgYml0cmF0ZSAoaW4gYml0IHBlciBzZWNvbmQpIG9mIHRoaXMgc3RyZWFtLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYXZlcmFnZSBiaXRyYXRlIGlzIGNvbXB1dGVkIG9uIHRoZSBzdHJlYW0gZHVyYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xIHZhbHVlIG1lYW5zIGVpdGhlciB0aGVyZSBpcyBubyBhdmVyYWdlIGJpdHJhdGUgb3Igbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZSBiaXRyYXRlIGlzIHByb3ZpZGVkLiovCi0gIE00T1NBX0ludDMyICAgICAgbWF4Qml0cmF0ZTsgICAgICAvKio8IFRoZSBtYXhpbXVtIGJpdHJhdGUgKGluIGJpdCBwZXIgc2Vjb25kKSBvZiB0aGlzIHN0cmVhbS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1heGltdW0gYml0cmF0ZSBpcyBjb21wdXRlZCBvbiBhIHNsaWRpbmcgd2luZG93IG9mIDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kLiAtMSB2YWx1ZSBtZWFucyBlaXRoZXIgdGhlcmUgaXMgbm8gbWF4LiBiaXRyYXRlIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIG1heC4gYml0cmF0ZSBpcyBwcm92aWRlZC4qLwotfSBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbjsKLQotdHlwZWRlZiBlbnVtIHsKLSAgIE00U1lTX2tQcmV2aW91c1JBUCAgICAgID0gMHgwMSAsCi0gICBNNFNZU19rTmV4dFJBUCAgICAgICAgICA9IDB4MDIgLAotICAgTTRTWVNfa0Nsb3Nlc3RSQVAgICAgICAgPSAweDAzICwKLSAgIE00U1lTX2tOb1JBUHByZXZpb3VzICAgID0gMHgxMSAsCi0gICBNNFNZU19rTm9SQVBuZXh0ICAgICAgICA9IDB4MTIgLAotICAgTTRTWVNfa05vUkFQY2xvc2VzdCAgICAgPSAweDEzICwKLSAgIE00U1lTX2tCZWdpbm5pbmcgICAgICAgID0gMHgyMAotfSBNNFNZU19TZWVrQWNjZXNzTW9kZSA7Ci0KLSNlbmRpZiAvKk00U1lTX1NUUkVBTV9IKi8KLQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VE9PTF9WZXJzaW9uSW5mby5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRUT09MX1ZlcnNpb25JbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwMTZiOGQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRUT09MX1ZlcnNpb25JbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFRPT0xfVmVyc2lvbkluZm8uaAotICogQGJyaWVmICBkZWZpbmVzIGEgY29tbW9uIHZlcnNpb24gaW5mb3JtYXRpb24gc3RydWN0dXJlCi0gKiBAbm90ZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRUT09MX1ZFUlNJT05JTkZPX0hfXwotI2RlZmluZSBfX000VE9PTF9WRVJTSU9OSU5GT19IX18KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLS8qKgotICogc3RydWN0dXJlICAgIE00X1ZlcnNpb25JbmZvCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB2ZXJzaW9uIG9mIGNvcmUgY29tcG9uZW50Ci0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdHlwaWNhbGx5IHVzZWQgdG8gcmV0cmlldmUgdmVyc2lvbiBpbmZvcm1hdGlvbgotICogICAgICAgICAgICAgICAgb2YgYSBjb21wb25lbnQgdmlhIGdldE9wdGlvbiBmdW5jdGlvbgotICovCi10eXBlZGVmIHN0cnVjdCBfTTRfVmVyc2lvbkluZm8KLXsKLSAgICBNNE9TQV9VSW50MzIgbV9tYWpvcjsgICAgICAgIC8qbWFqb3IgdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50Ki8KLSAgICBNNE9TQV9VSW50MzIgbV9taW5vcjsgICAgICAgIC8qbWlub3IgdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50Ki8KLSAgICBNNE9TQV9VSW50MzIgbV9yZXZpc2lvbjsgICAgLypyZXZpc2lvbiB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQqLwotCi0gICAgLyogU3RydWN0dXJlIHNpemUgKi8KLSAgICBNNE9TQV9VSW50MzIgbV9zdHJ1Y3RTaXplOwotCi19IE00X1ZlcnNpb25JbmZvOwotCi0KLSNlbmRpZiAvKl9fTTRUT09MX1ZFUlNJT05JTkZPX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfRVhURVJOQUxfSW50ZXJmYWNlLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MGJmY2I2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000VkRfRVhURVJOQUxfSU5URVJGQUNFX0hfXwotI2RlZmluZSBfX000VkRfRVhURVJOQUxfSU5URVJGQUNFX0hfXwotCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIC0tLS0tIERTSSBiaXRzdHJlYW0gcGFyc2VyIC0tLS0tICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIHRvIGNsaWVudHMgb2YgdGhlIHNoZWxsIHRvIGFsbG93IHRoZW0gdG8gYW5hbHlzZSBjbGlwcwotKHVzZWZ1bCBmb3IgdmlkZW8gZWRpdGluZykgd2l0aG91dCBoYXZpbmcgdG8gaW5zdGFuY2lhdGUgYSBkZWNvZGVyLCB3aGljaCBjYW4gYmUgdXNlZnVsIHByZWNpc2VseQotaWYgSFcgZGVjb2RlcnMgYXJlIGEgcG9zc2liaWxpdHkuICovCi0KLU00T1NBX0VSUiBNNERFQ09ERVJfRVhURVJOQUxfUGFyc2VWaWRlb0RTSSgKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogcFZvbCwgTTRPU0FfSW50MzIgYVZvbFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvKiBwRGNpLAotICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb1NpemUqIHBWaWRlb1NpemUpOwotCi1NNE9TQV9FUlIgZ2V0QVZDUHJvZmlsZUFuZExldmVsKE00T1NBX1VJbnQ4KiBwRFNJLCBNNE9TQV9JbnQzMiBEU0lTaXplLAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpwUHJvZmlsZSwgTTRPU0FfSW50MzIgKnBMZXZlbCk7Ci0KLU00T1NBX0VSUiBnZXRIMjYzUHJvZmlsZUFuZExldmVsKE00T1NBX1VJbnQ4KiBwRFNJLCBNNE9TQV9JbnQzMiBEU0lTaXplLAotICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpwUHJvZmlsZSwgTTRPU0FfSW50MzIgKnBMZXZlbCk7Ci0KLU00T1NBX0VSUiBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCBwcm9maWxlQW5kTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRWRF9FWFRFUk5BTF9JTlRFUkZBQ0VfSF9fICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX1Rvb2xzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZEX1Rvb2xzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjYTM2YWMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRF9Ub29scy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFZEX1RPT0xTX0hfXwotI2RlZmluZSBfX000VkRfVE9PTFNfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotLyogLS0tLS0gYml0c3RyZWFtIHBhcnNlciAtLS0tLSAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiBzdHJlYW1fYnl0ZTsKLSAgICBNNE9TQV9VSW50MzIgc3RyZWFtX2luZGV4OwotICAgIE00T1NBX01lbUFkZHI4IGluOwotCi19IE00VlNfQml0c3RyZWFtX2N0eHQ7Ci0KLU00T1NBX1VJbnQzMiBNNFZEX1Rvb2xzX0dldEJpdHNGcm9tTWVtb3J5KE00VlNfQml0c3RyZWFtX2N0eHQqIHBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbmJfYml0cyk7Ci1NNE9TQV9FUlIgTTRWRF9Ub29sc19Xcml0ZUJpdHNUb01lbW9yeShNNE9TQV9VSW50MzIgYml0c1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHIzMiBkZXN0X2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG9mZnNldCwgTTRPU0FfVUludDggbmJfYml0cyk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBfX000VkRfVE9PTFNfSF9fICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZGTF90cmFuc2l0aW9uLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZGTF90cmFuc2l0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc3Zjc2Y2IuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWRkxfdHJhbnNpdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotIC8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgICAgIE00VFJBTl90cmFuc2l0aW9uLmgKLSAqIEBicmllZgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgX19NNFZGTF9UUkFOU0lUSU9OX0hfXwotI2RlZmluZSBfX000VkZMX1RSQU5TSVRJT05fSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVSW50ODsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBVSW50MzI7Ci0KLXR5cGVkZWYgICAgc3RydWN0IFNfTTRWaUNvbUltYWdlUGxhbmUKLXsKLSAgICBVSW50MzIgICAgICAgIHVfd2lkdGg7ICAgICAgICAgICAgLyogYWN0aXZlIHdpZHRoLCBpbiBwaXhlbHMgKi8KLSAgICBVSW50MzIgICAgICAgIHVfaGVpZ2h0OyAgICAgICAgICAgIC8qIGFjdGl2ZSBoZWlnaHQsIGluIGxpbmVzICovCi0gICAgVUludDMyICAgICAgICB1X3RvcGxlZnQ7ICAgICAgICAgICAgLyogaW5kZXggb2YgMXN0IGFjdGl2ZSBwaXhlbCAqLwotICAgIFVJbnQzMiAgICAgICAgdV9zdHJpZGU7ICAgICAgICAgICAgLyogbGluZSBzdHJpZGUsIGluIGJ5dGVzICovCi0gICAgVUludDggICAgICAgICpwYWNfZGF0YTsgICAgICAgICAgICAvKiBidWZmZXIgYWRkcmVzcyAqLwotfSAgICBNNFZpQ29tSW1hZ2VQbGFuZTsKLQotdHlwZWRlZiBzdHJ1Y3QgU19NNFZGTF9tb2RpZkx1bVBhcmFtCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgbHVtX2ZhY3RvcjsKLSAgICB1bnNpZ25lZCBzaG9ydCBjb3B5X2Nocm9tYTsKLX0gTTRWRkxfTW9kaWZMdW1QYXJhbTsKLQotI2RlZmluZSAgICAgTTRWSUZJX09LICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lICAgICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQgICAgIDgKLSNkZWZpbmUgICAgIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIICAgICAgOQotCi11bnNpZ25lZCBjaGFyIE00VkZMX21vZGlmeUx1bWFCeVN0ZXAoTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX2luLCBNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZGTF9Nb2RpZkx1bVBhcmFtICpsdW1fcGFyYW0sIHZvaWQgKnVzZXJfZGF0YSk7Ci0KLXVuc2lnbmVkIGNoYXIgTTRWRkxfbW9kaWZ5THVtYVdpdGhTY2FsZShNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfaW4sIE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbHVtX2ZhY3Rvciwgdm9pZCAqdXNlcl9kYXRhKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VklGSV9JbWFnZUJsZW5kaW5nb25ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4xLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbjIsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfVUludDMyIFByb2dyZXNzKQotICogQGJyaWVmICAgQmxlbmRzIHR3byBZVVYgNDoyOjAgUGxhbmFyIGltYWdlcy4KLSAqIEBub3RlICAgIEJsZW5kcyBZVVY0MjAgcGxhbmFyIGltYWdlcywKLSAqICAgICAgICAgIE1hcCB0aGUgdmFsdWUgb2YgcHJvZ3Jlc3MgZnJvbSAoMCAtIDEwMDApIHRvICgwIC0gMTAyNCkKLSAqICAgICAgICAgIFNldCB0aGUgcmFuZ2Ugb2YgYmxlbmRpbmdmYWN0b3IsCi0gKiAgICAgICAgICAgICAgICAgIDEuIGZyb20gMCB0byAoUHJvZ3Jlc3MgPDwgMSkgICAgICAgICAgICA7Zm9yIFByb2dyZXNzIDw9IDUxMgotICogICAgICAgICAgICAgICAgICAyLiBmcm9tICgoIFByb2dyZXNzIC0gNTEyKTw8IDEpIHRvIDEwMjQgO290aGVyd2lzZQotICogICAgICAgICAgU2V0IHRoZSBpbmNyZW1lbnQgb2YgYmxlbmRpbmdmYWN0b3IgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgaW1hZ2Ugcm93IGJ5IHRoZSBmYWN0b3IsCi0gKiAgICAgICAgICAgICAgICAgID0gIChSYW5nZS0xKSAvIChpbWFnZSB3aWR0aC0xKSAgO2ZvciB3aWR0aCA+PSByYW5nZQotICogICAgICAgICAgICAgICAgICA9ICAoUmFuZ2UpIC8gKGltYWdlIHdpZHRoKSAgICAgIDtvdGhlcndpc2UKLSAqICAgICAgICAgIExvb3Agb24gZWFjaCg9IGkpIHJvdyBvZiBvdXRwdXQgWSBwbGFuZSAoc3RlcHMgb2YgMikKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2goPSBqKSBjb2x1bW4gb2Ygb3V0cHV0IFkgcGxhbmUgKHN0ZXBzIG9mIDIpCi0gKiAgICAgICAgICAgICAgICAgIEdldCBmb3VyIFkgc2FtcGxlcyBhbmQgb25lIFUgJiBWIHNhbXBsZSBmcm9tIHR3byBpbnB1dCBZVVY0OjI6MCBpbWFnZXMgYW5kCi0gKiAgICAgICAgICAgICAgICAgIENvbXB1dGUgZm91ciBZIHNhbXBsZSBhbmQgb25lIFUgJiBWIHNhbXBsZSBmb3Igb3V0cHV0IFlVVjQ6MjowIGltYWdlCi0gKiAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0aGUgZm9sbG93aW5nLAotICogICAgICAgICAgICAgICAgICBPdXQoaSxqKSA9IGJsZW5kaW5nZmFjdG9yKGksaikgKiBJbjEoaSxqKSsgKGwgLSBibGVuZGluZ2ZhY3RvcihpLGopKSAqIEluMihpLGopCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3AgY29sdW1uCi0gKiAgICAgICAgICBlbmQgbG9vcCByb3cuCi0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgIFVzZXIgU3BlY2lmaWMgUGFyYW1ldGVyCi0gKiBAcGFyYW0gICBwUGxhbmVJbjE6IChJTikgIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcyBtYWludGFpbmVkIGZvciBZLCBVCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgViBwbGFuZXMuCi0gKiBAcGFyYW0gICBwUGxhbmVJbjI6IChJTikgIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcyBtYWludGFpbmVkIGZvciBZLCBVCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgViBwbGFuZXMuCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcyBtYWludGFpbmVkIGZvciBZLCBVCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgViBwbGFuZXMuCi0gKiBAcGFyYW0gICBQcm9ncmVzczogIChJTikgIFByb2dyZXNzIHZhbHVlICh2YXJpZXMgYmV0d2VlbiAwIGFuZCAxMDAwKQotICogQHJldHVybiAgTTRWSUZJX09LOiBObyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBFcnJvciBpbiBoZWlnaHQKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOiAgRXJyb3IgaW4gd2lkdGgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVuc2lnbmVkIGNoYXIgTTRWSUZJX0ltYWdlQmxlbmRpbmdvbllVVjQyMCAodm9pZCAqcFVzZXJEYXRhLCBNNFZpQ29tSW1hZ2VQbGFuZSAqcFBsYW5lSW4xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBQbGFuZUluMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VmlDb21JbWFnZVBsYW5lICpwUGxhbmVPdXQsIFVJbnQzMiBQcm9ncmVzcyk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvLyBfX000VkZMX1RSQU5TSVRJT05fSF9fCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfQ2xpcC5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0NsaXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWYwNzYxNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfQ2xpcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFZJRklfQ2xpcC5oCi0gKiBAYnJpZWYgICAgICAgIEdsb2JhbCBUYWJsZSBkZWZpbml0aW9uCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIENsaXBwaW5nIGFuZCBEaXZpc2lvbiB0YWJsZSBhZGRyZXNzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmICAgIF9NNFZJRklfQ0xJUF9IXwotI2RlZmluZSAgICBfTTRWSUZJX0NMSVBfSF8KLQotLyogQ2xpcHBpbmcgbWF0cml4IGZvciBSR0IgdmFsdWVzICovCi1FWFRFUk4gQ05TVCBNNFZJRklfVUludDggICAgKk00VklGSV9DbGlwVGFibGVfemVybzsKLS8qIERpdmlzaW9uIHRhYmxlIGZvciAoNjU1MzUveCk7IHggPSAwIHRvIDUxMiAqLwotRVhURVJOIENOU1QgTTRWSUZJX1VJbnQxNiAgICAqTTRWSUZJX0RpdlRhYmxlX3plcm87Ci0KLSNlbmRpZiAvKiBfTTRWSUZJX0NMSVBfSF8gKi8KLQotLyogRW5kIG9mIGZpbGUgTTRWSUZJX0NsaXAuaCAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfRGVmaW5lcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRWSUZJX0RlZmluZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQ1OTFlNS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfRGVmaW5lcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgICAgTTRWSUZJX0RlZmluZXMuaAotICogQGJyaWVmICAgICAgICBNYWNybyBEZWZpbml0aW9uCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgYWxsIHRoZSBtYWNybyB1c2VkIGluIHRoZSBmaWx0ZXIgbGlicmFyeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBfTTRWSUZJX0RFRklORVNfSF8KLSNkZWZpbmUgX000VklGSV9ERUZJTkVTX0hfCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgTWFjcm9zIHVzZWQgZm9yIGNvbG9yIHRyYW5zZm9ybSBSR0I1NjUgdG8gWVVWCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIENTVF9SR0JfMTZfU0laRSAyCi0jZGVmaW5lIFkxNihyLCBnLCBiKSBDTElQKCAgKCAoICg4MDU5MyAqIHIpKyg3Nzg1NSAqIGcpKygzMDcyOCAqIGIpKSA+PiAxNSkpCi0jZGVmaW5lIFUxNihyLCBnLCBiKSBDTElQKDEyOCsgKCAoIC0oNDU0ODMgKiByKS0oNDM5MzYgKiBnKSsoMTM0NzcxICogYikpID4+IDE1ICkpCi0jZGVmaW5lIFYxNihyLCBnLCBiKSBDTElQKDEyOCsgKCAoICgxMzQ3NzEgKiByKS0oNTU1MzIgKiBnKS0oMjE5MTcgKiBiKSkgPj4gMTUgICkpCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgIE1hY3JvcyB1c2VkIGZvciBjb2xvciB0cmFuc2Zvcm0gWVVWIHRvIFJHQgotICogICAgQiA9IDEuMTY0KFkgLSAxNikgICAgICAgICAgICAgICAgICArIDIuMDE4KFUgLSAxMjgpCi0gKiAgRyA9IDEuMTY0KFkgLSAxNikgLSAwLjgxMyhWIC0gMTI4KSAtIDAuMzkxKFUgLSAxMjgpCi0gKiAgUiA9IDEuMTY0KFkgLSAxNikgKyAxLjU5NihWIC0gMTI4KQotICogIEFib3ZlIENvbnZlcnNpb24gRm9ybXVsYSBpcyBpbXBsZW1lbnRlZCBmb3IgZml4ZWQgcG9pbnQgb3BlcmF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNkZWZpbmUgQ1NUX1JHQl8yNF9TSVpFIDMKLQotI2lmZGVmIF9fUkdCX1YxX18KLSNkZWZpbmUgREVNQVRSSVgoUngsR3gsQngsWXgzNyxVeCxWeCkgXAotICAgIFJ4ID0gQ0xJUCgoKFl4MzcgKyAoVnggKiA1MSkgKyAxNikgPj4gNSkgLSAyMjMpOyBcCi0gICAgR3ggPSBDTElQKCgoWXgzNyAtICgoVXgrKFZ4PDwxKSkgKiAxMykgKzE2KSA+PiA1KSArIDEzNSk7IFwKLSAgICBCeCA9IENMSVAoKChZeDM3ICsgKFV4ICogNjUpICsgMTYpID4+IDUpIC0gMjc3KQotI2Vsc2UKLSNkZWZpbmUgREVNQVRSSVgoUngsR3gsQngsWXgyNTY4LFV4LFZ4KSBcCi0gICAgUnggPSBDTElQKCgoWXgyNTY4ICsgICAgICAgICAgICAgICAgIChWeCAqIDB4MzM0MykgKyAoTTRWSUZJX0ludDMyKTB4ZmZlNDA4MDApID4+IDEzKSk7IFwKLSAgICBHeCA9IENMSVAoKChZeDI1NjggLSAoVXggKiAweDBjOTIpIC0gKFZ4ICogMHgxYTFlKSArIChNNFZJRklfSW50MzIpMHgwMDExMDE4MCkgPj4gMTMpKTsgXAotICAgIEJ4ID0gQ0xJUCgoKFl4MjU2OCArIChVeCAqIDB4NDBjZikgICAgICAgICAgICAgICAgICAgICsgKE00VklGSV9JbnQzMikweGZmZGQ0MjAwKSA+PiAxMykpOwotI2VuZGlmIC8qIF9fUkdCX1YxX18gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgIFBhY2tpbmcgYW5kIFVucGFja2luZyBpcyBkaWZmZXJlbnQgZm9yIGxpdHRsZSBhbmQgYmlnIGVuZGlhbgotICogIHIsIGcsIGIsIFJ4LCBHeCwgQnggYXJlIDggYml0IGNvbG9yIHZhbHVlCi0gKiAgICBhLCBkYXRhIGFyZSAxNiBiaXQgcGl4ZWwgdmFsdWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qIFBhY2sgY29tcHV0YXRpb25zIGNvbW1vbiBmb3IgbGl0dGxlIGVuZGlhbiBhbmQgYmlnIGVuZGlhbiBtb2RlcyAqLwotI2RlZmluZSAgICBQQUNLX0JHUjI0KHJnYl9wdHIsUngsR3gsQngpIHtyZ2JfcHRyWzBdID0gKE00VklGSV9VSW50OClCeDsgcmdiX3B0clsxXSA9XAotICAgICAgICAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgpR3g7IHJnYl9wdHJbMl0gPSAoTTRWSUZJX1VJbnQ4KVJ4O30KLSNkZWZpbmUgICAgUEFDS19SR0IyNChyZ2JfcHRyLFJ4LEd4LEJ4KSB7cmdiX3B0clswXSA9IChNNFZJRklfVUludDgpUng7IHJnYl9wdHJbMV0gPVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KUd4OyByZ2JfcHRyWzJdID0gKE00VklGSV9VSW50OClCeDt9Ci0KLSNpZmRlZiBCSUdfRU5ESUFOCi0jZGVmaW5lICAgIFBBQ0tfUkdCNTY1KGEsIFJ4LCBHeCwgQngpICgoKFJ4ID4+IDMpIDw8ICgxMSArIChhKSkpXAotICAgICAgICAgICAgICAgICB8ICgoR3ggPj4gMikgPDwgKDUgKyAoYSkpKSB8ICgoQnggPj4gMykgPDwgKGEpKSkKLSNkZWZpbmUgICAgUEFDS19CR1I1NjUoYSwgUngsIEd4LCBCeCkgKCgoQnggPj4gMykgPDwgKDExICsgKGEpKSlcCi0gICAgICAgICAgICAgICAgIHwgKChHeCA+PiAyKSA8PCAoNSArIChhKSkpIHwgKChSeCA+PiAzKSA8PCAoYSkpKQotI2RlZmluZSBHRVRfUkdCNTY1KHIsIGcsIGIsIGRhdGEpIHtiID0gKChkYXRhKSAmIDMxKTsgZyA9XAotICAgICAgICAgICAgICAgICAgICAgKChkYXRhID4+IDUpICYgNjMpOyByID0gKChkYXRhID4+IDExKSAmIDMxKTt9Ci0jZGVmaW5lIEdFVF9CR1I1NjUoYiwgZywgciwgZGF0YSkgXAotICAgIHIgPSAoKGRhdGEpICYgMzEpOyBcCi0gICAgZyA9ICgoZGF0YSA+PiA1KSAmIDYzKTsgXAotICAgIGIgPSAoKGRhdGEgPj4gMTEpICYgMzEgKTsKLSNlbHNlIC8qIExJVFRMRSBlbmRpYW46IDB4MTIzNDU2NzggLT4gNzggNTYgMzQgMTIgKi8KLSNkZWZpbmUgICAgUEFDS19SR0I1NjUoYSwgUngsIEd4LCBCeCkgKCgoQnggPj4gMykgPDwgKDggKyAoYSkpKSBcCi0gICAgICAgICAgICAgICAgICB8ICgoKEd4ID4+IDIpJjB4NykgPDwgKDEzICsgKGEpKSkgfCAoKEd4ID4+IDUpIDw8IChhKSkgfCAoKFJ4ID4+IDMpIDw8ICgzICsgYSkpKQotI2RlZmluZSAgICBQQUNLX0JHUjU2NShhLCBSeCwgR3gsIEJ4KSAoKChSeCA+PiAzKSA8PCAoMTEgKyAoYSkpKSBcCi0gICAgICAgICAgICAgICAgICB8ICgoR3ggPj4gMikgPDwgKDUgKyAoYSkpKSB8ICgoQnggPj4gMykgPDwgKGEpKSkKLSNkZWZpbmUgR0VUX1JHQjU2NShyLCBnLCBiLCBkYXRhKSB7IGIgPSAoTTRWSUZJX1VJbnQ4KSgoKGRhdGEpICYgMHgxRjAwKSA+PiA4KTsgZyA9XAotICAgICAgICAgICAgIChNNFZJRklfVUludDgpKCgoKGRhdGEpICYgMHg3KSA8PCAzKSB8ICgoKGRhdGEpICYgMHhFMDAwKSA+PiAxMykpOyByID1cCi0gICAgICAgICAgICAgKE00VklGSV9VSW50OCkoKChkYXRhKSAmIDB4RjgpID4+IDMpO30KLSNkZWZpbmUgR0VUX0JHUjU2NShiLCBnLCByLCBkYXRhKSBcCi0gICAgYiA9ICgoZGF0YSkgJiAzMSk7IFwKLSAgICBnID0gKChkYXRhID4+IDUpICYgNjMpOyBcCi0gICAgciA9ICgoZGF0YSA+PiAxMSkgJiAzMSApOwotI2VuZGlmIC8qIEJJR19FTkRJQU4gKi8KLQotCi0jZGVmaW5lIENTVF9SR0JfMjRfU0laRSAzCi0jZGVmaW5lIFkyNChyLGcsYikgQ0xJUCgoICggKDE5NTk1ICogcikgKyAoMzg0NzAgKiBnKSArICg5NDM3ICogYikgKSA+PjE2KSkKLSNkZWZpbmUgVTI0KHIsZyxiKSBDTElQKDEyOCArICggKCAtKDExMDU5ICogcikgLSAoMjE3MDkgKiBnKSArICgzMjc2OCAqIGIpKSA+PjE2KSkKLSNkZWZpbmUgVjI0KHIsZyxiKSBDTElQKDEyOCArICggKCAoMzI3NjggKiByKSAtICgyNzQyNiAqIGcpIC0gKDUzMjkgKiBiKSkgID4+MTYpKQotI2RlZmluZSBHRVRfUkdCMjQocixnLGIscyxvKSByID0gc1tvXTsgZyA9IHNbbyArIDFdOyBiID0gc1tvICsgMl07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgTWFjcm8gZm9yIGNsaXBwaW5nIHVzaW5nIHRoZSBjbGlwcGluZyBtYXRyaXggZm9yIFJHQiB2YWx1ZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKiBDbGlwIGZ1bmN0aW9uIGVuc3VyZXMgdmFsdWVzIHdpdGggcmFuZ2Ugb2YgMCBhbmQgMjU1ICovCi0jZGVmaW5lICAgICAgICBDTElQKHgpICAgICooTTRWSUZJX0NsaXBUYWJsZV96ZXJvICsgKHgpKQotI2RlZmluZSAgICAgICAgQ0xJUF9PVkYgICAgICAgIDUwMAotI2RlZmluZSAgICAgQ0xJUF9MVVRfU0laRSAgICAgKDI1NiArIDIgKiBDTElQX09WRikKLS8qKiBEaXZpc2lvbiB0YWJsZSBmb3IgUkdCNTY1IHRvIEhMUyBjb252ZXJzaW9uICovCi0jZGVmaW5lICAgICAgICBESVZDTElQKHgpICAgICooTTRWSUZJX0RpdlRhYmxlX3plcm8gKyAoeCkpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgRW5kaWFubmVzcyAoZGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIExpdHRsZSBFbmRpYW4pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWYgKCFkZWZpbmVkKExJVFRMRV9FTkRJQU4pICYmICFkZWZpbmVkKEJJR19FTkRJQU4pKQotLyoqIERlZmF1bHQgZW5kaWFuIHNldHRpbmcgKi8KLSNkZWZpbmUgTElUVExFX0VORElBTgotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgT3RoZXIgbWFjcm9zIGFuZCBkZWZpbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKiBZVVYgcGxhbmUgaW5kZXggKi8KLSNkZWZpbmUgUExBTkVTICAgIDMKLSNkZWZpbmUgWVBsYW5lICAgIDAKLSNkZWZpbmUgVVBsYW5lICAgIDEKLSNkZWZpbmUgVlBsYW5lICAgIDIKLQotLyoqIENoZWNrIGZvciB2YWx1ZSBpcyBFVkVOICovCi0jaWZuZGVmIElTX0VWRU4KLSNkZWZpbmUgSVNfRVZFTihhKSAgICAoIShhICYgMHgwMSkpCi0jZW5kaWYKLQotLyogVXNlZCBmb3IgZml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gKi8KLSNpZm5kZWYgTUFYX1NIT1JUCi0jZGVmaW5lIE1BWF9TSE9SVCAgICAweDEwMDAwCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9NNFZJRklfREVGSU5FU19IXyAqLwotCi0vKiBFbmQgb2YgZmlsZSBNNFZJRklfRGVmaW5lcy5oICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9GaWx0ZXJzQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZJRklfRmlsdGVyc0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDJmYzlkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VklGSV9GaWx0ZXJzQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFZJRklfRmlsdGVyc0FQSS5oCi0gKiBAYnJpZWYgICAgICAgIEV4dGVybmFsIEFQSSBhbmQgRGF0YSBkZWZpbml0aW9ucyBmb3IgdGhlIHZpZGVvIGZpbHRlciBsaWJyYXJ5Ci0gKiBAbm90ZSAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgYW5kIGRlY2xhcmVzIGRhdGEgY29tbW9uIHRvIHRoZSB2aWRlbyBmaWx0ZXIgbGlicmFyeToKLSAqICAgICAgICAgICAgICAgICAgICAtIyBkYXRhIHR5cGVzCi0gKiAgICAgICAgICAgICAgICAgICAgLSMgZXJyb3IgY29kZXMKLSAqICAgICAgICAgICAgICAgICAgICAtIyBleHRlcm5hbCBBUEkncwotICogICAgICAgICAgICAgICAgICAgIC0jIEFQSSBsZXZlbCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2lmbmRlZiBfTTRWSUZJX0ZJTFRFUlNBUElfSF8KLQotI2RlZmluZSBfTTRWSUZJX0ZJTFRFUlNBUElfSF8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLWV4dGVybiAiQyIgewotCi0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotICAgIC8qKgotICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAqICAgICAgICAgICAgICAgICAgICBEYXRhIHR5cGVzIGRlZmluaXRpb24KLSAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqLwotCi0gICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIE00VklGSV9VSW50ODsKLSAgICB0eXBlZGVmIGNoYXIgTTRWSUZJX0ludDg7Ci0gICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBNNFZJRklfVUludDE2OwotICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBNNFZJRklfVUludDMyOwotICAgIHR5cGVkZWYgc2hvcnQgTTRWSUZJX0ludDE2OwotICAgIHR5cGVkZWYgbG9uZyBNNFZJRklfSW50MzI7Ci0gICAgdHlwZWRlZiBmbG9hdCBNNFZJRklfRmxvYXQ7Ci0gICAgdHlwZWRlZiBkb3VibGUgTTRWSUZJX0RvdWJsZTsKLSAgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgTTRWSUZJX0Vycm9yQ29kZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICBFcnJvciBjb2RlcyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00VklGSV9PSyAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTTRWSUZJX0lOVkFMSURfUEFSQU0gICAgICAgICAgICA3Ci0jZGVmaW5lIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVCAgICAgICAgOAotI2RlZmluZSBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSCAgICAgICAgOQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgIE90aGVyIGJhc2ljIGRlZmluaXRpb25zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIENOU1QgICAgY29uc3QKLSNkZWZpbmUgRVhURVJOICAgIGV4dGVybgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAgICAwCi0KLSNlbmRpZgotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAgICAwCi0jZGVmaW5lIFRSVUUgICAgIUZBTFNFCi0KLSNlbmRpZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZXMgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZJRklfSW1hZ2VQbGFuZQotICogQGJyaWVmICAgICAgICBUZXh0dXJlIChZVVYpIHBsYW5lcyBzdHJ1Y3R1cmUKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZXRhaWxzIHRoZSBpbWFnZSBwbGFuZXMgZm9yIHRoZSBvdXRwdXQgdGV4dHVyZXM6Ci0gKiAgICAgICAgICAgICAgICBzaXplcyAoaW4gcGl4ZWxzKSBhcmUgbHVtYSBwbGFuZSBzaXplcywgdGhlIDMgcG9pbnRlcnMgcG9pbnQKLSAqICAgICAgICAgICAgICAgIHRvIHRoZSBZLCBVIGFuZCBWIGJ1ZmZlcnMgd2hpY2ggc3RvcmUgZGF0YSBpbiBwbGFuYXIgZm9ybWF0LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQzMiB1X3dpZHRoOyAgIC8qKjwgV2lkdGggb2YgbHVtYSBpbiBwaXhlbCB1bml0ICovCi0gICAgICAgIE00VklGSV9VSW50MzIgdV9oZWlnaHQ7ICAvKio8IEhlaWdodCBvZiBsdW1hIGluIHBpeGVsIHVuaXQgKi8KLSAgICAgICAgTTRWSUZJX1VJbnQzMiB1X3RvcGxlZnQ7IC8qKjwgUG9pbnRlciB0byBmaXJzdCB0ZXh0dXJlIGFjdGl2ZSBwaXhlbCAqLwotICAgICAgICBNNFZJRklfVUludDMyIHVfc3RyaWRlOyAgLyoqPCBTdHJpZGUgdmFsdWUgKi8KLSAgICAgICAgTTRWSUZJX1VJbnQ4ICpwYWNfZGF0YTsgIC8qKjwgUG9pbnRlciB0byB0aGUgZGF0YSAqLwotICAgICAgICB9IE00VklGSV9JbWFnZVBsYW5lOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZJRklfRnJhbWluZ0RhdGEKLSAqIEBicmllZiAgICAgICAgRGF0YSBuZWNlc3NhcnkgdG8gYWRkIGFuIG92ZXJsYXkgb24gYW4gaW1hZ2UKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZXRhaWxzIHRoZSBwb3NpdGlvbiBhbmQgdGhlIGRhdGEgb2YgdGhlIG92ZXJsYXkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICBNNFZJRklfVUludDMyCi0gICAgICAgICAgICBtX3hQb3NTdGVwOyAvKio8IFggcG9zaXRpb25pbmcgb2YgdGhlIG92ZXJsYXkgdnMgbWFpbiBwaWN0dXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFggcG9zaXRpb25pbmcgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2UgdnMgdGhlIG1haW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSB3aWR0aC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3hQb3NTdGVwIG11c3QgYmUgZXhwcmVzc2VkIGJ5IHN0ZXAgb2YgMSUgYW5kIGJldHdlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTAvKzUwJS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwJSBtZWFucyBvdmVybGF5IGlzIGNlbnRlcmVkIHZzIG1haW4gcGljdHVyZSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYIGFic2Npc3NhLiAqLwotICAgICAgICBNNFZJRklfVUludDMyCi0gICAgICAgICAgICBtX3lQb3NTdGVwOyAvKio8IFkgcG9zaXRpb25pbmcgb2YgdGhlIG92ZXJsYXkgdnMgbWFpbiBwaWN0dXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFkgcG9zaXRpb25pbmcgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2UgdnMgdGhlIG1haW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSB3aWR0aC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3hQb3NTdGVwIG11c3QgYmUgZXhwcmVzc2VkIGJ5IHN0ZXAgb2YgMSUgYW5kIGJldHdlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTUwLys1MCUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCUgbWVhbnMgb3ZlcmxheSBpcyBjZW50ZXJlZCB2cyBtYWluIHBpY3R1cmUgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWSBhYnNjaXNzYS4gKi8KLQotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZQotICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgIG1faW1hZ2VQbGFuZTsgLyoqPCBQb2ludGVyIHRvIHRoZSBmcmFtaW5nIGltYWdlIHdpdGggYWxwaGEgY2hhbm5lbCAqLwotICAgICAgICB9IE00VklGSV9GcmFtaW5nRGF0YTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWSUZJX0hMU29mZnNldAotICogQGJyaWVmICAgICAgICBITFMgb2Zmc2V0IHN0cnVjdHVyZQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGhhdmUgdGhlIGh1ZSwgc2F0dXJhdGlvbiBhbmQgbGlnaHRuZXNzIHZhbHVlCi0gKiAgICAgICAgICAgICAgICBmb3IgcXVhbGl0eSBlbmhhbmNlbWVudC4gUmFuZ2Ugb2YgdmFsdWVzIG5lY2Nlc3NhcmlseSBiZQotICogICAgICAgICAgICAgICAgaHVlID0gLTM2MCB0byAzNjAsIHNhdCA9IDAgdG8gMTAwIGFuZCBsaWdodCA9IDAgdDAgMTAwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotICAgIHR5cGVkZWYgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgTTRWSUZJX0ludDE2IGh1ZTsgICAvKio8IEh1ZSBvZmZzZXQgKi8KLSAgICAgICAgTTRWSUZJX0ludDE2IHNhdDsgICAvKio8IFNhdHVyYXRpb24gb2Zmc2V0ICovCi0gICAgICAgIE00VklGSV9JbnQxNiBsaWdodDsgLyoqPCBMaWdodCBvZmZzZXQgKi8KLSAgICAgICAgfSBNNFZJRklfSExTb2Zmc2V0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZJRklfVHJhbmZvcm1hdGlvbgotICogQGJyaWVmICAgICAgICBJbWFnZSBUcmFuZm9ybWF0aW9uIFN0cnVjdHVyZQotICogQG5vdGUgICAgICAgIEltYWdlIFRyYW5mb3JtYXRpb24gUmVxdWVzdAotICogICAgICAgICAgICAgICAgcm90YXRpb24gOiAxIC0+ICs5MGRlZyBSb3RhdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgIC0xIC0+IC05MGRlZyBSb3RhdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0+ICBObyBSb3RhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSAgICB0eXBlZGVmIHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgIE00VklGSV9JbnQzMiBpMzJfcm90YXRpb247IC8qKjwgUm90YXRpb24gRmxhZyAgICAgICAgKi8KLSAgICAgICAgfSBNNFZJRklfVHJhbmZvcm1hdGlvbjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRWSUZJX3BDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgIE5ldyBTdHJ1Y3R1cmVzCi0gKiBAbm90ZSAgICAgICAgLSMgU3RydWN0dXJlIG9mIE00VklGSV9ITFNvZmZzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0gICAgdHlwZWRlZiBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICBNNFZJRklfSExTb2Zmc2V0IGhsc09mZnNldDsgLyoqPCBITFMgb2Zmc2V0IHN0cnVjdHVyZSAqLwotICAgICAgICB9IE00VklGSV9wQ29udGV4dDsKLQotICAgIC8qCi0gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICogICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIEFQSSBmdW5jdGlvbnMKLSAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqLwotCi0gICAgLyoqPCBFZmZlY3QgZmlsdGVycyAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2VwaWFZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9HcmF5c2NhbGVZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9Db250cmFzdFlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX05lZ2F0aXZlWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfRmxpcFlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX01pcnJvcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTE4MFlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JvdGF0ZTkwUmlnaHRZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9Sb3RhdGU5MExlZnRZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9Db2xvclJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9Db2xvckdZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9Db2xvckJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9GcmFtaW5nUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfRnJhbWluZ1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRIdWVJbllVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9Db2xkWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfV2FybVlVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotLyogICAgICAgICAgICAgICAgQURTIENvbXBpbGVyICAgICAgICAgICAgICAgICovCi0KLS8qICAgICAgICBHZW5lcmljIEFSTSBhc3NlbWJseSBmdW5jdGlvbnMgICAgICAgICovCi0jaWYgZGVmaW5lZCBBRFNfQVJNCi0KLSAgICAvKiogQXBwbHkgZ3JheXNjYWxlIGVmZmVjdCBSR0I1NjV0b1JHQjU2NSAqLwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9HcmF5c2NhbGVSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFJHQjg4OHRvUkdCODg4ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgUkdCNTY1dG9SR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1lVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUkdCNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjBBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIEJHUjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0JHUjU2NXRvWVVWNDIwQWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMiB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1VZVll0b1lVVjQyMEFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAgdG8gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjU2NUFkc0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjVBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1QWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHRBZHNBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEFkc0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0QWRzQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRBZHNBcm0oCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luUkdCNTY1QWRzQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5CR1I1NjVBZHNBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSNkZWZpbmUgTTRWSUZJX1JHQjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUkdCNTY1dG9ZVVY0MjBBZHNBcm0KLSNkZWZpbmUgTTRWSUZJX0JHUjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfQkdSNTY1dG9ZVVY0MjBBZHNBcm0KLSNkZWZpbmUgTTRWSUZJX1VZVll0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9VWVZZdG9ZVVY0MjBBZHNBcm0KLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9SR0I1NjVBZHNBcm0KLSNkZWZpbmUgTTRWSUZJX1lVVjQyMHRvQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwdG9CR1I1NjVBZHNBcm0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjUgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVBZHNBcm0KLQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUFkc0FybQotCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0QWRzQXJtCi0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEFkc0FybQotCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0QWRzQXJtCi0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdEFkc0FybQotCi0jZGVmaW5lIE00VklGSV9TZXRITFNpblJHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luUkdCNTY1QWRzQXJtCi0jZGVmaW5lIE00VklGSV9TZXRITFNpbkJHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luQkdSNTY1QWRzQXJtCi0KLS8qICAgICAgICBBUk05RSBhc3NlbWJseSBmdW5jdGlvbnMgICAgICAgICovCi0jZWxpZiBkZWZpbmVkIEFEU19BUk05RQotCi0gICAgLyoqIEFwcGx5IGdyYXlzY2FsZSBlZmZlY3QgUkdCNTY1dG9SR0I1NjUgKi8KLQotICAgIE00VklGSV9VSW50OCBNNFZJRklfR3JheXNjYWxlUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY4ODh0b1lVVjg4OCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjU2NXRvWVVWNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSR0I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I1NjV0b1lVVjQyMEFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBCR1I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9CR1I1NjV0b1lVVjQyMEFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMiB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1VZVll0b1lVVjQyMEFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMCB0byBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvUkdCNTY1QWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvQkdSNTY1QWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1QWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgd2l0aCByb3RhdGlvbiArOTAgb3IgLTkwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0QWRzQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdEFkc0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRBZHNBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0QWRzQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luUkdCNTY1QWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpbkJHUjU2NUFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBZVVY0MjB0b1lVVjQyMCBmcm9tIFFDSUYgdG8gUVZHQSovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBQWRzQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqUmVzaXplIFlVVjQyMHRvUkdCNTY1IGZyb20gUUNJRiB0byBRVkdBKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqUmVzaXplIFlVVjQyMHRvUkdCNTY1IGZyb20gUUNJRiB0byBRVkdBIHdpdGggcm90YXRpb24gKzkwKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUlJBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqUmVzaXplIFlVVjQyMHRvUkdCNTY1IGZyb20gUUNJRiB0byBRVkdBIHdpdGggcm90YXRpb24gLTkwKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUkxBZHNBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0vKiogUmVzaXplcyBZVVY0MjAgUGxhbmFyIEltYWdlIGFuZCBzdG9yZXMgaW4gWVVWNDIwIExpbmVhciBmb3JtYXQgd2l0aC93aXRob3V0ICtvci05MCByb3RhdGlvbiovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBQbGFuYXJ0b1lVVjQyMExpbmVhckFkc0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotI2RlZmluZSBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9CR1I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0JHUjU2NXRvWVVWNDIwQWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1VZVll0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9VWVZZdG9ZVVY0MjBBZHNBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b1JHQjU2NUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b0JHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvQkdSNTY1QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVBZHNBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRBZHNBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRBZHNBcm05RQotI2RlZmluZSBNNFZJRklfU2V0SExTaW5SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luUkdCNTY1QWRzQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1NldEhMU2luQkdSNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9TZXRITFNpbkJHUjU2NUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwUUNJRnRvWVVWNDIwUVZHQUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBICAgICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQUFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9SUkFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JMICAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STEFkc0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBQbGFuYXJ0b1lVVjQyMExpbmVhciAgICAgICAgICAgICAgICBNNFZJRklfWVVWNDIwUGxhbmFydG9ZVVY0MjBMaW5lYXJBZHNBcm05RQotLyogICAgICAgICAgICAgICAgR0NDIENvbXBpbGVyICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgR2VuZXJpYyBBUk0gYXNzZW1ibHkgZnVuY3Rpb25zICAgICAgICAqLwotCi0jZWxpZiBkZWZpbmVkIEdDQ19BUk0KLQotICAgIC8qKiBBcHBseSBncmF5c2NhbGUgZWZmZWN0IFJHQjU2NXRvUkdCNTY1ICovCi0KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWODg4dG9ZVVY4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCODg4dG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY1NjV0b1lVVjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSR0I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I1NjV0b1lVVjQyMEdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogQkdSNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjBHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwIHRvIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9SR0I1NjVHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCB0byBCR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvQkdSNTY1R2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVHY2NBcm0odm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodEdjY0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0R2NjQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEdjY0FybSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0R2NjQXJtKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luUkdCNTY1R2NjQXJtKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIE1vZGlmeSBITFMgaW4gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpbkJHUjU2NUdjY0FybSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotI2RlZmluZSBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMEdjY0FybQotI2RlZmluZSBNNFZJRklfQkdSNTY1dG9ZVVY0MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9CR1I1NjV0b1lVVjQyMEdjY0FybQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b1JHQjU2NUdjY0FybQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9CR1I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b0JHUjU2NUdjY0FybQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVHY2NBcm0KLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1R2NjQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodEdjY0FybQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0R2NjQXJtCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodEdjY0FybQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0R2NjQXJtCi0jZGVmaW5lIE00VklGSV9TZXRITFNpblJHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luUkdCNTY1R2NjQXJtCi0jZGVmaW5lIE00VklGSV9TZXRITFNpbkJHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luQkdSNTY1R2NjQXJtCi0KLS8qICAgICAgICBBUk05RSBhc3NlbWJseSBmdW5jdGlvbnMgICAgICAgICovCi0jZWxpZiBkZWZpbmVkIEdDQ19BUk05RQotCi0gICAgLyoqIEFwcGx5IGdyYXlzY2FsZSBlZmZlY3QgUkdCNTY1dG9SR0I1NjUgKi8KLQotICAgIE00VklGSV9VSW50OCBNNFZJRklfR3JheXNjYWxlUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY4ODh0b1lVVjg4OCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I4ODh0b1JHQjg4OCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjU2NXRvWVVWNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJHQjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1JHQjU2NXRvWVVWNDIwR2NjQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIEJHUjU2NSB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0JHUjU2NXRvWVVWNDIwR2NjQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwIHRvIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9SR0I1NjVHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjVHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVHY2NBcm05RSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1R2NjQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvUkdCNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodEdjY0FybTlFKAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRHY2NBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b0JHUjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHRHY2NBcm05RSgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0R2NjQXJtOUUoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogTW9kaWZ5IEhMUyBpbiBSR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1NldEhMU2luUkdCNTY1R2NjQXJtOUUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpbkJHUjU2NUdjY0FybTlFKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0jZGVmaW5lIE00VklGSV9SR0I1NjV0b1lVVjQyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1JHQjU2NXRvWVVWNDIwR2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX0JHUjU2NXRvWVVWNDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfQkdSNTY1dG9ZVVY0MjBHY2NBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b1JHQjU2NUdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9ZVVY0MjB0b0JHUjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1lVVjQyMHRvQkdSNTY1R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NUdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVHY2NBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZExlZnRHY2NBcm05RQotI2RlZmluZSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZFJpZ2h0R2NjQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjVSb3RhdGVkTGVmdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1Um90YXRlZExlZnRHY2NBcm05RQotI2RlZmluZSBNNFZJRklfU2V0SExTaW5CR1I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9TZXRITFNpbkJHUjU2NUdjY0FybTlFCi0jZGVmaW5lIE00VklGSV9TZXRITFNpblJHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1NldEhMU2luUkdCNTY1R2NjQXJtOUUKLQotLyogVEkgQ0NTIGFzc2VtYmx5IGZpbGVzICovCi0jZWxpZiBkZWZpbmVkIFRJNDExX0FSTTlFCi0KLSAgICAvKiogQXBwbHkgZ3JheXNjYWxlIGVmZmVjdCBSR0I1NjV0b1JHQjU2NSAqLwotCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9HcmF5c2NhbGVSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjg4OHRvWVVWODg4ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNTY1dG9ZVVY1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1lVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwIChQbGFuYXIpIHRvIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFlVVjQyMCAoUGxhbmFyKSB0byBSZXNpemVkIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIChQbGFuYXIpIHRvIFJlc2l6ZWQgUkdCODg4ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAoUGxhbmFyKSB0byBSZXNpemVkIGFuZCBSb3RhdGVkICgtOTApIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVJvdGF0ZWRMZWZ0KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0gICAgLyoqIFlVVjQyMChQbGFuYXIpIHRvIFJlc2l6ZWQgYW5kIFJvdGF0ZWQgKCs5MCkgUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0KAotICAgICAgICB2b2lkICpwVXNlckRhdGEsCi0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLSAgICAvKiogWVVWNDIwKFBsYW5hcikgdG8gUmVzaXplZCBZVVY0MjAoUGxhbmFyKSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvWVVWNDIwUVZHQSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgWVVWNDIwKFBsYW5hcikgb2YgUUNJRiB0byBSR0I1NjUgb2YgUVZHQSByZXNvbHV0aW9uICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotCi0vKiogUmVzaXplIFlVVjQyMChQbGFuYXIpIG9mIFFDSUYgdG8gUkdCNTY1IG9mIFFWR0EgcmVzb2x1dGlvbiB3aXRoIHJvdGF0aW9uKC05MCkgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUkwodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0KLS8qKiBSZXNpemUgWVVWNDIwKFBsYW5hcikgb2YgUUNJRiB0byBSR0I1NjUgb2YgUVZHQSByZXNvbHV0aW9uIHdpdGggcm90YXRpb24oKzkwKSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9SUih2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotI2RlZmluZSBNNFZJRklfWVVWNDIwdG9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9ZVVY0MjB0b1JHQjU2NVRpNDExQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1JHQjU2NVRpNDExQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdFRpNDExQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCNTY1Um90YXRlZFJpZ2h0VGk0MTFBcm05RQotCi0jZGVmaW5lIE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBICAgICAgIE00VklGSV9ZVVY0MjBRQ0lGdG9ZVVY0MjBRVkdBVGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQSAgICAgICBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQVRpNDExQXJtOUUKLSNkZWZpbmUgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUkwgIE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JMVGk0MTFBcm05RQotI2RlZmluZSBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9SUiAgTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0FfUlJUaTQxMUFybTlFCi0KLS8qICAgICAgICBBTlNJIEMgRnVuY3Rpb25zICAgICAgICAqLwotI2Vsc2UKLQotICAgIC8qKiBBcHBseSBncmF5c2NhbGUgZWZmZWN0IFJHQjU2NXRvUkdCNTY1ICovCi0KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0dyYXlzY2FsZVJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWODg4dG9ZVVY4ODggKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCODg4dG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotCi0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY1NjV0b1lVVjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJSR0I1NjV0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotICAgIC8qKiBSR0I1NjUgdG8gWVVWNDIwICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SR0I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogQlJHNTY1IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfQkdSNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIEJSRzg4OCB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX0JHUjg4OHRvWVVWNDIwKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lT3V0WzNdKTsKLSAgICAvKiogUkdCODg4IHRvIFlVVjQyMCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUkdCODg4dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVPdXRbM10pOwotCi0gICAgLyoqIFlVVjQyMiB0byBZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1VZVll0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLQotICAgIC8qKiBZVVY0MjAgdG8gUkdCNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b1JHQjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKiogWVVWNDIwIHRvIEJHUjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9CR1I1NjVSb3RhdGVkUmlnaHQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gQkdSMjQgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvQkdSMjQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBZVVY0MjAgdG8gUkdCMjQgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMHRvUkdCMjQodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9ZVVY0MjAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9SR0I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBSZXNpemUgQmlsaW5lYXIgWVVWNDIwdG9CR1I1NjUgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9CR1I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIFJlc2l6ZSBCaWxpbmVhciBZVVY0MjB0b1JHQjU2NSB3aXRoIHJvdGF0aW9uICs5MCBvciAtOTAgKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQoCi0gICAgICAgIHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkTGVmdCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKiogUmVzaXplIEJpbGluZWFyIFlVVjQyMHRvQkdSNTY1IHdpdGggcm90YXRpb24gKzkwIG9yIC05MCAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRSaWdodCgKLSAgICAgICAgdm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b0JHUjU2NVJvdGF0ZWRMZWZ0KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIC8qKiBNb2RpZnkgSExTIGluIFJHQjU2NSAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2V0SExTaW5SR0I1NjUodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0gICAgLyoqIE1vZGlmeSBITFMgaW4gQkdSNTY1ICovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9TZXRITFNpbkJHUjU2NSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9ZVVY0MjAgZnJvbSBRQ0lGIHRvIFFWR0EqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvWVVWNDIwUVZHQSh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0gICAgLyoqUmVzaXplIFlVVjQyMHRvUkdCNTY1IGZyb20gUUNJRiB0byBRVkdBKi8KLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFFDSUZ0b1JHQjU2NVFWR0Eodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpOwotICAgIC8qKlJlc2l6ZSBZVVY0MjB0b1JHQjU2NSBmcm9tIFFDSUYgdG8gUVZHQSB3aXRoIHJvdGF0aW9uICs5MCovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBRQ0lGdG9SR0I1NjVRVkdBX1JSKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLSAgICAvKipSZXNpemUgWVVWNDIwdG9SR0I1NjUgZnJvbSBRQ0lGIHRvIFFWR0Egd2l0aCByb3RhdGlvbiAtOTAqLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUUNJRnRvUkdCNTY1UVZHQV9STCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0vKiogUmVzaXplcyBZVVY0MjAgUGxhbmFyIEltYWdlIGFuZCBzdG9yZXMgaW4gWVVWNDIwIExpbmVhciBmb3JtYXQgd2l0aC93aXRob3V0ICtvci05MCByb3RhdGlvbiovCi0gICAgTTRWSUZJX1VJbnQ4IE00VklGSV9ZVVY0MjBQbGFuYXJ0b1lVVjQyMExpbmVhcih2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLS8qKiBSZXNpemVzIFlVVjQyMCBQbGFuYXIgSW1hZ2UgYW5kIHN0b3JlcyBpbiBZVVY0MjIgSW50ZXJsZWF2ZWQgZm9ybWF0Ci0gICAgIHdpdGgvd2l0aG91dCArb3ItOTAgcm90YXRpb24qLwotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwUGxhbmFydG9ZVVY0MjJJbnRlcmxlYXZlZCh2b2lkICpwVXNlckRhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0jZW5kaWYKLQotICAgIC8qKiBkZWZpbml0aW9uIG9mIHRoZSBjb252ZXJ0ZXIgZnVuY3Rpb24gdHlwZXMgKi8KLQotICAgIHR5cGVkZWYgTTRWSUZJX1VJbnQ4IE00VklGSV9QbGFuQ29udmVydGVyRnVuY3Rpb25UeXBlKHZvaWQKLSAgICAgICAgKnBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogaW4sIE00VklGSV9JbWFnZVBsYW5lKiBvdXQpOwotCi0gICAgLyoqIGRlZmluaXRpb24gb2YgdGhlIHByZXByb2Nlc3NpbmcgZnVuY3Rpb24gdHlwZXMgKi8KLSAgICB0eXBlZGVmIE00VklGSV9VSW50OCBNNFZJRklfUHJlcHJvY2Vzc0Z1bmN0aW9uVHlwZSh2b2lkCi0gICAgICAgICpwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIGluLCBNNFZJRklfSW1hZ2VQbGFuZSogb3V0KTsKLQotICAgIE00VklGSV9VSW50OCBNNFZJRklfWVVWNDIwdG9ZVVY0MjAodm9pZCAqdXNlcl9kYXRhLAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0KTsKLSAgICBNNFZJRklfVUludDggTTRWSUZJX1lVVjQyMFBsYW5hclRvWVVWNDIwU2VtaXBsYW5hcih2b2lkICp1c2VyX2RhdGEsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQpOwotICAgIE00VklGSV9VSW50OCBNNFZJRklfU2VtaXBsYW5hcllVVjQyMHRvWVVWNDIwKHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLQotfQotCi0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9NNFZJRklfRklMVEVSU0FQSV9IXyAqLwotCi0vKiBFbmQgb2YgZmlsZSBNNFZJRklfRmlsdGVyc0FQSS5oICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNFZQUF9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VlBQX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NjVjYTIyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000VlBQX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZQUF9BUEkuaAotICogQGJyaWVmICAgIFZpZGVvIHByZXByb2Nlc3NpbmcgQVBJIHB1YmxpYyBmdW5jdGlvbnMgcHJvdG90eXBlcy4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIE00VlBQX0FQSV9ICi0jZGVmaW5lIE00VlBQX0FQSV9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIiAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgY29tbW9uIE9TQUwgdHlwZXMgKi8KLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIiAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgY29tbW9uIE9TQUwgZXJyb3JzICovCi0KLS8qKgotICogICAgSW5jbHVkZSBWaWRlbyBmaWx0ZXJzIGludGVyZmFjZSBkZWZpbml0aW9uIChmb3IgdGhlIE00VklGSV9JbWFnZVBsYW5lIHR5cGUpICovCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUHVibGljIHR5cGUgb2YgdGhlIFZpZGVvIFByZXByb2Nlc3NpbmcgZXhlY3V0aW9uIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX1ZvaWQqICAgIE00VlBQX0NvbnRleHQ7Ci0KLXR5cGVkZWYgZW51bQotewotICAgIE00VlBQX2tJWVVWNDIwPTAsICAgIC8qKjwgWVVWIDQ6MjowIHBsYW5hciAoc3RhbmRhcmQgaW5wdXQgZm9yIG1wZWctNCB2aWRlbykgKi8KLSAgICBNNFZQUF9rSVlVVjQyMiwgICAgICAgIC8qKjwgWVVWNDIyIHBsYW5hciAqLwotICAgIE00VlBQX2tJWVVZViwgICAgICAgIC8qKjwgWVVWNDIyIGludGVybGFjZWQsIGx1bWEgZmlyc3QgKi8KLSAgICBNNFZQUF9rSVVZVlksICAgICAgICAvKio8IFlVVjQyMiBpbnRlcmxhY2VkLCBjaHJvbWEgZmlyc3QgKi8KLSAgICBNNFZQUF9rSUpQRUcsICAgICAgICAvKio8IEpQRUcgY29tcHJlc3NlZCBmcmFtZXMgKi8KLSAgICBNNFZQUF9rSVJHQjQ0NCwgICAgICAgIC8qKjwgUkdCIDEyIGJpdHMgNDo0OjQgKi8KLSAgICBNNFZQUF9rSVJHQjU1NSwgICAgICAgIC8qKjwgUkdCIDE1IGJpdHMgNTo1OjUgKi8KLSAgICBNNFZQUF9rSVJHQjU2NSwgICAgICAgIC8qKjwgUkdCIDE2IGJpdHMgNTo2OjUgKi8KLSAgICBNNFZQUF9rSVJHQjI0LCAgICAgICAgLyoqPCBSR0IgMjQgYml0cyA4Ojg6OCAqLwotICAgIE00VlBQX2tJUkdCMzIsICAgICAgICAvKio8IFJHQiAzMiBiaXRzICAqLwotICAgIE00VlBQX2tJQkdSNDQ0LCAgICAgICAgLyoqPCBCR1IgMTIgYml0cyA0OjQ6NCAqLwotICAgIE00VlBQX2tJQkdSNTU1LCAgICAgICAgLyoqPCBCR1IgMTUgYml0cyA1OjU6NSAqLwotICAgIE00VlBQX2tJQkdSNTY1LCAgICAgICAgLyoqPCBCR1IgMTYgYml0cyA1OjY6NSAqLwotICAgIE00VlBQX2tJQkdSMjQsICAgICAgICAvKio8IEJHUiAyNCBiaXRzIDg6ODo4ICovCi0gICAgTTRWUFBfa0lCR1IzMiAgICAgICAgLyoqPCBCR1IgMzIgYml0cyAgKi8KLX0gTTRWUFBfSW5wdXRWaWRlb0Zvcm1hdDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBQcm90b3R5cGUgb2YgdGhlIG1haW4gdmlkZW8gcHJlcHJvY2Vzc2luZyBmdW5jdGlvbgotICogQG5vdGUgICAgUHJlcHJvY2VzcyBvbmUgZnJhbWUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dCBvZiB0aGUgVlBQLgotICogQHBhcmFtICAgIHBQbGFuZUluOiAgICAoSU5PVVQpICAgIElucHV0IEltYWdlCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0OiAgICAoSU5PVVQpICAgIE91dHB1dCBJbWFnZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgTTRPU0FfRVJSIChNNFZQUF9hcHBseV9mY3QpIChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCk7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZQUF9pbml0VmlkZW9QcmVwcm9jZXNzaW5nKE00VlBQX0NvbnRleHQqIHBDb250ZXh0KQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgbmV3IGV4ZWN1dGlvbiBjb250ZXh0IGZvciB0aGUgVmlkZW8gUHJlcHJvY2Vzc2luZyBjb21wb25lbnQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoT1VUKSBFeGVjdXRpb24gY29udGV4dCBhbGxvY2F0ZWQgYnkgdGhlIGZ1bmN0aW9uLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IHRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeS4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBOVUxMIChkZWJ1ZyBvbmx5KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWUFBfaW5pdFZpZGVvUHJlcHJvY2Vzc2luZyhNNFZQUF9Db250ZXh0KiBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlBQX2FwcGx5VmlkZW9QcmVwcm9jZXNzaW5nKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICAgUHJlcHJvY2VzcyBvbmUgZnJhbWUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHBhcmFtICAgIHBQbGFuZUluOiAgICAoSU5PVVQpICAgIElucHV0IEltYWdlCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0OiAgICAoSU5PVVQpICAgIE91dHB1dCBJbWFnZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBvciBwUGxhbmVJbiBvciBwUGxhbmVPdXQgaXMgTlVMTCAoZGVidWcgb25seSkuCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiBWaWRlbyBQcmVwcm9jZXNzaW5nIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWUFBfYXBwbHlWaWRlb1ByZXByb2Nlc3NpbmcoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWUFBfY2xlYW5VcFZpZGVvUHJlcHJvY2Vzc2luZyhNNFZQUF9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIFRoaXMgbWV0aG9kIGZyZWVzIHRoZSBleGVjdXRpb24gY29udGV4dCBmb3IgdGhlIFZpZGVvIFByZXByb2Nlc3NpbmcgY29tcG9uZW50LgotICogICAgICAgICAgICBBbnkgZnVydGhlciB1c2FnZSBvZiB0aGUgY29udGV4dCB3aWxsIGxlYWQgdG8gdW5wcmVkaWN0YWJsZSByZXN1bHQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvci4KLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBOVUxMIChkZWJ1ZyBvbmx5KS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWUFBfY2xlYW5VcFZpZGVvUHJlcHJvY2Vzc2luZyhNNFZQUF9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWUFBfc2V0VmlkZW9QcmVwcm9jZXNzaW5nTW9kZShNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZFU19JbnB1dFZpZGVvRm9ybWF0IGZvcm1hdCkKLSAqIEBicmllZiAgICBUaGlzIG1ldGhvZCBhcHBseSB0aGUgdmlkZW8gcHJlcHJvY2Vzc2luZyB0byB0aGUgaW5wdXQgcGxhbmUuIFJlc3VsdCBpcyBwdXQgaW50byB0aGUKLSAqICAgICAgICAgICBvdXRwdXQgcGxhbi4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEBwYXJhbSAgICBmb3JtYXQgIDogICAgKElOKSBGb3JtYXQgb2YgaW5wdXQgcGxhbmUgKHJnYiwgeXV2LCAuLi4pCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlBQX3NldFZpZGVvUHJlcHJvY2Vzc2luZ01vZGUoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWUFBfSW5wdXRWaWRlb0Zvcm1hdCBmb3JtYXQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBEZWZpbml0aW9uIG9mIHRoZSBlcnJvcnMgc3BlY2lmaWMgdG8gdGhpcyBtb2R1bGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKio8IElucHV0IGFuZCBvdXRwdXQgcGxhbmVzIGhhdmUgaW5jb21wYXRpYmxlIHByb3BlcnRpZXMgKi8KLSNkZWZpbmUgTTRWUFBfRVJSX0lNQ09NUEFUSUJMRV9JTl9BTkRfT1VUX1BMQU5FUyAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICBNNFBSRVBST0NFU1NfVklERU8sIDB4MDAwMDAxKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIE00VlBQX0FQSV9IICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000V1JJVEVSX2NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRXUklURVJfY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiYjdiODYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRXUklURVJfY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0gLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFdSSVRFUl9jb21tb24uaAotICogQGJyaWVmICAgIFZFUyB3cml0ZXJzIHNoZWxsIGludGVyZmFjZS4KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB0eXBlcyBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIFZFUyB0byBhYnN0cmFjdCB3cml0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBfX000V1JJVEVSX0NPTU1PTl9IX18KLSNkZWZpbmUgX19NNFdSSVRFUl9DT01NT05fSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIiAgIC8qIGZvciBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqLwotI2luY2x1ZGUgIk00T1NBX0ZpbGVSZWFkZXIuaCIgICAvKiBmb3IgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKi8KLSNpbmNsdWRlICJNNE9TQV9PcHRpb25JRC5oIiAgICAgLyogZm9yIE00T1NBX09QVElPTl9JRF9DUkVBVEUoKSAqLwotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIiAgICAgICAvKiBmb3IgTTRXUklURVJfQ09NTU9OICovCi0KLSNpbmNsdWRlICJNNFNZU19TdHJlYW0uaCIgICAgICAgLyogZm9yIE00U1lTX1N0cmVhbUlEICovCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIiAgIC8qIGZvciBNNFNZU19BY2Nlc3NVbml0ICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTVA0VyBFcnJvcnMgJiBXYXJuaW5ncyBkZWZpbml0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNFdBUl9XUklURVJfU1RPUF9SRVEgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfV0FSLCBNNFdSSVRFUl9DT01NT04gLDB4MDAwMDAxKQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWxhaWJsZSBvdXRwdXQgZmlsZSBmb3JtYXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRXUklURVJfa1Vua25vd249LTEsCi0gICAgTTRXUklURVJfazNHUFA9MCwgICAgICAgICAgICAvKio8IDNHUFAgY29tcGxpYW50IGZpbGUgKi8KLSAgICBNNFdSSVRFUl9rQVZJPTEsICAgICAgICAgICAgLyoqPCBBVkkgZmlsZSAqLwotICAgIE00V1JJVEVSX2tBTVI9MiwgICAgICAgICAgICAvKio8IEFNUiBmaWxlICovCi0gICAgTTRXUklURVJfa05FVFdPUkszR1BQPTMsICAgIC8qKjwgM0dQUCB2aWEgVENQICovCi0gICAgTTRXUklURVJfa1BDTT00LCAgICAgICAgICAgIC8qKjwgUENNIGZpbGUgKi8KLSAgICBNNFdSSVRFUl9rSlBFRz01LCAgICAgICAgICAgIC8qKjwgSlBFRyBFWElGIHdyaXRlciAqLwotICAgIE00V1JJVEVSX2tNUDM9NiwgICAgICAgICAgICAvKio8IE1QMyB3cml0ZXIgKi8KLQotICAgIE00V1JJVEVSX2tUeXBlX05CICAvKiBudW1iZXIgb2Ygd3JpdGVycywga2VlcCBpdCBhcyBsYXN0IGVudW0gZW50cnkgKi8KLQotfSBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgIE00V1JJVEVSX09wdGlvbklECi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtcyBkZWZpbmVzIGFsbCBhdmFsYWlibGUgb3B0aW9ucy4gQWxsIHRoZSByZXV0dXJuZWQgdmFsdWVzIGFyZSBpbgotICogICAgICAgICAgIE00T1NBX1VJbnQzMiB0eXBlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTRXUklURVJfa01heEFVU2l6ZSAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEfE00X1dSSVRFLCBNNFdSSVRFUl9DT01NT04sIDB4MDEpLAotICAgIE00V1JJVEVSX2tNYXhDaHVuY2tTaXplICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfUkVBRHxNNF9XUklURSwgTTRXUklURVJfQ09NTU9OLCAweDAyKSwKLSAgICBNNFdSSVRFUl9rRmlsZVNpemUgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9SRUFEICAgICAgICAgICAgLCBcCi0gICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwMyksICAvKio8IEZpbGUgc2l6ZSBpZiB0aGUgcHJvY2VzcyB3YXMgZW5kZWQgd2hlbiB3ZSBjYWxsIHRoZSBtZXRob2QgKi8KLSAgICBNNFdSSVRFUl9rRmlsZVNpemVBdWRpb0VzdGltYXRlZD0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfUkVBRCAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDA0KSwgICAgLyoqPCBGaWxlIHNpemUgaWYgdGhlIHByb2Nlc3Mgd2FzIGVuZGVkIHdoZW4gd2UgY2FsbCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsIGVzdGltYXRlZCBzaXplIGZvciBhdWRpbyAqLwotICAgIE00V1JJVEVSX2tFbWJlZGRlZFN0cmluZyAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLFwKLSAgICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwNSksICAgIC8qKjwgU3RyaW5nIGVtYmVkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUoU1cgLSBWRVMpICovCi0gICAgTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbiA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDA2KSwgICAgLyoqPCBWZXJzaW9uIGVtYmVkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgKi8KLSAgICBNNFdSSVRFUl9rSW50ZWdyYXRpb25UYWcgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MDcpLCAgICAvKio8IFN0cmluZyBlbWJlZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIChjaGFyWzYwXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaW50ZWdyYXRpb24gcHVycG9zZSkgKi8KLSAgICBNNFdSSVRFUl9rTWF4RmlsZVNpemUgICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsIFwKLSAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDA4KSwgICAgLyoqPCBNYXhpbXVtIGZpbGUgc2l6ZSBsaW1pdGF0aW9uICovCi0gICAgTTRXUklURVJfa01heEZpbGVEdXJhdGlvbiA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDA5KSwgICAgLyoqPCBNYXhpbXVtIGZpbGUgZHVyYXRpb24gbGltaXRhdGlvbiAqLwotICAgIE00V1JJVEVSX2tTZXRGdHlwQm94ICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLFwKLSAgICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwQSksICAgIC8qKjwgU2V0ICdmdHlwJyBhdG9tICovCi0gICAgTTRXUklURVJfa01ldGFEYXRhICAgICAgICAgID0gTTRPU0FfT1BUSU9OX0lEX0NSRUFURSAoTTRfV1JJVEUgICAgICAgICxcCi0gICAgICAgICBNNFdSSVRFUl9DT01NT04sIDB4MEIpLCAgICAvKio8IEFkZGl0aW9ubmFsIGluZm9ybWF0aW9uIHRvIHNldCBpbiB0aGUgZmlsZSAqLwotICAgIE00V1JJVEVSX2tEU0kgICAgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLCBcCi0gICAgICAgIE00V1JJVEVSX0NPTU1PTiwgMHgwQyksICAgIC8qKjwgVG8gc2V0IERTSSBvZiB0aGUgZmlsZSAoRGVjb2RlciBzcGVjaWZjIGluZm8pICovCi0gICAgTTRXUklURVJfa0pwZWdSZXNlcnZlRlBEYXRhICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsXAotICAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDBEKSwgICAgLyoqPCBSZXNlcnZlIHNvbWUgc3BhY2UgaW4gdGhlIGZpbGUgZm9yIEpQRUcgZmFzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgZGF0YSAqLwotICAgIE00V1JJVEVSX2tKcGVnU2V0RlBEYXRhICAgICA9IE00T1NBX09QVElPTl9JRF9DUkVBVEUgKE00X1dSSVRFICAgICAgICAsIFwKLSAgICAgICAgTTRXUklURVJfQ09NTU9OLCAweDBFKSwgICAgLyoqPCBXcml0ZSBGYXN0IFByb2Nlc3NpbmcgRGF0YSBpbiB0aGUgZmlsZSovCi0gICAgLyogKyBDUkxWNjc3NSAtSC4yNjQgdHJpbW1pbmcgKi8KLSAgICBNNFdSSVRFUl9rTVVMX1BQU19TUFMgICAgICAgPSBNNE9TQV9PUFRJT05fSURfQ1JFQVRFIChNNF9XUklURSAgICAgICAgLCBNNFdSSVRFUl9DT01NT04sIDB4MEYpCi0gICAgLyogLSBDUkxWNjc3NSAtSC4yNjQgdHJpbW1pbmcgKi8KLX0gTTRXUklURVJfT3B0aW9uSUQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRXUklURVJfSGVhZGVyCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYnVmZmVyIHdoZXJlIGFuIGhlYWRlciBpcyBwdXQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9NZW1BZGRyOCAgICBwQnVmOyAgICAgICAgLyoqPCBCdWZmZXIgZm9yIHRoZSBoZWFkZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgU2l6ZTsgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgZGF0YSAqLwotfSBNNFdSSVRFUl9IZWFkZXI7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRXUklURVJfU3RyZWFtVmlkZW9JbmZvcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHNwZWNpZmljIHZpZGVvIHN0cmVhbSBpbmZvcywgZXh0ZW5zaW9uIHRvCi0gKiAgICAgICAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1VJbnQzMiAgICBoZWlnaHQ7ICAgICAgICAgICAgICAgIC8qKjwgRnJhbWUgaGVpZ2h0ICovCi0gICAgTTRPU0FfVUludDMyICAgIHdpZHRoOyAgICAgICAgICAgICAgICAvKio8IEZyYW1lIFdpZHRoICovCi0gICAgTTRPU0FfRG91YmxlICAgIGZwczsgICAgICAgICAgICAgICAgLyoqPCBUYXJnZXR0ZWQgZnJhbWVyYXRlIG9mIHRoZSB2aWRlbyAqLwotICAgIE00V1JJVEVSX0hlYWRlciAgICBIZWFkZXI7ICAgICAgICAgICAgICAgIC8qKjwgU2VxdWVuY2UgaGVhZGVyIG9mIHRoZSB2aWRlbyBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyIHNldCB0byBOVUxMIGlmIG5vIGhlYWRlciBwcmVzZW50ICovCi19IE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHNwZWNpZmljIGF1ZGlvIHN0cmVhbSBpbmZvcywgZXh0ZW5zaW9uIHRvCi0gICAgICAgICAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00T1NBX1VJbnQzMiAgICBuYlNhbXBsZXNQZXJTZWM7ICAgIC8qKjwgTnVtYmVyIG9mIFNhbXBsZXMgcGVyIHNlY29uZCAqLwotICAgIE00T1NBX1VJbnQxNiAgICBuYkJpdHNQZXJTYW1wbGU7ICAgIC8qKjwgTnVtYmVyIG9mIEJpdHMgaW4gMSBzYW1wbGUgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgbmJDaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLwotICAgIE00V1JJVEVSX0hlYWRlciAgICBIZWFkZXI7ICAgICAgICAgICAgICAgIC8qKjwgRGVjb2RlciBTcGVjaWZpYyBJbmZvIG9mIHRoZSBhdWRpb3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlciBzZXQgdG8gTlVMTCBpZiBubyBEU0kgcHJlc2VudCAqLwotfSBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRXUklURVJfT3JpZW50YXRpb24KLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgcG9zc2libGUgb3JpZW50YXRpb24gb2YgYSBmcmFtZSBhcyBkZXNjcmliZWQKLSAqICAgICAgICAgICAgaW4gdGhlIEVYSUYgc3RhbmRhcmQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRXUklURVJfT3JpZW50YXRpb25Vbmtub3duID0gMCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvblRvcExlZnQsCi0gICAgTTRXUklURVJfT3JpZW50YXRpb25Ub3BSaWdodCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvbkJvdHRvbVJpZ2h0LAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uQm90dG9tTGVmdCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvbkxlZnRUb3AsCi0gICAgTTRXUklURVJfT3JpZW50YXRpb25SaWdodFRvcCwKLSAgICBNNFdSSVRFUl9PcmllbnRhdGlvblJpZ2h0Qm90dG9tLAotICAgIE00V1JJVEVSX09yaWVudGF0aW9uTGVmdEJvdHRvbQotfU00V1JJVEVSX09yaWVudGF0aW9uIDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRXUklURVJfTWV0YURhdGEKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFsbCB0aGUgbWV0YSBkYXRhIHRvIHN0b3JlIGluIHRoZSBlbmNvZGVkIGZpbGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgUGhvbmVNYW51ZmFjdHVyZXIgOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIFBob25lTW9kZWwgOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIEFydGlzdCA7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgQ29weXJpZ2h0IDsKLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICBTb2Z0d2FyZSA7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgQ3JlYXRpb25EYXRlOwotICAgIE00V1JJVEVSX09yaWVudGF0aW9uICAgIE9yaWVudGF0aW9uIDsKLQotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIFdpZHRoIDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBIZWlnaHQgOwotCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgVGh1bWJuYWlsV2lkdGggOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIFRodW1ibmFpbEhlaWdodCA7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBUaHVtYm5haWxQcmVzZW5jZSA7Ci19TTRXUklURVJfTWV0YURhdGE7Ci0KLQotdHlwZWRlZiB2b2lkKiBNNFdSSVRFUl9Db250ZXh0OwotCi10eXBlZGVmIE00T1NBX0VSUiAoTTRXUklURVJfb3BlbldyaXRlKSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQqIGhDb250ZXh0LFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG91dHB1dEZpbGVEZXNjcmlwdG9yLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlclBvaW50ZXIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdGVtcEZpbGVEZXNjcmlwdG9yLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZGVyUG9pbnRlcik7Ci10eXBlZGVmIE00T1NBX0VSUiAoTTRXUklURVJfYWRkU3RyZWFtKSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQgIHBDb250ZXh0LFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qc3RyZWFtRGVzY3JpcHRpb24pOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00V1JJVEVSX3N0YXJ0V3JpdGluZykgICAgKE00V1JJVEVSX0NvbnRleHQgIHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFdSSVRFUl9jbG9zZVdyaXRlKSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQgIHBDb250ZXh0KTsKLXR5cGVkZWYgTTRPU0FfRVJSIChNNFdSSVRFUl9zZXRPcHRpb24pICAgICAgICAoTTRXUklURVJfQ29udGV4dCAgcENvbnRleHQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpOwotdHlwZWRlZiBNNE9TQV9FUlIgKE00V1JJVEVSX2dldE9wdGlvbikgICAgICAgIChNNFdSSVRFUl9Db250ZXh0ICBwQ29udGV4dCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgRGVmaW5lcyBhbGwgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgYSB3cml0ZXIgc2hlbGwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000V1JJVEVSX0dsb2JhbEludGVyZmFjZQotewotICAgIE00V1JJVEVSX29wZW5Xcml0ZSogICAgICAgICAgICAgcEZjdE9wZW47Ci0gICAgTTRXUklURVJfYWRkU3RyZWFtKiAgICAgICAgICAgICAgICBwRmN0QWRkU3RyZWFtOwotICAgIE00V1JJVEVSX3N0YXJ0V3JpdGluZyogICAgICAgICAgcEZjdFN0YXJ0V3JpdGluZzsKLSAgICBNNFdSSVRFUl9jbG9zZVdyaXRlKiAgICAgICAgICAgIHBGY3RDbG9zZVdyaXRlOwotICAgIE00V1JJVEVSX3NldE9wdGlvbiogICAgICAgICAgICAgICAgcEZjdFNldE9wdGlvbjsKLSAgICBNNFdSSVRFUl9nZXRPcHRpb24qICAgICAgICAgICAgICAgIHBGY3RHZXRPcHRpb247Ci19IE00V1JJVEVSX0dsb2JhbEludGVyZmFjZTsKLQotdHlwZWRlZiBNNE9TQV9FUlIgIE00V1JJVEVSX3N0YXJ0QVUoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSk7Ci10eXBlZGVmIE00T1NBX0VSUiAgTTRXUklURVJfcHJvY2Vzc0FVKE00V1JJVEVSX0NvbnRleHQgcENvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlCi0gKiBAYnJpZWYgICAgRGVmaW5lcyBhbGwgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCB0byB3cml0ZSBkYXRhIHdpdGggYSB3cml0ZXIgc2hlbGwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX000V1JJVEVSX0RhdGFJbnRlcmZhY2UKLXsKLSAgICBNNFdSSVRFUl9zdGFydEFVKiAgICBwU3RhcnRBVTsKLSAgICBNNFdSSVRFUl9wcm9jZXNzQVUqIHBQcm9jZXNzQVU7Ci0KLSAgICBNNFdSSVRFUl9Db250ZXh0ICAgIHBXcml0ZXJDb250ZXh0OwotCi19IE00V1JJVEVSX0RhdGFJbnRlcmZhY2U7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKl9fTTRXUklURVJfQ09NTU9OX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X0JpdFN0cmVhbVBhcnNlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQml0U3RyZWFtUGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4NzU0NTguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQml0U3RyZWFtUGFyc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRfQml0U3RyZWFtUGFyc2VyLmgKLSAqIEBicmllZiAgTVBFRy00IEZpbGUgRm9ybWF0IGJpdCBzdHJlYW0gdXRpbGl0eQotICogQG5vdGUgICBUaGlzIGZpbGUgY29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgdXNlZCB0byBwYXJzZSBNUEVHIHNwZWNpZmljCi0gKiAgICAgICAgIGRhdGEgc3RydWN0dXJlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRfQklUU1RSRUFNUEFSU0VSX0hfXwotI2RlZmluZSBfX000X0JJVFNUUkVBTVBBUlNFUl9IX18KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLS8qKgotKiBNNF9CaXRTdHJlYW1QYXJzZXJfSW5pdC4KLSoKLSogQWxsb2NhdGVzIHRoZSBjb250ZXh0IGFuZCBpbml0aWFsaXplcyBpbnRlcm5hbCBkYXRhCi0qCi0qIEBwYXJhbSBwQ29udGV4dCAgIDogQSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGludGVybmFsbHkgdXNlZCBieSB0aGUgcGFja2FnZSAtIEFMTE9DQVRFRCBCWSBUSEUKLSogICAgICAgICAgICAgICAgICAgIEZVTkNUSU9OIChNNE9TQV9OVUxMIGlmIGFsbG9jYXRpb24gZmFpbHMpCi0qIEBwYXJhbSBiaXRTdHJlYW0gIDogQSBwb2ludGVyIHRvIHRoZSBiaXRzdHJlYW0gLSBtdXN0IGJlIDMyIGJpdHMgYXMgYWNjZXNzIGFyZSAzMiBiaXRzCi0qIEBwYXJhbSBzaXplICAgICAgICA6IFRoZSBzaXplIG9mIHRoZSBiaXRzdHJlYW0gaW4gYnl0ZXMKLSoKLSovCi12b2lkIE00X0JpdFN0cmVhbVBhcnNlcl9Jbml0KHZvaWQqKiBwQ29udGV4dCwgdm9pZCogcEJpdFN0cmVhbSwgTTRPU0FfSW50MzIgc2l6ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIENsZWFuIHVwIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4vT1VUKSAgTTRfQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdm9pZCBNNF9CaXRTdHJlYW1QYXJzZXJfQ2xlYW5VcCh2b2lkKiBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFJlYWQgdGhlIG5leHQgPGxlbmd0aD4gYml0cyBpbiB0aGUgYml0c3RyZWFtLgotICogQG5vdGUgICAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOL09VVCkgTTRfQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbGVuZ3RoICAgICAgICAoSU4pIFRoZSBudW1iZXIgb2YgYml0cyB0byBleHRyYWN0IGZyb20gdGhlIGJpdHN0cmVhbQotICogQHJldHVybiAgICB0aGUgcmVhZCBiaXRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfVUludDMyIE00X0JpdFN0cmVhbVBhcnNlcl9TaG93Qml0cyh2b2lkKiBwQ29udGV4dCwgTTRPU0FfSW50MzIgbGVuZ3RoKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgSW5jcmVtZW50IHRoZSBiaXRzdHJlYW0gcG9pbnRlciBvZiA8bGVuZ3RoPiBiaXRzLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTi9PVVQpIE00X0JpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHBhcmFtICAgIGxlbmd0aCAgICAgICAgKElOKSBUaGUgbnVtYmVyIG9mIGJpdCB0byBzaGlmdCB0aGUgYml0c3RyZWFtCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdm9pZCBNNF9CaXRTdHJlYW1QYXJzZXJfRmx1c2hCaXRzKHZvaWQqIHBDb250ZXh0LCBNNE9TQV9JbnQzMiBsZW5ndGgpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBHZXQgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgcG9pbnRlZCBieSB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCi0gKiBJdCBkb2VzIG5vdCB1cGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCi0gKgotICogQHBhcmFtIHBDb250ZXh0ICAgOiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBwYWNrYWdlCi0gKiBAcGFyYW0gbGVuZ3RoICAgICAgICA6IFRoZSBudW1iZXIgb2YgYml0IHRvIGV4dHJhY3QgZnJvbSB0aGUgYml0c3RyZWFtCi0gKgotICogQHJldHVybnMgdGhlIHJlYWQgYml0cwotKi8KLU00T1NBX1VJbnQzMiBNNF9CaXRTdHJlYW1QYXJzZXJfR2V0Qml0cyh2b2lkKiBwQ29udGV4dCxNNE9TQV9JbnQzMiBiaXRQb3MsIE00T1NBX0ludDMyIGxlbmd0aCk7Ci0KLS8qKgotKiBNNF9CaXRTdHJlYW1QYXJzZXJfUmVzdGFydCByZXNldHMgdGhlIGJpdHN0cmVhbSBpbmRleGVzLgotKgotKiBAcGFyYW0gcENvbnRleHQgICA6IEEgcG9pbnRlciB0byB0aGUgY29udGV4dCBpbnRlcm5hbGx5IHVzZWQgYnkgdGhlIHBhY2thZ2UKLSoKLSovCi12b2lkIE00X0JpdFN0cmVhbVBhcnNlcl9SZXN0YXJ0KHZvaWQqIHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIHBvaW50ZWQgYnkgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICogQHJldHVybnMgcG9pbnRlciB0byB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgYml0c3RyZWFtCi0gKiBAbm90ZSAgICBJdCBzaG91bGQgYmUgdXNlZCBjYXJlZnVsbHkgYXMgdGhlIHBvaW50ZXIgaXMgaW4gdGhlIGJpdHN0cmVhbSBpdHNlbGYKLSAqICAgICAgICAgICAgYW5kIG5vIGNvcHkgaXMgbWFkZS4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4vT1VUKSAgTTRfQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0qLwotTTRPU0FfVUludDgqICBNNF9CaXRTdHJlYW1QYXJzZXJfR2V0Q3VycmVudGJpdFN0cmVhbVBvaW50ZXIodm9pZCogcENvbnRleHQpOwotCi0vKioKLSogTTRfQml0U3RyZWFtUGFyc2VyX0dldFNpemUgZ2V0cyB0aGUgc2l6ZSBvZiB0aGUgYml0c3RyZWFtIGluIGJ5dGVzCi0qCi0qIEBwYXJhbSBwQ29udGV4dCAgIDogQSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGludGVybmFsbHkgdXNlZCBieSB0aGUgcGFja2FnZQotKgotKiBAcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYml0c3RyZWFtIGluIGJ5dGVzCi0qLwotTTRPU0FfSW50MzIgTTRfQml0U3RyZWFtUGFyc2VyX0dldFNpemUodm9pZCogcENvbnRleHQpOwotCi12b2lkIE00X01QRUc0Qml0U3RyZWFtUGFyc2VyX0luaXQodm9pZCoqIHBDb250ZXh0LCB2b2lkKiBwQml0U3RyZWFtLCBNNE9TQV9JbnQzMiBzaXplKTsKLQotLyoqCi0qIGdldE1wZWdMZW5ndGhGcm9tSW50ZWdlciByZXR1cm5zIGEgZGVjb2RlZCBzaXplIHZhbHVlIGZyb20gYW4gZW5jb2RlZCBvbmUgKFNETCkKLSoKLSogQHBhcmFtIHBDb250ZXh0ICAgOiBBIHBvaW50ZXIgdG8gdGhlIGNvbnRleHQgaW50ZXJuYWxseSB1c2VkIGJ5IHRoZSBwYWNrYWdlCi0qIEBwYXJhbSB2YWwgOiBlbmNvZGVkIHZhbHVlCi0qCi0qIEByZXR1cm5zIHNpemUgaW4gYSBodW1hbiByZWFkYWJsZSBmb3JtCi0qLwotCi1NNE9TQV9JbnQzMiBNNF9NUEVHNEJpdFN0cmVhbVBhcnNlcl9HZXRNcGVnTGVuZ3RoRnJvbUludGVnZXIodm9pZCogcENvbnRleHQsIE00T1NBX1VJbnQzMiB2YWwpOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIERlY29kZSBhbiBNUEVHNCBTeXN0ZW1zIGRlc2NyaXB0b3Igc2l6ZSBmcm9tIGFuIGVuY29kZWQgU0RMIHNpemUgZGF0YS4KLSAqIEBub3RlICAgIFRoZSB2YWx1ZSBpcyByZWFkIGZyb20gdGhlIGN1cnJlbnQgYml0c3RyZWFtIGxvY2F0aW9uLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTi9PVVQpICBNNF9CaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqIEByZXR1cm4gICAgU2l6ZSBpbiBhIGh1bWFuIHJlYWRhYmxlIGZvcm0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9JbnQzMiBNNF9NUEVHNEJpdFN0cmVhbVBhcnNlcl9HZXRNcGVnTGVuZ3RoRnJvbVN0cmVhbSh2b2lkKiBwQ29udGV4dCk7Ci0KLSNlbmRpZiAvKl9fTTRfQklUU1RSRUFNUEFSU0VSX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X0NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc2MGE3ZGEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRfQ29tbW9uLmgKLSAqIEBicmllZiAgQ29tbW9uIGRhdGEgc3RydWN0dXJlIGJldHdlZW4gc2hlbGxzCi0gKiBAbm90ZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgX19NNF9DT01NT05fSF9fCi0jZGVmaW5lIF9fTTRfQ09NTU9OX0hfXwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgX3BhcmFtZXRlclNldAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGF2YwotICogICAgICAgICAgICAgICBkZWNvZGVyIHNwZWNpZmljIGluZm8KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgX3BhcmFtZXRlclNldAotewotICAgIE00T1NBX1VJbnQxNiBtX2xlbmd0aDsgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGl0ZW1zKi8KLSAgICBNNE9TQV9VSW50OCogbV9wUGFyYW1ldGVyU2V0VW5pdDsgICAvKiBBcnJheSBvZiBpdGVtcyovCi19IFBhcmFtZXRlclNldCA7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIF9hdmNTcGVjaWZpY0luZm8KLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHNwZWNpZmljIGluZm8gZm9yIHRoZSBhdmMgZGVjb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfYXZjU3BlY2lmaWNJbmZvCi17Ci0gICAgTTRPU0FfVUludDggICAgICAgIG1fbmFsVW5pdExlbmd0aDsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBOQUxVbml0TGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiBhIEFWQyBzYW1wbGUgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgbV9udW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0czsgICAvKiBOdW1iZXIgb2Ygc2VxdWVuY2UgcGFyYW1ldGVyIHNldHMqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICBtX251bU9mUGljdHVyZVBhcmFtZXRlclNldHM7ICAgIC8qIE51bWJlciBvZiBwaWN0dXJlIHBhcmFtZXRlciBzZXRzKi8KLSAgICBQYXJhbWV0ZXJTZXQgICAgKm1fcFNlcXVlbmNlUGFyYW1ldGVyU2V0OyAgICAgICAgLyogU2VxdWVuY2UgcGFyYW1ldGVyIHNldHMgYXJyYXkqLwotICAgIFBhcmFtZXRlclNldCAgICAqbV9wUGljdHVyZVBhcmFtZXRlclNldDsgICAgICAgIC8qIFBpY3R1cmUgcGFyYW1ldGVyIHNldHMgYXJyYXkqLwotfSBBdmNTcGVjaWZpY0luZm8gOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNF9TeW50aGVzaXNBdWRpb0luZm8KLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgc3BlY2lmaWMgcG9pbnRlcnMgdXNlZCBmb3Igc3ludGhlc2lzIGF1ZGlvIGZvcm1hdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IF9zeW50aGVzaXNBdWRpb0luZm8KLXsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgbV9wSW5wdXRCdWY7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgIG1fcElucHV0SW5mbzsKLSAgICBNNE9TQV9VSW50MTYgICAgbV91aU5iU3ViRnJhbWVQZXJTdGVwOwotICAgIE00T1NBX1VJbnQzMiAgICBtX3VpVXNlZEJ5dGVzOwotfSBNNF9TeW50aGVzaXNBdWRpb0luZm87Ci0KLQotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00X0FBQ0Rvd25zYW1wbGluZ01vZGUKLSAqIEBicmllZiAgIFRoaXMgZW51bSBzdGF0ZXMgbW9kZXMgZm9yIERvd24gc2FtcGxpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBBQUNfa0RTX09GRiAgICA9IDAsICAgICAgICAvKio8IE5vIERvd24gc2FtcGxpbmcgKi8KLSAgICBBQUNfa0RTX0JZXzIgICA9IDEsICAgICAgICAvKio8IERvd24gc2FtcGxpbmcgYnkgMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZSA9IEFBQyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBzYW1wbGluZyByYXRlID0gYWFjX3NhbXBfZnJlcS8yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlID0gSEVfQUFDIGFuZCBpbnB1dCBpcyBBQUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCBzYW1wbGluZyByYXRlID0gYWFjX3NhbXBfZnJlcS4oTm8gZG93bnNhbXBpbmcpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZSA9IEhFX0FBQyBhbmQgaW5wdXQgaXMgSEVfQUFDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQgc2FtcGxpbmcgcmF0ZSA9IGFhY19zYW1wX2ZyZXEgKERvd25zYW1wbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnMgaW4gU0JSIHRvb2wpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBwcm9maWxlID0gSEVfQUFDX3YyIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IFN1cHBvcnRlZCAqLwotICAgIEFBQ19rRFNfQllfMyAgID0gMiwgICAgICAgIC8qKjwgRG93biBzYW1wbGluZyBieSAzICAtIG9ubHkgZm9yIEFBQyBwcm9maWxlICovCi0gICAgQUFDX2tEU19CWV80ICAgPSAzLCAgICAgICAgLyoqPCBEb3duIHNhbXBsaW5nIGJ5IDQgIC0gb25seSBmb3IgQUFDIHByb2ZpbGUgKi8KLSAgICBBQUNfa0RTX0JZXzggICA9IDQgICAgICAgIC8qKjwgRG93biBzYW1wbGluZyBieSA4ICAtIG9ubHkgZm9yIEFBQyBwcm9maWxlICovCi0KLX0gTTRfQUFDRG93bnNhbXBsaW5nTW9kZTsKLQotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRfQUFDT3V0cHV0TW9kZQotICogQGJyaWVmICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIG91dHB1dCBtb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgQUFDX2tNb25vICAgICAgPSAwLCAgICAvKio8IE91dHB1dCBpcyBNb25vICAqLwotICAgIEFBQ19rU3RlcmVvICAgID0gMSAgICAgLyoqPCBPdXRwdXQgaXMgU3RlcmVvICovCi19IE00X0FBQ091dHB1dE1vZGU7Ci0KLQotLyoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00X0FBQ0RlY1Byb2ZpbGUKLSAqIEBicmllZiAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBBQUMgZGVjb2RlciBwcm9maWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgQUFDX2tBQUMgICAgICAgPSAwLCAgICAgICAgLyoqPCBBQUMgcHJvZmlsZSAob25seSBBQUMgTEMgb2JqZWN0IGFyZSBzdXBwb3J0ZWQpICovCi0gICAgQUFDX2tIRV9BQUMgICAgPSAxLCAgICAgICAgLyoqPCBIRSBBQUMgb3IgQUFDKyBwcm9maWxlIChTQlIgaW4gTFAgTW9kZSkgICovCi0gICAgQUFDX2tIRV9BQUNfdjIgPSAyICAgICAgICAvKio8IEhFIEFBQyB2MiBvciBFbmhhbmNlZCBBQUMrIHByb2ZpbGUgKFNCUiBUb29sIGluIEhRIE1vZGUpICovCi19IE00X0FBQ0RlY1Byb2ZpbGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRfQWFjRGVjb2RlckNvbmZpZwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHNwZWNpZmljIHNldHRpbmdzIGFjY29yZGluZyB0bwotICogICAgICAgICAgICAgICAgdGhlIHVzZXIgcmVxdWlyZW1lbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNF9BQUNEZWNQcm9maWxlICAgICAgICBtX0FBQ0RlY29kZXJQcm9maWxlOwotICAgIE00X0FBQ0Rvd25zYW1wbGluZ01vZGUgICAgbV9Eb3duU2FtcGxpbmdNb2RlOwotICAgIE00X0FBQ091dHB1dE1vZGUgICAgICAgIG1fT3V0cHV0TW9kZTsKLQotfSBNNF9BYWNEZWNvZGVyQ29uZmlnOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlIE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSB1c2VyJ3MgZGF0YSBuZWVkZWQgdG8gZGVjb2RlIHRoZQotICogICAgICAgICAgICBBQUNwbHVzIHN0cmVhbQotICogQG5vdGUgICAgVGhlIGZpZWxkIG1fcEZpcnN0QVUgaXMgdXNlZCBpbiBjYXNlIG9mIGxvY2FsIGZpbGVzICAgIGFuZAotICogICAgICAgICAgICB0aGUgZmllbGQgbV9iSXNTYnJFbmFibGVkIGlzIHVzZWQgaW4gc3RyZWFtaW5nIGNhc2UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgTTRPU0FfVm9pZCogICAgICAgICAgICBtX3BGaXJzdEFVOyAgICAgICAgICAgICAgICAvKio8IFRoZSBmaXJzdCBBVSBmcm9tIHdoZXJlIFNCUiBkYXRhIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGVkIChsb2NhbCBmaWxlIGNhc2UpKi8KLSAgTTRPU0FfQm9vbCAgICAgICAgICAgIG1fYklzU2JyRW5hYmxlZDsgICAgICAgIC8qKjwgQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBzdHJlYW0gaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNwbHVzIChzdHJlYW1pbmcgY2FzZSkqLwotICBNNF9BYWNEZWNvZGVyQ29uZmlnKiAgICBtX3BBYWNEZWNvZGVyVXNlckNvbmZpZzsvKio8IERlY29kZXIgc3BlY2lmaWMgdXNlciBzZXR0aW5nICovCi0KLX0gTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YTsKLQotI2VuZGlmIC8qIF9fTTRfQ09NTU9OX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X1V0aWxzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9NNF9VdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMWUwODI5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X1V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRfVXRpbHMuaAotICogQGJyaWVmICAgIFV0aWxpdGllcwotICogQG5vdGUgICAgVGhpcyBmaWxlIGRlZmluZXMgdXRpbGl0eSBtYWNyb3MKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaWZuZGVmIF9fTTRfVVRJTFNfSF9fCi0jZGVmaW5lIF9fTTRfVVRJTFNfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogICAgTTRfTWVkaWFUaW1lIGRlZmluaXRpb24KLSAgICBUaGlzIHR5cGUgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHNvbWUgc2hlbGwgY29tcG9uZW50cyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi10eXBlZGVmIE00T1NBX0RvdWJsZSAgICBNNF9NZWRpYVRpbWU7Ci0KLS8qICAgIEdFVF9NRU1PUlkzMiBtYWNybyBkZWZpbml0aW9uCi0gICAgVGhpcyBtYWNybyBpcyB1c2VkIGJ5IHRoZSAzR1AgcmVhZGVyKi8KLSNpZmRlZiBfX0JJR19FTkRJQU4KLSNkZWZpbmUgR0VUX01FTU9SWTMyKHgpICh4KQotI2Vsc2UKLSNkZWZpbmUgR0VUX01FTU9SWTMyKHgpICggKCgoeCkmMHhmZik8PDI0KSB8ICgoKHgpJjB4ZmYwMCk8PDgpIHxcCi0gICAgICgoKHgpJjB4ZmYwMDAwKT4+OCkgfCAoKCh4KSYweGZmMDAwMDAwKT4+MjQpICkKLSNlbmRpZiAvKl9fQklHX0VORElBTiovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000X1VUSUxTX0hfXyovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL000X1ZpZGVvRWRpdGluZ0NvbW1vbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDllN2QwM2YuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00X1ZpZGVvRWRpdGluZ0NvbW1vbi5oCi0gKiBAYnJpZWYgICAgVmlkZW8gRWRpdGluZyAoVlNTM0dQUCwgTUNTLCBQVE8zR1BQKSBjb21tb24gZGVmaW5pdGlvbnMKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaWZuZGVmIF9fTTRfVklERU9FRElUSU5HQ09NTU9OX0hfXwotI2RlZmluZSBfX000X1ZJREVPRURJVElOR0NPTU1PTl9IX18KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioKLSAqICAgIFZlcnNpb24gKi8KLS8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUiAgICAzCi0jZGVmaW5lIE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IgICAgMQotI2RlZmluZSBNNFZJREVPRURJVElOR19WRVJTSU9OX1JFVklTSU9OICAgIDAKLQotI2RlZmluZSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEUgMHg3ZmZmZmZmZgotI2RlZmluZSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMIDB4N2ZmZmZmZmYKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBmaWxlIGZvcm1hdCB0eXBlIHRvIGJlIHVzZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0gewotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICAgICAgICA9IDAsICAgICAgLyoqPCAzR1BQIGZpbGUgbWVkaWEgdHlwZSA6IGlucHV0ICYgb3V0cHV0ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNCAgICAgICAgID0gMSwgICAgICAvKio8IE1QNCAgZmlsZSBtZWRpYSB0eXBlIDogaW5wdXQgICAgICAgICAgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SICAgICAgICAgPSAyLCAgICAgIC8qKjwgQU1SICBmaWxlIG1lZGlhIHR5cGUgOiBpbnB1dCAmIG91dHB1dCAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMgICAgICAgICA9IDMsICAgICAgLyoqPCBNUDMgIGZpbGUgbWVkaWEgdHlwZSA6IGlucHV0ICAgICAgICAgICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1BDTSAgICAgICAgID0gNCwgICAgICAvKio8IFBDTSBSQVcgZmlsZSBtZWRpYSB0eXBlIDogaW5wdXQgICAgUkMgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfSlBHICAgICAgICAgPSA1LCAgICAgIC8qKjwgU1RJTEwgUElDVFVSRSBGRUFUVVJFOiBKUEcgZmlsZSBtZWRpYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogaW5wdXQgQU5EIE9VVFBVVCAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9CTVAgICAgICAgICA9IDYsICAgICAgLyoqPCBTVElMTCBQSUNUVVJFIEZFQVRVUkU6IEJNUCBmaWxlIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgOiBpbnB1dCBvbmx5ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0dJRiAgICAgICAgID0gNywgICAgICAvKio8IFNUSUxMIFBJQ1RVUkUgRkVBVFVSRTogR0lGIGZpbGUgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IGlucHV0IG9ubHkgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUE5HICAgICAgICAgPSA4LCAgICAgIC8qKjwgU1RJTEwgUElDVFVSRSBGRUFUVVJFOiBQTkcgZmlsZSBtZWRpYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIDogaW5wdXQgb25seSAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCAgICA9IDksICAgICAgLyoqPCBTVElMTCBQSUNUVVJFIEZFQVRVUkU6IEFSR0I4ODg4IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWEgdHlwZSA6IGlucHV0IG9ubHkgKi8KLSAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTTRWICAgICAgICAgPSAxMCwgICAgIC8qKjwgTTRWICBmaWxlIG1lZGlhIHR5cGUgOiBpbnB1dCBvbmx5ICAgICAqLwotICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9VbnN1cHBvcnRlZCA9IDI1NSAgICAgLyoqPCBVbnN1cHBvcnRlZCBmaWxlIG1lZGlhIHR5cGUgICAgICAgICAgICovCi19IE00VklERU9FRElUSU5HX0ZpbGVUeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhbGFpYmxlIHZpZGVvIGNvbXByZXNzaW9uIGZvcm1hdHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbyA9IDAsIC8qKjwgVmlkZW8gbm90IHByZXNlbnQgKi8KLSAgICBNNFZJREVPRURJVElOR19rSDI2MyA9IDEsIC8qKjwgSDI2MyB2aWRlbyAqLwotICAgIE00VklERU9FRElUSU5HX2tIMjY0ID0gMiwgICAgLyoqPCBIMjY0IHZpZGVvICovCi0gICAgTTRWSURFT0VESVRJTkdfa01QRUc0ID0gMywgLyoqPCBNUEVHLTQgdmlkZW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rTnVsbFZpZGVvID0gMjU0LCAgLyoqPCBEbyBub3QgY2FyZSB2aWRlbyB0eXBlLCB1c2UgTlVMTCBlbmNvZGVyICovCi0gICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkVmlkZW8gPSAyNTUgICAgLyoqPCBVbnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0gdHlwZSAqLwotfSBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdAotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFsYWlibGUgYXVkaW8gZm9ybWF0LgotICogQG5vdGUgICAgSEVfQUFDLCBIRV9BQUNfdjIgYW5kIE1QMyBjYW4gbm90IGJlIHVzZWQgZm9yIHRoZSBvdXRwdXQgYXVkaW8gZm9ybWF0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICAgICAgICAgICAgPSAwLCAgICAvKio8IEF1ZGlvIG5vdCBwcmVzZW50ICovCi0gICAgTTRWSURFT0VESVRJTkdfa0FNUl9OQiAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEFNUiBOYXJyb3cgQmFuZCBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tBQUMgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBBQUMgYXVkaW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rQUFDcGx1cyAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgQUFDKyBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tlQUFDcGx1cyAgICAgICAgICAgICA9IDQsICAgIC8qKjwgRW5oYW5jZWQgQUFDKyBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tNUDMgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBNUDMgYXVkaW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rRVZSQyAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgRVZSQyBhdWRpbyAqLwotICAgIE00VklERU9FRElUSU5HX2tQQ00gICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBQQ00gYXVkaW8gKi8KLSAgICBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvICAgICAgICAgICA9IDI1NCwgIC8qKjwgRG8gbm90IGNhcmUgYXVkaW8gdHlwZSwgdXNlIE5VTEwgZW5jb2RlciAqLwotICAgIE00VklERU9FRElUSU5HX2tVbnN1cHBvcnRlZEF1ZGlvICAgID0gMjU1ICAgIC8qKjwgVW5zdXBwb3J0ZWQgYXVkaW8gc3RyZWFtIHR5cGUgKi8KLX0gTTRWSURFT0VESVRJTkdfQXVkaW9Gb3JtYXQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhaWxhYmxlIG91dHB1dCBmcmFtZSBzaXplcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZJREVPRURJVElOR19rU1FDSUY9MCwgLyoqPCBTUUNJRiAxMjh4OTYgICovCi0gICAgTTRWSURFT0VESVRJTkdfa1FRVkdBLCAgIC8qKjwgUVFWR0EgMTYweDEyMCAqLwotICAgIE00VklERU9FRElUSU5HX2tRQ0lGLCAgICAvKio8IFFDSUYgIDE3NngxNDQgKi8KLSAgICBNNFZJREVPRURJVElOR19rUVZHQSwgICAgLyoqPCBRVkdBICAzMjB4MjQwICovCi0gICAgTTRWSURFT0VESVRJTkdfa0NJRiwgICAgIC8qKjwgQ0lGICAgMzUyeDI4OCAqLwotICAgIE00VklERU9FRElUSU5HX2tWR0EsICAgICAvKio8IFZHQSAgIDY0MHg0ODAgKi8KLS8qICtQUiBMVjU4MDcgKi8KLSAgICBNNFZJREVPRURJVElOR19rV1ZHQSwgICAgLyoqPCBXVkdBIDgwMHg0ODAgKi8KLSAgICBNNFZJREVPRURJVElOR19rTlRTQywgICAgLyoqPCBOVFNDIDcyMHg0ODAgKi8KLS8qIC1QUiBMVjU4MDcgKi8KLQotLyogK0NSIEdvb2dsZSAqLwotICAgIE00VklERU9FRElUSU5HX2s2NDBfMzYwLCAgLyoqPCA2NDB4MzYwICovCi0gICAgTTRWSURFT0VESVRJTkdfazg1NF80ODAsICAvKio8IDg1NHg0ODAgKi8KLSAgICBNNFZJREVPRURJVElOR19rMTI4MF83MjAsIC8qKjwgNzIwcCAxMjgweDcyMCAqLwotICAgIE00VklERU9FRElUSU5HX2sxMDgwXzcyMCwgLyoqPCA3MjBwIDEwODB4NzIwICovCi0gICAgTTRWSURFT0VESVRJTkdfazk2MF83MjAsICAvKio8IDcyMHAgOTYweDcyMCAqLwotICAgIE00VklERU9FRElUSU5HX2sxOTIwXzEwODAgLyoqPDEwODBwIDE5MjB4MTA4MCovCi0vKiAtQ1IgR29vZ2xlICovCi0KLX0gTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb2ZyYW1lcmF0ZQotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIHRoZSBhdmFpbGFibGUgdmlkZW8gZnJhbWVyYXRlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZJREVPRURJVElOR19rNV9GUFMgPSAwLAotICAgIE00VklERU9FRElUSU5HX2s3XzVfRlBTLAotICAgIE00VklERU9FRElUSU5HX2sxMF9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTLAotICAgIE00VklERU9FRElUSU5HX2sxNV9GUFMsCi0gICAgTTRWSURFT0VESVRJTkdfazIwX0ZQUywKLSAgICBNNFZJREVPRURJVElOR19rMjVfRlBTLAotICAgIE00VklERU9FRElUSU5HX2szMF9GUFMKLX0gTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZXJhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNFZJREVPRURJVElOR19BdWRpb1NhbXBsaW5nRnJlcXVlbmN5Ci0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGF2YWlsYWJsZSBvdXRwdXQgYXVkaW8gc2FtcGxpbmcgZnJlcXVlbmNpZXMKLSAqIEBub3RlICAgIDgga0h6IGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBmcmVxdWVuY3kgZm9yIEFNUi1OQiBvdXRwdXQKLSAqIEBub3RlICAgIDE2IGtIeiBpcyB0aGUgb25seSBzdXBwb3J0ZWQgZnJlcXVlbmN5IGZvciBBQUMgb3V0cHV0Ci0gKiBAbm90ZSAgICBUaGUgcmVjb21tZW5kZWQgcHJhY3RpY2UgaXMgdG8gdXNlIHRoZSBEZWZhdWx0IHZhbHVlIHdoZW4gc2V0dGluZyB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGICAgID0gMCwgICAgLyoqPCBEZWZhdWx0IEF1ZGlvIFNhbXBsaW5nIEZyZXF1ZW5jeSBmb3Igc2VsZWN0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpbyBvdXRwdXQgZm9ybWF0ICovCi0gICAgTTRWSURFT0VESVRJTkdfazgwMDBfQVNGICAgID0gODAwMCwgICAgLyoqPCBOb3RlOiBEZWZhdWx0IGF1ZGlvIFNhbXBsaW5nIEZyZXF1ZW5jeSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVItTkIgb3V0cHV0ICovCi0gICAgTTRWSURFT0VESVRJTkdfazExMDI1X0FTRiAgICA9IDExMDI1LAotICAgIE00VklERU9FRElUSU5HX2sxMjAwMF9BU0YgICAgPSAxMjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGICAgID0gMTYwMDAsICAgIC8qKjwgTm90ZTogRGVmYXVsdCBhdWRpbyBTYW1wbGluZyBGcmVxdWVuY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIEFBQyBvdXRwdXQgKi8KLSAgICBNNFZJREVPRURJVElOR19rMjIwNTBfQVNGICAgID0gMjIwNTAsCi0gICAgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRiAgICA9IDI0MDAwLAotICAgIE00VklERU9FRElUSU5HX2szMjAwMF9BU0YgICAgPSAzMjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNDQxMDBfQVNGICAgID0gNDQxMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRiAgICA9IDQ4MDAwCi0KLX0gTTRWSURFT0VESVRJTkdfQXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgYXZhaWxhYmxlIGF1ZGlvIG9yIHZpZGVvIGJpdHJhdGVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTID0gLTEsICAgICAvKiBubyByZWd1bGF0aW9uICovCi0gICAgTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgPSAwLCAgIC8qIHVuZGVmaW5lZCAqLwotICAgIE00VklERU9FRElUSU5HX2s4X0tCUFMgPSA4MDAwLAotICAgIE00VklERU9FRElUSU5HX2s5XzJfS0JQUyA9IDkyMDAsICAgICAgICAvKiBldnJjIG9ubHkgKi8KLSAgICBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTID0gMTIyMDAsICAgICAgLyogYW1yIG9ubHkgKi8KLSAgICBNNFZJREVPRURJVElOR19rMTZfS0JQUyA9IDE2MDAwLAotICAgIE00VklERU9FRElUSU5HX2syNF9LQlBTID0gMjQwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFMgPSAzMjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNDBfS0JQUyA9IDQwMDAwLAotICAgIE00VklERU9FRElUSU5HX2s0OF9LQlBTID0gNDgwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazU2X0tCUFMgPSA1NjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNjRfS0JQUyA9IDY0MDAwLAotICAgIE00VklERU9FRElUSU5HX2s4MF9LQlBTID0gODAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazk2X0tCUFMgPSA5NjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMTEyX0tCUFMgPSAxMTIwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazEyOF9LQlBTID0gMTI4MDAwLAotICAgIE00VklERU9FRElUSU5HX2sxNjBfS0JQUyA9IDE2MDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMTkyX0tCUFMgPSAxOTIwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazIyNF9LQlBTID0gMjI0MDAwLAotICAgIE00VklERU9FRElUSU5HX2syNTZfS0JQUyA9IDI1NjAwMCwKLSAgICBNNFZJREVPRURJVElOR19rMjg4X0tCUFMgPSAyODgwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazMyMF9LQlBTID0gMzIwMDAwLAotICAgIE00VklERU9FRElUSU5HX2szODRfS0JQUyA9IDM4NDAwMCwKLSAgICBNNFZJREVPRURJVElOR19rNTEyX0tCUFMgPSA1MTIwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazgwMF9LQlBTID0gODAwMDAwLAotLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgTTRWSURFT0VESVRJTkdfazJfTUJQUyA9IDIwMDAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazVfTUJQUyA9IDUwMDAwMDAsCi0gICAgTTRWSURFT0VESVRJTkdfazhfTUJQUyA9IDgwMDAwMDAsCi0vKi0gTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLX0gTTRWSURFT0VESVRJTkdfQml0cmF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZJREVPRURJVElOR19GdHlwQm94Ci0gKiBAYnJpZWYgICAgICAgIEluZm9ybWF0aW9uIHRvIGJ1aWxkIHRoZSAnZnR5cCcgYXRvbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfTUFYX0NPTVBBVElCTEVfQlJBTkRTIDEwCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qIEFsbCBicmFuZCBmaWVsZHMgYXJlIGFjdHVhbGx5IGNoYXJbNF0gc3RvcmVkIGluIGJpZy1lbmRpYW4gaW50ZWdlciBmb3JtYXQgKi8KLQotICAgIE00T1NBX1VJbnQzMiAgICBtYWpvcl9icmFuZDsgICAgICAgICAgIC8qIGdlbmVyYWxseSAnM2dwNCcgICAgICAgICAgICAqLwotICAgIE00T1NBX1VJbnQzMiAgICBtaW5vcl92ZXJzaW9uOyAgICAgICAgIC8qIGdlbmVyYWxseSAnMDAwMCcgb3IgJ3gueCAnICAqLwotICAgIE00T1NBX1VJbnQzMiAgICBuYkNvbXBhdGlibGVCcmFuZHM7ICAgIC8qIG51bWJlciBvZiBjb21wYXRpYmxlIGJyYW5kcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICBjb21wYXRpYmxlX2JyYW5kc1tNNFZJREVPRURJVElOR19NQVhfQ09NUEFUSUJMRV9CUkFORFNdOyAvKiBhcnJheSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCBjb21wYXRpYmxlIGJyYW5kcyAqLwotCi19IE00VklERU9FRElUSU5HX0Z0eXBCb3g7Ci0KLS8qIFNvbWUgdXNlZnVsIGJyYW5kcyAqLwotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF8wMDAwICAweDAwMDAwMDAwCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EXzNHMkEgIDB4MzM2NzMyNjEKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfM0dQNCAgMHgzMzY3NzAzNAotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF8zR1A1ICAweDMzNjc3MDM1Ci0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EXzNHUDYgIDB4MzM2NzcwMzYKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfQVZDMSAgMHg2MTc2NjMzMQotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF9FTVAgICAweDY1NkQ3MDIwCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EX0lTT00gIDB4Njk3MzZGNkQKLSNkZWZpbmUgTTRWSURFT0VESVRJTkdfQlJBTkRfTVA0MSAgMHg2RDcwMzQzMQotI2RlZmluZSBNNFZJREVPRURJVElOR19CUkFORF9NUDQyICAweDZENzAzNDMyCi0jZGVmaW5lIE00VklERU9FRElUSU5HX0JSQU5EX1ZGSjEgIDB4NzY2NjZBMzEKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZ2F0aGVycyB0aGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBhbiBpbnB1dCBmaWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgLyoqCi0gICAgICogQ29tbW9uICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgYkFuYWx5c2VkOyAgICAgICAgICAgLyoqPCBGbGFnIHRvIGtub3cgaWYgdGhlIGZpbGUgaGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWVuIGFscmVhZHkgYW5hbHlzZWQgb3Igbm90ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvblszXTsgICAgICAgICAgLyoqPCBWZXJzaW9uIG9mIHRoZSBsaWJyYXJpZXMgdXNlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSB0aGUgY2xpcCBhbmFseXNpcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpQ2xpcER1cmF0aW9uOyAgICAgIC8qKjwgQ2xpcCBkdXJhdGlvbiAoaW4gbXMpICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICAgICAgRmlsZVR5cGU7ICAgICAgICAgICAgLyoqPCAuM2dwLCAuYW1yLCAubXAzICovCi0gICAgTTRWSURFT0VESVRJTkdfRnR5cEJveCAgICAgICAgICAgICAgZnR5cDsgICAgICAgICAgICAgICAgLyoqPCAzZ3AgJ2Z0eXAnIGF0b20sIG1ham9yX2JyYW5kID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBpZiBub3QgdXNlZCAqLwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCAgICAgICAgICBWaWRlb1N0cmVhbVR5cGU7ICAgICAvKio8IEZvcm1hdCBvZiB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlDbGlwVmlkZW9EdXJhdGlvbjsgLyoqPCBWaWRlbyB0cmFjayBkdXJhdGlvbiAoaW4gbXMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlWaWRlb0JpdHJhdGU7ICAgICAgLyoqPCBWaWRlbyBhdmVyYWdlIGJpdHJhdGUgKGluIGJwcykqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpVmlkZW9NYXhBdVNpemU7ICAgIC8qKjwgTWF4aW11bSBBY2Nlc3MgVW5pdCBzaXplIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlWaWRlb1dpZHRoOyAgICAgICAgLyoqPCBWaWRlbyBmcmFtZSB3aWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpVmlkZW9IZWlnaHQ7ICAgICAgIC8qKjwgVmlkZW8gZnJhbWUgaGVpZ2h0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlWaWRlb1RpbWVTY2FsZTsgICAgLyoqPCBWaWRlbyB0aW1lIHNjYWxlICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgZkF2ZXJhZ2VGcmFtZVJhdGU7ICAgLyoqPCBBdmVyYWdlIGZyYW1lIHJhdGUgb2YgdGhlIHZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gKi8KLSAgICBNNE9TQV9JbnQzMiB1aVZpZGVvTGV2ZWw7ICAgLyoqPCB2aWRlbyBsZXZlbCovCi0gICAgTTRPU0FfSW50MzIgdWlWaWRlb1Byb2ZpbGU7IC8qKjwgdmlkZW8gcHJvZmlsZSAqLwotCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgYk1QRUc0ZGF0YVBhcnRpdGlvbjsgLyoqPCBNUEVHLTQgdXNlcyBkYXRhIHBhcnRpdGlvbmluZyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIGJNUEVHNHJ2bGM7ICAgICAgICAgIC8qKjwgTVBFRy00IHVzZXMgUlZMQyB0b29sICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgYk1QRUc0cmVzeW5jaE1hcmtlcjsgLyoqPCBNUEVHLTQgc3RyZWFtIHVzZXMgUmVzeW5jaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtlciAqLwotCi0gICAgLyoqCi0gICAgICogQXVkaW8gKi8KLSAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdCAgICAgICAgICBBdWRpb1N0cmVhbVR5cGU7ICAgICAvKio8IEZvcm1hdCBvZiB0aGUgYXVkaW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlDbGlwQXVkaW9EdXJhdGlvbjsgLyoqPCBBdWRpbyB0cmFjayBkdXJhdGlvbiAoaW4gbXMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGU7ICAgICAgLyoqPCBBdWRpbyBhdmVyYWdlIGJpdHJhdGUgKGluIGJwcykgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICB1aUF1ZGlvTWF4QXVTaXplOyAgICAvKio8IE1heGltdW0gQWNjZXNzIFVuaXQgc2l6ZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gc3RyZWFtICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlOYkNoYW5uZWxzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE9bW9ubywgMj1zdGVyZW8pICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlTYW1wbGluZ0ZyZXF1ZW5jeTsgLyoqPCBTYW1wbGluZyBhdWRpbyBmcmVxdWVuY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDgwMDAgZm9yIGFtciwgMTYwMDAgb3IgbW9yZSBmb3IgYWFjKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeTsgLyoqPCBFeHRlbmRlZCBmcmVxdWVuY3kgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDKywgZUFBQysgc3RyZWFtcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpRGVjb2RlZFBjbVNpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgZGVjb2RlZCBQQ00gZGF0YSAqLwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZWRpdGluZyBjb21wYXRpYmlsaXR5IGNoYXJ0ICovCi0gICAgTTRPU0FfQm9vbCAgICAgIGJWaWRlb0lzRWRpdGFibGU7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWaWRlbyBzdHJlYW0gY2FuIGJlIGRlY29kZWQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLWVuY29kZWQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgYkF1ZGlvSXNFZGl0YWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEF1ZGlvIHN0cmVhbSBjYW4gYmUgZGVjb2RlZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLWVuY29kZWQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgYlZpZGVvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXA7ICAgICAgICAvKio8IFZpZGVvIHByb3BlcnRpZXMgbWF0Y2ggcmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwIHByb3BlcnRpZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgYkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXA7ICAgICAgICAvKio8IEF1ZGlvIHByb3BlcnRpZXMgbWF0Y2ggcmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcCBwcm9wZXJ0aWVzICovCi0KLSAgICAvKioKLSAgICAgKiBTdGlsbCBQaWN0dXJlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlTdGlsbFBpY1dpZHRoOyAgICAgICAgLyoqPCBJbWFnZSB3aWR0aCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIHVpU3RpbGxQaWNIZWlnaHQ7ICAgICAgIC8qKjwgSW1hZ2UgaGVpZ2h0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgdWlDbGlwQXVkaW9Wb2x1bWVQZXJjZW50YWdlOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXRJbWFnZURhdGE7Ci0KLSAgICBNNE9TQV9JbnQzMiAgICAgdmlkZW9Sb3RhdGlvbkRlZ3JlZXM7ICAgICAgICAvKio8IFZpZGVvIHJvdGF0aW9uIGRlZ3JlZSAqLwotCi19IE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotICAgIH0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19NNF9WSURFT0VESVRJTkdDT01NT05fSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL01vbm9UbzJJXzE2LmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9Nb25vVG8ySV8xNi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NGIxYzhhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL01vbm9UbzJJXzE2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTU9OT1RPMklfMTZfSF8KLSNkZWZpbmUgX01PTk9UTzJJXzE2X0hfCi0KLQotdm9pZCBNb25vVG8ySV8xNiggIGNvbnN0IHNob3J0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBuKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNlbmRpZiAgLyogX01PTk9UTzJJXzE2X0hfICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9OWFBTV19Db21waWxlclN3aXRjaGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEzY2FjNmQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19ICi0jZGVmaW5lIE5YUFNXX0NPTVBJTEVSU1dJVENIRVNfSAotCi0vKiAtLS0tLSBNYWluIGZlYXR1cmVzIC0tLS0tICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCIgLyogVHJhbnNjb2RlciAqLwotCi0vKiAtLS0tLSBBZGQtb25zIC0tLS0tICovCi0KLSNlbmRpZiAvKiBOWFBTV19DT01QSUxFUlNXSVRDSEVTX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL05YUFNXX0NvbXBpbGVyU3dpdGNoZXNfTUNTLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxYjYyZTEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvTlhQU1dfQ29tcGlsZXJTd2l0Y2hlc19NQ1MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZm5kZWYgTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19NQ1NfSAotI2RlZmluZSBOWFBTV19DT01QSUxFUlNXSVRDSEVTX01DU19ICi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUkVBREVSUyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKi8KLQotLyogLS0tLS0gIEFNUiByZWFkZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgLmFtciBmaWxlcyAqLwotCi0vKiAtLS0tLSAzR1BQICByZWFkZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgLm1wNCwgLjNncCBmaWxlcyAqLwotCi0KLS8qIC0tLS0tIE1QMyByZWFkZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgLm1wMyBmaWxlcyAqLwotCi0vKiAtLS0tLSBSQVcgcmVhZGVyIHN1cHBvcnQgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9SRUFERVJfUENNICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IC5wY20gZmlsZXMgKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBERUNPREVSUyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKiovCi0KLS8qIC0tLS0tICBBTVIgTkIgZGVjb2RlciBzdXBwb3J0IC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfQVVERUNfQU1STkIgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCBBTVIgTkIgc3RyZWFtcyAqLwotCi0vKiAtLS0tLSBBQUMgZGVjb2RlciBzdXBwb3J0IC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfQVVERUNfQUFDICAgICAgICAgICAgLyoqPCBbZGVmYXVsdF0gU3VwcG9ydCBBQUMsIEFBQysgYW5kIGVBQUMrIHN0cmVhbXMgKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9WSURFQ19OVUxMCi0KLS8qIC0tLS0tIE1QNC9IMjYzIHZpZGVvIGRlY29kZXIgc3VwcG9ydCAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUCAgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgbXBlZzQgYW5kIEgyNjMgZGVjb2RlcnMgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERUNfM0dQCi0jZGVmaW5lIEdFVF9ERUNPREVSX0NPTkZJR19JTkZPCi0jZW5kaWYKLQotI2RlZmluZSBNNFZTU19TVVBQT1JUX1ZJREVPX0FWQyAgICAgICAgICAgIC8qKjwgW2RlZmF1bHRdIFN1cHBvcnQgSDI2NCBkZWNvZGVycyAqLwotCi0vKiAtLS0tLSBNUDMgZGVjb2RlciBzdXBwb3J0LS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9BVURFQ19NUDMgICAgICAgICAvKio8IFtkZWZhdWx0XSBTdXBwb3J0IE1QMyBkZWNvZGVycyAqLwotCi0KLS8qIC0tLS0tIE5VTEwgZGVjb2RlciBzdXBwb3J0LS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9BVURFQ19OVUxMICAgICAgICAvKiogW2RlZmF1bHRdIFN1cHBvcnQgUENNIHJlYWRpbmcgKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdSSVRFUlMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKiovCi0KLS8qIC0tLS0tIDNncCB3cml0ZXIgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUCAgICAgICAvKio8IFtkZWZhdWx0XSBzdXBwb3J0IGVuY2Fwc3VsYXRpbmcgaW4gM2dwIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2FtcixhYWN9IHgge21wZWc0LGgyNjN9ICovCi0KLQotCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRU5DT0RFUlMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqLwotCi0vKiAtLS0tLSBtcGVnNCAmIGgyNjMgZW5jb2RlciAtLS0tLSAqLwotI2RlZmluZSBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgICAgIC8qKjwgW2RlZmF1bHRdIHN1cHBvcnQgZW5jb2RpbmcgaW4gbXBlZzQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjYzIGZvcm1hdCB7eXV2LHJnYn0gKi8KLQotLyogLS0tLS0gaDI2NCBlbmNvZGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMKLQotLyogLS0tLS0gYW1yIGVuY29kZXIgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUiAgLyoqPCBbZGVmYXVsdF0gc3VwcG9ydCBlbmNvZGluZyBpbiBhbXIgMTIuMiBmb3JtYXQge2Ftcix3YXZ9ICovCi0KLS8qIC0tLS0tIGFhYyBlbmNvZGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMgICAgICAgLyoqPCBbZGVmYXVsdF0gc3VwcG9ydCBlbmNvZGluZyBpbiBhYWMgZm9ybWF0IHthbXIsd2F2fSAqLwotCi0KLS8qIC0tLS0tIG1wMyBlbmNvZGVyIC0tLS0tICovCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUDMgICAgICAgLyoqPCBbZGVmYXVsdF0gc3VwcG9ydCBlbmNvZGluZyBpbiBtcDMgZm9ybWF0IHttcDN9ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZFQVRVUkVTICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKi8KLQotLyogLS0tLS0gVlNTM0dQUCAmIHhWU1MgLS0tLS0gKi8KLSNkZWZpbmUgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUyAvKio8IFtkZWZhdWx0XSBpZiBkZWZpbmVkLCBpbXBsZW1lbnRhdGlvbiBpcyB4VlNTIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgVlNTM0dQUCAqLwotCi0vKiAtLS0tLSBTUFMgLS0tLS0gKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0KLS8vI2RlZmluZSBNNFNQU19HSUZfTk9UX1NVUFBPUlRFRCAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBHSUYgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0vLyNkZWZpbmUgTTRTUFNfSlBFR19OT1RfU1VQUE9SVEVEIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgSlBFRyBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLS8vI2RlZmluZSBNNFNQU19QTkdfTk9UX1NVUFBPUlRFRCAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBQTkcgZm9ybWF0IGluIHN0aWxsIHBpY3R1cmUgYXBpICovCi0jZGVmaW5lIE00U1BTX1dCTVBfTk9UX1NVUFBPUlRFRCAgIC8qKjwgW29wdGlvbl0gZG8gbm90IHN1cHBvcnQgV0JNUCBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLSNkZWZpbmUgTTRTUFNfQkdSNTY1X0NPTE9SX09VVFBVVCAgLyoqPCBbb3B0aW9uXSBvdXRwdXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgaXMgQkdSNTY1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgPSBCR1IyNCkgKi8KLQotI2Vsc2UKLQotI2RlZmluZSBNNFNQU19HSUZfTk9UX1NVUFBPUlRFRCAgICAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IEdJRiBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLS8vI2RlZmluZSBNNFNQU19KUEVHX05PVF9TVVBQT1JURUQgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBKUEVHIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotI2RlZmluZSBNNFNQU19QTkdfTk9UX1NVUFBPUlRFRCAgICAvKio8IFtvcHRpb25dIGRvIG5vdCBzdXBwb3J0IFBORyBmb3JtYXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgKi8KLSNkZWZpbmUgTTRTUFNfV0JNUF9OT1RfU1VQUE9SVEVEICAgLyoqPCBbb3B0aW9uXSBkbyBub3Qgc3VwcG9ydCBXQk1QIGZvcm1hdCBpbiBzdGlsbCBwaWN0dXJlIGFwaSAqLwotLy8jZGVmaW5lIE00U1BTX0JHUjU2NV9DT0xPUl9PVVRQVVQgLyoqPCBbb3B0aW9uXSBvdXRwdXQgaW4gc3RpbGwgcGljdHVyZSBhcGkgaXMgQkdSNTY1Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0ID0gQkdSMjQpICovCi0KLSNlbmRpZgotCi0jZGVmaW5lIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0jZW5kaWYgLyogTlhQU1dfQ09NUElMRVJTV0lUQ0hFU19NQ1NfSCAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9TU1JDLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9TU1JDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiMWNmY2YuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMvU1NSQy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgIFByb2plY3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgJW5hbWU6ICAgICAgICAgIFNTUkMuaCAlICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICAgIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJsb2NrcyBvZiB0aGUgU1JDIGFyZSBieSBkZWZhdWx0IGJsb2NrcyBvZiA0MCBtcy4gIFRoaXMgbWVhbnMgdGhhdAotICAgIHRoZSBmb2xsb3dpbmcgZGVmYXVsdCBibG9jayBzaXplcyBhcmUgdXNlZDoKLQotICAgICAgICAgIEZzICAgICBEZWZhdWx0IEJsb2NrIHNpemUKLSAgICAgICAgLS0tLS0gICAgICAgIC0tLS0tLS0tLS0KLSAgICAgICAgIDgwMDAgICAgICAgICAgIDMyMAotICAgICAgICAxMTAyNSAgICAgICAgICAgNDQxCi0gICAgICAgIDEyMDAwICAgICAgICAgICA0ODAKLSAgICAgICAgMTYwMDAgICAgICAgICAgIDY0MAotICAgICAgICAyMjA1MCAgICAgICAgICAgODgyCi0gICAgICAgIDI0MDAwICAgICAgICAgICA5NjAKLSAgICAgICAgMzIwMDAgICAgICAgICAgMTI4MAotICAgICAgICA0NDEwMCAgICAgICAgICAxNzY0Ci0gICAgICAgIDQ4MDAwICAgICAgICAgIDE5MjAKLQotICAgIEFuIEFQSSBpcyBwcm92aWRlZCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYmxvY2sgc2l6ZSBpbnRvIGFueSBtdWx0aXBsZSBvZiB0aGUgbWluaW1hbAotICAgIGJsb2NrIHNpemUuCi0KLSAgICBBbGwgdGhlIHNhbXBsaW5nIHJhdGVzIGFib3ZlIGFyZSBzdXBwb3J0ZWQgYXMgaW5wdXQgYW5kIGFzIG91dHB1dCBzYW1wbGluZyByYXRlCi0qLwotCi0jaWZuZGVmIF9fU1NSQ19IX18KLSNkZWZpbmUgX19TU1JDX0hfXwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZNX1R5cGVzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBERUZJTklUSU9OUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgU1NSQ19JTlNUQU5DRV9TSVpFICAgICAgICAgIDU0OAotI2RlZmluZSBTU1JDX0lOU1RBTkNFX0FMSUdOTUVOVCAgICAgNAotI2RlZmluZSBTU1JDX1NDUkFUQ0hfQUxJR05NRU5UICAgICAgNAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgVFlQRSBERUZJTklUSU9OUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFN0YXR1cyByZXR1cm4gdmFsdWVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBTU1JDX09LICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLwotICAgIFNTUkNfSU5WQUxJRF9GUyAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgIC8qIFRoZSBpbnB1dCBvciB0aGUgb3V0cHV0IHNhbXBsaW5nIHJhdGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCAqLwotICAgIFNTUkNfSU5WQUxJRF9OUl9DSEFOTkVMUyAgICA9IDIsICAgICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaXMgbm90IGVxdWFsIHRvIG1vbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHN0ZXJlbyAqLwotICAgIFNTUkNfTlVMTF9QT0lOVEVSICAgICAgICAgICA9IDMsICAgICAgICAgICAgICAgIC8qIE9uZSBvZiB0aGUgaW5wdXQgcG9pbnRlcnMgaXMgTlVMTCAqLwotICAgIFNTUkNfV1JPTkdfTlJfU0FNUExFUyAgICAgICA9IDQsICAgICAgICAgICAgICAgIC8qIEludmFsaWQgbnVtYmVyIG9mIHNhbXBsZXMgKi8KLSAgICBTU1JDX0FMTElOR01FTlRfRVJST1IgICAgICAgPSA1LCAgICAgICAgICAgICAgICAvKiBUaGUgaW5zdGFuY2UgbWVtb3J5IG9yIHRoZSBzY3JhdGNoIG1lbW9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgYWxsaWduZWQgKi8KLSAgICBTU1JDX0lOVkFMSURfTU9ERSAgICAgICAgICAgPSA2LCAgICAgICAgICAgICAgICAvKiBBIHdyb25nIHZhbHVlIGhhcyBiZWVuIHVzZWQgZm9yIHRoZSBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciAqLwotICAgIFNTUkNfSU5WQUxJRF9WQUxVRSAgICAgICAgICA9IDcsICAgICAgICAgICAgICAgIC8qIEFuIGludmFsaWQgKG91dCBvZiByYW5nZSkgdmFsdWUgaGFzIGJlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3Igb25lIG9mIHRoZSBwYXJhbWV0ZXJzICovCi0gICAgTFZYWFhfUkVUVVJOU1RBVFVTX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gU1NSQ19SZXR1cm5TdGF0dXNfZW47Ci0KLS8qIEluc3RhbmNlIG1lbW9yeSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMzIgU3RvcmFnZSBbIFNTUkNfSU5TVEFOQ0VfU0laRS80IF07Ci19IFNTUkNfSW5zdGFuY2VfdDsKLQotLyogU2NyYXRjaCBtZW1vcnkgKi8KLXR5cGVkZWYgTFZNX0lOVDMyIFNTUkNfU2NyYXRjaF90OwotCi0vKiBOdWJlciBvZiBzYW1wbGVzIG1vZGUgKi8KLXR5cGVkZWYgZW51bQotewotICAgIFNTUkNfTlJfU0FNUExFU19ERUZBVUxUICAgICA9IDAsCi0gICAgU1NSQ19OUl9TQU1QTEVTX01JTiAgICAgICAgID0gMSwKLSAgICBTU1JDX05SX1NBTVBMRVNfRFVNTVkgICAgICAgPSBMVk1fTUFYRU5VTQotfSBTU1JDX05SX1NBTVBMRVNfTU9ERV9lbjsKLQotLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRnNfZW4gICAgICAgICAgIFNTUkNfRnNfSW47Ci0gICAgTFZNX0ZzX2VuICAgICAgICAgICBTU1JDX0ZzX091dDsKLSAgICBMVk1fRm9ybWF0X2VuICAgICAgIFNTUkNfTnJPZkNoYW5uZWxzOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgTnJTYW1wbGVzSW47Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBOclNhbXBsZXNPdXQ7Ci19IFNTUkNfUGFyYW1zX3Q7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIFBST1RPVFlQRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgU1NSQ19HZXROclNhbXBsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIChvciBzYW1wbGUgcGFpcnMgZm9yIHN0ZXJlbykgdG8gYmUgICAgKi8KLS8qICB1c2VkIGFzIGlucHV0IGFuZCBhcyBvdXRwdXQgb2YgdGhlIFNTUkMgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RlICAgICAgICAgICAgICAgICAgICBUaGVyZSBhcmUgdHdvIG1vZGVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTUkNfTlJfU0FNUEVMU19ERUZBVUxULiAgSW4gdGhpcyBtb2RlLCB0aGUgZnVuY3Rpb24gICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIGZvciA0MCBtcyBibG9ja3MgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTU1JDX05SX1NBTVBFTFNfTUlOIHdpbGwgcmV0dXJuIHRoZSBtaW5pbWFsIG51bWJlciAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHNhbXBsZXMgdGhhdCBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgY29udmVyc2lvbiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW8uICBFYWNoIGludGVnZXIgbXVsdGlwbGUgb2YgdGhpcyByYXRpbyB3aWxsICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhY2NlcHRlZCBieSB0aGUgU1NSQ19Jbml0IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfUGFyYW1zICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19PSyAgICAgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfRlMgICAgICAgICBXaGVuIHRoZSByZXF1ZXN0ZWQgaW5wdXQgb3Igb3V0cHV0IHNhbXBsaW5nIHJhdGVzICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbnZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX05SX0NIQU5ORUxTIFdoZW4gdGhlIGNoYW5uZWwgZm9ybWF0IGlzIG5vdCBlcXVhbCB0byBMVk1fTU9OTyAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBvciBMVk1fU1RFUkVPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfTlVMTF9QT0lOVEVSICAgICAgIFdoZW4gcFNTUkNfUGFyYW1zIGlzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19JTlZBTElEX01PREUgICAgICAgV2hlbiBNb2RlIGlzIG5vdCBhIHZhbGlkIHNldHRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVNTUkNfUmV0dXJuU3RhdHVzX2VuIFNTUkNfR2V0TnJTYW1wbGVzKCBTU1JDX05SX1NBTVBMRVNfTU9ERV9lbiAgTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1JDX1BhcmFtc190KiAgICAgICAgICAgcFNTUkNfUGFyYW1zICk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBTU1JDX0dldFNjcmF0Y2hTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgc2NyYXRjaCBzaXplIGZvciBhIGdpdmVuIGNvbnZlcnNpb24gcmF0aW8gYW5kICAgICAgICAgICAqLwotLyogIGZvciBnaXZlbiBidWZmZXIgc2l6ZXMgYXQgdGhlIGlucHV0IGFuZCBhdCB0aGUgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX1BhcmFtcyAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNjcmF0Y2hTaXplICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgc2NyYXRjaCBzaXplLiAgVGhlIFNTUkNfR2V0U2NyYXRjaFNpemUgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3aWxsIGZpbGwgaW4gdGhlIGNvcnJlY3QgdmFsdWUgKGluIGJ5dGVzKS4gICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX09LICAgICAgICAgICAgICAgICB3aGVuIHRoZSBmdW5jdGlvbiBjYWxsIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9GUyAgICAgICAgIFdoZW4gdGhlIHJlcXVlc3RlZCBpbnB1dCBvciBvdXRwdXQgc2FtcGxpbmcgcmF0ZXMgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGludmFsaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfTlJfQ0hBTk5FTFMgV2hlbiB0aGUgY2hhbm5lbCBmb3JtYXQgaXMgbm90IGVxdWFsIHRvIExWTV9NT05PICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIExWTV9TVEVSRU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19OVUxMX1BPSU5URVIgICAgICAgV2hlbiBhbnkgb2YgdGhlIGlucHV0IHBvaW50ZXJzIGlzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgKi8KLS8qICBTU1JDX1dST05HX05SX1NBTVBMRVMgICBXaGVuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvbiB0aGUgaW5wdXQgb3Igb24gdGhlIG91dHB1dCAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpbmNvcnJlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotU1NSQ19SZXR1cm5TdGF0dXNfZW4gU1NSQ19HZXRTY3JhdGNoU2l6ZSggICBTU1JDX1BhcmFtc190KiAgICBwU1NSQ19QYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiogICAgICAgIHBTY3JhdGNoU2l6ZSApOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgU1NSQ19Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFNTUkMgbW9kdWxlIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfSW5zdGFuY2UgICAgICAgICAgSW5zdGFuY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX1NjcmF0Y2ggICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHNjcmF0Y2ggbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfUGFyYW1zICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5wdXRJblNjcmF0Y2gsICAgICAgICBwb2ludGVyIHRvIGEgbG9jYXRpb24gaW4gdGhlIHNjcmF0Y2ggbWVtb3J5IHRoYXQgY2FuIGJlICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gc3RvcmUgdGhlIGlucHV0IHNhbXBsZXMgKGUuZy4gdG8gc2F2ZSBtZW1vcnkpICAgICAgICovCi0vKiAgcE91dHB1dEluU2NyYXRjaCAgICAgICAgcG9pbnRlciB0byBhIGxvY2F0aW9uIGluIHRoZSBzY3JhdGNoIG1lbW9yeSB0aGF0IGNhbiBiZSAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHN0b3JlIHRoZSBvdXRwdXQgc2FtcGxlcyAoZS5nLiB0byBzYXZlIG1lbW9yeSkgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX09LICAgICAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9GUyAgICAgICAgIFdoZW4gdGhlIHJlcXVlc3RlZCBpbnB1dCBvciBvdXRwdXQgc2FtcGxpbmcgcmF0ZXMgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGludmFsaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfTlJfQ0hBTk5FTFMgV2hlbiB0aGUgY2hhbm5lbCBmb3JtYXQgaXMgbm90IGVxdWFsIHRvIExWTV9NT05PICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIExWTV9TVEVSRU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19XUk9OR19OUl9TQU1QTEVTICAgV2hlbiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGlucHV0IG9yIHRoZSBvdXRwdXQgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW5jb3JyZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfTlVMTF9QT0lOVEVSICAgICAgIFdoZW4gYW55IG9mIHRoZSBpbnB1dCBwb2ludGVycyBpcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICovCi0vKiAgU1NSQ19BTExJTkdNRU5UX0VSUk9SICAgV2hlbiB0aGUgaW5zdGFuY2UgbWVtb3J5IG9yIHRoZSBzY3JhdGNoIG1lbW9yeSBpcyBub3QgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICA0IGJ5dGVzIGFsbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiBUaGUgaW5pdCBmdW5jdGlvbiB3aWxsIGNsZWFyIHRoZSBpbnRlcm5hbCBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotU1NSQ19SZXR1cm5TdGF0dXNfZW4gU1NSQ19Jbml0KCBTU1JDX0luc3RhbmNlX3QqIHBTU1JDX0luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1JDX1NjcmF0Y2hfdCogIHBTU1JDX1NjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTUkNfUGFyYW1zX3QqICAgcFNTUkNfUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqKiAgICAgIHBwSW5wdXRJblNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNioqICAgICAgcHBPdXRwdXRJblNjcmF0Y2gpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgU1NSQ19TZXRHYWlucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBzZXRzIGhlYWRyb29tIGdhaW4gYW5kIHRoZSBwb3N0IGdhaW4gb2YgdGhlIFNTUkMgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYkhlYWRyb29tR2FpbkVuYWJsZWQgICAgcGFyYW1ldGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBoZWFkcm9vbSBnYWluIG9mIHRoZSAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBTU1JDLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgTFZNX01PREVfT04uICBMVk1fTU9ERV9PRkYgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB1c2VkIGluIGNhc2UgaXQgY2FuIGJlIGd1YXJhbnRlZWQgdGhhdCB0aGUgaW5wdXQgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgaXMgYmVsb3cgLTZkQiBpbiBhbGwgY2FzZXMgKHRoZSBkZWZhdWx0IGhlYWRyb29tICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBpcyAtNiBkQikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYk91dHB1dEdhaW5FbmFibGVkICAgICAgcGFyYW1ldGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBvdXRwdXQgZ2Fpbi4gIFRoZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHZhbHVlIGlzIExWTV9NT0RFX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3V0cHV0R2FpbiAgICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBvdXRwdXQgZ2Fpbi4gIFRoZSBvdXRwdXQgZ2FpbiBpcyBhIGxpbmVhciAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBnYWluIHZhbHVlLiAweDdGRkYgaXMgZXF1YWwgdG8gKzYgZEIgYW5kIDB4MDAwMCBjb3JyZXNwb25kcyAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIHRvIC1pbmYgZEIuICBCeSBkZWZhdWx0LCBhIDNkQiBnYWluIGlzIGFwcGxpZWQsIHJlc3VsdGluZyAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYW4gb3ZlcmFsbCBnYWluIG9mIC0zZEIgKC02ZEIgaGVhZHJvb20gKyAzZEIgb3V0cHV0IGdhaW4pKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU1NSQ19PSyAgICAgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX05VTExfUE9JTlRFUiAgICAgICBXaGVuIHBTU1JDX0luc3RhbmNlIGlzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNTUkNfSU5WQUxJRF9NT0RFICAgICAgIFdyb25nIHZhbHVlIHVzZWQgZm9yIHRoZSBiSGVhZHJvb21HYWluRW5hYmxlZCBvciB0aGUgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgYk91dHB1dEdhaW5FbmFibGVkIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTU1JDX0lOVkFMSURfVkFMVUUgICAgICBXaGVuIE91dHB1dEdhaW4gaXMgb3V0IHRvIHRoZSByYW5nZSBbMDszMjc2N10gICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiBUaGUgU1NSQ19TZXRHYWlucyBmdW5jdGlvbiBpcyBhbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgICAgICAqLwotLyogICAgIGluIHJhcmUgY2FzZXMuICBQcmVmZXJhYmx5LCB1c2UgdGhlIGRlZmF1bHQgc2V0dGluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1TU1JDX1JldHVyblN0YXR1c19lbiBTU1JDX1NldEdhaW5zKCBTU1JDX0luc3RhbmNlX3QqIHBTU1JDX0luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01vZGVfZW4gICAgICBiSGVhZHJvb21HYWluRW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Nb2RlX2VuICAgICAgYk91dHB1dEdhaW5FbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICBPdXRwdXRHYWluICk7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBTU1JDX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgU1NSQyBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU1NSQ19JbnN0YW5jZSAgICAgICAgICBJbnN0YW5jZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTU1JDX0F1ZGlvSW4gICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFNTUkNfQXVkaW9PdXQgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBTU1JDX09LICAgICAgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFNTUkNfTlVMTF9QT0lOVEVSICAgICAgICBXaGVuIG9uZSBvZiBwU1NSQ19JbnN0YW5jZSwgcFNTUkNfQXVkaW9JbiBvciBwU1NSQ19BdWRpb091dCAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotU1NSQ19SZXR1cm5TdGF0dXNfZW4gU1NSQ19Qcm9jZXNzKCAgU1NSQ19JbnN0YW5jZV90KiBwU1NSQ19JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiogICAgICAgcFNTUkNfQXVkaW9JbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiogICAgICAgcFNTUkNfQXVkaW9PdXQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2VuZGlmIC8qIF9fU1NSQ19IX18gKi8KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYy9WaWRlb0VkaXRvclJlc2FtcGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODQ5N2QzLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBWSURFT0VESVRPUlJFU0FNUExFUl9ICi0jZGVmaW5lIFZJREVPRURJVE9SUkVTQU1QTEVSX0gKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0KLU00T1NBX0NvbnRleHQgTFZBdWRpb1Jlc2FtcGxlckNyZWF0ZShNNE9TQV9JbnQzMiBiaXREZXB0aCwgTTRPU0FfSW50MzIgaW5DaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgc2FtcGxlUmF0ZSwgTTRPU0FfSW50MzIgcXVhbGl0eSk7Ci12b2lkIExWQXVkaW9zZXRTYW1wbGVSYXRlKE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCxNNE9TQV9JbnQzMiBpblNhbXBsZVJhdGUpOwotdm9pZCBMVkF1ZGlvc2V0Vm9sdW1lKE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCwgTTRPU0FfSW50MTYgbGVmdCwgTTRPU0FfSW50MTYgcmlnaHQpIDsKLXZvaWQgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoTTRPU0FfSW50MTYqIG91dCwgTTRPU0FfSW50MTYqIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIG91dEZyYW1lQ291bnQsIE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCk7Ci12b2lkIExWRGVzdHJveShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQpOwotCi12b2lkIE1vbm9UbzJJXzE2KCBjb25zdCBNNE9TQV9JbnQxNiAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2IG4pOwotCi12b2lkIEZyb20yaVRvTW9ub18xNiggY29uc3QgTTRPU0FfSW50MTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2IG4pOwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLSNlbmRpZiAvKiBWSURFT0VESVRPUlJFU0FNUExFUl9IICovCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNEVYSUZDX0NvbW1vbkFQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNEVYSUZDX0NvbW1vbkFQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMjNjMDJhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRFWElGQ19Db21tb25BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRFWElGQ19Db21tb25BUEkuaAotICogQGJyaWVmICAgIEVYSUYgY29tbW9uIGRhdGEgaGVhZGVyCi0gKiBAbm90ZSAgICBUaGUgdHlwZXMsIHN0cnVjdHVyZXMgYW5kIG1hY3JvcyBkZWZpbmVkIGluIHRoaXMgZmlsZSBhbGxvdyByZWFkaW5nCi0gKiAgICAgICAgICAgIGFuZCB3cml0aW5nIEVYSUYgSlBFRyBpbWFnZXMgY29tcGxpYW50IHNwZWMgRVhJRiAyLjIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBfX000X0VYSUZfQ09NTU9OX0FQSV9IX18KLSNkZWZpbmUgX19NNF9FWElGX0NPTU1PTl9BUElfSF9fCi0KLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLSNpbmNsdWRlICJNNENvbW1vbl90eXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogdHlwZSBNNEVYSUZDX0NvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX1ZvaWQqICAgIE00RVhJRkNfQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFcnJvcnMgJiBXYXJuaW5ncwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2RlZmluZSBNNEVYSUZDX05PX0VSUiAgICAgICAgICAgICAgMHgwMDAwMDAwMCAgICAvKio8IGludmFsaWQgcGFyYW1ldGVyICovCi0jZGVmaW5lIE00RVhJRkNfRVJSX1BBUkFNRVRFUiAgICAgICAweDAwMDAwMDAxICAgIC8qKjwgaW52YWxpZCBwYXJhbWV0ZXIgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfQUxMT0MgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyoqPCBhbGxvY2F0aW9uIGVycm9yICovCi0jZGVmaW5lIE00RVhJRkNfRVJSX0JBRF9DT05URVhUICAgICAweDAwMDAwMDAzICAgIC8qKjwgaW52YWxpZCBjb250ZXh0ICovCi0jZGVmaW5lIE00RVhJRkNfRVJSX05PVF9DT01QTElBTlQgICAweDAwMDAwMDA0ICAgIC8qKjwgdGhlIGltYWdlIGluIGJ1ZmZlciBpcyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUEVHIGNvbXBsaWFudCAqLwotI2RlZmluZSBNNEVYSUZDX0VSUl9OT19BUFBfRk9VTkQgICAgMHgwMDAwMDAwNSAgICAvKio8IHRoZSBKUEVHIGltYWdlIGRvZXMgbm90IGNvbnRhaW4gYW55IEFQUDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpZiAyLjIgY29tcGxpYW50ICovCi0jZGVmaW5lIE00RVhJRkNfV0FSX05PX1RIVU1CTkFJTCAgICAweDAwMDAwMDA2ICAgIC8qKjwgdGhlIEV4aWYgcGFydCBkb2VzIG5vdCBjb250YWluIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWwgKi8KLSNkZWZpbmUgTTRFWElGQ19FUlJfQVBQX1RSVU5DQVRFRCAgIDB4MDAwMDAwMDcgICAgLyoqPCBUaGUgQVBQMSBzZWN0aW9uIGluIGlucHV0IGJ1ZmZlciBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgY29tcGxldGUgKi8KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNEVYSUZDX0Jhc2ljVGFncwotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIGJhc2ljIHRhZ3MgdmFsdWVzLgotICogQG5vdGUgICAgICAgIFRoaXMgRXhpZiByZWFkZXIgZm9jdXNlcyBvbiBhIHNldCBvZiAiRW50cnkgVGFncyIuCi0gKiAgICAgICAgICAgICAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZyAiRW50cnkgVmFsdWVzIiBvZiB0aGVzZSB0YWdzLgotICogICAgICAgICAgICAgICAgTTRFWElGQ19DaGFyKiBmaWVsZHMgb2Ygc3RydWN0dXJlIGFyZSBOdWxsIHRlcm1pbmF0ZWQgU3RyaW5ncy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0ludDMyICAgICAgICB3aWR0aDsgICAgICAgICAgICAgICAgLyoqPCBpbWFnZSB3aWR0aCBpbiBwaXhlbHMgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgaGVpZ2h0OyAgICAgICAgICAgICAgIC8qKjwgaW1hZ2UgaGVpZ2h0IGluIHBpeGVscyAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpjcmVhdGlvbkRhdGVUaW1lOyAgICAgLyoqPCBkYXRlIGFuZCB0aW1lIG9yaWdpbmFsIGltYWdlIHdhcyBnZW5lcmF0ZWQgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqbGFzdENoYW5nZURhdGVUaW1lOyAgIC8qKjwgZmlsZSBjaGFuZ2UgZGF0ZSBhbmQgdGltZSAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpkZXNjcmlwdGlvbjsgICAgICAgICAgLyoqPCBpbWFnZSB0aXRsZSAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICptYWtlOyAgICAgICAgICAgICAgICAgLyoqPCBtYW51ZmFjdHVyZXIgb2YgaW1hZ2UgaW5wdXQgZXF1aXBtZW50ICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKm1vZGVsOyAgICAgICAgICAgICAgICAvKio8IG1vZGVsIG9mIGltYWdlIGlucHV0IGVxdWlwbWVudCAqLwotICAgIE00T1NBX0NoYXIgICAgICAgICpzb2Z0d2FyZTsgICAgICAgICAgICAgLyoqPCBzb2Z0d2FyZSB1c2VkICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmFydGlzdDsgICAgICAgICAgICAgICAvKio8IHBlcnNvbiB3aG8gY3JlYXRlZCB0aGUgaW1hZ2UgKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqY29weXJpZ2h0OyAgICAgICAgICAgIC8qKjwgY29weXJpZ2h0IGhvbGRlciAqLwotICAgIE00Q09NTU9OX09yaWVudGF0aW9uIG9yaWVudGF0aW9uOyAgICAgICAgLyoqPCBvcmllbnRhdGlvbiBvZiBpbWFnZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICB0aHVtYm5haWxTaXplOyAgICAgICAgLyoqPCBzaXplIG9mIHRoZSB0aHVtYm5haWwgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgKnRodW1ibmFpbEltZzsgICAgICAgIC8qKjwgcG9pbnRlciB0byB0aGUgdGh1bWJuYWlsIGluIG1haW4gaW1hZ2UgYnVmZmVyKi8KLSAgICBNNE9TQV9DaGFyICAgICAgICAqbGF0aXR1ZGVSZWY7ICAgICAgICAgIC8qKjwgbGF0aXR1ZGUgcmVmZXJlbmNlICovCi0gICAgTTRDT01NT05fTG9jYXRpb24gbGF0aXR1ZGU7ICAgICAgICAgICAgICAvKio8IGxhdGl0dWRlICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgKmxvbmdpdHVkZVJlZjsgICAgICAgICAvKio8IGxvbmdpdHVkZSByZWZlcmVuY2UgKi8KLSAgICBNNENPTU1PTl9Mb2NhdGlvbiBsb25naXR1ZGU7ICAgICAgICAgICAgIC8qKjwgbG9uZ2l0dWRlICovCi0KLX0gTTRFWElGQ19CYXNpY1RhZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRFWElGQ19nZXRWZXJzaW9uICAgIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pCi0gKiBAYnJpZWYgICAgZ2V0IHRoZSB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIGV4aWYgbGlicmFyeS4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSB2ZXJzaW9uIG51bWJlcnMgaW4gYSBzdHJ1Y3R1cmUuCi0gKiBAcGFyYW0gICAgcFZlcnNpb246ICAgIChPVVQpICAgICAgICB0aGUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdmVyc2lvbiBudW1iZXJzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVhJRkNfRVJSX1BBUkFNRVRFUjogICAgICAgIChEZWJ1ZyBvbmx5KSB0aGUgcGFyYW1ldGVyIGlzIE00RVhJRkNfTlVMTC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRFWElGQ19nZXRWZXJzaW9uIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pOwotCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMqLwotI2VuZGlmIC8qIF9fTTRfRVhJRl9DT01NT05fQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000UFRPM0dQUF9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YWEyMGQyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFBUTzNHUFBfQVBJLmgKLSAqIEBicmllZiAgICBUaGUgUGljdHVyZXMgdG8gM0dQUCBDb252ZXJ0ZXIuCi0gKiBAbm90ZSAgICBNNFBUTzNHUFAgcHJvZHVjZXMgM0dQUCBjb21wbGlhbnQgYXVkaW8vdmlkZW8gIGZpbGVzCi0gKiAgICAgICAgICAgIGZyb20gYW4gQU1SIE5CIGF1ZGlvIGZpbGUgYW5kIHJhdyBwaWN0dXJlcyBpbnRvIGEgTVBFRy00L2gyNjMgM0dQUCBmaWxlLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19NNFBUTzNHUFBfQVBJX0hfXwotI2RlZmluZSBfX000UFRPM0dQUF9BUElfSF9fCi0KLS8qKgotICogICAgT1NBTCBiYXNpYyB0eXBlcyBhbmQgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKioKLSAqICAgIE9TQUwgdHlwZXMgZm9yIGZpbGUgYWNjZXNzICovCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVJlYWRlci5oIgotI2luY2x1ZGUgIk00T1NBX0ZpbGVXcml0ZXIuaCIKLQotLyoqCi0gKiAgICBEZWZpbml0aW9uIG9mIE00X1ZlcnNpb25JbmZvICovCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLS8qKgotICogRGVmaW5pdGlvbnMgb2YgTTRWSUZJX0ltYWdlUGxhbmUgKi8KLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotCi0vKioKLSAqIENvbW1vbiBkZWZpbml0aW9ucyBvZiB2aWRlbyBlZGl0aW5nIGNvbXBvbmVudHMgKi8KLSNpbmNsdWRlICJNNF9WaWRlb0VkaXRpbmdDb21tb24uaCIKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICogICAgUHVibGljIHR5cGUgb2YgdGhlIE00UFRPM0dQUCBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00UFRPM0dQUF9Db250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRQVE8zR1BQX1JlcGxhY2VBdWRpb01vZGUKLSAqIEBicmllZiAgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHdheSB0aGUgYXVkaW8gaXMgbWFuYWdlZCBpZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHZpZGVvCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Ob25lID0gMCwgIC8qKjwgQXVkaW8gdHJhY2sgaXMga2VwdCBzaG9ydGVyIHRoYW4gdGhlIHZpZGVvIHRyYWNrKi8KLSAgICBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfU2lsZW5jZSwgICAvKio8IElmIGF1ZGlvIGlzIHNob3J0ZXIsIHNpbGVuY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCovCi0gICAgTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX0xvb3AgICAgICAgLyoqPCBJZiBhdWRpbyBpcyBzaG9ydGVyLCBsb29wIGJhY2sgdG8gdGhlIGJlZ2lubmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgd2hvbGUgdHJhY2sgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi19IE00UFRPM0dQUF9BdWRpb1BhZGRpbmdNb2RlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00UFRPM0dQUF9PdXRwdXRGaWxlTWF4U2l6ZQotICogQGJyaWVmICAgIERlZmluZXMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgM0dQUCBmaWxlIHByb2R1Y2VkIGJ5IHRoZSBQVE8zR1BQCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00UFRPM0dQUF9rNTBfS0IsICAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byA1MCBLYnl0ZXMgICovCi0gICAgTTRQVE8zR1BQX2s3NV9LQiwgICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDc1IEtieXRlcyAgKi8KLSAgICBNNFBUTzNHUFBfazEwMF9LQiwgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gMTAwIEtieXRlcyAqLwotICAgIE00UFRPM0dQUF9rMTUwX0tCLCAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byAxNTAgS2J5dGVzICovCi0gICAgTTRQVE8zR1BQX2syMDBfS0IsICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDIwMCBLYnl0ZXMgKi8KLSAgICBNNFBUTzNHUFBfazMwMF9LQiwgICAgICAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIGxpbWl0ZWQgdG8gMzAwIEtieXRlcyAqLwotICAgIE00UFRPM0dQUF9rNDAwX0tCLCAgICAgICAgICAgLyoqPCBPdXRwdXQgM0dQUCBmaWxlIHNpemUgaXMgbGltaXRlZCB0byA0MDAgS2J5dGVzICovCi0gICAgTTRQVE8zR1BQX2s1MDBfS0IsICAgICAgICAgICAvKio8IE91dHB1dCAzR1BQIGZpbGUgc2l6ZSBpcyBsaW1pdGVkIHRvIDUwMCBLYnl0ZXMgKi8KLSAgICBNNFBUTzNHUFBfa1VOTElNSVRFRD0tMSAgICAgIC8qKjwgT3V0cHV0IDNHUFAgZmlsZSBzaXplIGlzIG5vdCBsaW1pdGVkICAgICAgICAgICAqLwotfSBNNFBUTzNHUFBfT3V0cHV0RmlsZU1heFNpemU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIChNNFBUTzNHUFBfUGljdHVyZUNhbGxiYWNrRmN0KSAoTTRPU0FfVm9pZCogcFBpY3R1cmVDdHh0LAotICogTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywgTTRPU0FfRG91YmxlKiBwUGljdHVyZUR1cmF0aW9uKTsKLSAqIEBicmllZiAgICBUaGUgaW50ZWdyYXRvciBtdXN0IGltcGxlbWVudCBhIGZ1bmN0aW9uIGZvbGxvd2luZyB0aGlzIHByb3RvdHlwZS4KLSAqICAgICAgICAgICAgSXRzIGdvYWwgaXMgdG8gZmVlZCB0aGUgUFRPM0dQUCB3aXRoIFlVVjQyMCBwaWN0dXJlcy4KLSAqCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIGdpdmVuIHRvIHRoZSBQVE8zR1BQIGluIHRoZSBNNFBUTzNHUFBfUGFyYW1zIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcwotICogQHBhcmFtICAgIHBQaWN0dXJlRHVyYXRpb24oT1VUKSBEdXJhdGlvbiBvZiB0aGUgcmV0dXJuZWQgcGljdHVyZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU6IFRoZSByZXR1cm5lZCBpbWFnZSBpcyB0aGUgbGFzdCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbCAoYmVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBNNE9TQV9FUlIgKE00UFRPM0dQUF9QaWN0dXJlQ2FsbGJhY2tGY3QpIChNNE9TQV9Wb2lkKiBwUGljdHVyZUN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RvdWJsZSogcFBpY3R1cmVEdXJhdGlvbik7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTRQVE8zR1BQX1BhcmFtcwotICogQGJyaWVmICAgIE00UFRPM0dQUCBwYXJhbWV0ZXJzIGRlZmluaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKio8IE91dHB1dCB2aWRlbyBjb21wcmVzc2lvbiBmb3JtYXQsIEgyNjMgb3IgTVBFRzQgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCAgICAgIE91dHB1dFZpZGVvRm9ybWF0OwotICAgIC8qKjwgT3V0cHV0IGZyYW1lIHNpemUgOiBTUUNJRiB0byBWR0EqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplICAgT3V0cHV0VmlkZW9GcmFtZVNpemU7Ci0gICAgLyoqPCBUYXJnZXRlZCBPdXRwdXQgYml0LXJhdGUsIHNlZSBlbnVtKi8KLSAgICBNNFZJREVPRURJVElOR19CaXRyYXRlICAgICAgICAgIE91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICAvKio8IE1heGltdW0gc2l6ZSBvZiB0aGUgb3V0cHV0IDNHUFAgZmlsZSwgc2VlIGVudW0gKi8KLSAgICBNNFBUTzNHUFBfT3V0cHV0RmlsZU1heFNpemUgICAgIE91dHB1dEZpbGVNYXhTaXplOwotICAgIC8qKjwgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IHRoZSBQVE8zR1BQIHRvIGdldCB0aGUgaW5wdXQgcGljdHVyZXMqLwotICAgIE00UFRPM0dQUF9QaWN0dXJlQ2FsbGJhY2tGY3QqICAgcFBpY3R1cmVDYWxsYmFja0ZjdDsKLSAgICAvKio8IENvbnRleHQgdG8gYmUgZ2l2ZW4gYXMgdGhpcmQgYXJndW1lbnQgb2YgdGhlIHBpY3R1cmUgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbCovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICBwUGljdHVyZUNhbGxiYWNrQ3R4dDsKLSAgICAvKio8IEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgaW5wdXQgYXVkaW8gdHJhY2sgZmlsZSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgcElucHV0QXVkaW9UcmFja0ZpbGU7Ci0gICAgLyoqPCBGb3JtYXQgb2YgdGhlIGF1ZGlvIGZpbGUgKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgIEF1ZGlvRmlsZUZvcm1hdDsKLSAgICAvKio8IFR5cGUgb2YgcHJvY2Vzc2luZyB0byBhcHBseSB3aGVuIGF1ZGlvIGlzIHNob3J0ZXIgdGhhbiB2aWRlbyovCi0gICAgTTRQVE8zR1BQX0F1ZGlvUGFkZGluZ01vZGUgICAgICBBdWRpb1BhZGRpbmdNb2RlOwotICAgIC8qKjwgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBvdXRwdXQgM0dQUCBmaWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICBwT3V0cHV0M2dwcEZpbGU7Ci0gICAgIC8qKjwgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSB0byBzdG9yZSBtZXRhZGF0YSAoIm1vb3YuYmluIikgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlOwotICAgIC8qKjwgTnVtYmVyIG9mIGlucHV0IFlVViBmcmFtZXMgdG8gZW5jb2RlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBOYlZpZGVvRnJhbWVzOwotICAgIE00T1NBX0ludDMyICAgdmlkZW9Qcm9maWxlOwotICAgIE00T1NBX0ludDMyICAgdmlkZW9MZXZlbDsKLX0gTTRQVE8zR1BQX1BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0gKiBAYnJpZWYgICAgR2V0IHRoZSBNNFBUTzNHUFAgdmVyc2lvbi4KLSAqIEBub3RlICAgIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0luaXQoTTRQVE8zR1BQX0NvbnRleHQqIHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBJbml0aWFsaXplcyB0aGUgTTRQVE8zR1BQIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIE00UFRPM0dQUCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICBwRmlsZVJlYWRQdHJGY3QgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgcEZpbGVXcml0ZVB0ckZjdCAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHdyaXRlciBmdW5jdGlvbnMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGUgY29udGV4dCBzdHJ1Y3R1cmUgY291bGQgbm90IGJlIGFsbG9jYXRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX0luaXQoTTRQVE8zR1BQX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ckZjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZVB0ckZjdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9PcGVuKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0LCBNNFBUTzNHUFBfUGFyYW1zKiBwUGFyYW1zKTsKLSAqIEBicmllZiAgICBTZXQgdGhlIE00UFRPM0dQUCBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLgotICogQG5vdGUgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgbWF5IG5vdCBiZSBjcmVhdGVkIHlldC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUGFyYW1zICAgICAgICAgICAgICAgIChJTikgUG9pbnRlciB0byB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIFBUTzNHUFAuCi0gKiBAbm90ZSAgICBUaGUgcG9pbnRlZCBzdHJ1Y3R1cmUgY2FuIGJlIGRlLWFsbG9jYXRlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYmVjYXVzZQotICogICAgICAgICAgICBpdCBpcyBpbnRlcm5hbGx5IGNvcGllZCBieSB0aGUgUFRPM0dQUAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgTTRQVE8zR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMgVGhlIG91dHB1dCB2aWRlbyBmcmFtZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgcGFyYW1ldGVyIGlzIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gICAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IHZpZGVvIGZvcm1hdCAgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCB2aWRlbyBiaXQtcmF0ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICAgIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRQotICogICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX0ZJTEVfU0laRQotICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgZmlsZSBzaXplIHBhcmFtZXRlciBpcyB1bmRlZmluZWQKLSAqIEByZXR1cm4gICAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX0FVRElPX1BBRERJTkcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCBhdWRpbyBwYWRkaW5nIHBhcmFtZXRlciBpcyB1bmRlZmluZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9PcGVuKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0LCBNNFBUTzNHUFBfUGFyYW1zKiBwUGFyYW1zKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX1N0ZXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgdHJhbmNvZGluZy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgTTRQVE8zR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgICBNNFBUTzNHUFBfV0FSX0VORF9PRl9QUk9DRVNTSU5HOiAgICBFbmNvZGluZyBjb21wbGV0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9TdGVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0Nsb3NlKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIE00UFRPM0dQUCB0cmFuc2NvZGluZy4KLSAqIEBub3RlICAgIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBNNFBUTzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfQ2xvc2UoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfQ2xlYW5VcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIE00UFRPM0dQUC4KLSAqIEBub3RlICAgIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE00UFRPM0dQUCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfQ2xlYW5VcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRQVE8zR1BQX0FQSV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfRXJyb3JDb2Rlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfRXJyb3JDb2Rlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1N2JkNTRmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0Vycm9yQ29kZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRQVE8zR1BQX0Vycm9yQ29kZXMuaAotICogQGJyaWVmICAgIFBpY3R1cmUgdG8gM2dwcCBTZXJ2aWNlIGVycm9yIGRlZmluaXRpb25zLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fTTRQVE8zR1BQX0Vycm9yQ29kZXNfSF9fCi0jZGVmaW5lIF9fTTRQVE8zR1BQX0Vycm9yQ29kZXNfSF9fCi0KLS8qKgotICogICAgT1NBTCBiYXNpYyB0eXBlcyBhbmQgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKioKLSAqICAgIE9TQUwgY29yZSBJRCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0KLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBmb3JtYXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDAxICkKLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFICAgICAgICBcCi0gICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAwMiApCi0vKioKLSAqICAgIFRoZSBvdXRwdXQgdmlkZW8gYml0LXJhdGUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEUgICAgICAgICAgIFwKLSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDAzICkKLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcyBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyAgICAgICAgXAotICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMDQgKQotLyoqCi0gKiAgICBUaGUgZmlsZSBzaXplIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9JTlZBTElEX0ZJTEVfU0laRSAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDA1ICkKLS8qKgotICogVGhlIGlucHV0IGF1ZGlvIGZpbGUgY29udGFpbnMgYSB0cmFjayBmb3JtYXQgbm90IGhhbmRsZWQgYnkgUFRPM0dQUCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkhBTkRMRURfQVVESU9fVFJBQ0tfSU5QVVRfRklMRSAgICAgICAgIFwKLSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDA2ICkKLS8qKgotICogICAgVGhlIG91dHB1dCB2aWRlbyBmb3JtYXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDA3ICkKLQotLyoqCi0gKiAgICBUaGUgQU1SIGRlY29kZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0FNUl9ERUNPREVSX0lOSVRfRVJST1IgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjAgKQotLyoqCi0gKiAgICBUaGUgQU1SIGRlY29kZXIgZmFpbGVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0FNUl9ERUNPREVfRVJST1IgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjEgKQotLyoqCi0gKiAgICBUaGUgQU1SIGRlY29kZXIgY2xlYW51cCBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfQU1SX0RFQ09ERVJfREVTVFJPWV9FUlJPUiAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyMiApCi0KLS8qKgotICogICAgVGhlIHZpZGVvIGVuY29kZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1ZJREVPX0VOQ09ERVJfSU5JVF9FUlJPUiAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjMgKQotLyoqCi0gKiAgICBUaGUgdmlkZW8gZW5jb2RlciBkZWNvZGluZyBmYWlsZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVklERU9fRU5DT0RFX0VSUk9SICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyNCApCi0vKioKLSAqICAgIFRoZSB2aWRlbyBlbmNvZGVyIGNsZWFudXAgZmFpbGVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1ZJREVPX0VOQ09ERVJfREVTVFJPWV9FUlJPUiAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjUgKQotCi0vKioKLSAqICAgIFRoZSBvdXRwdXQgZmlsZSBzaXplIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9GSUxFX1NJWkUgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFBUTzNHUFAsIDB4MDAyNiApCi0KLS8qKgotICogICAgVGhlIEVuY29kaW5nIGlzIGNvbXBsZXRlZCAqLwotI2RlZmluZSBNNFBUTzNHUFBfV0FSX0VORF9PRl9QUk9DRVNTSU5HICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00UFRPM0dQUCwgMHgwMDI3ICkKLQotLyoqCi0gKiAgICBUaGUgRW5jb2RpbmcgaXMgY29tcGxldGVkICovCi0jZGVmaW5lIE00UFRPM0dQUF9XQVJfTEFTVF9QSUNUVVJFICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjggKQotCi0vKioKLSAqICAgIFRoZSBvdXRwdXQgYXVkaW8gcGFkZGluZyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9BVURJT19QQURESU5HICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMjkgKQotCi0vKioKLSAqIFRoZSB2aWRlbyBlbmNvZGVyIGVuY291bnRlcmVkIGFuIEFjY2VzIFVuaXQgZXJyb3I6IHZlcnkgcHJvYmFibHkgYSBmaWxlIHdyaXRlIGVycm9yICovCi0jZGVmaW5lIEVSUl9QVE8zR1BQX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUiAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRQVE8zR1BQLCAweDAwMkEgKQotCi0jZW5kaWYgLyogX19NNFBUTzNHUFBfRXJyb3JDb2Rlc19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFBUTzNHUFBfSW50ZXJuYWxUeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OTJlNTY2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRQVE8zR1BQX0ludGVybmFsVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRQVE8zR1BQX0ludGVybmFsVHlwZXMuaAotICogQGJyaWVmICAgIFBpY3R1cmUgdG8gM2dwcCBTZXJ2aWNlIGludGVybmFsIGRlZmluaXRpb25zCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGVudW0gYW5kIHR5cGVzIG5vdCB2aXNpYmxlIHRvIHRoZSBleHRlcm5hbCB3b3JsZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0KLSNpZm5kZWYgX19NNFBUTzNHUFBfSU5URVJOQUxUWVBFU19IX18KLSNkZWZpbmUgX19NNFBUTzNHUFBfSU5URVJOQUxUWVBFU19IX18KLQotI2RlZmluZSBNNFBUTzNHUFBfVkVSU0lPTl9NQUpPUiAgICAgICAgMwotI2RlZmluZSBNNFBUTzNHUFBfVkVSU0lPTl9NSU5PUiAgICAgICAgMAotI2RlZmluZSBNNFBUTzNHUFBfVkVSU0lPTl9SRVZJU0lPTiAgICA2Ci0KLS8qKgotICogICAgTTRQVE8zR1BQIHB1YmxpYyBBUEkgYW5kIHR5cGVzICovCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0FQSS5oIgotI2luY2x1ZGUgIk00X1V0aWxzLmgiCi0KLS8qKgotICogICAgSW50ZXJuYWxseSB1c2VkIG1vZHVsZXMgKi8KLQotI2luY2x1ZGUgIk00V1JJVEVSX2NvbW1vbi5oIiAgICAvKiBXcml0ZSAzR1BQIGZpbGUgICAgKi8KLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIgICAgLyogUmVhZCBBTVIgZmlsZSAgICAqLwotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00UFRPM0dQUF9TdGF0ZXMKLSAqIEBicmllZiAgICAgICAgTWFpbiBzdGF0ZSBtYWNoaW5lIG9mIHRoZSBNNFBUTzNHUFAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00UFRPM0dQUF9rU3RhdGVfQ1JFQVRFRCAgICAgICAgID0gMCwgICAgLyoqPCBNNFBUTzNHUFBfSW5pdCBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBNNFBUTzNHUFBfa1N0YXRlX09QRU5FRCAgICAgICAgICA9IDEsICAgIC8qKjwgTTRQVE8zR1BQX09wZW4gaGFzIGJlZW4gY2FsbGVkICovCi0gICAgTTRQVE8zR1BQX2tTdGF0ZV9SRUFEWSAgICAgICAgICAgPSAyLCAgICAvKio8IFN0ZXAgY2FuIGJlIGNhbGxlZCAqLwotICAgIE00UFRPM0dQUF9rU3RhdGVfRklOSVNIRUQgICAgICAgID0gMywgICAgLyoqPCBUcmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgIE00UFRPM0dQUF9rU3RhdGVfQ0xPU0VEICAgICAgICAgID0gNCAgICAgLyoqPCBPdXRwdXQgZmlsZSBoYXMgYmVlbiBjcmVhdGVkICovCi19Ci1NNFBUTzNHUFBfU3RhdGVzOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNFBUTzNHUFBfU3RyZWFtU3RhdGUKLSAqIEBicmllZiAgICAgICAgU3RhdGUgb2YgYSBtZWRpYSBzdHJlYW0gZW5jb2RpbmcgKGF1ZGlvIG9yIHZpZGVvKS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTSAgPSAwLCAgICAvKio8IE5vIHN0cmVhbSBwcmVzZW50ICovCi0gICAgTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9TVEFSVEVEICAgPSAxLCAgICAvKio8IFRoZSBzdHJlYW0gZW5jb2RpbmcgaXMgaW4gcHJvZ3Jlc3MgKi8KLSAgICBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEICA9IDIgICAgLyoqPCBUaGUgc3RyZWFtIGhhcyBmaW5pc2hlZCBlbmNvZGluZyAqLwotfQotTTRQVE8zR1BQX1N0cmVhbVN0YXRlOwotCi0vKgotICogRGVmaW5pdGlvbiBvZiBtYXggQVUgc2l6ZSAqLwotI2RlZmluZSBNNFBUTzNHUFBfVklERU9fTUlOX0NPTVBSRVNTSU9OX1JBVElPICAgICAwLjhGICAgIC8qKjwgTWF4IEFVIHNpemUgd2lsbCBiZSAwLjggdGltZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0OjI6MCBmcmFtZSBzaXplICovCi0jZGVmaW5lIE00UFRPM0dQUF9WSURFT19BVV9TSVpFX1RPX0NIVU5DS19TSVpFX1JBVElPICAgIDEuMkYgLyoqPCBNYXggY2h1bmsgc2l6ZSB3aWxsIGJlIDEuMiB0aW1lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1heCBBVSBzaXplICovCi0jZGVmaW5lIE00UFRPM0dQUF9BVURJT19NQVhfQVVfU0laRSAgICAgICAgICAgICAgMTAwMCAgICAvKio8IEFBQyBtYXggQVUgc2l6ZSBzZWVtcyB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm91dCA4NTAgYnl0ZXMgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX0FVRElPX01BWF9DSFVOS19TSVpFICAgICAgICAgICA1MDAwCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIGFub255bW91cyBlbnVtCi0gKiBAYnJpZWYgICAgICAgIGVudW0gdG8ga2VlcCB0cmFjayBvZiB0aGUgZW5jb2RlciBzdGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1lbnVtCi17Ci0gICAgTTRQVE8zR1BQX2tOb0VuY29kZXIsCi0gICAgTTRQVE8zR1BQX2tFbmNvZGVyQ2xvc2VkLAotICAgIE00UFRPM0dQUF9rRW5jb2RlclN0b3BwZWQsCi0gICAgTTRQVE8zR1BQX2tFbmNvZGVyUnVubmluZwotfTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBNNFBUTzNHUFAgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgTTRQVE8zR1BQIGNhbGxzIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqCi0gICAgICogICAgTTRQVE8zR1BQIG1haW4gdmFyaWFibGVzICovCi0gICAgTTRQVE8zR1BQX1N0YXRlcyAgICAgICAgICAgICBtX1N0YXRlOyAgICAgICAgICAgIC8qKjwgTTRQVE8zR1BQIGludGVybmFsIHN0YXRlICovCi0gICAgTTRQVE8zR1BQX1BhcmFtcyAgICAgICAgICAgICBtX1BhcmFtczsgICAgICAgICAgIC8qKjwgTTRQVE8zR1BQIHBhcmFtZXRlcnMsIHNldCBieSB0aGUgdXNlciAqLwotICAgIE00UFRPM0dQUF9TdHJlYW1TdGF0ZSAgICAgICAgbV9WaWRlb1N0YXRlOyAgICAgICAvKio8IFN0YXRlIG9mIHRoZSB2aWRlbyBlbmNvZGluZyAqLwotICAgIE00UFRPM0dQUF9TdHJlYW1TdGF0ZSAgICAgICAgbV9BdWRpb1N0YXRlOyAgICAgICAvKio8IFN0YXRlIG9mIHRoZSBhdWRpbyBlbmNvZGluZyAqLwotCi0gICAgLyoqCi0gICAgICogICAgT1NBTCBmaWxlIHJlYWQvd3JpdGUgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgcE9zYWxGaWxlUmVhZDsgICAgIC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgcE9zYWxGaWxlV3JpdGU7ICAgIC8qKjwgT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0KLSAgICAvKioKLSAgICAgKiAgICBSZWFkZXIgc3R1ZmYgKi8KLSAgICBNNF9BY2Nlc3NVbml0KiAgICAgICAgICAgICAgICBtX3BSZWFkZXJBdWRpb0FVOyAgICAvKio8IFJlYWQgYXVkaW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICAgICAgICBtX3BSZWFkZXJBdWRpb1N0cmVhbTsvKio8IERlc2NyaXB0aW9uIG9mIHRoZSByZWFkIGF1ZGlvIHN0cmVhbSAqLwotCi0gICAgLyoqCi0gICAgICogICAgV3JpdGVyIHN0dWZmICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIG1fV3JpdGVyVmlkZW9BVTsgICAgICAgLyoqPCBXcml0dGVuIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIG1fV3JpdGVyQXVkaW9BVTsgICAgICAgLyoqPCBXcml0dGVuIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRFTkNPREVSX0hlYWRlciogICAgICAgICAgIG1fcEVuY29kZXJIZWFkZXI7ICAgICAgLyoqPCBTZXF1ZW5jZSBoZWFkZXIgcmV0dXJuZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyIGF0IGVuY29kZXIgY3JlYXRlIChpZiBhbnkpICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qICAgIG1fcFdyaXRlclZpZGVvU3RyZWFtOyAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIHN0cmVhbSAqLwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiAgICBtX3BXcml0ZXJBdWRpb1N0cmVhbTsgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKiAgbV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvOyAgICAvKio8IFZpZGVvIHByb3BlcnRpZXMgb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIHN0cmVhbSAqLwotICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MqICAgIG1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mbzsgICAvKio8IEF1ZGlvIHByb3BlcnRpZXMgb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbSAqLwotCi0gICAgLyoqCi0gICAgICogICAgQ29udGV4dHMgb2YgdGhlIHVzZWQgbW9kdWxlcyAgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9SZWFkZXJDb250ZXh0OyAvKio8IENvbnRleHQgb2YgdGhlIGF1ZGlvIHJlYWRlciBtb2R1bGUqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBtX3AzZ3BXcml0ZXJDb250ZXh0OyAgIC8qKjwgQ29udGV4dCBvZiB0aGUgM0dQIHdyaXRlciBtb2R1bGUgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgbV9wTXA0RW5jb2RlckNvbnRleHQ7ICAvKio8IE1wNCBlbmNvZGVyIGNvbnRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgbV9lRW5jb2RlclN0YXRlOwotCi0gICAgLyoqCi0gICAgICogUmVhZGVyIEludGVyZmFjZXMgKi8KLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgIG1fcFJlYWRlckdsb2JJbnQ7ICAgIC8qKjwgUmVhZGVyIGNvbW1vbiBpbnRlcmZhY2UsIGdsb2JhbCBwYXJ0ICovCi0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgICBtX3BSZWFkZXJEYXRhSW50OyAgICAgLyoqPCBSZWFkZXIgY29tbW9uIGludGVyZmFjZSwgZGF0YSBwYXJ0ICovCi0KLSAgICAvKioKLSAgICAgKiBXcml0ZXIgSW50ZXJmYWNlcyAqLwotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICBtX3BXcml0ZXJHbG9iSW50OyAgICAgLyoqPCBXcml0ZXIgY29tbW9uIGludGVyZmFjZSwgZ2xvYmFsIHBhcnQgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgbV9wV3JpdGVyRGF0YUludDsgICAgIC8qKjwgV3JpdGVyIGNvbW1vbiBpbnRlcmZhY2UsIGRhdGEgcGFydCAqLwotCi0gICAgLyoqCi0gICAgICogRW5jb2RlciBJbnRlcmZhY2VzICovCi0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogIG1fcEVuY29kZXJJbnQ7ICAgICAgICAgICAgICAgIC8qKjwgRW5jb2RlciBjb21tb24gaW50ZXJmYWNlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgIG1fcEVuY29kZXJFeHRlcm5hbEFQSTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgbV9wRW5jb2RlclVzZXJEYXRhOwotCi0gICAgLyoqCi0gICAgICogKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgICAgICAgICBwU2F2ZWRQbGFuZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICB1aVNhdmVkRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiAgICBWaWRlbyByYXRlIGNvbnRyb2wgc3R1ZmYgKi8KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICAgICAgbV9kTGFzdFZpZGVvUmVndWxDdHM7IC8qKjwgTGFzdCB0aW1lIChDVFMpIHRoZSB2aWRlbyBiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXRpb24gaGFzIGJlZW4gY2FsbGVkICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fbXRDdHM7ICAgICAgICAgLyoqPCBDdXJyZW50IHZpZGVvIGN0cyAqLwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICAgICBtX210TmV4dEN0czsgICAgIC8qKjwgTmV4dCB2aWRlbyBDVFMgdG8gdHJhbnNjb2RlICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fbXRBdWRpb0N0czsgICAgLyoqPCBDdXJyZW50IGF1ZGlvIGN0cyAqLwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgICAgICBtX0F1ZGlvT2ZmU2V0OyAgIC8qKjwgQXVkaW8gT2Zmc2V0IHRvIGFkZCB0byB0aGUgY3RzIGluIGxvb3AgbW9kZSovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fUHJldkF1ZGlvQ3RzOyAgLyoqPCBQcmV2aW91cyBhdWRpbyBjdHMgZm9yIEFBQyBsb29waW5nICovCi0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgICAgIG1fRGVsdGFBdWRpb0N0czsgLyoqPCBEZWx0YSBhdWRpbyBjdHMgZm9yIEFBQyBsb29waW5nICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1fQ3VycmVudEZpbGVTaXplOyAvKio8IEN1cnJlbnQgT3V0cHV0IGZpbGUgc2l6ZSAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgbV9NYXhGaWxlU2l6ZTsgICAgIC8qKjwgTWF4IE91dHB1dCBmaWxlIHNpemUgICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIG1fSXNMYXN0UGljdHVyZTsgICAvKio8IEEgYm9vbGVhbiB0aGF0IHNpZ25hbHMgdG8gdGhlIGVuY29kZXIgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgdGhlIGxhc3QgZnJhbWUgdG8gYmUgZW5jb2RlZCovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIG1fYkxhc3RJbnRlcm5hbENhbGxCYWNrOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBtX05iQ3VycmVudEZyYW1lOyAgLyoqPCBJbmRleCBvZiB0aGUgY3VycmVudCBZVVYgZnJhbWUgZW5jb2RlZCAqLwotCi0gICAgLyoqCi0gICAgICogICAgQXVkaW8gcGFkZGluZyBtb2RlICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgbV9iQXVkaW9QYWRkaW5nU2lsZW5jZTsgIC8qKjwgQSBib29sZWFuIHRoYXQgc2lnbmFscyB0aGF0IGF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVUgd2lsbCBiZSBwYWRkZWQgYnkgc2lsZW5jZSAqLwotfSBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0OwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX2FwcGx5VlBQKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICAgQ2FsbCBhbiBleHRlcm5hbCBjYWxsYmFjayB0byBnZXQgdGhlIHBpY3R1cmUgdG8gZW5jb2RlCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFZQUCBjb250ZXh0LCB3aGljaCBhY3R1YWxseSBpcyB0aGUgTTRQVE8zR1BQCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgKElOKSBDb250YWlucyB0aGUgaW1hZ2UKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQgICAgKElOL09VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiAzIHBsYW5lcyB0aGF0IHdpbGwgY29udGFpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IFlVVjQyMCBpbWFnZSByZWFkIHdpdGggdGhlIG1fcFBpY3R1cmVDYWxsYmFja0ZjdAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfYXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpOwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000UFRPM0dQUF9JTlRFUk5BTFRZUEVTX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9BUEkuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0FQSS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYmI3MTQxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0FQSS5oCisrKyAvZGV2L251bGwKQEAgLTEsODE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0FQSV9IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfQVBJX0hfXwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9BUEkuaAotICogQGJyaWVmICAgVmlkZW8gU3R1ZGlvIFNlcnZpY2UgM0dQUCBwdWJsaWMgQVBJLgotICogQG5vdGUgICAgVlNTIGFsbG93cyBlZGl0aW5nIDNHUFAgZmlsZXMuCi0gKiAgICAgICAgICBJdCBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBhbmQgZnVsbHkgc3luY2hyb25vdXMgQVBJLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICogIE9TQUwgYmFzaWMgdHlwZXMgYW5kIGVycm9ycyAqLwotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLQotLyoqCi0gKiAgT1NBTCB0eXBlcyBmb3IgZmlsZSBhY2Nlc3MgKi8KLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotCi0vKioKLSAqICBEZWZpbml0aW9uIG9mIE00X1ZlcnNpb25JbmZvICovCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0KLS8qKgotICogSW1hZ2UgcGxhbmVzIGRlZmluaXRpb24gKi8KLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotCi0vKioKLSAqIENvbW1vbiBkZWZpbml0aW9ucyBvZiB2aWRlbyBlZGl0aW5nIGNvbXBvbmVudHMgKi8KLSNpbmNsdWRlICJNNF9WaWRlb0VkaXRpbmdDb21tb24uaCIKLSNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIKLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00REFfVHlwZXMuaCIKLQotLyoqCi0gKiBFeHRlbmRlZCBBUEkgKHhWU1MpICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotI2luY2x1ZGUgIk00VlNTM0dQUF9FeHRlbmRlZF9BUEkuaCIKLSNlbmRpZgotCi0vLyNpbmNsdWRlICJNNFZEX0hXX0FQSS5oIgotLy8jaW5jbHVkZSAiTTRWRV9BUEkuaCIKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgIEVkaXRpb24gRmVhdHVyZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqICBQdWJsaWMgdHlwZSBvZiB0aGUgVlNTIGVkaXQgY29udGV4dCAqLwotdHlwZWRlZiBNNE9TQV9Wb2lkKiBNNFZTUzNHUFBfRWRpdENvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZpZGVvIGVmZmVjdCB0eXBlcyBvZiB0aGUgVlNTM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9Ob25lICAgICAgICAgICA9IDAsICAvKio8IE5vIHZpZGVvIGVmZmVjdCAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVGcm9tQmxhY2sgID0gOCwgIC8qKjwgSW50ZW5kZWQgZm9yIGJlZ2luIGVmZmVjdCAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX0ZhZGVUb0JsYWNrICAgID0gMTYsIC8qKjwgSW50ZW5kZWQgZm9yIGVuZCBlZmZlY3QgKi8KLSAgICBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCAgICAgICA9IDI1NiAvKio8IEV4dGVybmFsIGVmZmVjdCBmdW5jdGlvbiBpcyB1c2VkICovCi0gICAgLyogcmVzZXJ2ZWQgMjU2ICsgbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFeHRlcm5hbCBlZmZlY3QgbnVtYmVyIG4gKi8KLQotfSBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTRWU1MzR1BQX0F1ZGlvRWZmZWN0VHlwZQotICogQGJyaWVmICAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBhdWRpbyBlZmZlY3QgdHlwZXMgb2YgdGhlIFZTUzNHUFAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfTm9uZSAgICA9IDAsCi0gICAgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfRmFkZUluICA9IDgsIC8qKjwgSW50ZW5kZWQgZm9yIGJlZ2luIGVmZmVjdCAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX0ZhZGVPdXQgPSAxNiAvKio8IEludGVuZGVkIGZvciBlbmQgZWZmZWN0ICovCi0KLX0gTTRWU1MzR1BQX0F1ZGlvRWZmZWN0VHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9WaWRlb1RyYW5zaXRpb25UeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZpZGVvIGVmZmVjdCB0aGF0IGNhbiBiZSBhcHBsaWVkIGR1cmluZyBhIHRyYW5zaXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lICAgICAgPSAwLAotICAgIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGUgPSAxLAotICAgIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCAgPSAyNTYKLSAgICAvKiByZXNlcnZlZCAyNTYgKyBuICovICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEV4dGVybmFsIHRyYW5zaXRpb24gbnVtYmVyIG4gKi8KLQotfSBNNFZTUzNHUFBfVmlkZW9UcmFuc2l0aW9uVHlwZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00VlNTM0dQUF9BdWRpb1RyYW5zaXRpb25UeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGF1ZGlvIGVmZmVjdCB0aGF0IGNhbiBiZSBhcHBsaWVkIGR1cmluZyBhIHRyYW5zaXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Ob25lID0gMCwKLSAgICBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfQ3Jvc3NGYWRlCi0KLX0gTTRWU1MzR1BQX0F1ZGlvVHJhbnNpdGlvblR5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8gdGhlIGV4dGVybmFsIEVmZmVjdAotICogICAgICAgICAgYW5kIFRyYW5zaXRpb24gZnVuY3Rpb25zCi0gKiBAbm90ZSAgICBUaGUgdWlQcm9ncmVzcyB2YWx1ZSBzaG91bGQgYmUgZW5vdWdoIGZvciBtb3N0IGNhc2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBQcm9ncmVzcyBvZiB0aGUgRWZmZWN0IG9yIHRoZSBUcmFuc2l0aW9uLCBmcm9tIDAgdG8gMTAwMCAob25lIHRob3VzYW5kKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aVByb2dyZXNzOwotICAgIC8qKjwgSW5kZXggb2YgdGhlIGN1cnJlbnQgY2xpcCAoZmlyc3QgY2xpcCBpbiBjYXNlIG9mIGEgVHJhbnNpdGlvbiksIGZyb20gMCB0byBOICovCi0gICAgLy9NNE9TQV9VSW50OCAgICAgdWlDdXJyZW50Q2xpcDsKLSAgICAvKio8IEN1cnJlbnQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLCBpbiB0aGUgY3VycmVudCBjbGlwIHRpbWUtbGluZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aUNsaXBUaW1lOwotICAgIC8qKjwgQ3VycmVudCB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIGluIHRoZSBvdXRwdXQgY2xpcCB0aW1lLWxpbmUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgdWlPdXRwdXRUaW1lOwotICAgIE00T1NBX0Jvb2wgICAgICAgIGJJc0xhc3Q7Ci0KLX0gTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZTUzNHUFBfY29kZWNUeXBlCi0gKiBAYnJpZWYgICAgVGhpcyBlbnVtIGRlZmluZXMgdGhlIGNvZGVjIHR5cGVzIHVzZWQgdG8gY3JlYXRlIGludGVyZmFjZXMKLSAqIEBub3RlICAgIFRoaXMgZW51bSBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFZTUzNHUFAgc2VydmljZXMgdG8gaWRlbnRpZnkKLSAqICAgICAgICAgICAgIGEgY3VycmVudGx5IHN1cHBvcnRlZCBjb2RlYyBpbnRlcmZhY2UuIEVhY2ggY29kZWMgaXMKLSAqICAgICAgICAgICAgcmVnaXN0ZXJlZCB3aXRoIG9uZSBvZiB0aGlzIHR5cGUgYXNzb2NpYXRlZC4KLSAqICAgICAgICAgICAgV2hlbiBhIGNvZGVjIGluc3RhbmNlIGlzIG5lZWRlZCwgdGhpcyB0eXBlIGlzIHVzZWQgdG8KLSAqICAgICAgICAgICAgaWRlbnRpZnkgYW5kIHJldHJpZXZlIGl0cyBpbnRlcmZhY2UuCi0gKiAgICAgICAgICAgIFRoaXMgY2FuIGJlIGV4dGVuZGVkIGZvciBvdGhlciBjb2RlY3MuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIC8qIFZpZGVvIERlY29kZXIgVHlwZXMgKi8KLSAgICBNNFZTUzNHUFBfa1ZpZGVvRGVjTVBFRzQgPSAwLAotICAgIE00VlNTM0dQUF9rVmlkZW9EZWNIMjY0LAotCi0gICAgLyogVmlkZW8gRW5jb2RlciBUeXBlcyAqLwotICAgIE00VlNTM0dQUF9rVmlkZW9FbmNNUEVHNCwKLSAgICBNNFZTUzNHUFBfa1ZpZGVvRW5jSDI2MywKLSAgICBNNFZTUzNHUFBfa1ZpZGVvRW5jSDI2NCwKLQotICAgIC8qIEF1ZGlvIERlY29kZXIgVHlwZXMgKi8KLSAgICBNNFZTUzNHUFBfa0F1ZGlvRGVjQU1STkIsCi0gICAgTTRWU1MzR1BQX2tBdWRpb0RlY0FBQywKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRGVjTVAzLAotCi0gICAgLyogQXVkaW8gRW5jb2RlciBUeXBlcyAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9FbmNBTVJOQiwKLSAgICBNNFZTUzNHUFBfa0F1ZGlvRW5jQUFDLAotCi0gICAgLyogbnVtYmVyIG9mIGNvZGVjcywga2VlcCBpdCBhcyBsYXN0IGVudW0gZW50cnksIGJlZm9yZSBpbnZsYWlkIHR5cGUgKi8KLSAgICBNNFZTUzNHUFBfa0NvZGVjVHlwZV9OQiwKLSAgICAvKiBpbnZhbGlkIGNvZGVjIHR5cGUgKi8KLSAgICBNNFZTUzNHUFBfa0NvZGVjVHlwZUludmFsaWQgPSAyNTUKLQotfSBNNFZTUzNHUFBfY29kZWNUeXBlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9lZGl0VmlkZW9FZmZlY3RGY3QKLSAqIEBicmllZiAgICAgICBCZWdpbiBhbmQgRW5kIHZpZGVvIGVmZmVjdCBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgYnkgdGhlIGludGVncmF0b3IKLSAqICAgICAgICAgICAgICBtdXN0IG1hdGNoIHRoaXMgcHJvdG90eXBlLgotICogQG5vdGUgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBwcm92aWRlZCB3aXRoIHRoZSBvcmlnaW5hbCBpbWFnZSBvZiB0aGUgY2xpcC4KLSAqICAgICAgICAgICAgICBJdCBtdXN0IGFwcGx5IHRoZSB2aWRlbyBlZmZlY3QgdG8gYnVpbGQgdGhlIG91dHB1dCBpbWFnZS4KLSAqICAgICAgICAgICAgICBUaGUgcHJvZ3Jlc3Mgb2YgdGhlIGVmZmVjdCBpcyBnaXZlbiwgb24gYSBzY2FsZSBmcm9tIDAgdG8gMTAwMC4KLSAqICAgICAgICAgICAgICBXaGVuIHRoZSBlZmZlY3QgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbGwgdGhlIGltYWdlIHBsYW5lIHN0cnVjdHVyZXMKLSAqICAgICAgICAgICAgICBhbmQgYnVmZmVycyBhcmUgdmFsaWQgYW5kIG93bmVkIGJ5IHRoZSBWU1MgM0dQUC4KLSAqCi0gKiBAcGFyYW0gICBwRnVuY3Rpb25Db250ZXh0ICAgIChJTikgVGhlIGZ1bmN0aW9uIGNvbnRleHQsIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiBAcGFyYW0gICBwSW5wdXRQbGFuZXMgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgcGxhbmVzIChZLCBVIGFuZCBWKQotICogQHBhcmFtICAgcE91dHB1dFBsYW5lcyAgICAgICAoSU4vT1VUKSBPdXRwdXQgKGZpbHRlcmVkKSBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhyZWUgdmFsaWQgaW1hZ2UgcGxhbmVzIChZLCBVIGFuZCBWKQotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgICAgICAoSU4pIFNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlkZW8gdHJhbnNpdGlvbiBwcm9ncmVzcy4KLSAqIEBwYXJhbSAgIHVpRXh0ZXJuYWxFZmZlY3RJZCAgKElOKSBXaGljaCBlZmZlY3QgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgKGZvciBleHRlcm5hbCBlZmZlY3RzKQotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00VlNTM0dQUF9lZGl0VmlkZW9FZmZlY3RGY3QpCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcElucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwT3V0cHV0UGxhbmVzLAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRXh0ZXJuYWxFZmZlY3RJZAotKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNFZTUzNHUFBfZWRpdFZpZGVvVHJhbnNpdGlvbkZjdAotICogQGJyaWVmICAgICAgIEV4dGVybmFsIHRyYW5zaXRpb24gZnVuY3Rpb25zIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiAgICAgICAgICAgICAgbXVzdCBtYXRjaCB0aGlzIHByb3RvdHlwZS4KLSAqIEBub3RlICAgICAgICBUaGUgZnVuY3Rpb24gaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW1hZ2Ugb2YgdGhlIGZpcnN0IGNsaXAgYW5kCi0gKiAgICAgICAgICAgICAgdGhlIGltYWdlIG9mIHRoZSBzZWNvbmQgY2xpcC4gSXQgbXVzdCBidWlsZCB0aGUgb3V0cHV0IGltYWdlCi0gKiAgICAgICAgICAgICAgZnJvbSB0aGUgdHdvIGlucHV0IGltYWdlcy4KLSAqICAgICAgICAgICAgICBUaGUgcHJvZ3Jlc3Mgb2YgdGhlIHRyYW5zaXRpb24gaXMgZ2l2ZW4sIG9uIGEgc2NhbGUgZnJvbSAwIHRvIDEwMDAuCi0gKiAgICAgICAgICAgICAgV2hlbiB0aGUgZXh0ZXJuYWwgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbGwgdGhlIGltYWdlIHBsYW5lCi0gKiAgICAgICAgICAgICAgc3RydWN0dXJlcyBhbmQgYnVmZmVycyBhcmUgdmFsaWQgYW5kIG93bmVkIGJ5IHRoZSBWU1MgM0dQUC4KLSAqCi0gKiBAcGFyYW0gICBwRnVuY3Rpb25Db250ZXh0ICAgIChJTikgVGhlIGZ1bmN0aW9uIGNvbnRleHQsIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiBAcGFyYW0gICBwQ2xpcDFJbnB1dFBsYW5lcyAgIChJTikgRmlyc3QgaW5wdXQgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW1hZ2UgcGxhbmVzIChZLCBVIGFuZCBWKQotICogQHBhcmFtICAgcENsaXAySW5wdXRQbGFuZXMgICAoSU4pIFNlY29uZCBpbnB1dCBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwT3V0cHV0UGxhbmVzICAgICAgIChJTi9PVVQpIE91dHB1dCAoZmlsdGVyZWQpIFlVVjQyMCBpbWFnZTogcG9pbnRlciB0byBhbiBhcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aHJlZSB2YWxpZCBpbWFnZSBwbGFuZXMgKFksIFUgYW5kIFYpCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgIChJTikgU2V0IG9mIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2aWRlbyBlZmZlY3QgcHJvZ3Jlc3MuCi0gKiBAcGFyYW0gICB1aUV4dGVybmFsVHJhbnNpdGlvbklkICAgIChJTikgV2hpY2ggdHJhbnNpdGlvbiBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9yIGV4dGVybmFsIHRyYW5zaXRpb25zKQotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00VlNTM0dQUF9lZGl0VmlkZW9UcmFuc2l0aW9uRmN0KQotKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBDbGlwMUlucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwQ2xpcDJJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcE91dHB1dFBsYW5lcywKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUV4dGVybmFsVHJhbnNpdGlvbklkCi0pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGF1ZGlvL3ZpZGVvIGVmZmVjdCBmb3IgdGhlIGVkaXRpb24uCi0gKiBAbm90ZSAgICBFZmZlY3Qgc3RhcnQgdGltZSBpcyByZWxhdGl2ZSB0byBvdXRwdXQgY2xpcC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgIHVpU3RhcnRUaW1lOyAgICAgICAgICAgLyoqPCBJbiBtcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgdWlEdXJhdGlvbjsgICAgICAgICAgICAvKio8IEluIG1zICovCi0gICAgTTRWU1MzR1BQX1ZpZGVvRWZmZWN0VHlwZSAgICBWaWRlb0VmZmVjdFR5cGU7ICAgICAgIC8qKjwgTm9uZSwgRmFkZUluLCBGYWRlT3V0LCBldGMuICovCi0gICAgTTRWU1MzR1BQX2VkaXRWaWRlb0VmZmVjdEZjdCBFeHRWaWRlb0VmZmVjdEZjdDsgICAgIC8qKjwgRXh0ZXJuYWwgZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICpwRXh0VmlkZW9FZmZlY3RGY3RDdHh0Oy8qKjwgQ29udGV4dCBnaXZlbiB0byB0aGUgZXh0ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QgZnVuY3Rpb24gKi8KLSAgICBNNFZTUzNHUFBfQXVkaW9FZmZlY3RUeXBlICAgIEF1ZGlvRWZmZWN0VHlwZTsgICAgICAgLyoqPCBOb25lLCBGYWRlSW4sIEZhZGVPdXQgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLSAgICBNNHhWU1NfRWZmZWN0U2V0dGluZ3MgICAgICAgICB4VlNTOwotI2VuZGlmCi0KLX0gTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXIKLSAqIEBicmllZiAgICBUcmFuc2l0aW9uIGJlaGF2aW9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX1NwZWVkVXAgPSAwLAotICAgIE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyX0xpbmVhciwKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9TcGVlZERvd24sCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU2xvd01pZGRsZSwKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9GYXN0TWlkZGxlCi19IE00VlNTM0dQUF9UcmFuc2l0aW9uQmVoYXZpb3VyOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgdHJhbnNpdGlvbiB0byBiZSBhcHBsaWVkIHdoZW4gYXNzZW1ibGluZyB0d28gY2xpcHMuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBEdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiwgaW4gbWlsbGlzZWNvbmRzIChzZXQgdG8gMCB0byBnZXQgbm8gdHJhbnNpdGlvbikgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICB1aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgIC8qKjwgVHlwZSBvZiB0aGUgdmlkZW8gdHJhbnNpdGlvbiAqLwotICAgIE00VlNTM0dQUF9WaWRlb1RyYW5zaXRpb25UeXBlICAgIFZpZGVvVHJhbnNpdGlvblR5cGU7Ci0KLSAgICAvKio8IEV4dGVybmFsIHRyYW5zaXRpb24gdmlkZW8gZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRWU1MzR1BQX2VkaXRWaWRlb1RyYW5zaXRpb25GY3QgRXh0VmlkZW9UcmFuc2l0aW9uRmN0OwotCi0gICAgLyoqPCBDb250ZXh0IG9mIHRoZSBleHRlcm5hbCB0cmFuc2l0aW9uIHZpZGVvIGVmZmVjdCBmdW5jdGlvbiAqLwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAgICAgKnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0OwotICAgIE00VlNTM0dQUF9BdWRpb1RyYW5zaXRpb25UeXBlICAgIEF1ZGlvVHJhbnNpdGlvblR5cGU7ICAgLyoqPCBUeXBlIG9mIHRoZSBhdWRpbyB0cmFuc2l0aW9uICovCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXIgICAgIFRyYW5zaXRpb25CZWhhdmlvdXI7ICAgIC8qKjxUcmFuc2l0aW9uIGJlaGF2aW91ciovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0gICAgTTR4VlNTX1RyYW5zaXRpb25TZXR0aW5ncyAgICAgICAgeFZTUzsKLSNlbmRpZgotCi19IE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGlucHV0IGNsaXAgZm9yIHRoZSBlZGl0aW9uLgotICogQG5vdGUgICAgSXQgYWxzbyBjb250YWlucyB0aGUgc2V0dGluZ3MgZm9yIHRoZSBjdXQgYW5kIGJlZ2luL2VuZCBlZmZlY3RzIGFwcGxpZWQgdG8gdGhlIGNsaXAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICpwRmlsZTsgICAgICAgICAgICAvKio8IENsaXAgZmlsZSBkZXNjcmlwdG9yICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICBGaWxlVHlwZTsgICAgICAgICAvKio8IC4zZ3AsIC5hbXIsIC5tcDMgICAgICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aFNpemU7ICAgICAgLyoqPCBDbGlwIHBhdGggc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkIGJlY2F1c2Ugb2YgVVRGMTYgY29udmVyc2lvbikqLwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICAgQ2xpcFByb3BlcnRpZXM7ICAgLyoqPCBDbGlwIGFuYWx5c2lzIHByZXZpb3VzbHkgY29tcHV0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIE00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHVpQmVnaW5DdXRUaW1lOyAgIC8qKjwgQmVnaW4gY3V0IHRpbWUsIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlFbmRDdXRUaW1lOyAgICAgLyoqPCBFbmQgY3V0IHRpbWUsIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgYlRyYW5zY29kaW5nUmVxdWlyZWQ7Ci0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VYVEVOREVEX0ZFQVRVUkVTCi0gICAgTTR4VlNTX0NsaXBTZXR0aW5ncyAgICAgICAgICAgICB4VlNTOwotI2VuZGlmCi0KLX0gTTRWU1MzR1BQX0NsaXBTZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGdhdGhlcnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZGVmaW5lIGEgY29tcGxldGUKLSAqICAgICAgICAgIGVkaXRpb24gb3BlcmF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50IG9mIHRoZSBjbGlwIGxpc3QgcENsaXBMaXN0ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgdWlDbGlwTnVtYmVyOwotICAgIC8qKjwgVGhlIHByb3BlcnRpZXMgb2YgdGhpcyBjbGlwIHdpbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgY29tcGF0aWJpbGl0eSBjaGVja2luZyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgIHVpTWFzdGVyQ2xpcDsKLSAgICAvKio8IExpc3Qgb2YgdGhlIGlucHV0IGNsaXBzIHNldHRpbmdzLiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHVpQ2xpcE51bWJlcgotICAgICBjbGlwIHNldHRpbmdzIHBvaW50ZXJzICovCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAgICAgICAgICAgKipwQ2xpcExpc3Q7Ci0gICAgLyoqPCBMaXN0IG9mIHRoZSB0cmFuc2l0aW9uIHNldHRpbmdzLiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHVpQ2xpcE51bWJlci0xCi0gICAgIHRyYW5zaXRpb24gc2V0dGluZ3MgcG9pbnRlcnMgKi8KLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICAgICAqKnBUcmFuc2l0aW9uTGlzdDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgICAgICAgICAqRWZmZWN0czsgICAgICAgICAvKio8IExpc3Qgb2YgZWZmZWN0cyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgIG5iRWZmZWN0czsgICAgIC8qKjwgTnVtYmVyIG9mIGVmZmVjdHMgaW4gdGhlIGFib3ZlIGxpc3QgKi8KLSAgICAvKio8IEZyYW1lIHJhdGUgYXQgd2hpY2ggdGhlIG1vZGlmaWVkIHZpZGVvIHNlY3Rpb25zIHdpbGwgYmUgZW5jb2RlZCAqLwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVyYXRlICAgIHZpZGVvRnJhbWVSYXRlOwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAgICAgICpwT3V0cHV0RmlsZTsgICAgICAvKio8IE91dHB1dCAzR1BQIGNsaXAgZmlsZSBkZXNjcmlwdG9yICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgdWlPdXRwdXRQYXRoU2l6ZTsgICAgLyoqPCBPdXRwdXQgZmlsZSBwYXRoIHNpemUqLwotICAgIC8qKjwgVGVtcG9yYXJ5IGZpbGUgdG8gc3RvcmUgbWV0YWRhdGEgKCJtb292LmJpbiIpICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICAgKnBUZW1wb3JhcnlGaWxlOwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotICAgIE00eFZTU19FZGl0U2V0dGluZ3MgICAgICAgICAgICAgIHhWU1M7Ci0jZW5kaWYKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgUFRWb2xMZXZlbDsKLX0gTTRWU1MzR1BQX0VkaXRTZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwKCkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIGEgY2xpcCBpcyBjb21wYXRpYmxlIHdpdGggVlNTIDNHUFAgZWRpdGluZwotICogQG5vdGUgICAgSXQgYWxzbyBmaWxscyBhIENsaXBBbmFseXNpcyBzdHJ1Y3R1cmUsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNoZWNrIGlmIHR3bwotICogICAgICAgICAgY2xpcHMgYXJlIGNvbXBhdGlibGUKLSAqIEBwYXJhbSAgIHBDbGlwICAgICAgICAgICAgICAgKElOKSBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGlucHV0IDNHUFAvTVAzIGNsaXAgZmlsZS4KLSAqIEBwYXJhbSAgIHBDbGlwUHJvcGVydGllcyAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgQ2xpcFByb3BlcnRpZXMgc3RydWN0dXJlLgotICogQHBhcmFtICAgRmlsZVR5cGUgICAgICAgICAgICAoSU4pIFR5cGUgb2YgdGhlIGlucHV0IGZpbGUgKC4zZ3AsIC5hbXIsIC5tcDMpCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVECi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTgotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfQU1SX0VESVRJTkdfVU5TVVBQT1JURUQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfSDI2M19QUk9GSUxFCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1BST0ZJTEUKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUlZMQwotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwKE00T1NBX1ZvaWQgKnBDbGlwLCBNNFZJREVPRURJVElOR19GaWxlVHlwZSBGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICAqcENsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZVJlYWRQdHJGY3QpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgY2hlY2tpbmcgaWYgdHdvIGNsaXBzIGFyZSBjb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlcgotICogICAgICAgICAgZm9yIFZTUyAzR1BQIGVkaXRpbmcgYXNzZW1ibHkgZmVhdHVyZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcDFQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIGZpcnN0IGNsaXAKLSAqIEBwYXJhbSAgIHBDbGlwMlByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgc2Vjb25kIGNsaXAKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTgotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfUExBVEZPUk0KLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZPUk1BVAotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRlJBTUVfU0laRQotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fVElNRV9TQ0FMRQotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fREFUQV9QQVJUSVRJT05JTkcKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5KE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICAqcENsaXAxUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgICpwQ2xpcDJQcm9wZXJ0aWVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRJbml0KCkKLSAqIEBicmllZiAgICBJbml0aWFsaXplcyB0aGUgVlNTIDNHUFAgZWRpdCBvcGVyYXRpb24gKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIDNHUFAgZWRpdCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0SW5pdCgKLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQqIHBDb250ZXh0LAotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlUHRyRmN0ICk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBBbGxvd3MgZmlsbGluZyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlIHdpdGggZGVmYXVsdCB2YWx1ZXMKLSAqCi0gKiBAbm90ZSAgICBXQVJOSU5HOiBwQ2xpcFNldHRpbmdzLT5wRmlsZSAgICAgIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwRmlsZSAgICAgICAgICAgICAgIChJTikgQ2xpcCBmaWxlIG5hbWUKLSAqIEBwYXJhbSAgIGZpbGVQYXRoU2l6ZSAgICAgICAgKElOKSBTaXplIG9mIHRoZSBjbGlwIHBhdGggKG5lZWRlZCBmb3IgVVRGMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlLCBNNE9TQV9VSW50MzIgZmlsZVBhdGhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBEdXBsaWNhdGVzIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUsIHBlcmZvcm1pbmcgYWxsb2NhdGlvbnMgaWYgcmVxdWlyZWQKLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc0Rlc3QgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzT3JpZyAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgYkNvcHlFZmZlY3RzICAgICAgICAoSU4pIEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGR1cGxpY2F0ZSBlZmZlY3RzIChkZXByZWNhdGVkKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc09yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiQ29weUVmZmVjdHMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEZyZWUgdGhlIHBvaW50ZXJzIGFsbG9jYXRlZCBpbiB0aGUgQ2xpcFNldHRpbmcgc3RydWN0dXJlIChwRmlsZSwgRWZmZWN0cykuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0T3BlbigpCi0gKiBAYnJpZWYgICBTZXQgdGhlIFZTUyAzR1BQIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMsIGFuZCBzZXQgdGhlIHNldHRpbmdzLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgIHBTZXR0aW5ncyAgICAgICAgICAgKElOKSBFZGl0IHNldHRpbmdzCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgVlNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdE9wZW4oTTRWU1MzR1BQX0VkaXRDb250ZXh0IHBDb250ZXh0LCBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdFN0ZXAoKQotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBlZGl0aW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgICAgIChJTikgVlNTIDNHUFAgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIGVkaXRpbmcgb3BlcmF0aW9uCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgICAgIFZTUyAzR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTpFZGl0aW9uIGlzIGRvbmUsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00VlNTM0dQUF9lZGl0Q2xvc2UoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRTdGVwKE00VlNTM0dQUF9FZGl0Q29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2xvc2UoKQotICogQGJyaWVmICAgRmluaXNoIHRoZSBWU1MgM0dQUCBlZGl0IG9wZXJhdGlvbi4KLSAqIEBub3RlICAgIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgVlNTIDNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbG9zZShNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsZWFuVXAoKQotICogQGJyaWVmICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgIEF1ZGlvIE1peGluZyBGZWF0dXJlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKioKLSAqICBQdWJsaWMgdHlwZSBvZiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc2V0dGluZ3Mgb2YgdGhlIGF1ZGlvIG1peGluZyBvcGVyYXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9yaWdpbmFsQ2xpcEZpbGU7ICAgICAgLyoqPCBJbnB1dCAzR1BQIGNsaXAgZmlsZSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWRkZWRBdWRpb1RyYWNrRmlsZTsgICAvKio8IE5ldyBhdWRpbyB0cmFjayAqLwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgICAgICAgICBBZGRlZEF1ZGlvRmlsZVR5cGU7ICAgICAvKio8IEZpbGUgRm9ybWF0IG9mIHRoZSBuZXcgYXVkaW8gZmlsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUFkZEN0czsgICAgICAgICAgICAgICAvKio8IFRpbWUsIGluIG1pbGxpc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgd2hpY2ggdGhlIGFkZGVkIGF1ZGlvIHRyYWNrIGlzIGluc2VydGVkICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQWRkVm9sdW1lOyAgICAgICAgICAgIC8qKjwgVm9sdW1lLCBpbiBwZXJjZW50YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGFkZGVkIGF1ZGlvIHRyYWNrICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQmVnaW5Mb29wOyAgICAgICAgICAgIC8qKjwgRGVzY3JpYmVzIGluIG1pbGxpLXNlY29uZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHRpbWUgb2YgdGhlIGxvb3AgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlFbmRMb29wOyAgICAgICAgICAgICAgLyoqPCBEZXNjcmliZXMgaW4gbWlsbGktc2Vjb25kIHRoZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBvZiB0aGUgbG9vcCAoMCBtZWFucyBubyBsb29wKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVtb3ZlT3JpZ2luYWw7ICAgICAgLyoqPCBJZiB0cnVlLCB0aGUgb3JpZ2luYWwgYXVkaW8gdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dENsaXBGaWxlOyAgICAgIC8qKjwgT3V0cHV0IDNHUFAgY2xpcCBmaWxlICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlOyAgICAgICAvKio8IFRlbXBvcmFyeSBmaWxlIHRvIHN0b3JlIG1ldGFkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibW9vdi5iaW4iKSAqLwotICAgIC8qKjwgVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBvcHRpb25uYWwuIFRoZXkgYXJlIGp1c3QgdXNlZCBpbiBjYXNlIG9mIE1QMyByZXBsYWNlbWVudC4gKi8KLSAgICBNNFZJREVPRURJVElOR19BdWRpb1NhbXBsaW5nRnJlcXVlbmN5ICAgb3V0cHV0QVNGOyAgICAgICAgIC8qKjwgT3V0cHV0IHNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgICAgICBvdXRwdXRBdWRpb0Zvcm1hdDsgLyoqPCBPdXRwdXQgYXVkaW8gY29kZWMoQUFDL0FNUikqLwotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgICAgICAgICAgICAgICBvdXRwdXRBdWRpb0JpdHJhdGU7IC8qKjwgT3V0cHV0IGF1ZGlvIGJpdHJhdGUgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0TkJDaGFubmVsczsgLyoqPCBPdXRwdXQgYXVkaW8gbmIgb2YgY2hhbm5lbHMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYl9EdWNraW5nTmVlZGVlZDsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5EdWNraW5nX3RocmVzaG9sZDsKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkJUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZQVFZvbExldmVsOwotICAgIE00T1NBX0Zsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbkR1Y2tpbmdfbG93Vm9sdW1lOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTG9vcDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlOdW1DaGFubmVsczsKLX0gTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3M7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCogcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyogcFNldHRpbmdzKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIHZhbGlkIGF1ZGlvIG1peGluZyBzZXR0aW5ncwotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCgKLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0KiBwQ29udGV4dCwKLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyogcFNldHRpbmdzLAotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiBwRmlsZVdyaXRlUHRyRmN0ICk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAoKQotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBhdWRpbyBtaXhpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgICAgICAgICAgICAgIChPVVQpIFByb2dyZXNzIHBlcmNlbnRhZ2UgKDAgdG8gMTAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZmluYWxpemF0aW9uIG9wZXJhdGlvbgotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICAgICAgICAgICAgICBWU1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HOiBBdWRpbyBtaXhpbmcgaXMgb3ZlciwgdXNlciBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93IGNhbGwgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKnBQcm9ncmVzcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAoKQotICogQGJyaWVmICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgM0dQUCBhdWRpbyBtaXhpbmcgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBDb250ZXh0KTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgIEV4dHJhY3QgUGljdHVyZSBGZWF0dXJlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKioKLSAqICBQdWJsaWMgdHlwZSBvZiB0aGUgVlNTIGV4dHJhY3QgcGljdHVyZSBjb250ZXh0ICovCi10eXBlZGVmIE00T1NBX1ZvaWQqIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZUNvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlU2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHNldHRpbmdzIG9mIHRoZSBleHRyYWN0IHBpY3R1cmUgYXVkaW8gb3BlcmF0aW9uLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0Q2xpcEZpbGU7ICAvKio8IElucHV0IDNHUFAgY2xpcCBmaWxlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgaUV4dHJhY3Rpb25UaW1lOyAvKio8IGZyYW1lIHRpbWUgKGluIG1zKSB0byBiZSBleHRyYWN0ZWQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0WXV2UGljOyAgIC8qKjwgT3V0cHV0IFlVViBwaWN0dXJlIG5hbWUgKi8KLX0gTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlU2V0dGluZ3M7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUluaXQoKQotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBWU1MgZXh0cmFjdCBwaWN0dXJlIG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBWU1MgZXh0cmFjdCBwaWN0dXJlIGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwU2V0dGluZ3MgICAgICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgZXh0cmFjdCBwaWN0dXJlIHNldHRpbmdzCi0gKiBAcGFyYW0gICAgcFdpZHRoICAgICAgICAgICAgICAgIChPVVQpIHZpZGVvIHN0cmVhbSB3aWR0aAotICogQHBhcmFtICAgIHBIZWlnaHQgICAgICAgICAgICAgICAgKE9VVCkgdmlkZW8gc3RyZWFtIGhlaWdodAotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQMTogICAgVGhlIGlucHV0IGNsaXAgaXMgZW1wdHkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZUluaXQoCi0gICAgICAgIE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZUNvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTZXR0aW5ncyogcFNldHRpbmdzLAotICAgICAgICBNNE9TQV9VSW50MzIgKnBXaWR0aCwKLSAgICAgICAgTTRPU0FfVUludDMyICpwSGVpZ2h0LAotICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ckZjdCApOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVTdGVwKCkKLSAqIEBicmllZiAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgcGljdHVyZSBleHRyYWN0aW9uLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgKElOKSBWU1MgZXh0cmFjdCBwaWN0dXJlIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEBwYXJhbSAgIHBEZWNQbGFuZXMgICAgICAgICAgICAgICAgICAgICAgKE9VVCkgUGxhbmUgaW4gd2ljaCB0aGUgZXh0cmFjdGVkIHBpY3R1cmUgaXMgY29waWVkCi0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgICAgICAgICAgICAgIChPVVQpIFByb2dyZXNzIHBlcmNlbnRhZ2UgKDAgdG8gMTAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBwaWN0dXJlIGV4dHJhY3Rpb24KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICAgICAgVlNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIFZTU19XQVJfRU5EX09GX0VYVFJBQ1RfUElDVFVSRTogUGljdHVyZSBleHRyYWN0aW9uICBpcyBvdmVyLCB1c2VyIHNob3VsZCBub3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRyYWN0UGljdHVyZVN0ZXAoTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwRGVjUGxhbmVzLCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlQ2xlYW5VcCgpCi0gKiBAYnJpZWYgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgVlNTIHBpY3R1cmUgZXh0cmFjdGlvbi4KLSAqIEBub3RlICAgIFRoZSBjb250ZXh0IGlzIG5vIG1vcmUgdmFsaWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgVlNTIGV4dHJhY3QgcGljdHVyZSBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwKE00VlNTM0dQUF9FeHRyYWN0UGljdHVyZUNvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgICAgIENvbW1vbiBmZWF0dXJlcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfR2V0VmVyc2lvbigpCi0gKiBAYnJpZWYgICBHZXQgdGhlIFZTUyB2ZXJzaW9uLgotICogQG5vdGUgICAgQ2FuIGJlIGNhbGxlZCBhbnl0aW1lLiBEbyBub3QgbmVlZCBhbnkgY29udGV4dC4KLSAqIEBwYXJhbSAgIHBWZXJzaW9uSW5mbyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pOwotCi0KLSNpZmRlZiBXSU4zMgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX0dldEVycm9yTWVzc2FnZSgpCi0gKiBAYnJpZWYgICBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gZXJyb3IgY29kZQotICogQG5vdGUgICAgVGhlIGlucHV0IHN0cmluZyBtdXN0IGJlIGFscmVhZHkgYWxsb2NhdGVkIChhbmQgbG9uZyBlbm91Z2ghKQotICogQHBhcmFtICAgZXJyICAgICAgICAgICAgIChJTikgRXJyb3IgY29kZSB0byBnZXQgdGhlIGRlc2NyaXB0aW9uIGZyb20KLSAqIEBwYXJhbSAgIHNNZXNzYWdlICAgICAgICAoSU4vT1VUKSBBbGxvY2F0ZWQgc3RyaW5nIGluIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiB3aWxsIGJlIGNvcGllZAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgIElucHV0IGVycm9yIGlzIGZyb20gdGhlIFZTUzNHUFAgbW9kdWxlCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6SW5wdXQgZXJyb3IgaXMgbm90IGZyb20gdGhlIFZTUzNHUFAgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfR2V0RXJyb3JNZXNzYWdlKE00T1NBX0VSUiBlcnIsIE00T1NBX0NoYXIqIHNNZXNzYWdlKTsKLSNlbmRpZiAvKio8IFdJTjMyICovCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRWU1MzR1BQX0FQSV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfRXJyb3JDb2Rlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YzUwMGRhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0Vycm9yQ29kZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0Vycm9yQ29kZXMuaAotICogQGJyaWVmICAgIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIDNHUFAgZXJyb3IgZGVmaW5pdGlvbnMuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLSNpZm5kZWYgX19NNFZTUzNHUFBfRXJyb3JDb2Rlc19IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfRXJyb3JDb2Rlc19IX18KLQotLyoqCi0gKiAgICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogICAgT1NBTCBjb3JlIElEIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFdhcm5pbmcgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqICAgIEVuZCBvZiBlZGl0aW9uLCB1c2VyIHNob3VsZCBub3cgY2FsbCBNNFZTUzNHUFBfZWRpdENsb3NlKCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTUzNHUFAsIDB4MDAwMSkKLQotLyoqCi0gKiAgICBFbmQgb2YgYXVkaW8gbWl4aW5nLCB1c2VyIHNob3VsZCBub3cgY2FsbCBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTUzNHUFAsIDB4MDAxMCkKLQotLyoqCi0gKiAgICBFbmQgb2YgZXh0cmFjdCBwaWN0dXJlLCB1c2VyIHNob3VsZCBub3cgY2FsbCBNNFZTUzNHUFBfZXh0cmFjdFBpY3R1cmVDbGVhblVwKCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfRVhUUkFDVF9QSUNUVVJFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTUzNHUFAsIDB4MDAyMCkKLS8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00VlNTM0dQUCwgMHgwMDMwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRXJyb3IgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogSW52YWxpZCBmaWxlIHR5cGUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRSAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDEpCi0vKioKLSAqIEludmFsaWQgZWZmZWN0IGtpbmQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDIpCi0vKioKLSAqIEludmFsaWQgZWZmZWN0IHR5cGUgZm9yIHZpZGVvICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRSAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDAzKQotLyoqCi0gKiBJbnZhbGlkIGVmZmVjdCB0eXBlIGZvciBhdWRpbyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEUgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwNCkKLS8qKgotICogSW52YWxpZCB0cmFuc2l0aW9uIHR5cGUgZm9yIHZpZGVvICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19UUkFOU0lUSU9OX1RZUEUgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDA1KQotLyoqCi0gKiBJbnZhbGlkIHRyYW5zaXRpb24gdHlwZSBmb3IgYXVkaW8gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0FVRElPX1RSQU5TSVRJT05fVFlQRSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDYpCi0vKioKLSAqIEludmFsaWQgdmlkZW8gZW5jb2RpbmcgZnJhbWUgcmF0ZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDA3KQotIC8qKgotICogRXh0ZXJuYWwgZWZmZWN0IGZ1bmN0aW9uIGlzIHVzZWQgd2l0aG91dCBiZWluZyBzZXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTCAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMDgpCi0vKioKLSAqIEV4dGVybmFsIHRyYW5zaXRpb24gZnVuY3Rpb24gaXMgdXNlZCB3aXRob3V0IGJlaW5nIHNldCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTCAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAwOSkKLQotLyoqCi0gKiBCZWdpbiBjdXQgdGltZSBpcyBsYXJnZXIgdGhhbiB0aGUgY2xpcCBkdXJhdGlvbiAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTiAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxMCkKLS8qKgotICogQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIG9yIGVxdWFsIHRoYW4gZW5kIGN1dCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9FTkRfQ1VUICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxMSkKLS8qKgotICogVHdvIGNvbnNlY3V0aXZlIHRyYW5zaXRpb25zIGFyZSBvdmVybGFwcGluZyBvbiBvbmUgY2xpcCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX09WRVJMQVBQSU5HX1RSQU5TSVRJT05TICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxMikKLQotLyoqCi0gKiBBbiBpbnB1dCAzR1BQIGZpbGUgaXMgaW52YWxpZC9jb3JydXB0ZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlZBTElEXzNHUFBfRklMRSAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTYpCi0vKioKLSAqIEEgZmlsZSBjb250YWlucyBhbiB1bnN1cHBvcnRlZCB2aWRlbyBmb3JtYXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTcpCi0vKioKLSAqIEEgZmlsZSBjb250YWlucyBhbiB1bnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTgpCi0KLS8qKgotICogQSBmaWxlIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBWU1MgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRCAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMTkpCi0gLyoqCi0gKiAgICBBbiBpbnB1dCBjbGlwIGhhcyBhbiB1bmV4cGVjdGVkbHkgbGFyZ2UgVmlkZW8gQVUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0UgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMUEpCi0vKioKLSAqICAgIEFuIGlucHV0IGNsaXAgaGFzIGFuIHVuZXhwZWN0ZWRseSBsYXJnZSBBdWRpbyBBVSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRSAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAxQikKLS8qKgotICogICAgQW4gaW5wdXQgY2xpcCBoYXMgYSBjb3JydXB0ZWQgQXVkaW8gQU1SIEFVICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMUMpCi0vKioKLSAqIFRoZSB2aWRlbyBlbmNvZGVyIGVuY291bnRlcmVkIGFuIEFjY2VzIFVuaXQgZXJyb3I6IHZlcnkgcHJvYmFibHkgYSBmaWxlIHdyaXRlIGVycm9yICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMUQpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEVycm9ycyByZXR1cm5lZCBieSBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwKCkgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIFVuc3VwcG9ydGVkIHZpZGVvIGZvcm1hdCBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFUIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjApCi0vKioKLSAqIFVuc3VwcG9ydGVkIEgyNjMgcHJvZmlsZSBmb3IgVmlkZW8gRWRpdGluZyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfSDI2M19QUk9GSUxFIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjEpCi0vKioKLSAqIFVuc3VwcG9ydGVkIE1QRUctNCBwcm9maWxlIGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9QUk9GSUxFICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMjIpCi0vKioKLSAqIFVuc3VwcG9ydGVkIE1QRUctNCBSVkxDIHRvb2wgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1JWTEMgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDIzKQotLyoqCi0gKiBVbnN1cHBvcnRlZCBhdWRpbyBmb3JtYXQgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVCBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDI0KQotIC8qKgotICogRmlsZSBjb250YWlucyBubyBzdXBwb3J0ZWQgc3RyZWFtICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDAyNSkKLS8qKgotICogRmlsZSBjb250YWlucyBubyB2aWRlbyBzdHJlYW0gb3IgYW4gdW5zdXBwb3J0ZWQgdmlkZW8gc3RyZWFtICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEUgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwMjYpCi0vKioKLSAqIFVuc3VwcG9ydGVkIHZpZGVvIHByb2ZpbGUgZm9yIFZpZGVvIEVkaXRpbmcgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX1BST0ZJTEUgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAyNykKLQotLyoqCi0gKiBVbnN1cHBvcnRlZCB2aWRlbyBwcm9maWxlIGZvciBWaWRlbyBFZGl0aW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19MRVZFTCBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDI4KQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRXJyb3JzIHJldHVybmVkIGJ5IE00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eSgpICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogQXQgbGVhc3Qgb25lIG9mIHRoZSBjbGlwIGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZCBieSBhbm90aGVyIHZlcnNpb24gb2YgdGhlIFZTUyAzR1BQICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04gICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDMwKQotLyoqCi0gKiBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIHZpZGVvIGZvcm1hdCAoSDI2MyBvciBNUEVHNCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAwMzEpCi0vKioKLSAqICAgIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgZnJhbWUgc2l6ZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GUkFNRV9TSVpFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAzMikKLS8qKgotICogICAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBNUEVHLTQgdGltZSBzY2FsZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19USU1FX1NDQUxFICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAzMykKLS8qKgotICogICAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSB1c2Ugb2YgTVBFRy00IGRhdGEgcGFydGl0aW9uaW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0RBVEFfUEFSVElUSU9OSU5HICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDAzNCkKLS8qKgotICogICAgTVAzIGNsaXBzIGNhbid0IGJlIGFzc2VtYmxlZCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX01QM19BU1NFTUJMWSAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDAzNSkKLS8qKgotICogIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgYXVkaW8gc3RyZWFtIHR5cGUgKGV4OiBBTVIgIT0gQUFDKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TVFJFQU1fVFlQRSAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTUzNHUFAsIDB4MDAzNikKLS8qKgotICogIENsaXBzIGRvbid0IGhhdmUgdGhlIHNhbWUgYXVkaW8gbnVtYmVyIG9mIGNoYW5uZWxzIChleDogc3RlcmVvICE9IG1vbm8pICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX05CX09GX0NIQU5ORUxTICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDM3KQotLyoqCi0gKiAgQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBzYW1wbGluZyBmcmVxdWVuY3kgKGV4OiA0NDEwMEh6ICE9IDE2MDAwSHopICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NBTVBMSU5HX0ZSRVFVRU5DWSAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwMzgpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBBdWRpbyBtaXhpbmcgZXJyb3IgY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIFRoZSBpbnB1dCAzR1BQIGZpbGUgZG9lcyBub3QgY29udGFpbiBhbnkgc3VwcG9ydGVkIGF1ZGlvIG9yIHZpZGVvIHRyYWNrICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDUwKQotLyoqCi0gKiBUaGUgVm9sdW1lIG9mIHRoZSBhZGRlZCBhdWRpbyB0cmFjayAoQWRkVm9sdW1lKSBtdXN0IGJlIHN0cmljdGx5IHN1cGVyaW9yIHRoYW4gemVybyAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTyAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDA1MSkKLS8qKgotICogVGhlIHRpbWUgYXQgd2hpY2ggdGhlIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIChBZGRDdHMpIGNhbid0IGJlIHN1cGVyaW9yIHRoYW4gdGhlCi0gICBpbnB1dCB2aWRlbyB0cmFjayBkdXJhdGlvbiAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTiAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA1MikKLS8qKgotICogVGhlIGF1ZGlvIHRyYWNrIGZpbGUgZm9ybWF0IHNldHRpbmcgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfVU5ERUZJTkVEX0FVRElPX1RSQUNLX0ZJTEVfRk9STUFUICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDUzKQotLyoqCi0gKiBUaGUgYWRkZWQgYXVkaW8gdHJhY2sgc3RyZWFtIGhhcyBhbiB1bnN1cHBvcnRlZCBmb3JtYXQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU0gICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDU0KQotLyoqCi0gKiBUaGUgYXVkaW8gbWl4aW5nIGZlYXR1cmUgZG9lc24ndCBzdXBwb3J0IEVWUkMsIE1QMyBhdWRpbyB0cmFja3MgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BVURJT19NSVhJTkdfVU5TVVBQT1JURUQgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMDU1KQotLyoqCi0gKiBBbiBhZGRlZCBhdWRpbyB0cmFjayBsaW1pdCB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzOiB1aUFkZEN0cyBtdXN0IGJlIDAKLSAgIGFuZCBiUmVtb3ZlT3JpZ2luYWwgbXVzdCBiZSBNNE9TQV9UUlVFICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfRkVBVFVSRV9VTlNVUFBPUlRFRF9XSVRIX0FVRElPX1RSQUNLICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNTYpCi0vKioKLSAqIElucHV0IGF1ZGlvIHRyYWNrIGlzIG5vdCBBTVItTkIgbm9yIEFBQyBzbyBpdCBjYW4ndCBiZSBtaXhlZCB3aXRoIG91dHB1dCAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRCAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDU3KQotLyoqCi0gKiBJbnB1dCBjbGlwIG11c3QgYmUgYSAzZ3BwIGZpbGUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFAsIDB4MDA1OCkKLS8qKgotICogQmVnaW4gbG9vcCB0aW1lIGlzIGhpZ2hlciB0aGFuIGVuZCBsb29wIHRpbWUgb3IgaGlnaGVyIHRoYW4gYWRkZWQgY2xpcCBkdXJhdGlvbiAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX0JFR0lOTE9PUF9ISUdIRVJfRU5ETE9PUCAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDU5KQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBBdWRpbyBtaXhpbmcgYW5kIGV4dHJhY3QgcGljdHVyZSBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBIMjYzIFByb2ZpbGUgMyBsZXZlbCAxMCBpcyBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUCwgMHgwMDYwKQotLyoqCi0gKiBGaWxlIGNvbnRhaW5zIG5vIHZpZGVvIHN0cmVhbSBvciBhbiB1bnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEUgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUixcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQLCAweDAwNjEpCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEludGVybmFsIGVycm9yIGFuZCB3YXJuaW5nIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIEludGVybmFsIHN0YXRlIGVycm9yICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSU5URVJOQUxfU1RBVEUgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMDApCi0vKioKLSAqIEx1bWluYW5jZSBmaWx0ZXIgZWZmZWN0IGVycm9yICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1IgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMDQpCi0vKioKLSAqIFRyYW5zaXRpb24gZmlsdGVyIGVmZmVjdCBlcnJvciAqLwotI2RlZmluZSBNNFZTUzNHUFBfRVJSX1RSQU5TSVRJT05fRklMVEVSX0VSUk9SICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTA2KQotLyoqCi0gKiBUaGUgYXVkaW8gZGVjb2RlciBpbml0aWFsaXphdGlvbiBmYWlsZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVSX0lOSVRfRkFJTEVEICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDExMCkKLS8qKgotICogVGhlIGRlY29kZXIgcHJvZHVjZWQgYW4gdW5hdHRlbmRlZCBhbW91bnQgb2YgUENNICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfQVVESU9fREVDT0RFRF9QQ01fU0laRV9JU1NVRSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRWU1MzR1BQLCAweDAxMTUpCi0vKioKLSAqIE91dHB1dCBmaWxlIG11c3QgYmUgM0dQUCBvciBNUDMgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9PVVRQVVRfRklMRV9UWVBFX0VSUk9SICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTUzNHUFAsIDB4MDExNykKLS8qKgotICogQ2FuIG5vdCBmaW5kIGEgdmFsaWQgdmlkZW8gZnJhbWUgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0VSUl9OT19WQUxJRF9WSURfRlJBTUUgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlNTM0dQUCwgMHgwMTE4KQotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfRXJyb3JDb2Rlc19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FeHRlbmRlZF9BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTY2OGI2Ny4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9FeHRlbmRlZF9BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000VlNTM0dQUF9FWFRFTkRFRF9BUElfSF9fCi0jZGVmaW5lIF9fTTRWU1MzR1BQX0VYVEVOREVEX0FQSV9IX18KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmgKLSAqIEBicmllZiAgICBBUEkgb2YgeFZTUwotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUwotI2Vycm9yICIqKiogdGhlIGZsYWcgTTRWU1NfU1VQUE9SVF9FWFRFTkRFRF9GRUFUVVJFUyBzaG91bGQgYmUgYWN0aXZhdGVkIGluIENvbXBpbGVyU3dpdGNoZXNcCi0gICAgICAgICAgICAgZm9yIFZpZGVvU3R1ZGlvICoqKiIKLSNlbmRpZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfZ2V0VGV4dFJnYkJ1ZmZlckZjdAotICogQGJyaWVmICAgICAgICBFeHRlcm5hbCB0ZXh0IHRvIFJHQiBidWZmZXIgZnVuY3Rpb25zIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlZ3JhdG9yCi0gKiAgICAgICAgICAgICAgICBtdXN0IG1hdGNoIHRoaXMgcHJvdG90eXBlLgotICogQG5vdGUgICAgICAgIFRoZSBmdW5jdGlvbiBpcyBwcm92aWRlZCB3aXRoIHRoZSByZW5kZXJpbmdEYXRhLCB0aGUgdGV4dCBidWZmZXIgYW5kCi0gKiAgICAgICAgICAgICAgICBpdHMgc2l6ZS4gSXQgbXVzdCBidWlsZCB0aGUgb3V0cHV0IFJHQiBpbWFnZSBwbGFuZSBjb250YWluaW5nIHRoZSB0ZXh0LgotICoKLSAqIEBwYXJhbSAgIHBSZW5kZXJpbmdEYXRhICAgIChJTikgVGhlIGRhdGEgZ2l2ZW4gYnkgdGhlIHVzZXIgaW4gTTR4VlNTX0VmZmVjdFNldHRpbmdzCi0gKiBAcGFyYW0gICAgcFRleHRCdWZmZXIgICAgICAgIChJTikgVGV4dCBidWZmZXIgZ2l2ZW4gYnkgdGhlIHVzZXIgaW4gTTR4VlNTX0VmZmVjdFNldHRpbmdzCi0gKiBAcGFyYW0gICAgdGV4dEJ1ZmZlclNpemUgICAgKElOKSBUZXh0IGJ1ZmZlciBzaXplIGdpdmVuIGJ5IHRoZSB1c2VyIGluIE00eFZTU19FZmZlY3RTZXR0aW5ncwotICogQHBhcmFtICAgIHBPdXRwdXRQbGFuZSAgICAoSU4vT1VUKSBPdXRwdXQgUkdCNTY1IGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBNNE9TQV9FUlIgKCpNNHhWU1NfZ2V0VGV4dFJnYkJ1ZmZlckZjdCkKLSgKLSAgICBNNE9TQV9Wb2lkICpwUmVuZGVyaW5nRGF0YSwKLSAgICBNNE9TQV9Wb2lkICpwVGV4dEJ1ZmZlciwKLSAgICBNNE9TQV9VSW50MzIgdGV4dEJ1ZmZlclNpemUsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKipwT3V0cHV0UGxhbmUKLSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19CR01TZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGdhdGhlcnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYWRkIEJhY2tncm91bmQgbXVzaWMgdG8gM2dwIGZpbGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAqcEZpbGU7ICAgICAgICAgLyoqPCBJbnB1dCBmaWxlIHBhdGggKi8KLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgRmlsZVR5cGU7ICAgICAgIC8qKjwgLjNncCwgLmFtciwgLm1wMyAgICAgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlBZGRDdHM7ICAgICAgIC8qKjwgVGltZSwgaW4gbWlsbGlzZWNvbmRzLCBhdCB3aGljaCB0aGUgYWRkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHRyYWNrIGlzIGluc2VydGVkICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpQWRkVm9sdW1lOyAgICAgLyoqPCBWb2x1bWUsIGluIHBlcmNlbnRhZ2UsIG9mIHRoZSBhZGRlZCBhdWRpbyB0cmFjayAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aUJlZ2luTG9vcDsgICAgLyoqPCBEZXNjcmliZXMgaW4gbWlsbGktc2Vjb25kIHRoZSBzdGFydCB0aW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBsb29wICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpRW5kTG9vcDsgICAgICAvKio8IERlc2NyaWJlcyBpbiBtaWxsaS1zZWNvbmQgdGhlIGVuZCB0aW1lIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wICgwIG1lYW5zIG5vIGxvb3ApICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJfRHVja2luZ05lZWRlZWQ7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIEluRHVja2luZ190aHJlc2hvbGQ7ICAvKio8IFRocmVzaG9sZCB2YWx1ZSBhdCB3aGljaCBiYWNrZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpYyBzaGFsbCBkdWNrICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgIGxvd1ZvbHVtZTsgICAgICAgLyoqPCBsb3dlciB0aGUgYmFja2dyb3VuZCB0cmFjayB0byB0aGlzIGZhY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBpbmNyZWFzZSB0aGUgcHJpbWFyeSB0cmFjayB0byBpbnZlcnNlIG9mIHRoaXMgZmFjdG9yICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJMb29wOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aU51bUNoYW5uZWxzOwotfSBNNHhWU1NfQkdNU2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNFZTUzNHUFBfVmlkZW9FZmZlY3RUeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZpZGVvIGVmZmVjdCB0eXBlcyBvZiB0aGUgVlNTM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rUkdCODg4ICAgICAgICAgICA9IDAsICAvKio8IFJHQjg4OCBkYXRhIHR5cGUgKi8KLSAgICBNNFZTUzNHUFBfa1JHQjU2NSAgICAgICAgICAgPSAxICAvKio8IFJHQjU2NSBkYXRhIHR5cGUgKi8KLQotfSBNNFZTUzNHUFBfUkdCVHlwZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNHhWU1NfRWZmZWN0U2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gYXVkaW8vdmlkZW8gZWZmZWN0IGZvciB0aGUgZWRpdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgSW4gcGVyY2VudCBvZiB0aGUgY3V0IGNsaXAgZHVyYXRpb24gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aVN0YXJ0UGVyY2VudDsKLSAgICAvKio8IEluIHBlcmNlbnQgb2YgdGhlICgoY2xpcCBkdXJhdGlvbikgLSAoZWZmZWN0IHN0YXJ0dGltZSkpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlEdXJhdGlvblBlcmNlbnQ7Ci0gICAgLyoqPCBGcmFtaW5nIGZpbGUgcGF0aCAoR0lGL1BORyBmaWxlKSwgdXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSBmcmFtaW5nICovCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgKnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgLyoqPCBGcmFtaW5nIFJHQjU2NSBidWZmZXIsICB1c2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAqcEZyYW1pbmdCdWZmZXI7Ci0gICAgLyoqPFJHQiBCdWZmZXIgdHlwZSx1c2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgKi8KLSAgICBNNFZTUzNHUFBfUkdCVHlwZSAgICAgICAgICByZ2JUeXBlOwotICAgIC8qKjwgVGhlIHRvcC1sZWZ0IFggY29vcmRpbmF0ZSBpbiB0aGUgb3V0cHV0IHBpY3R1cmUgd2hlcmUgdGhlIGFkZGVkIGZyYW1lIHdpbGwgYmUgZGlzcGxheWVkLgotICAgICBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgfHwgVmlkZW9FZmZlY3RUeXBlID09IHRleHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB0b3BsZWZ0X3g7Ci0gICAgLyoqPCBUaGUgdG9wLWxlZnQgWSBjb29yZGluYXRlIGluIHRoZSBvdXRwdXQgcGljdHVyZSB3aGVyZSB0aGUgYWRkZWQgZnJhbWUgd2lsbCBiZSBkaXNwbGF5ZWQuCi0gICAgIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gZnJhbWluZyB8fCBWaWRlb0VmZmVjdFR5cGUgPT0gdGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHRvcGxlZnRfeTsKLSAgICAvKio8IERvZXMgZnJhbWluZyBpbWFnZSBpcyByZXNpemVkIHRvIG91dHB1dCB2aWRlbyBzaXplLgotICAgICBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IGZyYW1pbmcgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICBiUmVzaXplOwotICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIGZyYW1pbmdTY2FsZWRTaXplOwotLyoqPCBTaXplIHRvIHdoaWNoIHRoZSB0aGUgZnJhbWluZyBmaWxlIG5lZWRzIHRvIGJlIHJlc2l6ZWQgKi8KLSAgICAvKio8IFRleHQgYnVmZmVyLiBVc2VkIG9ubHkgaWYgVmlkZW9FZmZlY3RUeXBlID09IHRleHQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwVGV4dEJ1ZmZlcjsKLSAgICAvKio8IFRleHQgYnVmZmVyIHNpemUuIFVzZWQgb25seSBpZiBWaWRlb0VmZmVjdFR5cGUgPT0gdGV4dCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgIHRleHRCdWZmZXJTaXplOwotICAgIC8qKjwgUG9pbnRlciBjb250YWluaW5nIHNwZWNpZmljIGRhdGEgdXNlZCBieSB0aGUgZm9udCBlbmdpbmUgKHNpemUsIGNvbG9yLi4uKSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBSZW5kZXJpbmdEYXRhOwotICAgIC8qKjwgVGV4dCBwbGFuZSB3aWR0aC4gVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSB0ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlUZXh0QnVmZmVyV2lkdGg7Ci0gICAgLyoqPCBUZXh0IHBsYW5lIGhlaWdodC4gVXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSA9PSB0ZXh0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlUZXh0QnVmZmVySGVpZ2h0OwotICAgIC8qKjwgUHJvY2Vzc2luZyByYXRlIG9mIHRoZSBlZmZlY3QgYWRkZWQgd2hlbiB1c2luZyB0aGUgRmlmdGllcyBlZmZlY3QgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICB1aUZpZnRpZXNPdXRGcmFtZVJhdGU7Ci0gICAgLyoqPCBSR0IxNiBpbnB1dCBjb2xvciBvZiB0aGUgZWZmZWN0IGFkZGVkIHdoZW4gdXNpbmcgdGhlIHJnYjE2IGNvbG9yIGVmZmVjdCAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgIHVpUmdiMTZJbnB1dENvbG9yOwotCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgdWlhbHBoYUJsZW5kaW5nU3RhcnQ7ICAgICAgIC8qU3RhcnQgcGVyY2VudGFnZSBvZiBBbHBoYSBibGVuZGluZyovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgdWlhbHBoYUJsZW5kaW5nTWlkZGxlOyAgICAgIC8qTWlkZGxlIHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgIHVpYWxwaGFCbGVuZGluZ0VuZDsgICAgICAgICAvKkVuZCBwZXJjZW50YWdlIG9mIEFscGhhIGJsZW5kaW5nKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lOyAgLypEdXJhdGlvbiwgaW4gcGVyY2VudGFnZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0IGR1cmF0aW9uLCBvZiB0aGUgRmFkZUluIHBoYXNlKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICB1aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZTsgICAvKkR1cmF0aW9uLCBpbiBwZXJjZW50YWdlIG9mIGVmZmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLCBvZiB0aGUgRmFkZU91dCBwaGFzZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHdpZHRoOyAgIC8qd2lkdGggb2YgdGhlIEFSR0I4ODg4IGNsaXAgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIG9ubHkgaWYgdmlkZW8gZWZmZWN0IGlzIGZyYW1taW5nICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIGhlaWdodDsgLypoZWlnaHQgb2YgdGhlIEFSR0I4ODg4IGNsaXAgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIG9ubHkgaWYgdmlkZW8gZWZmZWN0IGlzIGZyYW1taW5nICovCi19IE00eFZTU19FZmZlY3RTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0FscGhhTWFnaWNTZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGFscGhhIG1hZ2ljIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgcEFscGhhRmlsZVBhdGg7ICAgICAgICAvKio8IEFscGhhIGZpbGUgcGF0aCAoSlBHIGZpbGUpICAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50OyAgICAvKio8IEJsZW5kaW5nIFBlcmNlbnRhZ2UgYmV0d2VlbiAwIGFuZCAxMDAgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgIGlzcmV2ZXJzZTsgICAgICAgICAgICAvKio8IGRpcmVjdCBlZmZlY3Qgb3IgcmV2ZXJzZSAqLwotICAgIC8qVG8gc3VwcG9ydCBBUkdCODg4OCA6IGdldCB0aGUgd2lkdGggYW5kIGhlaWdodCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHdpZHRoOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIGhlaWdodDsKLX0gTTR4VlNTX0FscGhhTWFnaWNTZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0RpcmVjdGlvbgotICogQGJyaWVmICAgIERlZmluZXMgZGlyZWN0aW9ucyBmb3IgdGhlIHNsaWRlIHRyYW5zaXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9SaWdodE91dExlZnRJbiwKLSAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0xlZnRPdXRSaWdodEluLAotICAgIE00eFZTU19TbGlkZVRyYW5zaXRpb25fVG9wT3V0Qm90dG9tSW4sCi0gICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9Cb3R0b21PdXRUb3BJbgotfSBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX0RpcmVjdGlvbjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0FscGhhTWFnaWNTZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIHNsaWRlIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTR4VlNTX1NsaWRlVHJhbnNpdGlvbl9EaXJlY3Rpb24gZGlyZWN0aW9uOyAvKiBkaXJlY3Rpb24gb2YgdGhlIHNsaWRlICovCi19IE00eFZTU19TbGlkZVRyYW5zaXRpb25TZXR0aW5nczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICBNNHhWU1NfVHJhbnNpdGlvblNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFkZGl0aW9uYWwgdHJhbnNpdGlvbiBzZXR0aW5ncyBzcGVjaWZpYyB0bwotICogICAgICAgICAgICB4VlNTLCB3aGljaCBhcmUgYXBwZW5kZWQgdG8gdGhlIFZTUzNHUFAgdHJhbnNpdGlvbiBzZXR0aW5ncwotICogICAgICAgICAgICBzdHJ1Y3R1cmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBBbnl0aGluZyB4VlNTLXNwZWNpZmljLCBidXQgY29tbW9uIHRvIGFsbCB0cmFuc2l0aW9ucywgd291bGQgZ28gaGVyZSwKLSAgICBiZWZvcmUgdGhlIHVuaW9uLiAqLwotICAgIHVuaW9uIHsKLSAgICAgICAgLyoqPCBBbHBoYU1hZ2ljIHNldHRpbmdzLCB1c2VkIG9ubHkgaWYgVmlkZW9UcmFuc2l0aW9uVHlwZSA9PQotICAgICAgICAgICAgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0FscGhhTWFnaWMgKi8KLSAgICAgICAgTTR4VlNTX0FscGhhTWFnaWNTZXR0aW5ncyAgICAgICAgKnBBbHBoYU1hZ2ljU2V0dGluZ3M7Ci0gICAgICAgIC8qIG9ubHkgaW4gY2FzZSBvZiBzbGlkZSB0cmFuc2l0aW9uLiAqLwotICAgICAgICBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MgICAgKnBTbGlkZVRyYW5zaXRpb25TZXR0aW5nczsKLSAgICB9IHRyYW5zaXRpb25TcGVjaWZpYzsKLX0gTTR4VlNTX1RyYW5zaXRpb25TZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZwotICogQGJyaWVmICAgIFRoaXMgZW51bSBkZWZpbmVzIGRpZmZlcmVudCBtZWRpYSByZW5kZXJpbmcgdXNpbmcgZXhpZiBvcmllbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rUmVzaXppbmcgPSAwLCAgICAgICAgLypUaGUgcGljdHVyZSBpcyByZXNpemVkLCB0aGUgYXNwZWN0IHJhdGlvIGNhbiBiZSBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIG9yaWdpbmFsIG9uZS4gQWxsIG9mIHRoZSBwaWN0dXJlIGlzIHJlbmRlcmVkKi8KLSAgICBNNHhWU1Nfa0Nyb3BwaW5nLCAgICAgICAgICAgIC8qVGhlIHBpY3R1cmUgaXMgY3JvcHBlZCwgdGhlIGFzcGVjdCByYXRpbyBpcyB0aGUgc2FtZSBhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9yaWdpbmFsIG9uZS4gVGhlIHBpY3R1cmUgaXMgbm90IHJlbmRlcmVkIGVudGlyZWx5Ki8KLSAgICBNNHhWU1Nfa0JsYWNrQm9yZGVycyAgICAgICAgLypCbGFjayBib3JkZXJzIGFyZSByZW5kZXJlZCBpbiBvcmRlciB0byBrZWVwIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNwZWN0IHJhdGlvLiBBbGwgdGhlIHBpY3R1cmUgaXMgcmVuZGVyZWQqLwotCi19IE00eFZTU19NZWRpYVJlbmRlcmluZzsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00eFZTU19DbGlwU2V0dGluZ3MKLSAqIEBicmllZiAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gaW5wdXQgY2xpcCBmb3IgdGhlIGVkaXRpb24uCi0gKiBAbm90ZSAgICBJdCBhbHNvIGNvbnRhaW5zIHRoZSBzZXR0aW5ncyBmb3IgdGhlIGN1dCBhbmQgYmVnaW4vZW5kIGVmZmVjdHMgYXBwbGllZCB0byB0aGUgY2xpcC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdWlCZWdpbkN1dFBlcmNlbnQ7ICAgIC8qKjwgQmVnaW4gY3V0IHRpbWUsIGluIHBlcmNlbnQgb2YgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uIChvbmx5IGZvciAzR1BQIGNsaXAgISkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHVpRW5kQ3V0UGVyY2VudDsgICAgLyoqPCBFbmQgY3V0IHRpbWUsIGluIHBlcmNlbnQgb2YgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uIChvbmx5IGZvciAzR1BQIGNsaXAgISkgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHVpRHVyYXRpb247ICAgICAgICAgICAgLyoqPCBEdXJhdGlvbiBvZiB0aGUgY2xpcCwgaWYgZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAwLCBoYXMgcHJpb3JpdHkgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUVuZEN1dFRpbWUgb3IgdWlFbmRDdXRQZXJjZW50ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFuWm9vbTsgICAgICAgICAgICAvKio8IFJDOiBCb29sZWFuIHVzZWQgdG8ga25vdyBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuIGFuZCB6b29tIG1vZGUgaXMgZW5hYmxlZCAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVhhOyAgICAgICAgICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGE7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWE7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21YYjsgICAgICAgICAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFhiOyAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFliOyAgICAvKio8IFJDICovCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmc7ICAgICAgICAvKio8IEZCIG9ubHkgdXNlZCB3aXRoIEpQRUc6IHRvIGNyb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZSwgb3IgcmVuZGVyIGJsYWNrIGJvcmRlcnMqLwotCi19IE00eFZTU19DbGlwU2V0dGluZ3M7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTR4VlNTX0VkaXRTZXR0aW5ncwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgZ2F0aGVycyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkZWZpbmUgYSBjb21wbGV0ZQotICogICAgICAgICAgZWRpdGlvbiBvcGVyYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgT3V0cHV0IHZpZGVvIHNpemUgKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSAgICAgICAgICAgICBvdXRwdXRWaWRlb1NpemU7Ci0gICAgLyoqPCBPdXRwdXQgdmlkZW8gZm9ybWF0IChNUEVHNCAvIEgyNjMpICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgICAgICAgICAgICAgICAgb3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgLyoqPCBPdXRwdXQgYXVkaW8gZm9ybWF0IChBQUMsIEFNUk5CIC4uLikgKi8KLSAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdCAgICAgICAgICAgICAgICBvdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICAvKio8IE91dHB1dCBhdWRpbyBzYW1wbGluZyBmcmVxICg4MDAwSHosLi4uKSAqLwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgICAgIG91dHB1dEF1ZGlvU2FtcGxGcmVxOwotICAgIC8qKjwgTWF4aW11bSBvdXRwdXQgZmlsZSBzaXplIGluIEJZVEVTIChpZiBzZXQgdG8gMCwgbm8gbGltaXQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlU2l6ZTsKLSAgICAvKio8IElzIG91dHB1dCBhdWRpbyBtdXN0IGJlIE1vbm8gPyBWYWxpZCBvbmx5IGZvciBBQUMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXVkaW9Nb25vOwotICAgIC8qKjwgT3V0cHV0IHZpZGVvIGJpdHJhdGUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICAvKio8IE91dHB1dCBhdWRpbyBiaXRyYXRlKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgLyoqPCBCYWNrZ3JvdW5kIG11c2ljIHRyYWNrIHNldHRpbmdzICovCi0gICAgTTR4VlNTX0JHTVNldHRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgKnBCR010cmFjazsKLSAgICAvKio8IEZ1bmN0aW9uIHBvaW50ZXIgb24gdGV4dCByZW5kZXJpbmcgZW5naW5lLCBpZiBub3QgdXNlZCwgbXVzdCBiZSBzZXQgdG8gTlVMTCAhISAqLwotICAgIE00eFZTU19nZXRUZXh0UmdiQnVmZmVyRmN0ICAgICAgICAgICAgICAgIHBUZXh0UmVuZGVyaW5nRmN0OwotICAgIC8qKiBvdXRwdXQgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwqLwotICAgIE00T1NBX0ludDMyICAgb3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIE00T1NBX0ludDMyICAgb3V0cHV0VmlkZW9MZXZlbDsKLQotfSBNNHhWU1NfRWRpdFNldHRpbmdzOwotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfRVhURU5ERURfQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjY2OWZlYi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0lOVEVSTkFMQ09ORklHX0hfXwotI2RlZmluZSBfX000VlNTM0dQUF9JTlRFUk5BTENPTkZJR19IX18KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaAotICogQGJyaWVmICAgIFRoaXMgZmlsZSBjb250YWlucyBzb21lIG1hZ2ljYWwgYW5kIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFZpZGVvRWRpdGlvbiBjb25maWcgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfTUlOSU1BTF9UUkFOU0lUSU9OX0RVUkFUSU9OICAgICAgICAgICAgMTAwICAgIC8qKjwgMTAwIG1pbGxpc2Vjb25kcyAqLwotI2RlZmluZSBNNFZTUzNHUFBfTkJfQVVfUFJFRkVUQ0ggICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAvKio8IHByZWZlY3QgNCBBVXMgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX05PX1NUU1NfSlVNUF9QT0lOVCAgICAgICAgICAgICAgICAgICAgNDAwMDAgLyoqPCBJZiAzZ3AgZmlsZSBkb2VzIG5vdCBjb250YWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gU1RTUyB0YWJsZSAobm8gcmFwIGZyYW1lcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVtcCBiYWNrd2FyZCA0MCBzIG1heGltdW0gKi8KLQotLyoqKioqKioqKioqKioqKioqLwotLyogV3JpdGVyIGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQgICAgICAgICAgICAgICAgMgotCi0vKio8IE1heCBBVSBzaXplIHdpbGwgYmUgMC44IHRpbWVzIHRoZSBZVVY0OjI6MCBmcmFtZSBzaXplICovCi0jZGVmaW5lIE00VlNTM0dQUF9WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8gICAgICAgICAgICAwLjlGCi0vKio8IE1heCBjaHVuayBzaXplIHdpbGwgYmUgMS4yIHRpbWVzIHRoZSBtYXggQVUgc2l6ZSAqLwotI2RlZmluZSBNNFZTUzNHUFBfVklERU9fQVVfU0laRV9UT19DSFVOQ0tfU0laRV9SQVRJTyAgICAxLjJGCi0KLS8qKiBSRUFEIENBUkVGVUxMWSBJTiBDQVNFIE9GIFJFUE9SVEVEIFJVTk5JTkcgVFJPVUJMRVMKLVRoZSBtYXggQVUgc2l6ZSBpcyB1c2VkIHRvIHByZS1zZXQgbWF4IHNpemUgb2YgQVUgdGhhdCBjYW4gYmUgd3JpdHRlbiBpbiB0aGUgM0dQIHdyaXRlcgotRm9yIGF1ZGlvIHN0YW5kYXJkIHdpdGggdmFyaWFibGUgQVUgc2l6ZSwgdGhlcmUgY291bGQgYmUgc29tZSBlbmNvZGluZyBzZXR0aW5ncyBsZWFkaW5nIHRvIEFVIHNpemUKLWV4Y2VlZGluZyB0aGlzIGxpbWl0LgotRm9yIEFBQyBzdHJlYW1zIGZvciBpbnN0YW5jZSB0aGUgYXZlcmFnZSBBVSBzaXplIGlzIGdpdmVuIGJ5OgotYXYgQVUgc2l6ZSA9IChhdiBiaXRyYXRlICogMTAyNCkvKHNhbXBsaW5nIGZyZXEpCi1JZiBWU1MgcmV0dXJucyB0aGUgbWVzc2FnZToKLT4+IEVSUk9SOiBhdWRpbyBBVSBzaXplIChYWFhYKSB0byBjb3B5IGxhcmdlciB0aGFuIGFsbG9jYXRlZCBvbmUgKFlZWVkpID0+IGFib3J0Ci0+PiBQTEVBU0UgQ09OVEFDVCBTVVBQT1JUIFRPIEVYVEVORCBNQVggQVUgU0laRSBJTiBUSEUgUFJPRFVDVCBMSUJSQVJZCi1FcnJvciBpcyBtb3N0IGxpa2VseSB0byBoYXBwZW4gd2hlbiBtaXhpbmcgd2l0aCBhdWRpbyBmdWxsIHJlcGxhY2VtZW50Ci0gKi8KLS8qKjwgQUFDIG1heCBBVSBzaXplIC0gUkVBRCBFWFBMQU5BVElPTiBBQk9WRSAqLwotI2RlZmluZSBNNFZTUzNHUFBfQVVESU9fTUFYX0FVX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4Ci0vKio8IHNldCB0byB4NCBtYXggQVUgc2l6ZSBwZXIgY2h1bmsgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0FVRElPX01BWF9DSFVOQ0tfU0laRSAgICAgICAgICAgICAgICAgICAgODE5MgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEgyNjMgLyBNUEVHNCBjb25maWcgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSAgICBNNFZTUzNHUFBfRURJVF9IMjYzX01PRFVMT19USU1FICAgICAgICAgICAgMjU1Ci0KLSNpZmRlZiBCSUdfRU5ESUFOCi0vKio8IDB4YjMgMDEgMDAgMDAgTGl0dGxlIGVuZGlhbiAvIGIwMCAwMCAwMCAwMSBiMyBiaWcgZW5kaWFuKi8KLSNkZWZpbmUgICAgTTRWU1MzR1BQX0VESVRfR09WX0hFQURFUiAgICAgICAgICAgIDB4MDAwMDAxYjMKLSNlbHNlCi0vKio8IDB4YjMgMDEgMDAgMDAgTGl0dGxlIGVuZGlhbiAvIGIwMCAwMCAwMCAwMSBiMyBiaWcgZW5kaWFuKi8KLSNkZWZpbmUgICAgTTRWU1MzR1BQX0VESVRfR09WX0hFQURFUiAgICAgICAgICAgIDB4YjMwMTAwMDAKLSNlbmRpZgotCi0vKioqKioqKioqKioqKiovCi0vKiBBTVIgY29uZmlnICovCi0vKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX1dSSVRURU5fQU1SX1RSQUNLX1RJTUVfU0NBTEUgICAgICAgICAgICA4MDAwCi0jZGVmaW5lIE00VlNTM0dQUF9BTVJfREVDT0RFRF9QQ01fU0FNUExFX05VTUJFUiAgICAgICAgICAgIDE2MCAgICAgICAgLyoqPCAyMG1zIGF0IDgwMDBoeiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIweDg9MTYwIHNhbXBsZXMgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX0FNUl9ERUZBVUxUX0JJVFJBVEUgICAgICAgICAgICAgICAgICAgMTIyMDAgICAvKio8IDEyLjIga2JwcyAqLwotCi0vKioqKioqKioqKioqKiovCi0vKiBFVlJDIGNvbmZpZyAqLwotLyoqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9FVlJDX0RFRkFVTFRfQklUUkFURSAgICAgICAgICAgICAgICAgIDkyMDAgICAvKio8IDkuMiBrYnBzICovCi0KLS8qKioqKioqKioqKioqKi8KLS8qIE1QMyBjb25maWcgKi8KLS8qKioqKioqKioqKioqKi8KLQotLyoqIE1hY3JvIHRvIG1ha2UgYSBqdW1wIG9uIHRoZSBNUDMgdHJhY2sgb24gc2V2ZXJhbCBzdGVwcwotICAgIFRvIGF2b2lkIHRvIGJsb2NrIHRoZSBzeXN0ZW0gd2l0aCBhbiBsb25nIE1QMyBqdW1wLCB0aGlzIHByb2Nlc3MKLSAgICBpcyBkaXZpZGVkIG9uIHNldmVyYWwgc3RlcHMuCi0gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX01QM19KVU1QRURfQVVfTlVNQkVSX01BWCAxMDAKLQotLyoqIE1hY3JvIHRvIGRlZmluZSB0aGUgbnVtYmVyIG9mIHJlYWQgQVUgdG8gYW5hbHlzZSB0aGUgYml0cmF0ZQotICAgIFNvIHRoZSBwcm9jZXNzIHdpbGwgcmVhZCB0aGUgZmlyc3QgbiBBVSBvZiB0aGUgTVAzIHN0cmVhbSB0byBnZXQKLSAgICB0aGUgYXZlcmFnZSBiaXRyYXRlLiBuIGlzIGRlZmluZWQgYnkgdGhpcyBkZWZpbmUuCi0gKi8KLSNkZWZpbmUgTTRWU1MzR1BQX01QM19BVV9OVU1CRVJfTUFYIDUwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBkZWZpbmUgQU1SIHNpbGVuY2UgZnJhbWVzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFICAgICAxMwotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OIDE2MAotCi0jaWZkZWYgTTRWU1MzR1BQX1NJTEVOQ0VfRlJBTUVTCi1jb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4W000VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRV0gPQotewotICAgIDB4MDQsIDB4RkYsIDB4MTgsIDB4QzcsIDB4RjAsIDB4MEQsIDB4MDQsIDB4MzMsCi0gICAgMHhGRiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMAotfTsKLSNlbHNlCi1leHRlcm4gY29uc3QgTTRPU0FfVUludDggXAotICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4W000VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRV07Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogZGVmaW5lIEFBQyBzaWxlbmNlIGZyYW1lcyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkUgICAgICA0Ci0KLSNpZmRlZiBNNFZTUzNHUFBfU0lMRU5DRV9GUkFNRVMKLWNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PW000VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkVdID0KLXsKLSAgICAweDAwLCAweEM4LCAweDIwLCAweDA3Ci19OwotI2Vsc2UKLWV4dGVybiBjb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT1tNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFXTsKLSNlbmRpZgotCi0jZGVmaW5lIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRSAgICAgICAgNgotCi0jaWZkZWYgTTRWU1MzR1BQX1NJTEVOQ0VfRlJBTUVTCi1jb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPW000VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRV0gPQotewotICAgIDB4MjEsIDB4MTAsIDB4MDMsIDB4MjAsIDB4NTQsIDB4MUMKLX07Ci0jZWxzZQotZXh0ZXJuIGNvbnN0IE00T1NBX1VJbnQ4IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9bTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFT19TSVpFXTsKLSNlbmRpZgotCi0jZW5kaWYgLyogX19NNFZTUzNHUFBfSU5URVJOQUxDT05GSUdfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmggYi9saWJ2aWRlb2VkaXRvci92c3MvaW5jL000VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlODU1ODgyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgKLSAqIEBicmllZiAgICBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGZ1bmN0aW9uIHByb3RvdHlwZXMgbm90IHZpc2libGUgdG8gdGhlIGV4dGVybmFsIHdvcmxkLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLQotI2lmbmRlZiBfX000VlNTM0dQUF9JTlRFUk5BTEZVTkNUSU9OU19IX18KLSNkZWZpbmUgX19NNFZTUzNHUFBfSU5URVJOQUxGVU5DVElPTlNfSF9fCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0vKioKLSAqICAgIFZTUyBwdWJsaWMgQVBJIGFuZCB0eXBlcyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLQotLyoqCi0gKiAgICBWU1MgcHJpdmF0ZSB0eXBlcyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0KLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIiAvKio8IGZvciBNNF9BY2Nlc3NVbml0IGRlZmluaXRpb24gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBBbGwgZXJyb3JzIGFyZSBmYXRhbCBpbiB0aGUgVlNTICovCi0jZGVmaW5lIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpIGlmKE00Tk9fRVJST1IhPWVycikgcmV0dXJuIGVycjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW8oKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIHZpZGVvIHByb2Nlc3NpbmcKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW8oTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiBhdWRpbyBwcm9jZXNzaW5nIGZvciB0aGUgTVAzIGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRPcGVuQ2xpcCgpCi0gKiBAYnJpZWYgICAgT3BlbiBuZXh0IGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRPcGVuQ2xpcChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqKmhDbGlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBEZXN0cm95IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAbm90ZQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbygpCi0gKiBAYnJpZWYgICAgRG8gd2hhdCB0byBkbyB3aGVuIHRoZSBlbmQgb2YgYSBjbGlwIHZpZGVvIHRyYWNrIGlzIHJlYWNoZWQKLSAqIEBub3RlICAgIElmIHRoZXJlIGlzIGF1ZGlvIG9uIHRoZSBjdXJyZW50IGNsaXAsIHByb2Nlc3MgaXQsIGVsc2Ugc3dpdGNoIHRvIHRoZSBuZXh0IGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbyhNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8oKQotICogQGJyaWVmICAgIERvIHdoYXQgdG8gZG8gd2hlbiB0aGUgZW5kIG9mIGEgY2xpcCBhdWRpbyB0cmFjayBpcyByZWFjaGVkCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8oTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpCi0gKiBAYnJpZWYgICAgQ2hlY2sgaWYgdGhlIGNsaXAgaXMgY29tcGF0aWJsZSB3aXRoIFZTUyBlZGl0aW5nCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwQ2xpcFByb3BlcnRpZXMgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2YWxpZCBDbGlwUHJvcGVydGllcyBzdHJ1Y3R1cmUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZyhNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcENsaXBQcm9wZXJ0aWVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBPcGVuKCkKLSAqIEBicmllZiAgICBPcGVuIGEgY2xpcC4gQ3JlYXRlcyBhIGNsaXAgY29udGV4dC4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBoQ2xpcEN0eHQgICAgICAgICAgICAoT1VUKSBSZXR1cm4gdGhlIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBFZGl0IHNldHRpbmdzIG9mIHRoaXMgY2xpcC4gVGhlIG1vZHVsZSB3aWxsIGtlZXAgYQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIHRvIHRoaXMgcG9pbnRlcgotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICAgYlNraXBBdWRpb1RyYWNrICAgICAgICAoSU4pIElmIHRydWUsIGRvIG5vdCBvcGVuIHRoZSBhdWRpbwotICogQHBhcmFtICAgIGJGYXN0T3Blbk1vZGUgICAgICAgIChJTikgSWYgdHJ1ZSwgdXNlIHRoZSBmYXN0IG1vZGUgb2YgdGhlIDNncHAgcmVhZGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9ubHkgdGhlIGZpcnN0IEFVIGlzIHJlYWQpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcEluaXQgKAotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqKmhDbGlwQ3R4dCwKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlUmVhZFB0ckZjdAotKTsKLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwT3BlbiAoCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncywKLSAgICBNNE9TQV9Cb29sIGJTa2lwQXVkaW9UcmFjaywKLSAgICBNNE9TQV9Cb29sIGJGYXN0T3Blbk1vZGUsCi0gICAgTTRPU0FfQm9vbCBiQXZvaWRPcGVuaW5nVmlkZW9EZWMKLSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjaygpCi0gKiBAYnJpZWYgICAgRGVsZXRlIHRoZSBhdWRpbyB0cmFjay4gQ2xpcCB3aWxsIGJlIGxpa2UgaWYgaXQgaGFkIG5vIGF1ZGlvIHRyYWNrCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBJbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjayhNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3VycmVudFRpbWUoKQotICogQGJyaWVmICAgIEp1bXAgdG8gdGhlIHByZXZpb3VzIFJBUCBhbmQgZGVjb2RlIHVwIHRvIHRoZSBjdXJyZW50IHZpZGVvIHRpbWUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgaUN0cyAgICAgICAgKElOKSBUYXJnZXQgQ1RTCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzKE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0LCBNNE9TQV9JbnQzMiBpQ3RzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKQotICogQGJyaWVmICAgIFJlYWQgb25lIEFVIGZyYW1lIGluIHRoZSBjbGlwCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBJbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoKQotICogQGJyaWVmICAgIERlY29kZSB0aGUgY3VycmVudCBBVURJTyBmcmFtZS4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKQotICogQGJyaWVmICAgIEp1bXAgaW4gdGhlIGF1ZGlvIHRyYWNrIG9mIHRoZSBjbGlwLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwSnVtcEN0cyAgICAgICAgICAgIChJTi9PVVQpIGluOnRhcmdldCBDVFMsIG91dDogcmVhY2hlZCBDVFMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0LCBNNE9TQV9JbnQzMiAqcEp1bXBDdHMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcENsb3NlKCkKLSAqIEBicmllZiAgICBDbG9zZSBhIGNsaXAuIERlc3Ryb3kgdGhlIGNvbnRleHQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBJbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcENsb3NlKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0SnVtcE1QMygpCi0gKiBAYnJpZWYgICAgT25lIHN0ZXAgb2YganVtcGluZyBwcm9jZXNzaW5nIGZvciB0aGUgTVAzIGNsaXAuCi0gKiBAbm90ZSAgICBPbiBvbmUgc3RlcCwgdGhlIGp1bXAgb2Ygc2V2ZXJhbCBBVSBpcyBkb25lCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0SnVtcE1QMyhNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlcigpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgZmlsZSBmb3JtYXQgd3JpdGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgICAgdGhlIHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgcENvbnRleHQscFd0ckdsb2JhbEludGVyZmFjZSBvciBwV3RyRGF0YUludGVyZmFjZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KSwgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJXcml0ZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiBwV3RyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXdHJEYXRhSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJFbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyB2aWRlbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgICB0aGUgZW5jb2RlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfRm9ybWF0IE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIGF1ZGlvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgICB0aGUgZW5jb2RlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgICAgICAgICAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZTogICAgICAgICAgICAgICAgKElOKSBUaGUgbWVkaWEgdHlwZS4KLSAqIEBwYXJhbSAgICBwRW5jR2xvYmFsSW50ZXJmYWNlOiAgICAoT1VUKSB0aGUgZW5jb2RlciBpbnRlcmZhY2UgZnVuY3Rpb25zLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0VuY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclJlYWRlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgcmVhZGVyLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclJlYWRlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX01lZGlhVHlwZSBtZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZHJEYXRhSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICAgcERlY29kZXJJbnRlcmZhY2UgICAgKElOKSBEZWNvZGVyIGludGVyZmFjZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpLCBvciB0aGUgZGVjb2RlciB0eXBlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBSZWdpc3RlciBhdWRpbyBkZWNvZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW50ZXJuYWx5IGJ5IHRoZSBWU1MgdG8gcmVnaXN0ZXIgYXVkaW8gZGVjb2RlcnMsCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgICAgIChJTikgQXVkaW8gZGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICAgcERlY29kZXJJbnRlcmZhY2UgICAgKElOKSBBdWRpbyBkZWNvZGVyIGludGVyZmFjZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwsIG9yIHRoZSBkZWNvZGVyIHR5cGUgaXMgaW52YWxpZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRW5jb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGVuY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycyhNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgcmVhZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGRlY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVycyhNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFdyaXRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFdyaXRlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9FbmNvZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19TdHJlYW1UeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFJlYWRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgcmVhZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFJlYWRlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9EZWNvZGVyKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcihNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9jbGVhckludGVyZmFjZVRhYmxlcygpCi0gKiBAYnJpZWYgICAgQ2xlYXIgZW5jb2RlcnMsIGRlY29kZXJzLCByZWFkZXIgYW5kIHdyaXRlcnMgaW50ZXJmYWNlcyB0YWJsZXMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgVGhlIGNvbnRleHQgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgIE00VlNTM0dQUF9jbGVhckludGVyZmFjZVRhYmxlcyhNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX1N1YnNjcmliZU1lZGlhQW5kQ29kZWMoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIHRoZSByZWFkZXIsIGRlY29kZXJzLCB3cml0ZXJzIGFuZCBlbmNvZGVycwotICogICAgICAgICAgaW4gdGhlIFZTUy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCBpcyBOVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1VJbnQzMiBNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0FNUk5CKCkKLSAqIEBicmllZiAgIFJldHVybiB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIEFNUiBOYXJyb3ctQmFuZCBmcmFtZSBjb250YWluZWQgaW4gdGhlIGdpdmVuIGJ1ZmZlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBBdWRpb0ZyYW1lICAgKElOKSBBTVJOQiBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9BTVJOQihNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQygpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBFVlJDIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogICAgIDAgMSAyIDMKLSAqICAgICstKy0rLSstKwotICogICAgfGZyIHR5cGV8ICAgICAgICAgICAgICBSRkMgMzU1OAotICogICAgKy0rLSstKy0rCi0gKgotICogRnJhbWUgVHlwZTogNCBiaXRzCi0gKiAgICBUaGUgZnJhbWUgdHlwZSBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29kZWMgZGF0YQotICogICAgZnJhbWUgaW4gdGhlIFJUUCBwYWNrZXQuCi0gKgotICogRm9yIEVWUkMgYW5kIFNNViBjb2RlY3MsIHRoZSBmcmFtZSB0eXBlIHZhbHVlcyBhbmQgc2l6ZSBvZiB0aGUKLSAqIGFzc29jaWF0ZWQgY29kZWMgZGF0YSBmcmFtZSBhcmUgZGVzY3JpYmVkIGluIHRoZSB0YWJsZSBiZWxvdzoKLSAqCi0gKiBWYWx1ZSAgIFJhdGUgICAgICBUb3RhbCBjb2RlYyBkYXRhIGZyYW1lIHNpemUgKGluIG9jdGV0cykKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogICAwICAgICBCbGFuayAgICAgIDAgICAgKDAgYml0KQotICogICAxICAgICAxLzggICAgICAgIDIgICAgKDE2IGJpdHMpCi0gKiAgIDIgICAgIDEvNCAgICAgICAgNSAgICAoNDAgYml0czsgbm90IHZhbGlkIGZvciBFVlJDKQotICogICAzICAgICAxLzIgICAgICAgMTAgICAgKDgwIGJpdHMpCi0gKiAgIDQgICAgIDEgICAgICAgICAyMiAgICAoMTcxIGJpdHM7IDUgcGFkZGVkIGF0IGVuZCB3aXRoIHplcm9zKQotICogICA1ICAgICBFcmFzdXJlICAgIDAgICAgKFNIT1VMRCBOT1QgYmUgdHJhbnNtaXR0ZWQgYnkgc2VuZGVyKQotICoKLSAqIEBwYXJhbSAgIHBDcEF1ZGlvRnJhbWUgICAoSU4pIEVWUkMgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQyhNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCkKLSAqIEBicmllZiAgICBHZXQgdmlkZW8gYW5kIGF1ZGlvIHByb3BlcnRpZXMgZnJvbSB0aGUgY2xpcCBzdHJlYW1zCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGZhdGFsIGVycm9ycyBvbmx5IChlcnJvcnMgdGhhdCBzaG91bGQgbm90IGhhcHBlbiBpbiB0aGUKLSAqICAgICAgICAgICAgIGZpbmFsIGludGVncmF0ZWQgcHJvZHVjdCkuCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgIHBDbGlwUHJvcGVydGllcyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZhbGlkIENsaXBQcm9wZXJ0aWVzIHN0cnVjdHVyZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcyhNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcENsaXBQcm9wZXJ0aWVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgUmVzZXQgdGhlIGF1ZGlvIGVuY29kZXIgKENyZWF0ZSBpdCBpZiBuZWVkZWQpCi0gKiBAbm90ZQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAqcENfZXdjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUF1ZGlvQml0cmF0ZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgpCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyBhbmQgcHJlcGFyZSB0aGUgb3V0cHV0IE1QMyBmaWxlCi0gKiBAbm90ZSAgICBDcmVhdGVzIHRoZSB3cml0ZXIsIENyZWF0ZXMgdGhlIG91dHB1dCBmaWxlLCBBZGRzIHRoZSBzdHJlYW1zLCBSZWFkaWVzIHRoZQotICogICAgICAgICAgICB3cml0aW5nIHByb2Nlc3MKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUoTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAqcENfZXdjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDX1NoZWxsQVBJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcE9zYUZpbGVXcml0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwT3V0cHV0RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwT3NhRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG1heE91dHB1dEZpbGVTaXplKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eSgpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgY2hlY2tpbmcgaWYgdHdvIGNsaXBzIGFyZSBjb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlciBmb3IKLSAqICAgICAgICAgICAgIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBmZWF0dXJlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIENvbnRleHQgb2YgdGhlIGF1ZGlvIG1peGVyCi0gKiBAcGFyYW0gICAgcElucHV0Q2xpcFByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgZmlyc3QgY2xpcAotICogQHBhcmFtICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIHNlY29uZCBjbGlwCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTgotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eShNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcElucHV0Q2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEFkZGVkQ2xpcFByb3BlcnRpZXMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKCkKLSAqIEBicmllZiAgICBEZWxldGUgdGhlIGF1ZGlvIHRyYWNrLiBDbGlwIHdpbGwgYmUgbGlrZSBpZiBpdCBoYWQgbm8gYXVkaW8gdHJhY2sKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIEludGVybmFsIGNsaXAgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTdGFydEFVKCkKLSAqIEBicmllZiAgICBTdGFydEFVIHdyaXRlci1saWtlIGludGVyZmFjZSB1c2VkIGZvciB0aGUgVlNTIDNHUFAgb25seQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogKElOKSBJdCBpcyB0aGUgVlNTIDNHUFAgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgIHN0cmVhbUlEOiAoSU4pIElkIG9mIHRoZSBzdHJlYW0gdG8gd2hpY2ggdGhlIEFjY2VzcyBVbml0IGlzIHJlbGF0ZWQuCi0gKiBAcGFyYW0gICAgcEFVOiAgICAgIChJTi9PVVQpIEFjY2VzcyBVbml0IHRvIGJlIHByZXBhcmVkLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgTTRWU1MzR1BQX2ludFN0YXJ0QVUoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwQVUpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFByb2Nlc3NBVSgpCi0gKiBAYnJpZWYgICAgUHJvY2Vzc0FVIHdyaXRlci1saWtlIGludGVyZmFjZSB1c2VkIGZvciB0aGUgVlNTIDNHUFAgb25seQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogKElOKSBJdCBpcyB0aGUgVlNTIDNHUFAgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgIHN0cmVhbUlEOiAoSU4pIElkIG9mIHRoZSBzdHJlYW0gdG8gd2hpY2ggdGhlIEFjY2VzcyBVbml0IGlzIHJlbGF0ZWQuCi0gKiBAcGFyYW0gICAgcEFVOiAgICAgIChJTi9PVVQpIEFjY2VzcyBVbml0IHRvIGJlIHdyaXR0ZW4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgIE00VlNTM0dQUF9pbnRQcm9jZXNzQVUoTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcEFVKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFZQUCgpCi0gKiBAYnJpZWYgICAgV2UgaW1wbGVtZW50IG91ciBvd24gVmlkZW9QcmVQcm9jZXNzaW5nIGZ1bmN0aW9uCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFZQUCBjb250ZXh0LCB3aGljaCBhY3R1YWxseSBpcyB0aGUgVlNTIDNHUFAgY29udGV4dCBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgIHBQbGFuZUluICAgIChJTikKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQgICAgKElOL09VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiAzIHBsYW5lcyB0aGF0IHdpbGwgY29udGFpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50VlBQKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX000VlNTM0dQUF9JTlRFUk5BTEZVTkNUSU9OU19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNzkwMGYwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oCi0gKiBAYnJpZWYgICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBlbnVtIGFuZCB0eXBlcyBub3QgdmlzaWJsZSB0byB0aGUgZXh0ZXJuYWwgd29ybGQuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotCi0jaWZuZGVmIF9fTTRWU1MzR1BQX0lOVEVSTkFMVFlQRVNfSF9fCi0jZGVmaW5lIF9fTTRWU1MzR1BQX0lOVEVSTkFMVFlQRVNfSF9fCi0KLSNkZWZpbmUgTTRWU1NfVkVSU0lPTl9NQUpPUiAgICAgICAgMwotI2RlZmluZSBNNFZTU19WRVJTSU9OX01JTk9SICAgICAgICAyCi0jZGVmaW5lIE00VlNTX1ZFUlNJT05fUkVWSVNJT04gICAgNQotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0vKioKLSAqICAgIFZTUyBwdWJsaWMgQVBJIGFuZCB0eXBlcyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLQotLyoqCi0gKiAgICBJbnRlcm5hbGx5IHVzZWQgbW9kdWxlcyAqLwotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIiAgICAgICAgLyoqPCBSZWFkZXIgY29tbW9uIGludGVyZmFjZSAqLwotI2luY2x1ZGUgIk00V1JJVEVSX2NvbW1vbi5oIiAgICAgICAgLyoqPCBXcml0ZXIgY29tbW9uIGludGVyZmFjZSAqLwotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIgICAgICAgIC8qKjwgRGVjb2RlciBjb21tb24gaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIiAgICAgICAgLyoqPCBFbmNvZGVyIGNvbW1vbiBpbnRlcmZhY2UgKi8KLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIiAgICAgICAgLyoqPCBJbWFnZSBwbGFuZXMgZGVmaW5pdGlvbiAqLwotI2luY2x1ZGUgIk00UkVBREVSXzNncENvbS5oIiAgICAgICAgLyoqPCBSZWFkIDNHUFAgZmlsZSAgICAgKi8KLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIiAgICAgICAgICAgIC8qKjwgRGVjb2RlciBhdWRpbyAgICovCi0jaW5jbHVkZSAiTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgiICAvKio8IEVuY29kZSBhdWRpbyAgICAqLwotCi0KLSNpbmNsdWRlICJTU1JDLmgiICAgICAgICAgICAgICAgICAgICAvKio8IFNTUkMgICAgICAgICAgICAgKi8KLSNpbmNsdWRlICJGcm9tMmlUb01vbm9fMTYuaCIgICAgICAgIC8qKjwgU3RlcmVvIHRvIE1vbm8gICAgICovCi0jaW5jbHVkZSAiTW9ub1RvMklfMTYuaCIgICAgICAgICAgICAvKio8IE1vbm8gdG8gU3RlcmVvICAgICAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgV0lORE9XX1NJWkUgMTAKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U3RhdGUKLSAqIEBicmllZiAgICAgICAgTWFpbiBzdGF0ZSBtYWNoaW5lIG9mIHRoZSBWU1MgM0dQUCBlZGl0IG9wZXJhdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX0NSRUFURUQgICAgPSAwLCAgICAvKio8IE00VlNTM0dQUF9lZGl0SW5pdCBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9WSURFTyAgICAgICAgPSAxLCAgICAvKio8IFByb2Nlc3NpbmcgdmlkZW8gdHJhY2sgKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9BVURJTyAgICAgICAgPSAyLCAgICAvKio8IFByb2Nlc3NpbmcgYXVkaW8gdHJhY2sgKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9NUDMgICAgICAgID0gMywgICAgLyoqPCBQcm9jZXNzaW5nIE1QMyBhdWRpbyB0cmFjayAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX01QM19KVU1QICAgPSA0LCAgICAgICAgLyoqPCBQcm9jZXNzaW5nIGEganVtcCBpbiBhIE1QMyBhdWRpbyB0cmFjayAqLwotICAgIE00VlNTM0dQUF9rRWRpdFN0YXRlX0ZJTklTSEVEICAgID0gNSwgICAgLyoqPCBQcm9jZXNzaW5nIGRvbmUsIFZTUyAzR1BQIGNhbiBiZSBjbG9zZWQgKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9DTE9TRUQgICAgICAgID0gNiAgICAgICAgLyoqPCBPdXRwdXQgZmlsZSBoYXMgYmVlbiBjbG9zZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZTUyAzR1BQIGNhbiBiZSBkZXN0cm95ZWQgKi8KLX0KLU00VlNTM0dQUF9FZGl0U3RhdGU7Ci0KLXR5cGVkZWYgZW51bQotewotICAgIC8qKjwgRG9pbmcgUmVhZC9Xcml0ZSBvcGVyYXRpb24uIFRoaXMgb3BlcmF0aW9uIHdpbGwgaGF2ZSBubyBwcm9jZXNzaW5nCi0gICAgICogb24gaW5wdXQgZnJhbWVzLiBPbmx5IHRpbWUgc3RhbXAgbWFuaXB1bGF0aW9ucyBpbiBvdXRwdXQgZmlsZS4gKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEUgICAgPSAxMCwKLSAgICAvKio8IERlY29kZSBlbmNvZGUgdG8gY3JlYXRlIGFuIEkgZnJhbWUuIFRoaXMgaXMgZG9uZSBmb3IgYSBzaW5nbGUgZnJhbWUKLSAgICAgKiB0byBjcmVhdGUgYSBuZXcgcmVmZXJlbmNlIGZyYW1lLiAqLwotICAgIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUICAgICA9IDExLAotICAgIC8qKjwgRG9pbmcgUmVhZC0+RGVjb2RlLT5GaWx0ZXItPkVuY29kZS0+V3JpdGUgb3BlcmF0aW9uIG9uIHRoZSBpbnB1dCBmaWxlCi0gICAgICogdG8gY3JlYXRlIHRoZSBvdXRwdXQgZmlsZS4gKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREUgPSAxMiwKLSAgICAvKio8IEFwcGxpZWQgd2hlbiBUcmFuc2l0aW9uIGlzIGFjdGl2ZSBhbmQgYmxlbmRpbmcgb2YgdHdvIHZpZGVvcyBpcwotICAgICAqIHJlcXVpcmVkLiAqLwotICAgIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTiAgICA9IDEzLAotICAgIC8qKjwgU3BlY2lhbCBSZWFkL1dyaXRlIG1vZGUgdXNlZCBhZnRlciBCRUdJTl9DVVQgc3RhdGUuIFRoZSBmcmFtZQotICAgICAqIGlzIGFscmVhZHkgY29kZWQgYXMgSSBmcmFtZSBpbiBCRUdJTl9DVVQgc3RhdGU7IHNvIHNraXAgaXQuICovCi0gICAgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQgICAgID0gMTQKLX0KLU00VlNTM0dQUF9FZGl0VmlkZW9TdGF0ZTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9SRUFEX1dSSVRFICAgID0gMjAsICAgIC8qKjwgRG9pbmcgUmVhZC9Xcml0ZSBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vIGRlY29kaW5nL2VuY29kaW5nKSAqLwotICAgIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfREVDT0RFX0VOQ09ERSA9IDIxLCAgICAvKio8IERvaW5nIFJlYWQtRGVjb2RlL0ZpbHRlci8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZS1Xcml0ZSBvcGVyYXRpb24gKi8KLSAgICBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1RSQU5TSVRJT04gICAgPSAyMiAgICAvKio8IFRyYW5zaXRpb247IGJsZW5kaW5nIG9mIHR3byBhdWRpbyAqLwotfQotTTRWU1MzR1BQX0VkaXRBdWRpb1N0YXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwU3RhdHVzCi0gKiBAYnJpZWYgICAgICAgIFN0YXR1cyBvZiB0aGUgY2xpcC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRCAgICAgICAgICAgID0gMCwgICAgLyoqPCBUaGUgY2xpcCBpcyBjdXJyZW50bHkgcmVhZHkgZm9yIHJlYWRpbmcgKi8KLSAgICBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFICAgICAgICA9IDEsICAgIC8qKjwgVGhlIGNsaXAgaXMgY3VycmVudGx5IHJlYWR5IGZvciBkZWNvZGluZyAqLwotICAgIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gICAgPSAyICAgICAgICAvKio8IFRoZSBjbGlwIGlzIGN1cnJlbnRseSBpbiBzcGxpdHRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlVXBUbygpIHByb2Nlc3NpbmcgKi8KLX0KLU00VlNTM0dQUF9DbGlwU3RhdHVzOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ3VycmVudEVmZmVjdAotICogQGJyaWVmICAgICAgICBDdXJyZW50IGVmZmVjdCBhcHBsaWVkIHRvIHRoZSBjbGlwLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00VlNTM0dQUF9rQ2xpcEN1cnJlbnRFZmZlY3RfTk9ORSAgICA9IDAsICAgIC8qKjwgTm9uZSAqLwotICAgIE00VlNTM0dQUF9rQ2xpcEN1cnJlbnRFZmZlY3RfQkVHSU4gICAgPSAxLCAgICAvKio8IEJlZ2luIGVmZmVjdCBjdXJyZW50bHkgYXBwbGllZCAqLwotICAgIE00VlNTM0dQUF9rQ2xpcEN1cnJlbnRFZmZlY3RfRU5EICAgID0gMiAgICAgICAgLyoqPCBFbmQgZWZmZWN0IGN1cnJlbnRseSBhcHBsaWVkICovCi19Ci1NNFZTUzNHUFBfQ2xpcEN1cnJlbnRFZmZlY3Q7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU3RhdGUKLSAqIEBicmllZiAgICAgICAgTWFpbiBzdGF0ZSBtYWNoaW5lIG9mIHRoZSBWU1MgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfVklERU8gPSAwLCAgICAgICAgICAgIC8qKjwgVmlkZW8gaXMgYmVpbmcgcHJvY2Vzc2VkICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX0ZJUlNUX1NFR01FTlQsICAvKio8IEF1ZGlvIGlzIGJlaW5nIHByb2Nlc3NlZCAqLwotICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVCwgLyoqPCBBdWRpbyBpcyBiZWluZyBwcm9jZXNzZWQgKi8KLSAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVCwgIC8qKjwgQXVkaW8gaXMgYmVpbmcgcHJvY2Vzc2VkICovCi0gICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0ZJTklTSEVEICAgICAgICAgICAgICAvKio8IFByb2Nlc3NpbmcgZmluaXNoZWQsIHVzZXIgbXVzdCBub3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCovCi19Ci1NNFZTUzNHUFBfQXVkaW9NaXhpbmdTdGF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNFZTUzNHUFBfRXh0cmFjdFBpY3R1cmVTdGF0ZQotICogQGJyaWVmICAgICAgICBNYWluIHN0YXRlIG1hY2hpbmUgb2YgdGhlIFZTUyBwaWN0dXJlIGV4dHJhY3Rpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRWU1MzR1BQX2tFeHRyYWN0UGljdHVyZVN0YXRlX09QRU5FRCAgID0gMCwgIC8qKjwgVmlkZW8gY2xpcCBpcyBvcGVuZWQgYW5kIHJlYWR5IHRvIGJlIHJlYWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWwgdGhlIFJBUCBiZWZvcmUgdGhlIHBpY3R1cmUgdG8gZXh0cmFjdCAqLwotICAgIE00VlNTM0dQUF9rRXh0cmFjdFBpY3R1cmVTdGF0ZV9QUk9DRVNTICAgID0gMSwgIC8qKjwgVmlkZW8gaXMgZGVjb2RlZCBmcm9tIHRoZSBwcmV2aW91cyBSQVAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHBpY3R1cmUgdG8gZXh0cmFjdCAqLwotICAgIE00VlNTM0dQUF9rRXh0cmFjdFBpY3R1cmVTdGF0ZV9FWFRSQUNURUQ9IDIgICAvKio8IFZpZGVvIEFVIGhhcyBiZWVuICBkZWNvZGVkLCB1c2VyIG11c3Qgbm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgTTRWU1MzR1BQX2V4dHJhY3RQaWN0dXJlQ2xlYW5VcCAqLwotfQotTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlU3RhdGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICAgIENvZGVjcyByZWdpc3RyYXRpb24gc2FtZSBhcyBpbiBWUFMgYW5kIFZFUywgc28gbGVzcyBtYXBwaW5nCi0gKiAgICAgICAgICAgICAgaXMgcmVxdWlyZWQgdG93YXJkIFZTUyBhcGkgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICAgcEdsb2JhbEZjdHM7ICAgIC8qKjwgb3BlbiwgY2xvc2UsIHNldG9wdGlvbixldGMuLi4gZnVuY3Rpb25zICovCi0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgICAgIHBEYXRhRmN0czsgICAgICAgIC8qKjwgZGF0YSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zICovCi19IE00VlNTM0dQUF9Xcml0ZXJJbnRlcmZhY2U7Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCBBQUNfREVDX1NUUkVBTV9QUk9QUwotICogQGJyaWVmIEFBQyBTdHJlYW0gcHJvcGVydGllcwotICogQE5vdGUgYU5vQ2hhbiBhbmQgYVNhbXBGcmVxIGFyZSB1c2VkIGZvciBwYXJzaW5nIGV2ZW4gdGhlIHVzZXIgcGFyYW1ldGVycwotICogICAgICAgIGFyZSBkaWZmZXJlbnQuICBVc2VyIHBhcmFtZXRlcnMgd2lsbCBiZSBpbnB1dCBmb3IgdGhlIG91dHB1dCBiZWhhdmlvdXIKLSAqICAgICAgICBvZiB0aGUgZGVjb2RlciB3aGVyZWFzIGZvciBwYXJzaW5nIGJpdHN0cmVhbSBwcm9wZXJ0aWVzIGFyZSB1c2VkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE00T1NBX0ludDMyIGFBdWRpb09iamVjdFR5cGU7ICAgICAvKio8IEF1ZGlvIG9iamVjdCB0eXBlIG9mIHRoZSBzdHJlYW0gLSBpbiBmYWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0eXBlIGZvdW5kIGluIHRoZSBBY2Nlc3MgVW5pdCBwYXJzZWQgKi8KLSAgTTRPU0FfSW50MzIgYU51bUNoYW47ICAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIGNoYW5uZWxzICg9MShtb25vKSBvciA9MihzdGVyZW8pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBpbmRpY2F0ZWQgYnkgaW5wdXQgYml0c3RyZWFtKi8KLSAgTTRPU0FfSW50MzIgYVNhbXBGcmVxOyAgICAgICAgICAgIC8qKjwgc2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6ICovCi0gIE00T1NBX0ludDMyIGFFeHRlbnNpb25TYW1wRnJlcTsgICAvKio8IGV4dGVuZGVkIHNhbXBsaW5nIGZyZXF1ZW5jeSBpbiBIeiwgPSAwIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGV4dGVuZGVkIGZyZXF1ZW5jeSAqLwotICBNNE9TQV9JbnQzMiBhU0JSUHJlc2VudDsgICAgICAgICAgLyoqPCBwcmVzZW5jZT0xL2Fic2VuY2U9MCBvZiBTQlIgKi8KLSAgTTRPU0FfSW50MzIgYVBTUHJlc2VudDsgICAgICAgICAgIC8qKjwgcHJlc2VuY2U9MS9hYnNlbmNlPTAgb2YgUFMgKi8KLSAgTTRPU0FfSW50MzIgYU1heFBDTVNhbXBsZXNQZXJDaDsgIC8qKjwgbWF4IG51bWJlciBvZiBQQ00gc2FtcGxlcyBwZXIgY2hhbm5lbCAqLwotfSBBQUNfREVDX1NUUkVBTV9QUk9QUzsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgICAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQKLSAqIEBicmllZiAgICAgICAgRmlsZXN5c3RlbSBhbmQgY29kZWMgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIHBvaW50ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qKgotICAgICAgKiBNZWRpYSBhbmQgQ29kZWMgcmVnaXN0cmF0aW9uICovCi0gICAgLyoqPCBUYWJsZSBvZiBNNFZFU19Xcml0ZXJJbnRlcmZhY2Ugc3RydWN0dXJlcyBmb3IgYXZhbGFpYmxlIFdyaXRlcnMgbGlzdCAqLwotICAgIE00VlNTM0dQUF9Xcml0ZXJJbnRlcmZhY2UgICAgV3JpdGVySW50ZXJmYWNlW000V1JJVEVSX2tUeXBlX05CXTsKLSAgICAvKio8IG9wZW4sIGNsb3NlLCBzZXRvcHRpb24sZXRjLi4uIGZ1bmN0aW9ucyBvZiB0aGUgdXNlZCB3cml0ZXIqLwotICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSogICAgcFdyaXRlckdsb2JhbEZjdHM7Ci0gICAgLyoqPCBkYXRhIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgb2YgdGhlIHVzZWQgd3JpdGVyICovCi0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgICAgIHBXcml0ZXJEYXRhRmN0czsKLQotICAgIC8qKjwgVGFibGUgb2YgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSBzdHJ1Y3R1cmVzIGZvciBhdmFsYWlibGUgZW5jb2RlcnMgbGlzdCAqLwotICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqICAgIHBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTTRFTkNPREVSX2tWaWRlb19OQl07Ci0gICAgLyoqPCBGdW5jdGlvbnMgb2YgdGhlIHVzZWQgZW5jb2RlciAqLwotICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzOwotCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW000RU5DT0RFUl9rVmlkZW9fTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBwQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNNEVOQ09ERVJfa1ZpZGVvX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YTsKLQotICAgIC8qKjwgVGFibGUgb2YgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlIHN0cnVjdHVyZXMgZm9yIGF2YWxhaWJsZSBlbmNvZGVycyBsaXN0ICovCi0gICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiAgICBwQXVkaW9FbmNvZGVySW50ZXJmYWNlW000RU5DT0RFUl9rQXVkaW9fTkJdOwotICAgIC8qKjwgVGFibGUgb2YgaW50ZXJuYWwvZXh0ZXJuYWwgZmxhZ3MgZm9yIGF2YWxhaWJsZSBlbmNvZGVycyBsaXN0ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyRmxhZ1tNNEVOQ09ERVJfa0F1ZGlvX05CXTsKLSAgICAvKio8IEZ1bmN0aW9ucyBvZiB0aGUgdXNlZCBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0czsKLQotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICBtX3BSZWFkZXJHbG9iYWxJdFRhYmxlW000UkVBREVSX2tNZWRpYVR5cGVfTkJdOwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICAgICBtX3BSZWFkZXJEYXRhSXRUYWJsZVtNNFJFQURFUl9rTWVkaWFUeXBlX05CXTsKLSAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UqICAgbV9wUmVhZGVyOwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICAgICBtX3BSZWFkZXJEYXRhSXQ7Ci0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgIG1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzOwotCi0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKiAgIG1fcFZpZGVvRGVjb2RlcjsKLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqICAgbV9wVmlkZW9EZWNvZGVySXRUYWJsZVtNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQl07Ci0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgIG1fdWlOYlJlZ2lzdGVyZWRWaWRlb0RlYzsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW000REVDT0RFUl9rVmlkZW9UeXBlX05CXTsKLSNlbmRpZgotCi0gICAgTTRBRF9JbnRlcmZhY2UqICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2RlcjsKLSAgICBNNEFEX0ludGVyZmFjZSogICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVySXRUYWJsZVtNNEFEX2tUeXBlX05CXTsKLSAgICAvKio8IHN0b3JlIGluZGljZXMgb2YgZXh0ZXJuYWwgZGVjb2RlcnMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXJGbGFnVGFibGVbTTRBRF9rVHlwZV9OQl07Ci0KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNNEVOQ09ERVJfa0F1ZGlvX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICBwQ3VycmVudEF1ZGlvRW5jb2RlclVzZXJEYXRhOwotCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbTTRBRF9rVHlwZV9OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YTsKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgIC8qIGJvb2xlYW4gdG8gdGVsbCB3aGV0aGVyIHJlZ2lzdGVyZWQgZXh0ZXJuYWwgT01YIGNvZGVjcyBzaG91bGQgYmUgZnJlZWQgZHVyaW5nIGNsZWFudXAKLSAgICAgb3IgbmV3IGNvZGVjIHJlZ2lzdHJhdGlvbiovCi0gICAgTTRPU0FfQm9vbCAgICBiQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2U7Ci0jZW5kaWYKLQotCi19IE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb25zIHJlbGF0ZWQgdG8gb25lIDNHUFAgY2xpcCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBjb250ZXh0IHJlbGF0ZWQgdG8gb25lIGNsaXAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MqICAgICAgICBwU2V0dGluZ3M7ICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIHRoZSBjbGlwIHNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IHBvc3Nlc3NlZCkgKi8KLQotICAgIE00VlNTM0dQUF9DbGlwU3RhdHVzICAgICAgICBWc3RhdHVzOyAgICAgICAgICAgIC8qKjwgVmlkZW8gc3RhdHVzIG9mIHRoZSBjbGlwIHJlYWRpbmcgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcFN0YXR1cyAgICAgICAgQXN0YXR1czsgICAgICAgICAgICAvKio8IEF1ZGlvIHN0YXR1cyBvZiB0aGUgY2xpcCByZWFkaW5nICovCi0KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaVZvZmZzZXQ7ICAgICAgICAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBPZmZzZXQgYmV0d2VlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAgYW5kIHRoZSBvdXRwdXQgdmlkZW8gc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVnaW4gY3V0IHRha2VuIGludG8gYWNjb3VudCkgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaUFvZmZzZXQ7ICAgICAgICAgICAvKio8IFtUaW1lc2NhbGVdIE9mZnNldCBiZXR3ZWVuIHRoZSBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIG91dHB1dCBhdWRpbyBzdHJlYW0gKGJlZ2luCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXQgdGFrZW4gaW50byBhY2NvdW50KSAqLwotCi0gICAgLyoqCi0gICAgICogM0dQUCByZWFkZXIgU3R1ZmYgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICBwUmVhZGVyQ29udGV4dDsgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIDNHUFAgcmVhZGVyIG1vZHVsZSAqLwotICAgIE00X1ZpZGVvU3RyZWFtSGFuZGxlciogICAgICAgIHBWaWRlb1N0cmVhbTsgICAgICAgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHJlYWQgdmlkZW8gc3RyZWFtICovCi0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiAgICAgICAgcEF1ZGlvU3RyZWFtOyAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgcmVhZCBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICAgICAgIFZpZGVvQVU7ICAgICAgICAgICAgLyoqPCBSZWFkIHZpZGVvIGFjY2VzcyB1bml0ICh3ZSBkbyBub3QgdXNlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gYWxsb2NhdGUgbGF0ZXIsIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vc3Qgb2YgdGhlIHRpbWUgd2Ugd2lsbCBuZWVkIGl0KSAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgICAgICAgQXVkaW9BVTsgICAgICAgICAgICAvKio8IFJlYWQgYXVkaW8gYWNjZXNzIHVuaXQgKHdlIGRvIG5vdCB1c2UgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBhbGxvY2F0ZSBsYXRlciwgYmVjYXVzZSBtb3N0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdGltZSB3ZSB3aWxsIG5lZWQgaXQpICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgYlZpZGVvQXVBdmFpbGFibGU7ICAgIC8qKjwgVGVsbCBpZiBhIHZpZGVvIEFVIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZpb3VzbHkgcmVhZCkgKi8KLSAgICAvKio8IEJvb2xlYW4gb25seSB1c2VkIHRvIGZpeCB0aGUgQlpaIGJ1Zy4uLiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGJGaXJzdEF1V3JpdHRlbjsKLQotICAgIC8qKgotICAgICAqIFZpZGVvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICAgIHBWaURlY0N0eHQ7ICAgICAgICAgICAgLyoqPCBWaWRlbyBkZWNvZGVyIGNvbnRleHQgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgaVZpZGVvRGVjQ3RzOyAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIEZvciB2aWRlbyBkZWNvZGVVcFRvKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdHVhbCByZWFjaGVkIGN0cyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpVmlkZW9SZW5kZXJDdHM7ICAgIC8qKjwgW01pbGxpc2Vjb25kc10gRm9yIHZpZGVvIHJlbmRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY3R1YWwgcmVhY2hlZCBjdHMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBpc1JlbmRlckR1cDsgICAgICAgIC8qKjwgVG8gaGFuZGxlIGR1cGxpY2F0ZSBmcmFtZSByZW5kZXJpbmcgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG9mIGV4dGVybmFsIGRlY29kaW5nICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUqICAgICAgICAgICAgbGFzdERlY29kZWRQbGFuZTsgICAgLyoqPCBMYXN0IGRlY29kZWQgcGxhbmUgKi8KLQotICAgIC8qKgotICAgICAqIE1QRUc0IHRpbWUgaW5mbyBzdHVmZiBhdCBjbGlwIGxldmVsICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICBiTXBlZzRHb3ZTdGF0ZTsgICAgICAgICAgICAvKio8IE5hbWVseSwgdXBkYXRlIG9yIGluaXRpYWxpemF0aW9uICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICB1aU1wZWc0UHJldkdvdlZhbHVlR2V0OyAgICAvKio8IFByZXZpb3VzIEdvdiB2YWx1ZSByZWFkIChpbiBzZWNvbmQpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICB1aU1wZWc0UHJldkdvdlZhbHVlU2V0OyAgICAvKio8IFByZXZpb3VzIEdvdiB2YWx1ZSB3cml0ZSAoaW4gc2Vjb25kKSAqLwotCi0gICAgLyoqCi0gICAgICogVGltZS1saW5lIHN0dWZmICovCi0gICAgIC8qKjwgW01pbGxpc2Vjb25kc10gQ1RTIGF0IHdoaWNoIHRoZSB2aWRlbyBjbGlwIGFjdHVhbGx5IHN0YXJ0cyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpQWN0dWFsVmlkZW9CZWdpbkN1dDsKLSAgICAvKio8IFtNaWxsaXNlY29uZHNdIENUUyBhdCB3aGljaCB0aGUgYXVkaW8gY2xpcCBhY3R1YWxseSBzdGFydHMgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaUFjdHVhbEF1ZGlvQmVnaW5DdXQ7Ci0gICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBUaW1lIGF0IHdoaWNoIHRoZSBjbGlwIG11c3QgZW5kICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgICAgIGlFbmRUaW1lOwotCi0gICAgLyoqCi0gICAgICogQXVkaW8gZGVjb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgcEF1ZGlvRGVjQ3R4dDsgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgQU1SIGRlY29kZXIgKi8KLSAgICBNNEFEX0J1ZmZlciAgICAgICAgICAgICAgICAgQXVkaW9EZWNCdWZmZXJJbjsgICAgLyoqPCBJbnB1dCBzdHJ1Y3R1cmUgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgTTRBRF9CdWZmZXIgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGVjQnVmZmVyT3V0OyAgICAvKio8IEJ1ZmZlciBmb3IgdGhlIGRlY29kZWQgUENNIGRhdGEgKi8KLSAgICBBQUNfREVDX1NUUkVBTV9QUk9QUyAgICAgICAgQWFjUHJvcGVydGllczsgICAgICAvKio8IFN0cnVjdHVyZSBmb3IgbmV3IGFwaSB0byBnZXQgQUFDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzICovCi0KLSAgICAvKioKLSAgICAgKiBBdWRpbyBBVSB0byBGcmFtZSBzcGxpdCBzdHVmZiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgYkF1ZGlvRnJhbWVBdmFpbGFibGU7ICAvKio8IFRydWUgaWYgYW4gYXVkaW8gZnJhbWUgaXMgYXZhaWxhYmxlICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICBwQXVkaW9GcmFtZVB0cjsgICAgICAgIC8qKjwgUG9pbnRlciB0byB0aGUgQXVkaW8gZnJhbWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIHVpQXVkaW9GcmFtZVNpemU7ICAgICAgICAvKio8IFNpemUgb2YgdGhlIGF1ZGlvIGZyYW1lIGF2YWlsYWJsZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgaUF1ZGlvRnJhbWVDdHM7ICAgICAgIC8qKjwgW1RpbWVzY2FsZV0gQ1RTIG9mIHRoZSBhdWRpbyBmcmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlICovCi0KLSAgICAvKioKLSAgICAgKiBTaWxlbmNlIGZyYW1lIHN0dWZmICovCi0gICAgIC8qKjwgU2l6ZSB0byByZXNlcnZlIHRvIHN0b3JlIGEgcGNtIGZ1bGwgb2YgemVyb3MgY29tcGF0aWJsZSB3aXRoIG1hc3RlciBjbGlwIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpU2lsZW5jZVBjbVNpemU7Ci0gICAgLyoqPCBQb2ludGVyIHRvIHNpbGVuY2UgZnJhbWUgZGF0YSBjb21wYXRpYmxlIHdpdGggbWFzdGVyIGNsaXAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9VSW50OCogICAgICAgICAgICAgICAgcFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgLyoqPCBTaXplIG9mIHNpbGVuY2UgZnJhbWUgZGF0YSBjb21wYXRpYmxlIHdpdGggbWFzdGVyIGNsaXAgc3RyZWFtIHR5cGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlTaWxlbmNlRnJhbWVTaXplOwotICAgIC8qKjwgW1RpbWVzY2FsZV0gRHVyYXRpb24gb2Ygc2lsZW5jZSBmcmFtZSBkYXRhIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcCBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBpU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgICAgIHNjYWxlX2F1ZGlvOyAgICAgICAgICAgIC8qKjwgZnJlcXVlbmN5IC8gMTAwMC4wICovCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2VzIG9mIHRoZSB1c2VkIG1vZHVsZXMgKi8KLSAgICAgLyoqPCBGaWxlc3lzdGVtIGFuZCBzaGVsbCByZWFkZXIsIGRlY29kZXIgZnVuY3Rpb25zICovCi0gICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0IFNoZWxsQVBJOwotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICAgICAqcFBsYW5lWXV2OyAgLyogWVVWNDIwIGltYWdlIHBsYW5lLCBjb252ZXJ0ZWQgZnJvbSBBUkdCODg4ICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUqICAgICAgICAgIG1fcFByZVJlc2l6ZUZyYW1lOyAgLyogVGhlIGRlY29kZWQgaW1hZ2UgYmVmb3JlIHJlc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jYXRlZCBvbmx5IGlmIHJlc2l6ZSBuZWVkZWQpKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgKnBQbGFuZVl1dldpdGhFZmZlY3Q7IC8qIFlVVjQyMCBpbWFnZSBwbGFuZSwgd2l0aCBjb2xvciBlZmZlY3QgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYkdldFl1dkRhdGFGcm9tRGVjb2RlcjsgIC8qIEJvb2xlYW4gdXNlZCB0byBnZXQgWVVWIGRhdGEgZnJvbSBkdW1teSB2aWRlbyBkZWNvZGVyIG9ubHkgZm9yIGZpcnN0IHRpbWUgKi8KLX0gTTRWU1MzR1BQX0NsaXBDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIGFub255bW91cyBlbnVtCi0gKiBAYnJpZWYgICAgICAgIGVudW0gdG8ga2VlcCB0cmFjayBvZiB0aGUgZW5jb2RlciBzdGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLWVudW0KLXsKLSAgICBNNFZTUzNHUFBfa05vRW5jb2RlciwKLSAgICBNNFZTUzNHUFBfa0VuY29kZXJDbG9zZWQsCi0gICAgTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZCwKLSAgICBNNFZTUzNHUFBfa0VuY29kZXJSdW5uaW5nCi19OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZTUzNHUFBfQXVkaW9WaWRlb0NvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgYXVkaW8gdmlkZW8gY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgYXVkaW8vdmlkZW8sIGVuY29kaW5nL3dyaXRpbmcgb3BlcmF0aW9ucy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKgotICAgICAqIFRpbWluZyBTdHVmZiAqLwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBEdXJhdGlvbiBvZiB0aGUgb3V0cHV0IGZpbGUsIHVzZWQgZm9yIHByb2dyZXNzIGNvbXB1dGF0aW9uICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgICAgIGRJbnB1dFZpZEN0czsKLSAgICAvKio8IFtNaWxsaXNlY29uZHNdIEN1cnJlbnQgQ1RTIG9mIHRoZSB2aWRlbyBvdXRwdXQgc3RyZWFtICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgICAgIGRPdXRwdXRWaWRDdHM7Ci0vKio8IFtNaWxsaXNlY29uZHNdIEN1cnJlbnQgQ1RTIG9mIHRoZSBhdWRpbyBvdXRwdXQgc3RyZWFtICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgICAgIGRBVG87Ci0gICAgIC8qKjwgW01pbGxpc2Vjb25kc10gRHVyYXRpb24gb2YgdGhlIG91dHB1dCBmaWxlLCB1c2VkIGZvciBwcm9ncmVzcyBjb21wdXRhdGlvbiAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpT3V0cHV0RHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgVmlkZW8gU3RyZWFtIFN0dWZmICovCi0gICAgTTRTWVNfU3RyZWFtVHlwZSAgICAgICAgICAgIFZpZGVvU3RyZWFtVHlwZTsgICAgICAgIC8qKjwgT3V0cHV0IHZpZGVvIGNvZGVjICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIG91dHB1dFZpZGVvUHJvZmlsZTsgIC8qKjwgT3V0cHV0IHZpZGVvIHByb2ZpbGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgb3V0cHV0VmlkZW9MZXZlbDsgICAvKio8IE91dHB1dCB2aWRlbyBsZXZlbCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvQml0cmF0ZTsgICAgIC8qKjwgQXZlcmFnZSB2aWRlbyBiaXRyYXRlIG9mIHRoZSBvdXRwdXQgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkIGZyb20gaW5wdXQgYml0cmF0ZXMsIGR1cmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9ucyBhbmQgY3V0cyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvV2lkdGg7ICAgICAgICAgICAgLyoqPCBPdXRwdXQgaW1hZ2Ugd2lkdGggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlWaWRlb0hlaWdodDsgICAgICAgICAgICAvKio8IE91dHB1dCBpbWFnZSBoZWlnaHQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlWaWRlb1RpbWVTY2FsZTsgICAgICAgIC8qKjwgVGltZSBzY2FsZSB0byB1c2UgZm9yIHRoZSBlbmNvZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHRyYW5zaXRpb24gKGlmIE1QRUctNCkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICBiVmlkZW9EYXRhUGFydGl0aW9uaW5nOyAgICAvKio8IERhdGEgcGFydGl0aW9uaW5nIHRvIHVzZSBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nIG9mIHRoZSB0cmFuc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBNUEVHLTQpICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICAgICAgcFZpZGVvT3V0cHV0RHNpOyAgICAgICAgLyoqPCBEZWNvZGVyIFNwZWNpZmljIEluZm8gb2YgdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHLTQgdHJhY2sgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgdWlWaWRlb091dHB1dERzaVNpemU7ICAgIC8qKjwgU2l6ZSBvZiB0aGUgRGVjb2RlciBTcGVjaWZpYyBJbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG91dHB1dCBNUEVHLTQgdHJhY2sgKi8KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgQXVkaW8gU3RyZWFtIFN0dWZmICovCi0gICAgTTRTWVNfU3RyZWFtVHlwZSAgICAgICAgICAgIEF1ZGlvU3RyZWFtVHlwZTsgICAgICAgIC8qKjwgVHlwZSBvZiB0aGUgb3V0cHV0IGF1ZGlvIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHM7ICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gKDE9bW9ubywgMj1zdGVyZW8pICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpQXVkaW9CaXRyYXRlOyAgICAgICAgIC8qKjwgQXVkaW8gYXZlcmFnZSBiaXRyYXRlIChpbiBicHMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpU2FtcGxpbmdGcmVxdWVuY3k7ICAgIC8qKjwgU2FtcGxpbmcgYXVkaW8gZnJlcXVlbmN5ICg4MDAwIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtciwgMTYwMDAgb3IgbW9yZSBmb3IgYWFjKSAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgICAgICAgIHBBdWRpb091dHB1dERzaTsgICAgICAgIC8qKjwgRGVjb2RlciBTcGVjaWZpYyBJbmZvIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhdWRpbyB0cmFjayAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICB1aUF1ZGlvT3V0cHV0RHNpU2l6ZTsgICAgLyoqPCBTaXplIG9mIHRoZSBEZWNvZGVyIFNwZWNpZmljIEluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgb3V0cHV0IGF1ZGlvIHRyYWNrICovCi0KLSAgICAvKioKLSAgICAgKiBBdWRpbyBFbmNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNDdHh0OyAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX0F1ZGlvRGVjU3BlY2lmaWNJbmZvICBwQXVkaW9FbmNEU0k7ICAgICAgIC8qKjwgRGVjb2RlciBzcGVjaWZpYyBpbmZvIGJ1aWx0IGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9QYXJhbXMgICAgICAgICAgIEF1ZGlvRW5jUGFyYW1zOyAgICAgLyoqPCBDb25maWcgb2YgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLQotICAgIC8qKgotICAgICAqIFNpbGVuY2UgZnJhbWUgc3R1ZmYgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlTaWxlbmNlUGNtU2l6ZTsgICAgICAgLyoqPCBTaXplIHRvIHJlc2VydmUgdG8gc3RvcmUgYSBwY20gZnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHplcm9zIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfVUludDgqICAgICAgICAgICAgICAgIHBTaWxlbmNlRnJhbWVEYXRhOyAgICAgIC8qKjwgUG9pbnRlciB0byBzaWxlbmNlIGZyYW1lIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlIHdpdGggbWFzdGVyIGNsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVNpbGVuY2VGcmFtZVNpemU7ICAgICAvKio8IFNpemUgb2Ygc2lsZW5jZSBmcmFtZSBkYXRhIGNvbXBhdGlibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG1hc3RlciBjbGlwIHN0cmVhbSB0eXBlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIGlTaWxlbmNlRnJhbWVEdXJhdGlvbjsgIC8qKjwgW1RpbWVzY2FsZV0gRHVyYXRpb24gb2Ygc2lsZW5jZSBmcmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGNvbXBhdGlibGUgd2l0aCBtYXN0ZXIgY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gdHlwZSAqLwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgICAgICBzY2FsZV9hdWRpbzsgICAgICAgICAgICAvKio8IGZyZXF1ZW5jeSAvIDEwMDAuMCAqLwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gRW5jb2RlciBzdHVmZiAqLwotICAgIE00RU5DT0RFUl9Db250ZXh0ICAgICAgICAgICAgcEVuY0NvbnRleHQ7ICAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBlbmNvZGVyICovCi0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSAgICAgICAgT3VyV3JpdGVyRGF0YUludGVyZmFjZTsgICAgLyoqPCBPdXIgb3duIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIgaW50ZXJmYWNlLCB0byBnaXZlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbmNvZGVyIHNoZWxsICovCi0gICAgTTRPU0FfTWVtQWRkcjMyICAgICAgICAgICAgICAgIHBEdW1teUF1QnVmZmVyOyAgICAgICAgICAgIC8qKjwgQnVmZmVyIGdpdmVuIHRvIHRoZSBlbmNvZGVyIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IHRvIHdyaXRlIEFVcyB3ZSBkb24ndCB3YW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBvdXRwdXQgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgaU1wZWc0R292T2Zmc2V0OyAgICAgICAgLyoqPCBDbGlwIEdPViBvZmZzZXQgaW4gbXMgYmV0d2VlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBhbmQgc3lzdGVtIHRpbWUgKi8KLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICAgICAgIFZwcEVycm9yOyAgICAgICAgICAgICAgICAvKio8IEVycm9yIGZvciBWUFAgYXJlIG1hc2tlZCBieSBWaWRlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2Rlciwgc28gd2UgbXVzdCByZW1lbWJlciBpdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBlbmNvZGVyU3RhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXIgc3R1ZmYgKi8KLSAgICBNNFdSSVRFUl9Db250ZXh0ICAgICAgICAgICAgcDNncFdyaXRlckNvbnRleHQ7ICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIDNHUFAgd3JpdGVyIG1vZHVsZSAqLwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uICAgICAgICBXcml0ZXJWaWRlb1N0cmVhbTsgICAgICAgIC8qKjwgRGVzY3JpcHRpb24gb2YgdGhlIHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gc3RyZWFtICovCi0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gICAgICAgIFdyaXRlckF1ZGlvU3RyZWFtOyAgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zICAgIFdyaXRlclZpZGVvU3RyZWFtSW5mbzsgICAgLyoqPCBWaWRlbyBwcm9wZXJ0aWVzIG9mIHRoZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zICAgIFdyaXRlckF1ZGlvU3RyZWFtSW5mbzsgICAgLyoqPCBBdWRpbyBwcm9wZXJ0aWVzIG9mIHRoZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgICBXcml0ZXJWaWRlb0FVOyAgICAgICAgICAgIC8qKjwgV3JpdHRlbiB2aWRlbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgICBXcml0ZXJBdWRpb0FVOyAgICAgICAgICAgIC8qKjwgV3JpdHRlbiBhdWRpbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICB1aVZpZGVvTWF4QXVTaXplOyAgICAgICAgLyoqPCBNYXggQVUgc2l6ZSBzZXQgdG8gdGhlIHdyaXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgdmlkZW8gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlBdWRpb01heEF1U2l6ZTsgICAgICAgIC8qKjwgTWF4IEFVIHNpemUgc2V0IHRvIHRoZSB3cml0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGF1ZGlvICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpT3V0cHV0QXZlcmFnZVZpZGVvQml0cmF0ZTsgLyoqPCBBdmVyYWdlIHZpZGVvIGJpdHJhdGUgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBmaWxlLCBjb21wdXRlZCBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGJpdHJhdGVzLCBkdXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zIGFuZCBjdXRzICovCi0KLX0gTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBlZGl0IFZTUyBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBWU1MgZWRpdCBvcGVyYXRpb25zIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiBWU1MgM0dQUCBtYWluIHZhcmlhYmxlcyAqLwotICAgIE00VlNTM0dQUF9FZGl0U3RhdGUgICAgICAgICBTdGF0ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVlNTIGludGVybmFsIHN0YXRlICovCi0gICAgTTRWU1MzR1BQX0VkaXRWaWRlb1N0YXRlICAgIFZzdGF0ZTsKLSAgICBNNFZTUzNHUFBfRWRpdEF1ZGlvU3RhdGUgICAgQXN0YXRlOwotCi0gICAgLyoqCi0gICAgICogVXNlciBTZXR0aW5ncyAoY29waWVkLCB0aHVzIG93bmVkIGJ5IFZTUzNHUFApICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBOdW1iZXI7ICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50IG9mIHRoZSBjbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgcENsaXBMaXN0LiAqLwotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgICAgICAgICAgICpwQ2xpcExpc3Q7ICAgICAgICAgICAgLyoqPCBMaXN0IG9mIHRoZSBpbnB1dCBjbGlwcyBzZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkgb2YgdWlDbGlwTnVtYmVyIGNsaXAgc2V0dGluZ3MgKi8KLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICAgKnBUcmFuc2l0aW9uTGlzdDsgICAgLyoqPCBMaXN0IG9mIHRoZSB0cmFuc2l0aW9uIHNldHRpbmdzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5IG9mIHVpQ2xpcE51bWJlci0xIHRyYW5zaXRpb24gc2V0dGluZ3MgKi8KLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgICAgICAgKnBFZmZlY3RzTGlzdDsgICAgICAgIC8qKjwgTGlzdCBvZiB0aGUgZWZmZWN0cyBzZXR0aW5ncy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheSBvZiBuYkVmZmVjdHMgUkMgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgKnBBY3RpdmVFZmZlY3RzTGlzdDsgICAgLyoqPCBMaXN0IG9mIHRoZSBhY3RpdmUgZWZmZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLiBBcnJheSBvZiBuYkVmZmVjdHMgUkMgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIG5iRWZmZWN0czsgICAgICAgICAgICAvKio8IE51bWJlcnMgb2YgZWZmZWN0cyBSQyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgbmJBY3RpdmVFZmZlY3RzOyAgICAvKio8IE51bWJlcnMgb2YgYWN0aXZlIGVmZmVjdHMgUkMgKi8KLQotICAgIC8qKgotICAgICAqIElucHV0IFN0dWZmICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICB1aUN1cnJlbnRDbGlwOyAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgY3VycmVudCBjbGlwIDEgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0IGNsaXAgbGlzdCAqLwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogICAgICAgICAgICBwQzE7ICAgICAgICAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgY3VycmVudCBjbGlwIDEgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqICAgICAgICAgICAgcEMyOyAgICAgICAgICAgICAgICAvKio8IENvbnRleHQgb2YgdGhlIGN1cnJlbnQgY2xpcCAyICovCi0KLSAgICAvKioKLSAgICAgKiBEZWNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgICAgIGRPdXRwdXRGcmFtZUR1cmF0aW9uOyAgICAvKio8IFtNaWxsaXNlY29uZHNdIGRpcmVjdGx5IHJlbGF0ZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGZyYW1lIHJhdGUgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgIHl1djFbM107ICAgICAgICAgICAgLyoqPCBGaXJzdCB0ZW1wb3JhcnkgWVVWNDIwIGltYWdlIHBsYW5lICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgICAgICB5dXYyWzNdOyAgICAgICAgICAgIC8qKjwgU2Vjb25kIHRlbXBvcmFyeSBZVVY0MjAgaW1hZ2UgcGxhbmUgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgICAgICAgICAgIHl1djNbM107ICAgICAgICAgICAgLyoqPCBUaGlyZCB0ZW1wb3JhcnkgWVVWNDIwIGltYWdlIHBsYW5lIFJDICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgICAgICB5dXY0WzNdOyAgICAgICAgICAgIC8qKjwgRm91cnRoIHRlbXBvcmFyeSBZVVY0MjAgaW1hZ2UgcGxhbmUgUkMgKi8KLQotICAgIC8qKgotICAgICAqIEVmZmVjdCBzdHVmZiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGJDbGlwMUF0QmVnaW5DdXQ7ICAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIFRoZSBjbGlwMSBpcyBhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cyBiZWdpbiBjdXQgKi8KLSAgICBNNE9TQV9JbnQ4ICAgICAgICAgICAgICAgICAgICBpQ2xpcDFBY3RpdmVFZmZlY3Q7ICAgICAgICAvKio8IFRoZSBpbmRleCBvZiB0aGUgYWN0aXZlIGVmZmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBDbGlwMSAoPDAgbWVhbnMgbm9uZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZWQgZm9yIHZpZGVvIGFuZCBhdWRpbyBidXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzaW11bHRhbmVvdXNseSkgKi8KLSAgICBNNE9TQV9JbnQ4ICAgICAgICAgICAgICAgICAgICBpQ2xpcDJBY3RpdmVFZmZlY3Q7ICAgICAgICAvKio8IFRoZSBpbmRleCBvZiB0aGUgYWN0aXZlIGVmZmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBDbGlwMiAoPDAgbWVhbnMgbm9uZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZWQgZm9yIHZpZGVvIGFuZCBhdWRpbyBidXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHNpbXVsdGFuZW91c2x5KSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGJUcmFuc2l0aW9uRWZmZWN0OyAgICAgICAgLyoqPCBUcnVlIGlmIHRoZSB0cmFuc2l0aW9uIGVmZmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGFwcGxpZWQgYXQgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSAqLwotCi0gICAgLyoqCi0gICAgICogRW5jb2RpbmcgYW5kIFdyaXRpbmcgb3BlcmF0aW9ucyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgYlN1cHBvcnRTaWxlbmNlOyAgICAvKio8IEZsYWcgdG8ga25vdyBpZiB0aGUgb3V0cHV0IHN0cmVhbSBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHNpbGVuY2UgKGV2ZW4gaWYgbm90IGVkaXRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSBBQUMrLCBidXQgbm90IEVWUkMpICovCi0gICAgTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAgICBld2M7ICAgICAgICAgICAgICAgIC8qKjwgQXVkaW8gYW5kIHZpZGVvIGVuY29kZS93cml0ZSBzdHVmZiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICBiSXNNTVM7ICAgICAgICAgICAgICAgIC8qKjwgQm9vbGVhbiB1c2VkIHRvIGtub3cgaWYgd2UgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBhIGZpbGUgd2l0aCBhbiBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIGNvbnN0cmFpbnQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHVpTU1TVmlkZW9CaXRyYXRlOyAgICAvKio8IElmIGluIE1NUyBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRlZCB2aWRlbyBiaXRyYXRlICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZXJhdGUgICAgTU1TdmlkZW9GcmFtZXJhdGU7ICAgIC8qKjwgSWYgaW4gTU1TIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGVkIHZpZGVvIGZyYW1lcmF0ZSAqLwotCi0gICAgLyoqCi0gICAgICogRmlsZXN5c3RlbSBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBwT3NhRmlsZVJlYWRQdHI7ICAgICAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgIHBPc2FGaWxlV3JpdFB0cjsgICAgIC8qKjwgT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2VzIG9mIHRoZSB1c2VkIG1vZHVsZXMgKi8KLSAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgICAgICAgICBTaGVsbEFQSTsgICAgICAgICAgIC8qKjwgRmlsZXN5c3RlbSBhbmQgc2hlbGwgcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICBiSXNzZWNvbmRDbGlwOwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAqcEFjdGl2ZUVmZmVjdHNMaXN0MTsgIC8qKjwgTGlzdCBvZiB0aGUgYWN0aXZlIGVmZmVjdHMgc2V0dGluZ3MuIEFycmF5IG9mIG5iRWZmZWN0cyBSQyAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICBuYkFjdGl2ZUVmZmVjdHMxOyAgLyoqPCBOdW1iZXJzIG9mIGFjdGl2ZSBlZmZlY3RzIFJDICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIG1fYkNsaXBFeHRlcm5hbEhhc1N0YXJ0ZWQ7ICAvKio8IEZsYWcgdG8gaW5kaWNhdGUgdGhhdCBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBlZmZlY3QgaXMgYWN0aXZlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgIGlJbk91dFRpbWVPZmZzZXQ7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIGJFbmNvZGVUaWxsRW9GOwotICAgIE00eFZTU19FZGl0U2V0dGluZ3MgICAgICB4VlNTOwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICBtX2Fpcl9jb250ZXh0OwotCi0gICAgTTRPU0FfQm9vbCBiQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0OyAvKio8IE92ZXJsYXkgZmxhZyBmb3IgY2xpcDEgKi8KLSAgICBNNE9TQV9Cb29sIGJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3Q7IC8qKjwgT3ZlcmxheSBmbGFnIGZvciBjbGlwMiwgdXNlZCBpbiB0cmFuc2l0aW9uICovCi19IE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dAotICogQGJyaWVmICAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBhdWRpbyBtaXhpbmcgVlNTIDNHUFAgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgVlNTIDNHUFAgYXVkaW8gbWl4aW5nIG9wZXJhdGlvbnMgdG8gc3RvcmUKLSAqICAgICAgICAgICAgICAgIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiAgICBWU1MgbWFpbiB2YXJpYWJsZXMgKi8KLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTdGF0ZSBTdGF0ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBzdGF0ZSAqLwotCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgY29weSBvZiB0aGUgaW5wdXQgc2V0dGluZ3MgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICBpQWRkQ3RzOyAgICAgICAgICAgICAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBUaW1lLCBpbiBtaWxsaXNlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgd2hpY2ggdGhlIGFkZGVkIGF1ZGlvIHRyYWNrIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGVkICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlCZWdpbkxvb3A7ICAgICAgICAgICAgICAgIC8qKjwgRGVzY3JpYmVzIGluIG1pbGxpLXNlY29uZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCB0aW1lIG9mIHRoZSBsb29wICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlFbmRMb29wOyAgICAgICAgICAgICAgICAvKio8IERlc2NyaWJlcyBpbiBtaWxsaS1zZWNvbmQgdGhlIGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSBvZiB0aGUgbG9vcCAoMCBtZWFucyBubyBsb29wKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgIGJSZW1vdmVPcmlnaW5hbDsgICAgICAgICAgICAvKio8IElmIHRydWUsIHRoZSBvcmlnaW5hbCBhdWRpbyB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgKi8KLQotICAgIC8qKgotICAgICAqIElucHV0IGF1ZGlvL3ZpZGVvIGZpbGUgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICAgICAgICBJbnB1dENsaXBTZXR0aW5nczsgICAgICAgIC8qKjwgU3RydWN0dXJlIGludGVybmFsbHkgdXNlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UgdGhlIGlucHV0IDNHUFAgc2V0dGluZ3MgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqICAgICAgICBwSW5wdXRDbGlwQ3R4dDsgICAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgaW5wdXQgM0dQUCBjbGlwICovCi0KLSAgICAvKioKLSAgICAgKiBBZGRlZCBhdWRpbyBmaWxlIHN0dWZmICovCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAgICAgICAgQWRkZWRDbGlwU2V0dGluZ3M7ICAgICAgICAvKio8IFN0cnVjdHVyZSBpbnRlcm5hbGx5IHVzZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlIHRoZSBhZGRlZCBzZXR0aW5ncyAqLwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogICAgICAgIHBBZGRlZENsaXBDdHh0OyAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBhZGRlZCAzR1BQIGNsaXAgKi8KLQotICAgIC8qKgotICAgICAqIEF1ZGlvIHN0dWZmICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgIGZPcmlnRmFjdG9yOyAgICAgICAgICAgIC8qKjwgRmFjdG9yIHRvIGFwcGx5IHRvIHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHRyYWNrIGZvciB0aGUgbWl4aW5nICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgICAgIGZBZGRlZEZhY3RvcjsgICAgICAgICAgICAvKio8IEZhY3RvciB0byBhcHBseSB0byB0aGUgYWRkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdHJhY2sgZm9yIHRoZSBtaXhpbmcgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYlN1cHBvcnRTaWxlbmNlOyAgICAgICAgLyoqPCBGbGFnIHRvIGtub3cgaWYgdGhlIG91dHB1dCBzdHJlYW0gY2FuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCBzaWxlbmNlIChldmVuIGlmIG5vdCBlZGl0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUgQUFDKywgYnV0IG5vdCBFVlJDKSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiSGFzQXVkaW87ICAgICAgICAgICAgICAvKio8IEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGRlbGV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdHJhY2sgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYkF1ZGlvTWl4aW5nSXNOZWVkZWQ7ICAvKio8IEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGRvIG1peGluZyAqLwotCi0gICAgLyoqCi0gICAgICogRW5jb2RpbmcgYW5kIFdyaXRpbmcgb3BlcmF0aW9ucyAqLwotICAgIE00VlNTM0dQUF9FbmNvZGVXcml0ZUNvbnRleHQgICAgZXdjOyAgICAgICAgICAgICAgICAvKio8IEF1ZGlvIGFuZCB2aWRlbyBlbmNvZGUvd3JpdGUgc3R1ZmYgKi8KLQotICAgIC8qKgotICAgICAqIEZpbGVzeXN0ZW0gZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgcE9zYUZpbGVSZWFkUHRyOyAgICAgLyoqPCBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcHJvdmlkZWQgYnkgdXNlciAqLwotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgICBwT3NhRmlsZVdyaXRQdHI7ICAgICAvKio8IE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2VzIG9mIHRoZSB1c2VkIG1vZHVsZXMgKi8KLSAgICBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgU2hlbGxBUEk7ICAgICAgICAgICAgICAgLyoqPCBGaWxlc3lzdGVtIGFuZCBzaGVsbCByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgZnVuY3Rpb25zICovCi0KLSAgICAvKioKLSAgICAgKiBTYW1wbGUgUmF0ZSBDb252ZXJ0b3IgKFNTUkMpIHN0dWZmIChuZWVkZWQgaW4gY2FzZSBvZiBtaXhpbmcgd2l0aCAhPSBBU0YvbmIgb2YgY2hhbm5lbHMpICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJfU1NSQ25lZWRlZDsgICAgICAgIC8qKjwgSWYgdHJ1ZSwgU1NSQyBpcyBuZWVkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghPSBBU0Ygb3IgbmIgb2YgY2hhbm5lbHMpICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgIENoYW5uZWxDb252ZXJzaW9uOyAgICAvKio8IDE9Q29udmVyc2lvbiBmcm9tIE1vbm8gdG8gU3RlcmVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMj1TdGVyZW8gdG8gTW9ubywgMD1ubyBjb252ZXJzaW9uICovCi0gICAgU1NSQ19JbnN0YW5jZV90ICAgICAgICAgICAgIFNzcmNJbnN0YW5jZTsgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgU3NyYyAqLwotICAgIFNTUkNfU2NyYXRjaF90KiAgICAgICAgICAgICBTc3JjU2NyYXRjaDsgICAgICAgIC8qKjwgV29ya2luZyBtZW1vcnkgb2YgdGhlIFNzcmMgKi8KLSAgICBzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgaVNzcmNOYlNhbXBsSW47ICAgIC8qKjwgTnVtYmVyIG9mIHNhbXBsZSB0aGUgU3NyYyBuZWVkcyBhcyBpbnB1dCAqLwotICAgIHNob3J0ICAgICAgICAgICAgICAgICAgICAgICBpU3NyY05iU2FtcGxPdXQ7ICAgIC8qKjwgTnVtYmVyIG9mIHNhbXBsZSB0aGUgU3NyYyBvdXRwdXRzICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICAgIHBTc3JjQnVmZmVySW47ICAgICAgICAvKio8IElucHV0IG9mIHRoZSBTU1JDICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICAgIHBTc3JjQnVmZmVyT3V0OyAgICAgICAgLyoqPCBPdXRwdXQgb2YgdGhlIFNTUkMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFBvc0luU3NyY0J1ZmZlckluOyAgICAvKio8IFBvc2l0aW9uIGludG8gdGhlIFNTUkMgaW4gYnVmZmVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICAgIHBQb3NJblNzcmNCdWZmZXJPdXQ7LyoqPCBQb3NpdGlvbiBpbnRvIHRoZSBTU1JDIG91dCBidWZmZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFRlbXBCdWZmZXI7ICAgICAgICAvKio8IFRlbXBvcmFyeSBidWZmZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgICAgcFBvc0luVGVtcEJ1ZmZlcjsgICAgLyoqPCBQb3NpdGlvbiBpbiB0ZW1wb3JhcnkgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1pbmltdW1CdWZmZXJJbjsgICAgLyoqPCBNaW5pbXVtIGFtb3VudCBvZiBkZWNvZGVkIGRhdGEgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBieSBTU1JDIGFuZCBjaGFubmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydG9yICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIGJfRHVja2luZ05lZWRlZWQ7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgICAgIEluRHVja2luZ190aHJlc2hvbGQ7ICAvKio8IFRocmVzaG9sZCB2YWx1ZSBhdCB3aGljaCBiYWNrZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljIHNoYWxsIGR1Y2sgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgSW5EdWNraW5nX2xvd1ZvbHVtZTsgIC8qKjwgbG93ZXIgdGhlIGJhY2tncm91bmQgdHJhY2sgdG8gdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvciBhbmQgaW5jcmVhc2UgdGhlIHByaW1hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjayB0byBpbnZlcnNlIG9mIHRoaXMgZmFjdG9yICovCi0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgIGxvd1ZvbHVtZTsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgYXVkaW9Wb2x1bWVBcnJheVtXSU5ET1dfU0laRV07IC8vIHN0b3JlIHBlYWsgYXVkaW8gdm9sLiBsZXZlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGR1cmF0aW9uIGZvciBXSU5ET1dfU0laRQotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICBhdWRWb2xBcnJJbmRleDsKLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgZHVja2luZ0ZhY3RvciA7ICAgICAvKio8IG11bHRpcGx5IGJ5IHRoaXMgZmFjdG9yIHRvIGJyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFERSBJTi9GQURFIE9VVCBlZmZlY3QgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgZkJUVm9sTGV2ZWw7Ci0gICAgTTRPU0FfRmxvYXQgICAgICAgICAgICAgICAgIGZQVFZvbExldmVsOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiRG9EdWNraW5nOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICBiTG9vcDsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYk5vTG9vcGluZzsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgICBwTFZBdWRpb1Jlc2FtcGxlcjsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgYmp1bXBmbGFnOwotCi19IE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFeHRyYWN0UGljdHVyZUNvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZXh0cmFjdCBwaWN0dXJlIFZTUyBjb250ZXh0IChwcml2YXRlKQotICogQG5vdGUgICAgICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIGFsbCBWU1MgcGljdHVyZSBleHRyYWN0aW9ucyB0byBzdG9yZSB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqCi0gICAgICogICAgVlNTIG1haW4gdmFyaWFibGVzICovCi0gICAgTTRWU1MzR1BQX0V4dHJhY3RQaWN0dXJlU3RhdGUgU3RhdGU7ICAgICAgICAgICAgICAgIC8qKjwgVlNTIGV4dHJhY3QgcGljdHVyZWludGVybmFsIHN0YXRlICovCi0KLSAgICAvKioKLSAgICAgKiBJbnB1dCBmaWxlcyAqLwotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgICAgICAgIENsaXBTZXR0aW5nczsgICAgICAgICAgICAvKio8IFN0cnVjdHVyZSBpbnRlcm5hbGx5IHVzZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UgdGhlIGlucHV0IDNGUFAgc2V0dGluZ3MgKi8KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqICAgICAgICBwSW5wdXRDbGlwQ3R4dDsgICAgICAgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgaW5wdXQgM0dQUCBjbGlwICovCi0KLSAgICAvKioKLSAgICAgKiBTZXR0aW5ncyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgICAgICBpRXh0cmFjdEN0czsgICAgICAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIEN0cyBvZiB0aGUgQVUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBleHRyYWN0ZWQgKi8KLQotICAgIC8qKgotICAgICAqIFZpZGVvIHN0dWZmICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgICAgICBkZWNQbGFuZXNbM107ICAgICAgICAgICAgLyoqPCBEZWNvZGVkIFlVVjQyMCBwaWN0dXJlIHBsYW5lICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIHVpVmlkZW9XaWR0aDsgICAgICAgICAgICAvKio8IERlY29kZWQgaW1hZ2Ugd2lkdGggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgdWlWaWRlb0hlaWdodDsgICAgICAgICAgICAvKio8IERlY29kZWQgaW1hZ2UgaGVpZ2h0ICovCi0KLSAgICAvKgotICAgICAqIERlY29kZXIgaW5mbyAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgIGlEZWNDdHM7ICAgICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBEZWNvZGVkIEFVIEN0cyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgIGJKdW1wRmxhZzsgICAgIC8qKjwgMSBpZiBhIGp1bXAgaGFzIGJlZW4gbWFkZSAqLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgIGlEZWx0YVRpbWU7ICAgLyoqPCBbTWlsbGlzZWNvbmRzXSBUaW1lIGJldHdlZW4gcHJldmlvdXMgUkFQIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIHRvIGV4dHJhY3QgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICBpR2FwOyAgICAgICAgIC8qKjwgW01pbGxpc2Vjb25kc10gVGltZSBiZXR3ZWVuIGp1bXAgQVUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGlvbiB0aW1lICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgdWlTdGVwOyAgICAgICAgICAvKio8IFtNaWxsaXNlY29uZHNdIFByb2dyZXNzIGJhciB0aW1lIGluY3JlbWVudCAqLwotCi0gICAgLyoqCi0gICAgICogRmlsZXN5c3RlbSBmdW5jdGlvbnMgKi8KLSAgICAgLyoqPCBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMsIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICBwT3NhRmlsZVJlYWRQdHI7Ci0gICAgLyoqPCBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zLCB0byBiZSBwcm92aWRlZCBieSB1c2VyICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgIHBPc2FGaWxlV3JpdFB0cjsKLQotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgIGJDbGlwT3BlbmVkOwotfSBNNFZTUzNHUFBfSW50ZXJuYWxFeHRyYWN0UGljdHVyZUNvbnRleHQ7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRWU1MzR1BQX0lOVEVSTkFMVFlQRVNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTR4VlNTX0FQSS5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfQVBJLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjZTEwMmYuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfQVBJLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19NNFhWU1NfQVBJX0hfXwotI2RlZmluZSBfX000WFZTU19BUElfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTR4VlNTX0FQSS5oCi0gKiBAYnJpZWYgICAgQVBJIG9mIFZpZGVvIFN0dWRpbyAyLjEKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIE00VlNTX1NVUFBPUlRfRVhURU5ERURfRkVBVFVSRVMKLQotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmgiCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotLyogRXJyb3JzIGNvZGVzICovCi0KLS8qKgotICogRW5kIG9mIGFuYWx5emluZyA9PiB0aGUgdXNlciBjYW4gY2FsbCBNNHhWU1NfUHJldmlld1N0YXJ0IG9yIE00eFZTU19TYXZlU3RhcnQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORSAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWUywgMHgwMDAxKQotCi0vKioKLSAqIEVuZCBvZiBwcmV2aWV3IGdlbmVyYXRpbmcgPT4gdGhlIHVzZXIgY2FuIGxhdW5jaCB2cHMgdG8gc2VlIHByZXZpZXcuIE9uY2UgcHJldmlldyBpcyBvdmVyLAotICAgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19QcmV2aWV3U3RvcCgpIHRvIGJlIGFibGUgdG8gc2F2ZSBlZGl0ZWQgZmlsZSwgb3IgdG8gY2FsbCBhbm90aGVyCi0gICBNNHhWU1NfU2VuZENvbW1hbmQoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX1BSRVZJRVdfUkVBRFkgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDIpCi0KLS8qKgotICogRW5kIG9mIHNhdmVkIGZpbGUgZ2VuZXJhdGlvbiA9PiB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1NhdmVTdG9wKCkgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORSAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWUywgMHgwMDAzKQotCi0vKioKLSAqIFRyYW5zY29kaW5nIGlzIG5lY2Vzc2FyeSB0byBnbyBmdXJ0aGVyIC0+IGlmIHRoZSB1c2VyIGRvZXMgbm90IHdhbnQgdG8gY29udGludWUsCi0gIGhlIG11c3QgY2FsbCBNNHhWU1Nfc2VuZENvbW1hbmQoKSAqLwotI2RlZmluZSBNNFZTUzNHUFBfV0FSX1RSQU5TQ09ESU5HX05FQ0VTU0FSWSAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDQpCi0KLS8qKgotICogSW4gY2FzZSBvZiBNTVMsIHRoZSBvdXRwdXQgZmlsZSBzaXplIHdvbid0IGJlIHJlYWNoZWQgKi8KLSNkZWZpbmUgTTRWU1MzR1BQX1dBUl9PVVRQVVRGSUxFU0laRV9FWENFRUQgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWUywgMHgwMDA1KQotCi0vKioKLSAqIEpQRyBpbnB1dCBmaWxlIGRpbWVuc2lvbnMgYXJlIHRvbyBoaWdoICovCi0jZGVmaW5lIE00VlNTM0dQUF9FUlJfSlBHX1RPT19CSUcgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00VlMsIDB4MDAwMSkKLQotLyoqCi0gKiBVVEYgQ29udmVyc2lvbiwgd2FybmluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgdGVtcG9yYXJ5IGNvbnZlcnRlZCBidWZmZXIqLwotI2RlZmluZSBNNHhWU1NXQVJfQlVGRkVSX09VVF9UT09fU01BTEwgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfV0FSLCBNNFZTLCAweDAwMDYpCi0KLS8qKgotICogU1dJS0FSIDpFcnJvciB3aGFuIE5PX01PUkVfU1BBQ0UqLwotI2RlZmluZSBNNHhWU1NFUlJfTk9fTU9SRV9TUEFDRSAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNFZTLCAweDAwMDcpCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgTTR4VlNTX1ZpZGVvRWZmZWN0VHlwZQotICogQGJyaWVmICAgVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSB2aWRlbyBlZmZlY3QgdHlwZXMgb2YgdGhlIHhWU1MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlID0gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwrMSwgLyogMjU3ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluaywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI1OCAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNTkgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjYwICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI2MSAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZyYW1pbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNjIgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9UZXh0LCAvKiBUZXh0IG92ZXJsYXkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjYzICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbUluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI2NCAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21PdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNjUgKi8KLSAgICBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GaWZ0aWVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMjY2ICovCi0gICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjI2NyAqLwotICAgIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoyNjgqLwotfSBNNHhWU1NfVmlkZW9FZmZlY3RUeXBlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgIE00eFZTU19WaWRlb1RyYW5zaXRpb25UeXBlCi0gKiBAYnJpZWYgICBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHZpZGVvIGVmZmVjdCB0aGF0IGNhbiBiZSBhcHBsaWVkIGR1cmluZyBhIHRyYW5zaXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsID0gTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsLCAvKjI1NiovCi0gICAgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0FscGhhTWFnaWMsCi0gICAgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX1NsaWRlVHJhbnNpdGlvbiwKLSAgICBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRmFkZUJsYWNrCi0KLX0gTTR4VlNTX1ZpZGVvVHJhbnNpdGlvblR5cGU7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19QcmV2aWV3U2V0dGluZ3MKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBnYXRoZXJzIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IHRoZSBWUFMgZm9yIHByZXZpZXcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwM2dwUHJldmlld0ZpbGU7Ci0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBQQ01GaWxlOwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgICAgb3V0UENNX0FTRjsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXVkaW9Nb25vOwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAgICAgICAgICAgICAgICAgICAqRWZmZWN0czsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJFZmZlY3RzOwotCi19IE00eFZTU19QcmV2aWV3U2V0dGluZ3M7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU190b1VURjhGY3QKLSAqIEBicmllZiAgICAgICAgVGhpcyBwcm90b3R5cGUgZGVmaW5lcyB0aGUgZnVuY3Rpb24gaW1wbGVtZW50ZWQgYnkgdGhlIGludGVncmF0b3IKLSAqICAgICAgICAgICAgICAgIHRvIGNvbnZlcnQgYSBzdHJpbmcgZW5jb2RlZCBpbiBhbnkgZm9ybWF0IHRvIGFuIFVURjggc3RyaW5nLgotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICAgcEJ1ZmZlckluICAgICAgICBJTiAgICAgICAgICAgIEJ1ZmZlciBjb250YWluaW5nIHRoZSBzdHJpbmcgdG8gY29udmVydCB0byBVVEY4Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlck91dCAgICAgICAgSU4gICAgICAgICAgICBCdWZmZXIgY29udGFpbmluZyB0aGUgVVRGOCBjb252ZXJ0ZWQgc3RyaW5nCi0gKiBAcGFyYW0gICAgYnVmZmVyT3V0U2l6ZSAgICBJTi9PVVQgICAgSU46ICAgICBTaXplIG9mIHRoZSBnaXZlbiBvdXRwdXQgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogU2l6ZSBvZiB0aGUgY29udmVydGVkIGJ1ZmZlcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00eFZTU190b1VURjhGY3QpCi0oCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICpwQnVmZmVySW4sCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAqcEJ1ZmZlck91dCwKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICpidWZmZXJPdXRTaXplCi0pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19mcm9tVVRGOEZjdAotICogQGJyaWVmICAgICAgICBUaGlzIHByb3RvdHlwZSBkZWZpbmVzIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRlZCBieSB0aGUgaW50ZWdyYXRvcgotICogICAgICAgICAgICAgICAgdG8gY29udmVydCBhbiBVVEY4IHN0cmluZyB0byBhIHN0cmluZyBlbmNvZGVkIGluIGFueSBmb3JtYXQuCi0gKiBAbm90ZQotICoKLSAqIEBwYXJhbSAgICBwQnVmZmVySW4gICAgICAgIElOICAgICAgICAgICAgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIFVURjggc3RyaW5nIHRvIGNvbnZlcnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBkZXNpcmVkIGZvcm1hdC4KLSAqIEBwYXJhbSAgICBwQnVmZmVyT3V0ICAgICAgICBJTiAgICAgICAgICAgIEJ1ZmZlciBjb250YWluaW5nIHRoZSBjb252ZXJ0ZWQgc3RyaW5nCi0gKiBAcGFyYW0gICAgYnVmZmVyT3V0U2l6ZSAgICBJTi9PVVQgICAgSU46ICAgICBTaXplIG9mIHRoZSBnaXZlbiBvdXRwdXQgYnVmZmVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogU2l6ZSBvZiB0aGUgY29udmVydGVkIGJ1ZmZlcgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00eFZTU19mcm9tVVRGOEZjdCkKLSgKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICpwQnVmZmVySW4sCi0gICAgTTRPU0FfVm9pZCAgICAgICAgICAgICpwQnVmZmVyT3V0LAotICAgIE00T1NBX1VJbnQzMiAgICAgICAgKmJ1ZmZlck91dFNpemUKLSk7Ci0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19Jbml0UGFyYW1zCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBwYXJhbWV0ZXJzIGZvciB4VlNTLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogICAgICAgICAgICBwRmlsZVJlYWRQdHI7Ci0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgICBwRmlsZVdyaXRlUHRyOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBQYXRoOwotICAgIC8qRnVuY3Rpb24gcG9pbnRlciBvbiBhbiBleHRlcm5hbCB0ZXh0IGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KLSAgICBNNHhWU1NfdG9VVEY4RmN0ICAgICAgICAgICAgICAgIHBDb252VG9VVEY4RmN0OwotICAgIC8qRnVuY3Rpb24gcG9pbnRlciBvbiBhbiBleHRlcm5hbCB0ZXh0IGNvbnZlcnNpb24gZnVuY3Rpb24gKi8KLSAgICBNNHhWU1NfZnJvbVVURjhGY3QgICAgICAgICAgICAgICAgcENvbnZGcm9tVVRGOEZjdDsKLQotCi0KLX0gTTR4VlNTX0luaXRQYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19Jbml0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHhWU1MKLSAqIEBub3RlICAgICAgICBJbml0aWFsaXplcyB0aGUgeFZTUyBlZGl0IG9wZXJhdGlvbiAoYWxsb2NhdGVzIGFuIGV4ZWN1dGlvbiBjb250ZXh0KS4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBhcmFtcyAgICAgICAgICAgICAgICAoSU4pIFBhcmFtZXRlcnMgbWFuZGF0b3J5IGZvciB4VlNTCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19Jbml0KE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNHhWU1NfSW5pdFBhcmFtcyogcGFyYW1zKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1JlZHVjZVRyYW5zY29kZQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIGdpdmVuIGVkaXRpbmcgc3RydWN0dXJlIGluIG9yZGVyIHRvCi0gKiAgICAgICAgICAgICAgICBtaW5pbWl6ZSB0aGUgdHJhbnNjb2RpbmcgdGltZS4KLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBhbmFseXNlcyB0aGlzIHN0cnVjdHVyZSwgYW5kIGlmIG5lZWRlZCwgY2hhbmdlcyB0aGUKLSAqICAgICAgICAgICAgICAgIG91dHB1dCBwYXJhbWV0ZXJzIChWaWRlbyBjb2RlYywgdmlkZW8gc2l6ZSwgYXVkaW8gY29kZWMsCi0gKiAgICAgICAgICAgICAgICBhdWRpbyBuYiBvZiBjaGFubmVscykgdG8gbWluaW1pemUgdGhlIHRyYW5zY29kaW5nIHRpbWUuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwU2V0dGluZ3MgICAgICAgICAgICAoSU4pIEVkaXRpb24gc2V0dGluZ3MgKGFsbG9jYXRlZCBieSB0aGUgdXNlcikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfUmVkdWNlVHJhbnNjb2RlKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19TZW5kQ29tbWFuZAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGdpdmVzIHRvIHRoZSB4VlNTIGFuIGVkaXRpbmcgc3RydWN0dXJlCi0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgYW5hbHlzZXMgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBwcmVwYXJlIGVkaXRpb24KLSAqICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgTTR4VlNTX0luaXQsIGFmdGVyCi0gKiAgICAgICAgICAgICAgICBNNHhWU1NfQ2xvc2VDb21tYW5kLCBvciBhZnRlciBNNHhWU1NfUHJldmlld1N0b3AuCi0gKiAgICAgICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1N0ZXAgdW50aWwKLSAqICAgICAgICAgICAgICAgIGl0IHJldHVybnMgYW5vdGhlciBlcnJvciB0aGFuIE00Tk9fRVJST1IuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAgICAgICAgIChJTikgRWRpdGlvbiBzZXR0aW5ncyAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19TZW5kQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfUHJldmlld1N0YXJ0Ci0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gcHJlcGFyZSB0aGUgcHJldmlldwotICogQG5vdGUgICAgICAgIFRoZSB4VlNTIGNyZWF0ZSAzR1AgcHJldmlldyBmaWxlIGFuZCBmaWxsIHBQcmV2aWV3U2V0dGluZ3Mgd2l0aAotICogICAgICAgICAgICAgICAgcHJldmlldyBwYXJhbWV0ZXJzLgotICogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIE00eFZTU19TdGVwIGhhcyByZXR1cm5lZAotICogICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORQotICogICAgICAgICAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIHVudGlsCi0gKiAgICAgICAgICAgICAgICBpdCByZXR1cm5zIGFub3RoZXIgZXJyb3IgdGhhbiBNNE5PX0VSUk9SLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUHJldmlld1NldHRpbmdzICAgIChJTikgUHJldmlldyBzZXR0aW5ncyAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19QcmV2aWV3U3RhcnQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTR4VlNTX1ByZXZpZXdTZXR0aW5ncyogcFByZXZpZXdTZXR0aW5ncyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19QcmV2aWV3U3RvcAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHVuYWxsb2NhdGUgcHJldmlldyByZXNzb3VyY2VzIGFuZCBjaGFuZ2UgeFZTUwotICogICAgICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGUgdG8gYWxsb3cgc2F2aW5nIG9yIHJlc2VuZCBhbiBlZGl0aW5nIGNvbW1hbmQKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX1BSRVZJRVdfUkVBRFkKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfUHJldmlld1N0b3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19TYXZlU3RhcnQKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBwcmVwYXJlIHRoZSBzYXZlCi0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgY3JlYXRlIDNHUCBlZGl0ZWQgZmluYWwgZmlsZQotICogICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIE00eFZTU19TdGVwIGhhcyByZXR1cm5lZAotICogICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORQotICogICAgICAgICAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIHVudGlsCi0gKiAgICAgICAgICAgICAgICBpdCByZXR1cm5zIGFub3RoZXIgZXJyb3IgdGhhbiBNNE5PX0VSUk9SLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwRmlsZVBhdGggICAgICAgICAgICAoSU4pIElmIHRoZSB1c2VyIHdhbnRzIHRvIHByb3ZpZGUgYSBkaWZmZXJlbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgZmlsZW5hbWUsIGVsc2UgY2FuIGJlIE5VTEwgKGFsbG9jYXRlZCBieSB0aGUgdXNlcikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0YXJ0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZVBhdGhTaXplKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX1NhdmVTdG9wCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gdW5hbGxvY2F0ZSBzYXZlIHJlc3NvdXJjZXMgYW5kIGNoYW5nZSB4VlNTCi0gKiAgICAgICAgICAgICAgICBpbnRlcm5hbCBzdGF0ZS4KLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX1NBVklOR19ET05FCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX1NhdmVTdG9wKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfU3RlcAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIGRpZmZlcmVudHMgdGFza3MsIGRlcGVuZGluZyBvZiB4VlNTCi0gKiAgICAgICAgICAgICAgICBpbnRlcm5hbCBzdGF0ZS4KLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uOgotICogICAgICAgICAgICAgICAgICAgIC0gYW5hbHlzZXMgZWRpdGluZyBzdHJ1Y3R1cmUgaWYgY2FsbGVkIGFmdGVyIE00eFZTU19TZW5kQ29tbWFuZAotICogICAgICAgICAgICAgICAgICAgIC0gZ2VuZXJhdGVzIHByZXZpZXcgZmlsZSBpZiBjYWxsZWQgYWZ0ZXIgTTR4VlNTX1ByZXZpZXdTdGFydAotICogICAgICAgICAgICAgICAgICAgIC0gZ2VuZXJhdGVzIGZpbmFsIGVkaXRlZCBmaWxlIGlmIGNhbGxlZCBhZnRlciBNNHhWU1NfU2F2ZVN0YXJ0Ci0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgKE9VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiBmcm9tIDAgdG8gMTAwCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IsIHRoZSB1c2VyIG11c3QgY2FsbCBNNHhWU1NfU3RlcCBhZ2FpbgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfUFJFVklFV19SRUFEWTogICAgUHJldmlldyBmaWxlIGlzIGdlbmVyYXRlZAotICogQHJldHVybiAgICBNNFZTUzNHUFBfV0FSX1NBVklOR19ET05FOiAgICAgICAgRmluYWwgZWRpdGVkIGZpbGUgaXMgZ2VuZXJhdGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfQU5BTFlaSU5HX0RPTkU6ICAgIEFuYWx5c2UgaXMgZG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfU3RlcChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX0Nsb3NlQ29tbWFuZAotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgY3VycmVudCBlZGl0aW5nIHByb2ZpbGUsIHVuYWxsb2NhdGUKLSAqICAgICAgICAgICAgICAgIHJlc3NvdXJjZXMgYW5kIGNoYW5nZSB4VlNTIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZSB1c2VyIGNhbiBjYWxsIGEgbmV3IE00eFZTU19TZW5kQ29tbWFuZAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19DbG9zZUNvbW1hbmQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19DbGVhblVwCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBhbGwgeFZTUyByZXNzb3VyY2VzCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBNNHhWU1NfQ2xvc2VDb21tYW5kLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19DbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNHhWU1NfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBWaWRlbyBTdHVkaW8gMi4xCi0gKgotICogQHBhcmFtICAgIHBWZXJzaW9uICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB2ZXJzaW9uIGluZm8gc3RydWN0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX0dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZSAgICBUaGUgcHJvdG90eXBlIG9mIHRoaXMgZWZmZWN0IGZ1bmN0aW9uIGlzIGV4cG9zZWQgYmVjYXVzZSBpdCBuZWVkcyB0bwotICogICAgICAgICAgICBjYWxsZWQgYnkgdGhlIFZQUyBkdXJpbmcgdGhlIHByZXZpZXcKLSAqIEBwYXJhbSAgICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCBjb2xvciB0byBhcHBseSAobm90IHZlcnkgY2xlYW4gLi4uKQotICogQHBhcmFtICAgIFBsYW5lSW4gICAgICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yCi0oCi0gICAgTTRPU0FfVm9pZCAqcEZ1bmN0aW9uQ29udGV4dCwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcElucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwT3V0cHV0UGxhbmVzLAotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZAotKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGcmFtaW5nKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFkZCBhIGZpeGVkIG9yIGFuaW1hdGVkIGltYWdlIG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlICAgIFRoZSBwcm90b3R5cGUgb2YgdGhpcyBlZmZlY3QgZnVuY3Rpb24gaXMgZXhwb3NlZCBiZWNhdXNlIGl0IG5lZWRzIHRvCi0gKiAgICAgICAgICAgIGNhbGxlZCBieSB0aGUgVlBTIGR1cmluZyB0aGUgcHJldmlldwotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZwotKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcE91dHB1dFBsYW5lcywKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQKLSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBtYWtlIGEgdmlkZW8gbG9vayBhcyBpZiBpdCB3YXMgdGFrZW4gaW4gdGhlIGZpZnRpZXMKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcFVzZXJEYXRhICAgICAgIChJTikgQ29udGV4dAotICogQHBhcmFtICAgIHBQbGFuZUluICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUGxhbmVPdXQgICAgICAgIChJTi9PVVQpIE91dHB1dCBZVVY0MjAgcGxhbmFyCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAoSU4vT1VUKSBQcm9ncmVzcyBpbmRpY2F0aW9uICgwLTEwMCkKLSAqIEBwYXJhbSAgICB1aUVmZmVjdEtpbmQgICAgKElOKSBVbnVzZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00VklGSV9PSzogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwRmlmdGllc0RhdGEsIHBQbGFuZU91dCBvciBwUHJvZ3Jlc3MgYXJlIE5VTEwgKERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcwotKAotICAgIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSwKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcElucHV0UGxhbmVzLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kCi0pOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbShNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhZGQgYSBmaXhlZCBvciBhbmltYXRlZCBpbWFnZSBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZSAgICBUaGUgcHJvdG90eXBlIG9mIHRoaXMgZWZmZWN0IGZ1bmN0aW9uIGlzIGV4cG9zZWQgYmVjYXVzZSBpdCBuZWVkcyB0bwotICogICAgICAgICAgICBjYWxsZWQgYnkgdGhlIFZQUyBkdXJpbmcgdGhlIHByZXZpZXcKLSAqIEBwYXJhbSAgICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCB6b29tIHRvIGFwcGx5IChJbi9PdXQpCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbQotKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcE91dHB1dFBsYW5lcywKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQKLSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEFsbG93cyBmaWxsaW5nIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcwotICoKLSAqIEBub3RlICAgIFdBUk5JTkc6IHBDbGlwU2V0dGluZ3MtPkVmZmVjdHNbIF0gd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlICAgICAgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgIHBGaWxlICAgICAgICAgICAgICAgKElOKSBDbGlwIGZpbGUgbmFtZQotICogQHBhcmFtICAgZmlsZVBhdGhTaXplICAgICAgICAoSU4pIFNpemUgb2YgdGhlIGNsaXAgcGF0aCAobmVlZGVkIGZvciB0aGUgVVRGMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncywgTTRPU0FfVm9pZCogcEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZVBhdGhTaXplLCBNNE9TQV9VSW50OCBuYkVmZmVjdHMpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBEdXBsaWNhdGVzIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUsIHBlcmZvcm1pbmcgYWxsb2NhdGlvbnMgaWYgcmVxdWlyZWQKLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc0Rlc3QgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzT3JpZyAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgYkNvcHlFZmZlY3RzICAgICAgICAoSU4pIEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGR1cGxpY2F0ZSBlZmZlY3RzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3MoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3NPcmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJDb3B5RWZmZWN0cyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19GcmVlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBwb2ludGVycyBhbGxvY2F0ZWQgaW4gdGhlIENsaXBTZXR0aW5nIHN0cnVjdHVyZSAocEZpbGUsIEVmZmVjdHMpLgotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENsaXBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyhNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19nZXRNQ1NDb250ZXh0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NvbnRleHQqIG1jc0NvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgTUNTIGNvbnRleHQgd2l0aGluIHRoZSB4VlNTIGludGVybmFsIGNvbnRleHQKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgVlNTIHN0YXRlIGhhcyBtb3ZlZCB0byBhbmFseXppbmcgc3RhdGUKLSAqICAgICAgICAgICAgICAgIG9yIGJleW9uZAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBtY3NDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgbWNzIGNvbnRleHQgdG8gcmV0dXJuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00eFZTU19nZXRNQ1NDb250ZXh0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NvbnRleHQqIG1jc0NvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2dldFZTUzNHUFBDb250ZXh0KE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCogbWNzQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBWU1MzR1BQIGNvbnRleHQgd2l0aGluIHRoZSB4VlNTIGludGVybmFsIGNvbnRleHQKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgVlNTIHN0YXRlIGhhcyBtb3ZlZCB0byBHZW5lcmF0aW5nCi0gKiAgICAgICAgICAgICAgICBwcmV2aWV3IG9yIGJleW9uZAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICB2c3MzZ3BwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciB0byBwb2ludGVyIG9mIHZzczNncHAgY29udGV4dCB0byByZXR1cm4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZTUzNHUFBDb250ZXh0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NvbnRleHQqIHZzczNncHBDb250ZXh0KTsKLQotLy8gR2V0IHN1cHBvcnRlZCB2aWRlbyBkZWNvZGVycyBhbmQgY2FwYWJpbGl0aWVzLgotTTRPU0FfRVJSIE00eFZTU19nZXRWaWRlb0RlY29kZXJDYXBhYmlsaXRpZXMoTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMgKipkZWNvZGVycyk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotI2VuZGlmIC8qIF9fTTRYVlNTX0FQSV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfSW50ZXJuYWwuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMvTTR4VlNTX0ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyOTY1NzIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL2luYy9NNHhWU1NfSW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX000WFZTU19JTlRFUk5BTF9IX18KLSNkZWZpbmUgX19NNFhWU1NfSU5URVJOQUxfSF9fCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTR4VlNTX0ludGVybmFsLmgKLSAqIEBicmllZiAgICBJbnRlcm5hbCBvZiBWaWRlbyBBdXRob3JpbmcuCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLQotI2luY2x1ZGUgIk00TUNTX0FQSS5oIgotI2luY2x1ZGUgIk00TUNTX0Vycm9yQ29kZXMuaCIKLQotI2luY2x1ZGUgIk00UFRPM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFBUTzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0jaW5jbHVkZSAiTTRBSVJfQVBJLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBNNF94VlNTX01BSk9SICAgICAgICAxCi0jZGVmaW5lIE00X3hWU1NfTUlOT1IgICAgICAgIDUKLSNkZWZpbmUgTTRfeFZTU19SRVZJU0lPTiAgICA1Ci0KLS8qIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBkZXNjcmliZSB0aGUgbWF4IGRpbWVuc2lvbnMgb2YgYW4gaW5wdXQgSlBHICovCi0jZGVmaW5lIE00WFZTU19NWF9KUEdfTkJfT0ZfUElYRUxTICAgIDM5MjYwMTYKLQotLypTaXplIG9mIHRoZSBVVEYgdGVtcG9yYXJ5IGNvbnZlcnNpb24gYnVmZmVyIGtlZXAgaW4gdGhlIFZBIGludGVybmFsIGNvbnRleHQgYW5kCi1hbGxvY2F0ZSBhdCB0aGUgaW5pdGlhbGl6YXRpb24qLwotI2RlZmluZSBVVEZfQ09OVkVSU0lPTl9CVUZGRVJfU0laRSAgICAgICAgICAgIDIwNDgKLQotLyogTWF4IHBhdGggbGVuZ3RoIHNpemUgKi8KLSNkZWZpbmUgIE00WFZTU19NQVhfUEFUSF9MRU4gMjU2Ci0KLS8qKiBEZXRlcm1pbmUgYWJzb2x1dGUgdmFsdWUgb2YgYS4gKi8KLSNkZWZpbmUgTTR4VlNTX0FCUyhhKSAgICAgICAgICAgICAgICggKCAoYSkgPCAoMCkgKSA/ICgtKGEpKSA6IChhKSApCi0KLS8qKiBZLFUsViB2YWx1ZXMgaW4gY2FzZSBvZiBibGFjayBib3JkZXJzIHJlbmRlcmluZyAqLwotI2RlZmluZSBZX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDAwCi0jZGVmaW5lIFVfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4ODAKLSNkZWZpbmUgVl9QTEFORV9CT1JERVJfVkFMVUUgICAgMHg4MAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfRWZmZWN0c0FscGhhQmxlbmRpbmcKLSAqIEBicmllZiAgICBJbnRlcm5hbCBlZmZlY3RzIGFscGhhIGJsZW5kaW5nIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBpbnRlcm5hbCBpbmZvcm1hdGlvbnMgdG8gY3JlYXRlIGFuIGFscGhhCi0gKiAgICAgICAgICAgIGJsZW5kaW5nIGZvciB0aGUgZWZmZWN0cyB0ZXh0IGFuZCBmcmFtaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgbV9mYWRlSW5UaW1lOyAgICAgICAgLypTdGFydCBwZXJjZW50YWdlIG9mIEFscGhhIGJsZW5kaW5nKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgbV9mYWRlT3V0VGltZTsgICAgICAgIC8qTWlkZGxlIHBlcmNlbnRhZ2Ugb2YgQWxwaGEgYmxlbmRpbmcqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICBtX2VuZDsgICAgICAgICAgICAvKkVuZCBwZXJjZW50YWdlIG9mIEFscGhhIGJsZW5kaW5nKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgbV9taWRkbGU7ICAgIC8qRHVyYXRpb24sIGluIHBlcmNlbnRhZ2Ugb2YgZWZmZWN0IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBGYWRlSW4gcGhhc2UqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICBtX3N0YXJ0OyAgICAvKkR1cmF0aW9uLCBpbiBwZXJjZW50YWdlIG9mIGVmZmVjdCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBGYWRlT3V0IHBoYXNlKi8KLQotfSBNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZzsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUSElTIFNUUlVDVFVSRSBNVVNUIE5PVCBCRSBNT0RJRklFRAotICogc3RydWN0ICAgIE00eFZTU19GcmFtaW5nU3RydWN0Ci0gKiBAYnJpZWYgICAgSXQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHhWU1MgZm9yIGZyYW1pbmcgZWZmZWN0LCBhbmQgYnkgVlBTIGZvciBwcmV2aWV3aW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqRnJhbWluZ1JnYjsgICAgICAgICAgICAgICAgLyoqPCBkZWNvZGVkIEJHUjU2NSBwbGFuZSAqLwotICAgIE00VklGSV9JbWFnZVBsYW5lICpGcmFtaW5nWXV2OyAgICAgICAgICAgICAgICAvKio8IGNvbnZlcnRlZCBZVVY0MjAgcGxhbmFyIHBsYW5lICovCi0gICAgTTRPU0FfSW50MzIgZHVyYXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEdXJhdGlvbiBvZiB0aGUgZnJhbWUgKi8KLSAgICBNNE9TQV9JbnQzMiBwcmV2aW91c0NsaXBUaW1lOyAgICAgICAgICAgICAgICAvKio8IFByZXZpb3VzIGNsaXAgdGltZSwgdXNlZCBieSBmcmFtaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciBmb3IgU0FWSU5HICovCi0gICAgTTRPU0FfSW50MzIgcHJldmlld09mZnNldENsaXBUaW1lOyAgICAgICAgICAgIC8qKjwgUHJldmlvdXMgY2xpcCB0aW1lLCB1c2VkIGJ5IGZyYW1pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyIGZvciBQUkVWSUVXICovCi0gICAgTTRPU0FfSW50MzIgcHJldmlld0NsaXBUaW1lOyAgICAgICAgICAgICAgICAvKio8IEN1cnJlbnQgY2xpcCB0aW1lLCB1c2VkIGJ5IGZyYW1pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyIGZvciBQUkVWSUVXICovCi0gICAgTTRPU0FfVm9pZCogcEN1cnJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IE00eFZTU19GcmFtaW5nU3RydWN0IHVzZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmcgZmlsdGVyICovCi0gICAgTTRPU0FfVm9pZCogcE5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTmV4dCBNNHhWU1NfRnJhbWluZ1N0cnVjdCwgaWYgbm8gbW9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50IG9uIGN1cnJlbnQgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKi8KLSAgICBNNE9TQV9VSW50MzIgdG9wbGVmdF94OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIHRvcC1sZWZ0IFggY29vcmRpbmF0ZSBpbiB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIG9mIHRoZSBmaXJzdCBkZWNvZGVkIHBpeGVsICovCi0gICAgTTRPU0FfVUludDMyIHRvcGxlZnRfeTsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSB0b3AtbGVmdCBZIGNvb3JkaW5hdGUgaW4gdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBvZiB0aGUgZmlyc3QgZGVjb2RlZCBwaXhlbCAqLwotICAgIE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKiBhbHBoYUJsZW5kaW5nU3RydWN0OyAvKiBBbHBoYSBibGVuZGluZyBTdHJ1Y3QgKi8KLS8qVG8gc3VwcG9ydCBBUkdCODg4OCA6IGdldCB0aGUgd2lkdGggYW5kIGhlaWdodCBpbiBjYXNlIG9mIGZpbGUgQVJHQjg4OCB1c2VkIGluIGZyYW1pbmcKLSBhcyB2aWRlbyBlZmZlY3QgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgd2lkdGg7ICAgLyp3aWR0aCBvZiB0aGUgQVJHQjg4ODggY2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Vc2VkIG9ubHkgaWYgdmlkZW8gZWZmZWN0IGlzIGZyYW1taW5nICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIGhlaWdodDsgLypoZWlnaHQgb2YgdGhlIEFSR0I4ODg4IGNsaXAgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgb25seSBpZiB2aWRlbyBlZmZlY3QgaXMgZnJhbW1pbmcgKi8KLQotfSBNNHhWU1NfRnJhbWluZ1N0cnVjdDsKLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRISVMgU1RSVUNUVVJFIE1VU1QgTk9UIEJFIE1PRElGSUVECi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0ZyYW1pbmdDb250ZXh0Ci0gKiBAYnJpZWYgICAgSXQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHhWU1MgZm9yIGZyYW1pbmcgZWZmZWN0LCB3aGVuIHRoZSBmbGFnCi0gICAgICAgICAgICAgICAgREVDT0RFX0dJRl9PTl9TQVZJTkcgaXMgYWN0aXZhdGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogICAgICAgICAgICBhRnJhbWluZ0N0eDsgICAgICAgIC8qKjxGcmFtaW5nIHN0cnVjdCBmb3IgdGhlIGRlY29kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY3VycmVudCBmcmFtZSBvZiB0aGUgZ2lmKi8KLSAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogICAgICAgICAgICBhRnJhbWluZ0N0eF9sYXN0OyAgICAvKio8RnJhbWluZyBzdHJ1Y3QgZm9yIHRoZSBkZWNvZGluZyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcmV2aW91cyBmcmFtZSBvZiB0aGUgZ2lmKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgICAgICAgICAgcEZpbGVSZWFkUHRyOyAgICAvKio8IFBvaW50ZXIgb24gT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqICAgICAgICBwRmlsZVdyaXRlUHRyOyAgICAgLyoqPCBQb2ludGVyIG9uIE9TQUwgZmlsZSB3cml0ZSBmdW5jdGlvbnMgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBTUFNDb250ZXh0OyAgICAgICAgLyoqPFNQUyBjb250ZXh0IGZvciB0aGUgR0lGIGRlY29kaW5nKi8KLSAgICAvL000U1BTX1N0cmVhbSAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW07ICAgICAgICAvKio8R0lGIGlucHV0IHN0cmVhbSBidWZmZXIgcG9pbnRlciovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICBwRWZmZWN0RmlsZVBhdGg7ICAgIC8qKjxmaWxlIHBhdGggb2YgdGhlIGdpZiovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgICAgb3V0cHV0VmlkZW9TaXplOyAgICAvKio8IE91dHB1dCB2aWRlbyBzaXplIFJDICovCi0gICAgLy9NNFNQU19EaXNwb3NhbE1vZGUgICAgICAgICAgICAgICAgZGlzcG9zYWw7ICAgICAgICAgICAgLyoqPHByZXZpb3VzIGZyYW1lIEdJRiBkaXNwb3NhbCovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBiX2FuaW1hdGVkOyAgICAgICAgICAgIC8qKjxJcyB0aGUgR0lGIGFuaW1hdGVkPyovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGJFZmZlY3RSZXNpemU7ICAgICAgICAvKio8SXMgdGhlIGdpZiByZXNpemUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgdG9wbGVmdF94OyAgICAgICAgICAgIC8qKjwgVGhlIHRvcC1sZWZ0IFggY29vcmRpbmF0ZSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBpY3R1cmUgb2YgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWQgcGl4ZWwgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHRvcGxlZnRfeTsgICAgICAgICAgICAvKio8IFRoZSB0b3AtbGVmdCBZIGNvb3JkaW5hdGUgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwaWN0dXJlIG9mIHRoZSBmaXJzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkIHBpeGVsICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB3aWR0aDsgICAgICAgICAgICAgICAgLyoqPEdJRiB3aWR0aCwgZmlsbCBkdXJpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gd2l0aCB0aGUgU1BTKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGhlaWdodDsgICAgICAgICAgICAgICAgLyoqPEdJRiBoZWlnaHQsIGZpbGwgZHVyaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiB3aXRoIHRoZSBTUFMqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgZWZmZWN0RHVyYXRpb247ICAgICAgICAvKio8RWZmZWN0IGR1cmF0aW9uKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdFN0YXJ0VGltZTsgICAgLyoqPEVmZmVjdCBzdGFydCB0aW1lKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGNsaXBUaW1lOyAgICAgICAgICAgIC8qKjxjdXJyZW50IG91dHB1dCBjbGlwIHRpbWUgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgZnJhbWUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgbGFzdF9jbGlwVGltZTsgICAgICAgIC8qKjxwcmV2aW91cyBvdXRwdXQgY2xpcCB0aW1lIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyBmcmFtZSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBsYXN0U3RlcER1cmF0aW9uOyAgICAvKio8VGltZSBpbnRlcnZhbCBiZXR3ZWVuIHRoZSBwcmV2aW91cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGFuZCB0aGUgY3VycmVudCBmcmFtZSovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGJfSXNGaWxlR2lmOyAgICAgICAgLyoqPElzIHRoZSBmcmFtaW5nIHVzaW5nIGEgZ2lmIGZpbGUqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgbGFzdF93aWR0aDsgICAgICAgICAgICAvKio8TGFzdCBmcmFtZSB3aWR0aCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBsYXN0X2hlaWdodDsgICAgICAgIC8qKjxMYXN0IGZyYW1lIGhlaWdodCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBsYXN0X3RvcGxlZnRfeDsgICAgICAgIC8qKjxMYXN0IGZyYW1lIHggdG9wbGVmdCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBsYXN0X3RvcGxlZnRfeTsgICAgICAgIC8qKjxMYXN0IGZyYW1lIHkgdG9wbGVmdCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2dpZl90aW1lOyAgICAvKio8IEN1cnJlbnQgdGltZSBvcyB0aGUgR0lGIGluIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHRpbWUgKi8KLSAgICBNNE9TQV9GbG9hdCAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRHVyYXRpb25SYXRpbzsgICAgLyoqPCBGcmFtZSBkdXJhdGlvbiByYXRpbyAqLwotICAgIE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKiAgICBhbHBoYUJsZW5kaW5nU3RydWN0Oy8qQWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSNpZmRlZiBERUJVR19HSUYKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIHVpRGVidWdfZmlsZUNvdW50ZXI7LyoqPGZvciBkZWJ1ZyBwdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCB0aGUgZnJhbWUgb2YgdGhlIGdpZiovCi0jZW5kaWYgLypERUJVR19HSUYqLwotfU00eFZTU19GcmFtaW5nQ29udGV4dDsKLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgeFZTUyBwYXJhbWV0ZXIgZm9yIFB0bzNHUFAgbW9kdWxlCi0gKiBAbm90ZSAgICBUaGlzIHN0cnVjdHVyZSBpcyBmaWxsZWQgYnkgTTR4VlNTX3NlbmRDb21tYW5kIGZ1bmN0aW9uLAotICogQG5vdGUgICAgYW5kIGlzIHVzZWQgZHVyaW5nIE00eFZTU19TdGVwIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgUHRvM0dQUCBtb2R1bGUKLSAqIEBub3RlICAgIEFsbCB0aGUgSlBHIGZpbGVzIHRvIHRyYW5zZm9ybSB0byAzR1AgYXJlIGNoYWluZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwRmlsZUluOwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgICAgICAgcEZpbGVPdXQ7Ci0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwRmlsZVRlbXA7ICAgICAgICAgICAgLyoqPCB0ZW1wb3JhcnkgZmlsZSB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB3cml0aW5nLCBOVUxMIGlzIGNzdG1lbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIgbm90IHVzZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlICAgICAgICAgICAgSW5wdXRGaWxlVHlwZTsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgaXNDcmVhdGVkOyAgICAgICAgICAgIC8qKjwgVGhpcyBib29sZWFuIGlzIHVzZWQgdG8ga25vdyBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IGZpbGUgaXMgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIG9yIG5vdCAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICBpc1Bhblpvb207ICAgICAgICAgICAgLyoqPCBSQzogQm9vbGVhbiB1c2VkIHRvIGtub3cgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuIGFuZCB6b29tIG1vZGUgaXMgZW5hYmxlZCAqLwotICAgIE00T1NBX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgUGFuWm9vbVhhOyAgICAgICAgICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGE7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWE7ICAgIC8qKjwgUkMgKi8KLSAgICBNNE9TQV9VSW50MTYgICAgICAgICAgICAgICAgICAgIFBhblpvb21YYjsgICAgICAgICAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFhiOyAgICAvKio8IFJDICovCi0gICAgTTRPU0FfVUludDE2ICAgICAgICAgICAgICAgICAgICBQYW5ab29tVG9wbGVmdFliOyAgICAvKio8IFJDICovCi0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmc7ICAgICAgICAvKio8IEZCOiB0byByZW5kZXIgb3Igbm90IHBpY3R1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3QgcmF0aW8gKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lcmF0ZSAgICBmcmFtZXJhdGU7ICAgICAgICAgICAgLyoqPCBSQyAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgIHBOZXh0OyAgICAgICAgICAgICAgICAvKio8IEFkZHJlc3Mgb2YgbmV4dCBNNHhWU1NfUHRvM0dQUF9wYXJhbXMqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCAqLwotICAgIC8qVG8gc3VwcG9ydCBBUkdCODg4ODp3aWR0aCBhbmQgaGVpZ2h0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgd2lkdGg7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgIGhlaWdodDsKLQotfSBNNHhWU1NfUHRvM0dQUF9wYXJhbXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19maWZ0aWVzU3RydWN0Ci0gKiBAYnJpZWYgICAgSXQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHhWU1MgZm9yIGZpZnRpZXMgZWZmZWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgZmlmdGllc0VmZmVjdER1cmF0aW9uOyAgICAvKio8IER1cmF0aW9uIG9mIHRoZSBzYW1lIGVmZmVjdCBpbiBhIHZpZGVvICovCi0gICAgTTRPU0FfSW50MzIgcHJldmlvdXNDbGlwVGltZTsgICAgICAgICAgLyoqPCBQcmV2aW91cyBjbGlwIHRpbWUsIHVzZWQgYnkgZnJhbWluZyBmaWx0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBTQVZJTkcgKi8KLSAgICBNNE9TQV9VSW50MzIgc2hpZnRSYW5kb21WYWx1ZTsgICAgICAgICAgICAgICAgLyoqPCBWZXJ0aWNhbCBzaGlmdCBvZiB0aGUgaW1hZ2UgKi8KLSAgICAgIE00T1NBX1VJbnQzMiBzdHJpcGVSYW5kb21WYWx1ZTsgICAgICAgICAgICAgICAgLyoqPCBIb3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBzdHJpcGUgKi8KLQotfSBNNHhWU1NfRmlmdGllc1N0cnVjdDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0NvbG9yUkdCMTYKLSAqIEBicmllZiAgICBJdCBpcyB1c2VkIGludGVybmFsbHkgYnkgeFZTUyBmb3IgUkdCMTYgY29sb3IgZWZmZWN0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNHhWU1NfVmlkZW9FZmZlY3RUeXBlIGNvbG9yRWZmZWN0VHlwZTsgICAgLypDb2xvciB0eXBlIG9mIGVmZmVjdCovCi0gICAgTTRPU0FfVUludDE2ICAgIHJnYjE2Q29sb3JEYXRhOyAgICAgICAgICAgIC8qUkdCMTYgY29sb3Igb25seSBmb3IgdGhlIFJHQjE2IGNvbG9yIGVmZmVjdCovCi19IE00eFZTU19Db2xvclN0cnVjdDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dAotICogQGJyaWVmICAgIFRoZSBDYWxsYmFjayBDb250ZXh0IHBhcmFtZXRlcnMgZm9yIFB0bzNHUFAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgIG1fRmlsZUluOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1fTmJJbWFnZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX0ltYWdlQ291bnRlcjsKLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgICBtX3RpbWVEdXJhdGlvbjsKLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICBtX3BGaWxlUmVhZFB0cjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgICAgIG1fcERlY29kZWRQbGFuZTsgLyogVXNlZCBmb3IgUGFuIGFuZCBab29tIG9ubHkgKi8KLSAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMqICAgIG1fcFB0bzNHUFBwYXJhbXM7Ci0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgIG1fYWlyX2NvbnRleHQ7Ci0gICAgTTR4VlNTX01lZGlhUmVuZGVyaW5nICAgIG1fbWVkaWFSZW5kZXJpbmc7Ci0KLX0gTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTR4VlNTX1N0YXRlCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgU3RhdGUgb2YgdGhlIHhWU1MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgPSAwLAotICAgIE00eFZTU19rU3RhdGVBbmFseXppbmcsCi0gICAgTTR4VlNTX2tTdGF0ZU9wZW5lZCwKLSAgICAvL000eFZTU19rU3RhdGVHZW5lcmF0aW5nUHJldmlldywKLSAgICAvL000eFZTU19rU3RhdGVQcmV2aWV3LAotICAgIE00eFZTU19rU3RhdGVTYXZpbmcsCi0gICAgTTR4VlNTX2tTdGF0ZVNhdmVkCi0KLX0gTTR4VlNTX1N0YXRlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGVudW0gICAgICAgIE00eFZTU19lZGl0TWljcm9TdGF0ZQotICogQGJyaWVmICAgIEludGVybmFsIE1pY3JvIHN0YXRlIG9mIHRoZSB4VlNTIGZvciBwcmV2aWV3aW5nL3NhdmluZyBzdGF0ZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNHhWU1Nfa01pY3JvU3RhdGVFZGl0aW5nID0gMCwKLSAgICBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZwotCi19IE00eFZTU19lZGl0TWljcm9TdGF0ZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICBNNHhWU1NfZWRpdE1pY3JvU3RhdGUKLSAqIEBicmllZiAgICBJbnRlcm5hbCBNaWNybyBzdGF0ZSBvZiB0aGUgeFZTUyBmb3IgYW5hbHl6aW5nIHN0YXRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00eFZTU19rTWljcm9TdGF0ZUFuYWx5c2VQdG8zR1BQID0gMCwKLSAgICBNNHhWU1Nfa01pY3JvU3RhdGVDb252ZXJ0UHRvM0dQUCwKLSAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXplTUNTLAotICAgIE00eFZTU19rTWljcm9TdGF0ZVRyYW5zY29kZU1DUwotCi19IE00eFZTU19hbmFseXNlTWljcm9TdGF0ZTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfTUNTX3BhcmFtcwotICogQGJyaWVmICAgIEludGVybmFsIHhWU1MgcGFyYW1ldGVyIGZvciBNQ1MgbW9kdWxlCi0gKiBAbm90ZSAgICBUaGlzIHN0cnVjdHVyZSBpcyBmaWxsZWQgYnkgTTR4VlNTX3NlbmRDb21tYW5kIGZ1bmN0aW9uLAotICogQG5vdGUgICAgYW5kIGlzIHVzZWQgZHVyaW5nIE00eFZTU19TdGVwIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgTUNTIG1vZHVsZQotICogQG5vdGUgICAgQWxsIHRoZSBpbnB1dCBmaWxlcyB0byB0cmFuc2NvZGUgYXJlIGNoYWluZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlSW47Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlT3V0OwotICAgIC8qKjwgdGVtcG9yYXJ5IGZpbGUgdXNlZCBmb3IgbWV0YWRhdGEgd3JpdGluZywgTlVMTCBpcyBjc3RtZW0gd3JpdGVyIG5vdCB1c2VkICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlVGVtcDsKLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgICAgICAgICAgICAgSW5wdXRGaWxlVHlwZTsKLSAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSAgICAgICAgICAgICAgICAgICAgT3V0cHV0RmlsZVR5cGU7Ci0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgICAgICAgICAgICAgICAgT3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgICAgICAgICAgICBPdXRwdXRWaWRlb0ZyYW1lU2l6ZTsKLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lcmF0ZSAgICAgICAgICAgIE91dHB1dFZpZGVvRnJhbWVSYXRlOwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvRm9ybWF0ICAgICAgICAgICAgICAgIE91dHB1dEF1ZGlvRm9ybWF0OwotICAgIE00VklERU9FRElUSU5HX0F1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgICAgT3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXVkaW9Nb25vOwotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgICAgICAgICAgICAgICAgIE91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICBNNFZJREVPRURJVElOR19CaXRyYXRlICAgICAgICAgICAgICAgICAgICBPdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCR007Ci0gICAgLyoqPCBUaGlzIGJvb2xlYW4gaXMgdXNlZCB0byBrbm93IGlmIHRoZSBvdXRwdXQgZmlsZSBpcyBhbHJlYWR5IGNyZWF0ZWQgb3Igbm90ICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDcmVhdGVkOwotICAgIC8qKjwgQWRkcmVzcyBvZiBuZXh0IE00eFZTU19NQ1NfcGFyYW1zKiBlbGVtZW50ICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0OwotCi0gICAgLypGQjogdHJhbnNjb2RpbmcgcGVyIHBhcnRzKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgQmVnaW5DdXRUaW1lOyAgICAvKio8IEJlZ2lubmluZyBjdXQgdGltZSBpbiBpbnB1dCBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgIEVuZEN1dFRpbWU7ICAgICAgLyoqPCBFbmQgY3V0IHRpbWUgaW4gaW5wdXQgZmlsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb1RpbWVzY2FsZTsgICAgLypPdXRwdXQgdGltZXNjYWxlKi8KLQotICAgIE00TUNTX01lZGlhUmVuZGVyaW5nICAgICAgICAgICAgICAgICBNZWRpYVJlbmRlcmluZzsgICAvKio8IEZCOiB0byBjcm9wLCByZXNpemUsIG9yIHJlbmRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWNrIGJvcmRlcnMqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb2NsaXBudW1iZXI7Ci0gICAgTTRPU0FfVUludDMyICBvdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgTTRPU0FfVUludDMyICBvdXRwdXRWaWRlb0xldmVsOwotfSBNNHhWU1NfTUNTX3BhcmFtczsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncwotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGFscGhhIG1hZ2ljIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgKnBQbGFuZTsKLSAgICBNNE9TQV9JbnQzMiAgICAgICAgIGJsZW5kaW5ndGhyZXNob2xkOyAgICAvKio8IEJsZW5kaW5nIFJhbmdlICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgIGlzcmV2ZXJzZTsgICAgICAgICAgICAvKio8IGRpcmVjdCBlZmZlY3Qgb3IgcmV2ZXJzZSAqLwotCi19IE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX2ludGVybmFsX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzCi0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgaW50ZXJuYWwgc2xpZGUgdHJhbnNpdGlvbiBzZXR0aW5ncwotICogQG5vdGUgICAgVGhpcyB0eXBlIGhhcHBlbnMgdG8gbWF0Y2ggdGhlIGV4dGVybmFsIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqICAgICAgICAgICAgc3RydWN0dXJlIChpLmUuIHRoZSBvbmUgd2hpY2ggaXMgZ2l2ZW4gYnkgdGhlIGFwcGxpY2F0aW9uKSwgYnV0IGFyZQotICogICAgICAgICAgICBjb25jZXB0dWFsbHkgZGlmZmVyZW50IHR5cGVzLCBzbyB0aGF0IGlmIChvciByYXRoZXIgd2hlbikgc29tZSBkYXkKLSAqICAgICAgICAgICAgdHJhbnNsYXRpb24gbmVlZHMgdG8gb2NjdXIgd2hlbiBsb2FkaW5nIHRoZSBzZXR0aW5ncyBmcm9tIHRoZSBhcHAsCi0gKiAgICAgICAgICAgIHRoaXMgc2VwYXJhdGUgdHlwZSB3aWxsIGFscmVhZHkgYmUgcmVhZHkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi10eXBlZGVmIE00eFZTU19TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyAgICBNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3M7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00eFZTU19pbnRlcm5hbEpwZWdDaHVua01vZGUKLSAqIEBicmllZiAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBjaHVuayBjYWxsYmFjayB0byBkZWNvZGUKLSAqICAgICAgICAgICAgYSBKUEVHIGJ5IGNodW5rIG1vZGUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNHhWU1NfVVRGQ29udmVyc2lvbkNvbnRleHQKLSAqIEBicmllZiAgICBJbnRlcm5hbCBVVEYgY29udmVyc2lvbiBjb250ZXh0Ci0gKiBAbm90ZSAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgVVRGIGNvbnZlcnNpb24gaW5mb3JtYXRpb25zCi0gKiAgICAgICAgICAgIG5lZWRlZCBieSB0aGUgeFZTUyB0byBtYW5hZ2UgdGhlIGRpZmZlcmVudCBmb3JtYXRzIChVVEY4LzE2L0FTQ0lJKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLypGdW5jdGlvbiBwb2ludGVyIG9uIGFuIGV4dGVybmFsIHRleHQgY29udmVyc2lvbiBmdW5jdGlvbiAqLwotICAgIE00eFZTU190b1VURjhGY3QgICAgICAgICAgICAgICAgcENvbnZUb1VURjhGY3Q7Ci0gICAgLypGdW5jdGlvbiBwb2ludGVyIG9uIGFuIGV4dGVybmFsIHRleHQgY29udmVyc2lvbiBmdW5jdGlvbiAqLwotICAgIE00eFZTU19mcm9tVVRGOEZjdCAgICAgICAgICAgICAgICBwQ29udkZyb21VVEY4RmN0OwotICAgIC8qVGVtcG9yYXJ5IGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgZWFjaCBjb252ZXJzaW9uKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAvKlNpemUgb2YgdGhlIHByZXZpb3VzIGJ1ZmZlciwgdGhlIHNpemUgaXMgcHJlZGVybWluYXRlZCovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICBtX1RlbXBPdXRDb252ZXJzaW9uU2l6ZTsKLX0gTTR4VlNTX1VURkNvbnZlcnNpb25Db250ZXh0OwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3QgICAgTTR4VlNTX0NvbnRleHQKLSAqIEBicmllZiAgICBJbnRlcm5hbCBjb250ZXh0IG9mIHRoZSB4VlNTCi0gKiBAbm90ZSAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgaW50ZXJuYWwgaW5mb3JtYXRpb25zIG5lZWRlZCBieSB0aGUgeFZTUwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAvKio8IFBvaW50ZXIgb24gT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICAgICAgICAgIHBGaWxlUmVhZFB0cjsKLSAgICAvKio8IFBvaW50ZXIgb24gT1NBTCBmaWxlIHdyaXRlIGZ1bmN0aW9ucyAqLwotICAgIE00T1NBX0ZpbGVXcml0ZXJQb2ludGVyKiAgICAgICAgcEZpbGVXcml0ZVB0cjsKLSAgICAvKio8IExvY2FsIGNvcHkgb2YgdmlkZW8gZWRpdG9yIHNldHRpbmdzICovCi0gICAgTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogICAgICAgICAgICBwU2V0dGluZ3M7Ci0gICAgLyoqPCBDdXJyZW50IFNldHRpbmdzIG9mIHZpZGVvIGVkaXRvciB0byB1c2UgaW4gc3RlcCBmdW5jdGlvbnMgZm9yIHByZXZpZXcvc2F2ZSAqLwotICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqICAgICAgICAgICAgcEN1cnJlbnRFZGl0U2V0dGluZ3M7Ci0gICAgLyoqPCBDdXJyZW50IGNvbnRleHQgb2YgdmlkZW8gZWRpdG9yIHRvIHVzZSBpbiBzdGVwIGZ1bmN0aW9ucyBmb3IgcHJldmlldy9zYXZlICovCi0gICAgTTRWU1MzR1BQX0VkaXRDb250ZXh0ICAgICAgICAgICAgcEN1cnJlbnRFZGl0Q29udGV4dDsKLSAgICAvKio8IFRoaXMgaXMgdG8ga25vdyBpZiBhIHByZXZpb3VzIE00eFZTU19zZW5kQ29tbWFuZCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDbGlwTnVtYmVyOwotICAgIC8qKjwgQXVkaW8gbWl4aW5nIHNldHRpbmdzLCBuZWVkZWQgdG8gZnJlZSBpdCBpbiBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlIGZ1bmN0aW9uKi8KLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdTZXR0aW5ncyogICAgcEF1ZGlvTWl4U2V0dGluZ3M7Ci0gICAgLyoqPCBBdWRpbyBtaXhpbmcgY29udGV4dCAqLwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgICAgcEF1ZGlvTWl4Q29udGV4dDsKLSAgICAvKio8IEZpbGUgcGF0aCBmb3IgUENNIG91dHB1dCBmaWxlOiB1c2VkIGZvciBwcmV2aWV3LCBnaXZlbiB0byB1c2VyICovCi0gICAgTTRPU0FfQ2hhciogICAgICAgICAgICAgICAgICAgICAgICBwY21QcmV2aWV3RmlsZTsKLSAgICAvKio8IER1cGxpY2F0aW9uIG9mIG91dHB1dCBmaWxlIHBvaW50ZXIsIHRvIGJlIGFibGUgdG8gdXNlIGF1ZGlvIG1peGluZyAqLwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dEZpbGU7Ci0gICAgLyoqPCBEdXBsaWNhdGlvbiBvZiB0ZW1wb3JhcnkgZmlsZSBwb2ludGVyLCB0byBiZSBhYmxlIHRvIHVzZSBhdWRpbyBtaXhpbmcgKi8KLSAgICBNNE9TQV9DaGFyKiAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlOwotICAgIC8qKjwgTWljcm8gc3RhdGUgZm9yIFNhdmluZy9QcmV2aWV3aW5nIHN0YXRlICovCi0gICAgTTR4VlNTX2VkaXRNaWNyb1N0YXRlICAgICAgICAgICAgZWRpdGluZ1N0ZXA7Ci0gICAgLyoqPCBNaWNybyBzdGF0ZSBmb3IgQW5hbHl6aW5nIHN0YXRlICovCi0gICAgTTR4VlNTX2FuYWx5c2VNaWNyb1N0YXRlICAgICAgICBhbmFseXNlU3RlcDsKLSAgICAvKio8IE5iIG9mIHN0ZXAgZm9yIGFuYWx5c2lzIG9yIHNhdmUvcHJldmlldy4gVXNlZCB0byBjb21wdXRlIHByb2dyZXNzaW9uCi0gICAgICAgICBvZiBhbmFseXNpcyBvciBzYXZlL3ByZXZpZXcgKi8KLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgIG5iU3RlcFRvdGFsOwotICAgIC8qKjwgQ3VycmVudCBzdGVwIG51bWJlciBmb3IgYW5hbHlzaXMgb3Igc2F2ZS9wcmV2aWV3ICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RlcDsKLSAgICAvKio8IFRvIGJlIGFibGUgdG8gZnJlZSBwRWZmZWN0cyBkdXJpbmcgcHJldmlldyBjbG9zZSAqLwotICAgIE00eFZTU19QcmV2aWV3U2V0dGluZ3MqICAgICAgICAgICAgcFByZXZpZXdTZXR0aW5nczsKLSAgICAvKio8IFRlbXBvcmFyeSBmaWxlIHBhdGg6IGFsbCB0ZW1wb3JhcnkgZmlsZXMgYXJlIGNyZWF0ZWQgaGVyZSAqLwotICAgIE00T1NBX0NoYXIqICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBQYXRoOwotICAgIC8qKjwgQ3VycmVudCBzdGF0ZSBvZiB4VlNTICovCi0gICAgTTR4VlNTX1N0YXRlICAgICAgICAgICAgICAgICAgICBtX3N0YXRlOwotICAgIC8qKjwgTGlzdCBvZiBzdGlsbCBwaWN0dXJlcyBpbnB1dCB0byBjb252ZXJ0IHRvIDNHUCB3aXRoIHBhcmFtZXRlcnMgKi8KLSAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMqICAgICAgICAgICAgcFBUbzNHUFBwYXJhbXNMaXN0OwotICAgIC8qKjwgQ3VycmVudCBlbGVtZW50IG9mIHRoZSBhYm92ZSBjaGFpbmVkIGxpc3QgYmVlaW5nIHByb2Nlc3NkIGJ5IHRoZSBQdG8zR1BQICovCi0gICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zKiAgICAgICAgICAgIHBQVG8zR1BQY3VycmVudFBhcmFtczsKLSAgICAvKio8IEN1cnJlbnQgUHRvM0dQUCBjb250ZXh0LCBuZWVkZWQgdG8gY2FsbCBQdG8zR1BQX3N0ZXAgZnVuY3Rpb24gaW4gTTR4VlNTX3N0ZXAgZnVuY3Rpb24gKi8KLSAgICBNNFBUTzNHUFBfQ29udGV4dCAgICAgICAgICAgICAgICBwTTRQVE8zR1BQX0N0eHQ7Ci0gICAgLyoqPCBQb2ludGVyIG9uIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBvZiB0aGUgUHRvM0dQUCBtb2R1bGUgKi8KLSAgICBNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCogICAgICAgIHBDYWxsQmFja0N0eHQ7Ci0gICAgLyoqPCBMaXN0IG9mIGZpbGVzIHRvIHRyYW5zY29kZSB3aXRoIHBhcmFtZXRlcnMgKi8KLSAgICBNNHhWU1NfTUNTX3BhcmFtcyogICAgICAgICAgICAgICAgcE1DU3BhcmFtc0xpc3Q7Ci0gICAgLyoqPCBDdXJyZW50IGVsZW1lbnQgb2YgdGhlIGFib3ZlIGNoYWluZWQgbGlzdCBiZWVpbmcgcHJvY2Vzc2QgYnkgdGhlIE1DUyAqLwotICAgIE00eFZTU19NQ1NfcGFyYW1zKiAgICAgICAgICAgICAgICBwTUNTY3VycmVudFBhcmFtczsKLSAgICAvKio8IEN1cnJlbnQgTUNTIGNvbnRleHQsIG5lZWRlZCB0byBjYWxsIE1DU19zdGVwIGZ1bmN0aW9uIGluIE00eFZTU19zdGVwIGZ1bmN0aW9uKi8KLSAgICBNNE1DU19Db250ZXh0ICAgICAgICAgICAgICAgICAgICBwTUNTX0N0eHQ7Ci0gICAgLyoqPCBJbmRleCB0byBoYXZlIHVuaXF1ZSB0ZW1wb3JhcnkgZmlsZW5hbWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHRlbXBGaWxlSW5kZXg7Ci0gICAgLyoqPCBJbiBjYXNlIG9mIE1NUyB1c2UgY2FzZSwgdGFyZ2V0ZWQgYml0cmF0ZSB0byByZWFjaCBvdXRwdXQgZmlsZSBzaXplICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICAgICB0YXJnZXRlZEJpdHJhdGU7Ci0gICAgLyoqPCBJZiB0aGUgc2VuZENvbW1hbmQgZmN0IGlzIGNhbGxlZCB0d2ljZSBvciBtb3JlLCB0aGUgZmlyc3QgY29tcHV0ZWQgdGltZXNjYWxlCi0gICAgICAgIHJlY29yZGVkIGhlcmUgbXVzdCBiZSByZXVzZWQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgIHRhcmdldGVkVGltZXNjYWxlOwotCi0gICAgLypVVEYgQ29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNHhWU1NfVVRGQ29udmVyc2lvbkNvbnRleHQgICAgVVRGQ29udmVyc2lvbkNvbnRleHQ7ICAgIC8qVVRGIGNvbnZlcnNpb24gY29udGV4dCBzdHJ1Y3R1cmUqLwotCi19IE00eFZTU19Db250ZXh0OwotCi0vKioKLSAqIEludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqcm90YXRpb25EZWdyZWUpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRGVjb2RlSlBHKE00T1NBX1ZvaWQqIHBGaWxlSW4sIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSoqIHBJbWFnZVBsYW5lcyk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4ODh0b1lVVjQyMChNNE9TQV9Wb2lkKiBwRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiogcEltYWdlUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCxNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVBbmRSZXNpemVKUEcoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMpOwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCk7Ci0KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbERlY29kZUdJRihNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbERlY29kZUdJRl9Jbml0aWFsaXphdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbERlY29kZUdJRl9DbGVhbmluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotI2Vsc2UKLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVHSUYoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKiBwRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCk7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0KE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRnJhbWVTaXplIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0VmlkZW9SZXNvbHV0aW9uKTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlRWRpdGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEZyZWVQcmV2aWV3KE00T1NBX0NvbnRleHQgcENvbnRleHQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVNhdmluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19mcmVlU2V0dGluZ3MoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyogcFNldHRpbmdzKTsKLQotTTRPU0FfRVJSIE00eFZTU19mcmVlQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0KTsKLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ2hhciogcEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMpOwotCi1NNE9TQV9FUlIgTTR4VlNTX0FscGhhTWFnaWMoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpVHJhbnNpdGlvbktpbmQpOwotCi1NNE9TQV9FUlIgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKTsKLQotTTRPU0FfRVJSIE00eFZTU19GYWRlQmxhY2tUcmFuc2l0aW9uKE00T1NBX1ZvaWQgKnVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSxNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBUYXJnZXRlZFRpbWVTY2FsZSk7Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBCdWZmZXJPdXQsIE00T1NBX1VJbnQzMiogY29udmVydGVkU2l6ZSk7Ci0KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBCdWZmZXJPdXQsIE00T1NBX1VJbnQzMiogY29udmVydGVkU2l6ZSk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLSNlbmRpZiAvKiBfX000WFZTU19JTlRFUk5BTF9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDUzZTdkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfQVBJLmggYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19BUEkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTg5ODdlMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19BUEkuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNE1DU19BUEkuaAotICogQGJyaWVmICAgTWVkaWEgQ29udmVyc2lvbiBTZXJ2aWNlIHB1YmxpYyBBUEkuCi0gKiBAbm90ZSAgICBNQ1MgYWxsb3dzIHRyYW5zY29kaW5nIGEgM2dwL21wNCBmaWxlIGludG8gYSBuZXcgM2dwL21wNCBmaWxlIGNoYW5naW5nIHRoZQotICogICAgICAgICAgdmlkZW8gYW5kIGF1ZGlvIGVuY29kaW5nIHNldHRpbmdzLgotICogICAgICAgICAgSXQgaXMgYSBzdHJhaWdodGZvcndhcmQgYW5kIGZ1bGx5IHN5bmNocm9ub3VzIEFQSS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWZuZGVmIF9fTTRNQ1NfQVBJX0hfXwotI2RlZmluZSBfX000TUNTX0FQSV9IX18KLQotLyoqCi0gKiAgICBPU0FMIGJhc2ljIHR5cGVzIGFuZCBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0KLS8qKgotICogICAgT1NBTCB0eXBlcyBmb3IgZmlsZSBhY2Nlc3MgKi8KLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotCi0vKioKLSAqICAgIERlZmluaXRpb24gb2YgTTRfVmVyc2lvbkluZm8gKi8KLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLQotLyoqCi0gKiBDb21tb24gZGVmaW5pdGlvbnMgb2YgdmlkZW8gZWRpdGluZyBjb21wb25lbnRzICovCi0jaW5jbHVkZSAiTTRfVmlkZW9FZGl0aW5nQ29tbW9uLmgiCi0KLS8qKgotICogVG8gZW5hYmxlIGV4dGVybmFsIGF1ZGlvIGNvZGVjcyByZWdpc3RlcmluZyovCi0jaW5jbHVkZSAiTTRBRF9Db21tb24uaCIKLSNpbmNsdWRlICJNNEVOQ09ERVJfQXVkaW9Db21tb24uaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioKLSAqICAgIFB1YmxpYyB0eXBlIG9mIHRoZSBNQ1MgY29udGV4dCAqLwotdHlwZWRlZiBNNE9TQV9Wb2lkKiBNNE1DU19Db250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgTTRNQ1NfTWVkaWFSZW5kZXJpbmcKLSAqIEBicmllZiAgICBUaGlzIGVudW0gZGVmaW5lcyBkaWZmZXJlbnQgbWVkaWEgcmVuZGVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TUNTX2tSZXNpemluZyA9IDAsICAgIC8qKjwgVGhlIG1lZGlhIGlzIHJlc2l6ZWQsIHRoZSBhc3BlY3QgcmF0aW8gY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgb25lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIG9mIHRoZSBtZWRpYSBpcyByZW5kZXJlZCAqLwotICAgIE00TUNTX2tDcm9wcGluZywgICAgICAgIC8qKjwgVGhlIG1lZGlhIGlzIGNyb3BwZWQsIHRoZSBhc3BlY3QgcmF0aW8gaXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lIGFzIHRoZSBvcmlnaW5hbCBvbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWVkaWEgaXMgbm90IHJlbmRlcmVkIGVudGlyZWx5ICovCi0gICAgTTRNQ1Nfa0JsYWNrQm9yZGVycyAgICAgLyoqPCBCbGFjayBib3JkZXJzIGFyZSByZW5kZXJlZCBpbiBvcmRlciB0byBrZWVwIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwgYXNwZWN0IHJhdGlvLiBBbGwgdGhlIG1lZGlhIGlzIHJlbmRlcmVkICovCi19IE00TUNTX01lZGlhUmVuZGVyaW5nOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcwotICogQGJyaWVmICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8gdGhlIGV4dGVybmFsIEVmZmVjdCBmdW5jdGlvbnMKLSAqIEBub3RlICAgIFRoZSB1aVByb2dyZXNzIHZhbHVlIHNob3VsZCBiZSBlbm91Z2ggZm9yIG1vc3QgY2FzZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgdWlQcm9ncmVzczsgICAgIC8qKjwgUHJvZ3Jlc3Mgb2YgdGhlIEVmZmVjdCBmcm9tIDAgdG8gMTAwMCAob25lIHRob3VzYW5kKSAqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aUNsaXBUaW1lOyAgICAgLyoqPCBDdXJyZW50IHRpbWUsIGluIG1pbGxpc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBjdXJyZW50IGNsaXAgdGltZS1saW5lICovCi0gICAgTTRPU0FfVUludDMyICAgIHVpT3V0cHV0VGltZTsgICAvKio8IEN1cnJlbnQgdGltZSwgaW4gbWlsbGlzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dHB1dCBjbGlwIHRpbWUtbGluZSAqLwotCi19IE00TUNTX0V4dGVybmFsUHJvZ3Jlc3M7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICBNNE1DU19BdWRpb0VmZmVjdFR5cGUKLSAqIEBicmllZiAgIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgYXVkaW8gZWZmZWN0IHR5cGVzIG9mIHRoZSBNQ1MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9Ob25lICAgID0gMCwKLSAgICBNNE1DU19rQXVkaW9FZmZlY3RUeXBlX0ZhZGVJbiAgPSA4LCAvKio8IEludGVuZGVkIGZvciBiZWdpbiBlZmZlY3QgKi8KLSAgICBNNE1DU19rQXVkaW9FZmZlY3RUeXBlX0ZhZGVPdXQgPSAxNiwgLyoqPCBJbnRlbmRlZCBmb3IgZW5kIGVmZmVjdCAqLwotICAgIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfRXh0ZXJuYWwgPSAyNTYKLQotfSBNNE1DU19BdWRpb0VmZmVjdFR5cGU7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0Ci0gKiBAYnJpZWYgICAgICAgQXVkaW8gZWZmZWN0IGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBieSB0aGUgaW50ZWdyYXRvcgotICogICAgICAgICAgICAgIG11c3QgbWF0Y2ggdGhpcyBwcm90b3R5cGUuCi0gKiBAbm90ZSAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHdpdGggdGhlIG9yaWdpbmFsIFBDTSBkYXRhIGJ1ZmZlciBhbmQgaXRzIHNpemUuCi0gKiAgICAgICAgICAgICAgQXVkaW8gZWZmZWN0IGhhdmUgdG8gYmUgYXBwbGllZCBvbiBpdC4KLSAqICAgICAgICAgICAgICBUaGUgcHJvZ3Jlc3Mgb2YgdGhlIGVmZmVjdCBpcyBnaXZlbiwgb24gYSBzY2FsZSBmcm9tIDAgdG8gMTAwMC4KLSAqICAgICAgICAgICAgICBXaGVuIHRoZSBlZmZlY3QgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbGwgdGhlIGJ1ZmZlcnMgYXJlIHZhbGlkIGFuZAotICogICAgICAgICAgICAgIG93bmVkIGJ5IHRoZSBNQ1MuCi0gKgotICogQHBhcmFtICAgcEZ1bmN0aW9uQ29udGV4dCAgICAoSU4pIFRoZSBmdW5jdGlvbiBjb250ZXh0LCBwcmV2aW91c2x5IHNldCBieSB0aGUgaW50ZWdyYXRvcgotICogQHBhcmFtICAgcFBDTWRhdGEgICAgICAgICAgICAoSU4vT1VUKSB2YWxpZCBQQ00gZGF0YSBidWZmZXIKLSAqIEBwYXJhbSAgIHVpUENNc2l6ZSAgICAgICAgICAgKElOL09VVCkgUENNIGRhdGEgYnVmZmVyIGNvcnJlc3BvbmRpbmcgc2l6ZQotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgICAgICAoSU4pIFNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXVkaW8gZWZmZWN0IHByb2dyZXNzLgotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIE00T1NBX0VSUiAoKk00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdCkKLSgKLSAgICBNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICAgIE00T1NBX0ludDE2ICpwUENNZGF0YSwKLSAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplLAotICAgIE00TUNTX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcwotKTsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgIE00TUNTX0VmZmVjdFNldHRpbmdzCi0gKiBAYnJpZWYgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGFuIGF1ZGlvIGVmZmVjdCBmb3IgdGhlIGVkaXRpb24uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgICB1aVN0YXJ0VGltZTsgICAgICAgICAgICAgIC8qKjwgSW4gbXMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgIHVpRHVyYXRpb247ICAgICAgICAgICAgICAgLyoqPCBJbiBtcyAqLwotICAgIE00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdCAgICAgRXh0QXVkaW9FZmZlY3RGY3Q7ICAgICAgICAvKio8IEV4dGVybmFsIGVmZmVjdCBmdW5jdGlvbiAqLwotICAgIE00T1NBX1ZvaWQgICAgICAgICAgICAgICAgICAgKnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQ7ICAvKio8IENvbnRleHQgZ2l2ZW4gdG8gdGhlIGV4dGVybmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0IGZ1bmN0aW9uICovCi0gICAgTTRNQ1NfQXVkaW9FZmZlY3RUeXBlICAgICAgICBBdWRpb0VmZmVjdFR5cGU7ICAgICAgICAgLyoqPCBOb25lLCBGYWRlSW4sIEZhZGVPdXQgKi8KLQotfSBNNE1DU19FZmZlY3RTZXR0aW5nczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICBNNE1DU19PdXRwdXRQYXJhbXMKLSAqIEBicmllZiAgICBNQ1MgT3V0cHV0IHBhcmFtZXRlcnMKLSAqIEBub3RlICAgICBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdXNlZCBmb3Igc3RpbGwgcGljdHVyZSBpbnB1dHMgOgotICogICAgICAgICAgICAgLSBPdXRwdXRGaWxlVHlwZSAobXVzdCBiZSBzZXQgdG8gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRykKLSAqICAgICAgICAgICAgIC0gYkRpc2NhcmRFeGlmIG11c3QgYmUgc2V0IHRvIE00T1NBX1RSVUUgb3IgTTRPU0FfRkFMU0UKLSAqICAgICAgICAgICAgIC0gYkFkanVzdE9yaWVudGF0aW9uIG11c3QgYmUgc2V0IHRvIE00T1NBX1RSVUUgb3IgTTRPU0FfRkFMU0UKLSAqICAgICAgICAgICAgIC0gKE1lZGlhUmVuZGVyaW5nIGlzIG5vdCBoYW5kbGVkIDogb3V0cHV0IGltYWdlIHJlc29sdXRpb24gaXMgYWx3YXlzCi0gICAgICAgICAgICAgICAgIHNldCBhY2NvcmRpbmcgdG8gQmVzdEZpdCBjcml0ZXJpYSkKLSAqICAgICAgICAgICAgYkRpc2NhcmRFeGlmIGFuZCBiQWRqdXN0T3JpZW50YXRpb24gYXJlIHN0aWxsIHBpY3R1cmUgb25seSBwYXJhbWV0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqPCBGb3JtYXQgb2YgdGhlIG91dHB1dCBmaWxlICovCi0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgICAgICAgICAgICAgICAgIE91dHB1dEZpbGVUeXBlOwotICAgIC8qKjwgT3V0cHV0IHZpZGVvIGNvbXByZXNzaW9uIGZvcm1hdCwgc2VlIGVudW0gKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0Zvcm1hdCAgICAgICAgICAgICAgT3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgLyoqPCBPdXRwdXQgZnJhbWUgc2l6ZSA6IFFRVkdBLCBRQ0lGIG9yIFNRQ0lGICovCi0gICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemUgICAgICAgICAgIE91dHB1dFZpZGVvRnJhbWVTaXplOwotICAgIC8qKjwgVGFyZ2V0ZWQgT3V0cHV0IGZyYW1lcmF0ZSwgc2VlIGVudW0gKi8KLSAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lcmF0ZSAgICAgICAgICAgT3V0cHV0VmlkZW9GcmFtZVJhdGU7Ci0gICAgLyoqPCBGb3JtYXQgb2YgdGhlIGF1ZGlvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdCAgICAgICAgICAgICAgT3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgLyoqPCBTYW1wbGluZyBmcmVxdWVuY3kgb2YgdGhlIGF1ZGlvIGluIHRoZSBzdHJlYW0gKi8KLSAgICBNNFZJREVPRURJVElOR19BdWRpb1NhbXBsaW5nRnJlcXVlbmN5ICAgT3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAvKio8IFNldCB0byBNNE9TQV9UUlVFIGlmIHRoZSBvdXRwdXQgYXVkaW8gaXMgbW9ubyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXVkaW9Nb25vOwotICAgIC8qKjwgT3V0cHV0IFBDTSBmaWxlIGlmIG5vdCBOVUxMICovCi0gICAgTTRPU0FfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwT3V0cHV0UENNZmlsZTsKLSAgICAvKio8IFRvIGNyb3AsIHJlc2l6ZSwgb3IgcmVuZGVyIGJsYWNrIGJvcmRlcnMqLwotICAgIE00TUNTX01lZGlhUmVuZGVyaW5nICAgICAgICAgICAgICAgICAgICBNZWRpYVJlbmRlcmluZzsKLSAgICAvKio8IExpc3Qgb2YgZWZmZWN0cyAqLwotICAgIE00TUNTX0VmZmVjdFNldHRpbmdzICAgICAgICAgICAgICAgICAgICAqcEVmZmVjdHM7Ci0gICAgLyoqPCBOdW1iZXIgb2YgZWZmZWN0cyBpbiB0aGUgYWJvdmUgbGlzdCAqLwotICAgIE00T1NBX1VJbnQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYkVmZmVjdHM7Ci0KLSAgICAvKi0tLSBTVElMTCBQSUNUVVJFIC0tLSovCi0gICAgLyoqPCBUUlVFOiBFdmVuIGlmIHRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIGFuIEVYSUYgc2VjdGlvbiwKLSAgICB0aGUgb3V0cHV0IGZpbGUgd29uJ3QgY29udGFpbiBhbnkgRVhJRiBzZWN0aW9uLiovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEaXNjYXJkRXhpZiA7Ci0KLSAgICAvKio8ID1UUlVFIDogcGljdHVyZSBtdXN0IGJlIHJvdGF0ZWQgaWYgRXhpZiB0YWdzIGhvbGQgYSByb3RhdGlvbiBpbmZvCi0gICAgKGFuZCByb3RhdGlvbiBpbmZvIGlzIHNldCB0byAwKSovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBZGp1c3RPcmllbnRhdGlvbiA7Ci0gICAgLyotLS0gU1RJTEwgUElDVFVSRSAtLS0qLwotICAgIE00T1NBX0ludDMyIG91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBNNE9TQV9JbnQzMiBvdXRwdXRWaWRlb0xldmVsOwotfSBNNE1DU19PdXRwdXRQYXJhbXM7Ci0KLS8qLS0tIFNUSUxMIFBJQ1RVUkUgLS0tKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgIE00TUNTX1NQT3V0cHV0UmVzb2x1dGlvbgotICogQGJyaWVmICAgIFN0aWxsIHBpY3R1cmUgc3BlY2lmaWMgOiBNQ1Mgb3V0cHV0IHRhcmdldGVkIGZpbGUgcmVzb2x1dGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1DU19rUmVzU2FtZUFzSW5wdXQgICAgICAgPSAweDAwLCAvKndpZHRoIHggaGVpZ2h0Ki8KLSAgICBNNE1DU19rUmVzUVZHQSAgICAgICAgICAgICAgPSAweDAxLCAvKjMyMHgyNDAqLwotICAgIE00TUNTX2tSZXNWR0EgICAgICAgICAgICAgICA9IDB4MDIsIC8qNjQweDQ4MCovCi0gICAgTTRNQ1Nfa1Jlc1dRVkdBICAgICAgICAgICAgID0gMHgwMywgLyo0MDB4MjQwKi8KLSAgICBNNE1DU19rUmVzV1ZHQSAgICAgICAgICAgICAgPSAweDA0LCAvKjgwMHg0ODAqLwotICAgIE00TUNTX2tSZXNYR0EgICAgICAgICAgICAgICA9IDB4MDUsIC8qMTAyNHg3NjgqLwotICAgIE00TUNTX2tSZXNDdXN0b20gICAgICAgICAgICA9IDB4RkYgIC8qU2l6ZSBpcyBzZXQgdmlhIFN0aWxsUGljdHVyZUN1c3RvbVdpZHRoL0hlaWdodCovCi19IE00TUNTX1NQT3V0cHV0UmVzb2x1dGlvbiA7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgTTRNQ1NfU1BTdHJhdGVneQotICogQGJyaWVmICAgIFN0aWxsIHBpY3R1cmUgc3BlY2lmaWMgOiBNQ1Mgc3RyYXRlZ3kgdG8gY29uZmlndXJlIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TUNTX2tGaWxlU2l6ZU9ubHlGaXhlZCAgICAgICAgICAgID0gMHgwMCwgLypTdGlsbFBpY3R1cmVSZXNvbHV0aW9uIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxpdHlGYWN0b3IgYXJlIGlnbm9yZWQqLwotICAgIE00TUNTX2tGaWxlU2l6ZUFuZFJlc0ZpeGVkICAgICAgICAgID0gMHgwMSwgLypRdWFsaXR5RmFjdG9yIGlzIGlnbm9yZWQqLwotICAgIE00TUNTX2tRdWFsaXR5QW5kUmVzRml4ZWQgICAgICAgICAgID0gMHgwMiAgLypPdXRwdXRGaWxlU2l6ZSBpcyBpZ25vcmVkKi8KLX0gTTRNQ1NfU1BTdHJhdGVneSA7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgTTRNQ1NfU1BDcm9wCi0gKiBAYnJpZWYgICAgU3RpbGwgcGljdHVyZSBzcGVjaWZpYyA6IGluZGljYXRlIHdoZXRoZXIgY3JvcHBpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgY2hhbmdpbmcgdGhlIHJlc29sdXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRNQ1Nfa05vQ3JvcCAgICAgICAgICAgICAgICA9IDB4MDAsIC8qTm8gQ3JvcHBpbmcgaXMgcGVyZm9ybWVkKi8KLSAgICBNNE1DU19rQ3JvcEJlZm9yZVJlc2l6ZSAgICAgID0gMHgwMSAgLypJbnB1dCBpbWFnZSBpcyBjcm9wcGVkIChiZWZvcmUgY2hhbmdpbmcgcmVzb2x1dGlvbikqLwotfSBNNE1DU19TUENyb3AgOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0ICAgIE00TUNTX0VuY29kaW5nUGFyYW1zCi0gKiBAYnJpZWYgICAgTUNTIGZpbGUgc2l6ZSwgYml0cmF0ZSBhbmQgY3V0IHBhcmFtZXRlcnMKLSAqIEBub3RlICAgICBGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdXNlZCBmb3Igc3RpbGwgcGljdHVyZSBpbnB1dHMgOgotICogICAgICAgICAgICAgLSBPdXRwdXRGaWxlU2l6ZQotICogICAgICAgICAgICAgLSBTdGlsbFBpY3R1cmVSZXNvbHV0aW9uCi0gKiAgICAgICAgICAgICAtIFF1YWxpdHlGYWN0b3IKLSAqICAgICAgICAgICAgIC0gU3RpbGxQaWN0dXJlU3RyYXRlZ3kKLSAqICAgICAgICAgICAgIC0gU3RpbGxQaWN0dXJlQ3VzdG9tV2lkdGgvSGVpZ2h0IChpZiBTdGlsbFBpY3R1cmVSZXNvbHV0aW9uPT1NNE1DU19rUmVzQ3VzdG9tKQotICogICAgICAgICAgICBTdGlsbCBwaWN0dXJlIG9ubHkgcGFyYW1ldGVycyA6IFN0aWxsUGljdHVyZVJlc29sdXRpb24sIFF1YWxpdHlGYWN0b3IsCi0gKiAgICAgICAgICAgIFN0aWxsUGljdHVyZVN0cmF0ZWd5IGFuZCBTdGlsbFBpY3R1cmVDdXN0b21XaWR0aC9IZWlnaHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFZJREVPRURJVElOR19CaXRyYXRlICAgIE91dHB1dFZpZGVvQml0cmF0ZTsgICAgIC8qKjwgVGFyZ2V0ZWQgdmlkZW8gYml0cmF0ZSAqLwotICAgIE00VklERU9FRElUSU5HX0JpdHJhdGUgICAgT3V0cHV0QXVkaW9CaXRyYXRlOyAgICAgLyoqPCBUYXJnZXRlZCBhdWRpbyBiaXRyYXRlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICBCZWdpbkN1dFRpbWU7ICAgICAgICAgICAvKio8IEJlZ2lubmluZyBjdXQgdGltZSBpbiBpbnB1dCBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICBFbmRDdXRUaW1lOyAgICAgICAgICAgICAvKio8IEVuZCBjdXQgdGltZSBpbiBpbnB1dCBmaWxlICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICBPdXRwdXRGaWxlU2l6ZTsgICAgICAgICAvKio8IEV4cGVjdGVkIHJlc3VsdGluZyBmaWxlIHNpemUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIE91dHB1dFZpZGVvVGltZXNjYWxlOyAgIC8qKjwgT3B0aW9uYWwgcGFyYW1ldGVyIHVzZWQgdG8gZml4IGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXNjYWxlIGR1cmluZyB0cmFuc2NvZGluZyAqLwotCi0gICAgLyotLS0gU1RJTEwgUElDVFVSRSAtLS0qLwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgICAgUXVhbGl0eUZhY3RvciA7ICAgICAgICAgLyoqPCA9LTEgKHVuZGVmaW5lZCkgb3IgMChsb3dlc3QpLi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwKGJlc3QpIDogVGhpcyBwYXJhbWV0ZXIgaXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5IGluZGljYXRpb24gZm9yIHRoZSBKUEVHIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSAoaWYgPS0xIHRoZSBNQ1Mgd2lsbCBzZXQgcXVhbGl0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSkqLwotICAgIE00TUNTX1NQU3RyYXRlZ3kgICAgICAgICAgICBTdGlsbFBpY3R1cmVTdHJhdGVneSA7IC8qKjwgRGVmaW5lcyB3aGljaCBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudCBieSBNQ1MqLwotICAgIE00TUNTX1NQT3V0cHV0UmVzb2x1dGlvbiAgICBTdGlsbFBpY3R1cmVSZXNvbHV0aW9uOy8qKjwgRGVzaXJlZCBvdXRwdXQgcmVzb2x1dGlvbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgc3RpbGwgcGljdHVyZSBmaWxlICovCi0gICAgLyoqPCAob25seSBpZiBSZXNvbHV0aW9uPT1NNE1DU19rUmVzQ3VzdG9tKSA6IEN1c3RvbSBvdXRwdXQgaW1hZ2Ugd2lkdGggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgU3RpbGxQaWN0dXJlQ3VzdG9tV2lkdGg7Ci0gICAgLyoqPCAob25seSBpZiBSZXNvbHV0aW9uPT1NNE1DU19rUmVzQ3VzdG9tKSA6IEN1c3RvbSBvdXRwdXQgaW1hZ2UgaGVpZ2h0ICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUN1c3RvbUhlaWdodDsKLSAgICAvKio8IEluZGljYXRlIHdoZXRoZXIgQ3JvcCBzaG91bGQgYmUgcGVyZm9ybWVkICovCi0gICAgTTRNQ1NfU1BDcm9wICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUNyb3A7Ci0gICAgLyoqPCAob25seSBpZiBjcm9wcGluZykgWCBjb29yZGluYXRlIG9mIHRvcGxlZnQgY29ybmVyIG9mIHRoZSBjcm9wIHdpbmRvdyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBTdGlsbFBpY3R1cmVDcm9wX1g7Ci0gICAgLyoqPCAob25seSBpZiBjcm9wcGluZykgWSBjb29yZGluYXRlIG9mIHRvcGxlZnQgY29ybmVyIG9mIHRoZSBjcm9wIHdpbmRvdyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgICBTdGlsbFBpY3R1cmVDcm9wX1k7Ci0gICAgLyoqPCAob25seSBpZiBjcm9wcGluZykgV2lkdGggb2YgdGhlIGNyb3Agd2luZG93IChpbiBwaXhlbHMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUNyb3BfVzsKLSAgICAvKio8IChvbmx5IGlmIGNyb3BwaW5nKSBIZWlnaHQgb2YgdGhlIGNyb3Agd2luZG93IChpbiBwaXhlbHMpICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIFN0aWxsUGljdHVyZUNyb3BfSDsKLSAgICAvKi0tLSBTVElMTCBQSUNUVVJFIC0tLSovCi19IE00TUNTX0VuY29kaW5nUGFyYW1zOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19nZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pOwotICogQGJyaWVmICAgIEdldCB0aGUgTUNTIHZlcnNpb24uCi0gKiBAbm90ZSBDYW4gYmUgY2FsbGVkIGFueXRpbWUuIERvIG5vdCBuZWVkIGFueSBjb250ZXh0LgotICogQHBhcmFtICAgIHBWZXJzaW9uSW5mbyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwVmVyc2lvbkluZm8gaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2luaXQoTTRNQ1NfQ29udGV4dCogcENvbnRleHQsIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVQdHJGY3QpOwotICogQGJyaWVmICAgIEluaXRpYWxpemVzIHRoZSBNQ1MgKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgTUNTIGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwRmlsZVJlYWRQdHJGY3QgICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgcmVhZGVyIGZ1bmN0aW9ucwotICogQHBhcmFtICAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19pbml0KE00TUNTX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ckZjdCwKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogcEZpbGVXcml0ZVB0ckZjdCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX29wZW4oTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVJbiwgTTRPU0FfVm9pZCogcEZpbGVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aU1heE1ldGFkYXRhU2l6ZSk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE1DUyBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLgotICogQG5vdGUgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgaXMgbm90IGNyZWF0ZWQgeWV0LgotICogICAgICAgICAgSW4gY2FzZSBvZiBzdGlsbCBwaWN0dXJlLCBmb3VyIElucHV0RmlsZVR5cGUgYXJlIHBvc3NpYmxlCi0gKiAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRy9CTVAvR0lGL1BORwotICogICAgICAgICAgSWYgb25lIG9mIHRoZW0gaXMgc2V0LCB0aGUgT3V0cHV0RmlsZVR5cGUgU0hBTEwgYmUgc2V0IHRvIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9KUEcKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcEZpbGVJbiAgICAgICAgICAgICAoSU4pIElucHV0IGZpbGUgdG8gdHJhbnNjb2RlIChUaGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVJMLCBwaXBlLi4uKSBkZXBlbmRzIG9uIHRoZSBPU0FMIGltcGxlbWVudGF0aW9uKS4KLSAqIEBwYXJhbSAgIG1lZGlhVHlwZSAgICAgICAgICAgKElOKSBDb250YWluZXIgdHlwZSAoLjNncCwuYW1yLCAuLi4pIG9mIGlucHV0IGZpbGUuCi0gKiBAcGFyYW0gICBwRmlsZU91dCAgICAgICAgICAgIChJTikgT3V0cHV0IGZpbGUgdG8gY3JlYXRlICAoVGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVSTCwgcGlwZS4uLikgZGVwZW5kcyBvbiB0aGUgT1NBTCBpbXBsZW1lbnRhdGlvbikuCi0gKiBAcGFyYW0gICBwVGVtcEZpbGUgICAgICAgICAgIChJTikgVGVtcG9yYXJ5IGZpbGUgZm9yIHRoZSBjb25zdGFudCBtZW1vcnkgd3JpdGVyIHRvIHN0b3JlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhICgibW9vdi5iaW4iKS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiAgIFRoZSBpbnB1dCBmaWxlIGhhcyBub3QgYmVlbiBmb3VuZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRTogICBUaGUgaW5wdXQgZmlsZSBpcyBub3QgYSB2YWxpZCBmaWxlLCBvciBpcyBjb3JydXB0ZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU06ICBUaGUgaW5wdXQgZmlsZSBjb250YWlucyBubwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYXVkaW8gb3IgdmlkZW8gc3RyZWFtCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19vcGVuKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBJbnB1dEZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3N0ZXAoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyk7Ci0gKiBAYnJpZWYgICBQZXJmb3JtIG9uZSBzdGVwIG9mIHRyYW5jb2RpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUHJvZ3Jlc3MgICAgICAgICAgIChPVVQpIFByb2dyZXNzIHBlcmNlbnRhZ2UgKDAgdG8gMTAwKSBvZiB0aGUgdHJhbnNjb2RpbmcKLSAqIEBub3RlICAgIHBQcm9ncmVzcyBtdXN0IGJlIGEgdmFsaWQgYWRkcmVzcy4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgT25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORTogVHJhbnNjb2RpbmcgaXMgb3ZlciwgdXNlciBzaG91bGQgbm93IGNhbGwgTTRNQ1NfY2xvc2UoKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEOiBUaGUgYXVkaW8gY29udmVyc2lvbiAoQUFDIHRvIEFNUi1OQiwgTVAzKSBmYWlsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1k6IFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIGFuIEFBQyBhdWRpbyB0cmFjawotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYW4gaW52YWxpZCBzYW1wbGluZyBmcmVxdWVuY3kKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hvdWxkIG5ldmVyIGhhcHBlbikKLSAqIEByZXR1cm4gIE00TUNTX1dBUl9QSUNUVVJFX0FVVE9fUkVTSVpFOiBQaWN0dXJlIHdpbGwgYmUgYXV0b21hdGljYWxseSByZXNpemVkIHRvIGZpdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIHJlcXVpcmVtZW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc3RlcChNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9VSW50OCAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfcGF1c2UoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBQYXVzZSB0aGUgdHJhbnNjb2RpbmcgaS5lLiByZWxlYXNlIHRoZSAoZXh0ZXJuYWwgaGFyZHdhcmUpIHZpZGVvIGRlY29kZXIuCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBuZWVkZWQgaWYgbm8gaGFyZHdhcmUgYWNjZWxlcmF0b3JzIGFyZSB1c2VkLgotICogICAgICAgICAgSW4gdGhhdCBjYXNlLCBwYXVzaW5nIHRoZSBNQ1MgaXMgc2ltcGx5IGFjaGlldmVkIGJ5IHRlbXBvcmFyaWx5IHN1c3BlbmRpbmcKLSAqICAgICAgICAgIHRoZSBNNE1DU19zdGVwIGZ1bmN0aW9uIGNhbGxzLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19wYXVzZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfcmVzdW1lKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgUmVzdW1lIHRoZSB0cmFuc2NvZGluZyBhZnRlciBhIHBhdXNlIChzZWUgTTRNQ1NfcGF1c2UpLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgbmVlZGVkIGlmIG5vIGhhcmR3YXJlIGFjY2VsZXJhdG9ycyBhcmUgdXNlZC4KLSAqICAgICAgICAgIEluIHRoYXQgY2FzZSwgcmVzdW1pbmcgdGhlIE1DUyBpcyBzaW1wbHkgYWNoaWV2ZWQgYnkgY2FsbGluZwotICogICAgICAgICAgdGhlIE00TUNTX3N0ZXAgZnVuY3Rpb24uCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3Jlc3VtZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfY2xvc2UoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgRmluaXNoIHRoZSBNQ1MgdHJhbnNjb2RpbmcuCi0gKiBAbm90ZSBUaGUgb3V0cHV0IDNHUFAgZmlsZSBpcyByZWFkeSB0byBiZSBwbGF5ZWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqIEByZXR1cm4gICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19jbG9zZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfY2xlYW5VcChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTUNTLgotICogQG5vdGUgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2NsZWFuVXAoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2Fib3J0KE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIEZpbmlzaCB0aGUgTUNTIHRyYW5zY29kaW5nIGFuZCBmcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTUNTCi0gKiAgICAgICAgICB3aGF0ZXZlciB0aGUgc3RhdGUgaXMuCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2Fib3J0KE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzKiBwRmlsZVByb3BlcnRpZXMpOwotICogQGJyaWVmICAgUmV0cmlldmVzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtcyBmcm9tIHRoZSBpbnB1dCBmaWxlLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUHJvcGVydGllcyAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gYW4gYWxsb2NhdGVkIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSB3aGljaCBpcyBmaWxsZWQgd2l0aCB0aGUgaW5wdXQgc3RyZWFtIHByb3BlcnRpZXMuCi0gKiBAbm90ZSAgICBUaGUgc3RydWN0dXJlIHBQcm9wZXJ0aWVzIG11c3QgYmUgYWxsb2NhdGVkIGFuZCBmdXJ0aGVyIGRlLWFsbG9jYXRlZAotICAgICAgICAgICAgYnkgdGhlIGFwcGxpY2F0aW9uLiBUaGUgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIG9wZW5lZCBzdGF0ZS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzKE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgKnBGaWxlUHJvcGVydGllcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3NldE91dHB1dFBhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19PdXRwdXRQYXJhbXMqIHBQYXJhbXMpOwotICogQGJyaWVmICAgU2V0IHRoZSBNQ1MgdmlkZW8gb3V0cHV0IHBhcmFtZXRlcnMuCi0gKiBAbm90ZSAgICBNdXN0IGJlIGNhbGxlZCBhZnRlciBNNE1DU19vcGVuLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgTTRNQ1Nfc3RlcC4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFBhcmFtcyAgICAgICAgICAgICAoSU4vT1VUKSBUcmFuc2NvZGluZyBwYXJhbWV0ZXJzCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMgOiBPdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1JBVEVfRk9SX0gyNjMgOiBPdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCAgICAgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZvcm1hdCBwYXJhbWV0ZXIKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1JBVEUgOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHJhdGUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCA6IFVuZGVmaW5lZCBvdXRwdXQgYXVkaW8gZm9ybWF0IHBhcmFtZXRlcgotICogQHJldHVybiAgTTRNQ1NfRVJSX0RVUkFUSU9OX0lTX05VTEwgOiBTcGVjaWZpZWQgb3V0cHV0IHBhcmFtZXRlcnMgZGVmaW5lIGEgbnVsbCBkdXJhdGlvbiBzdHJlYW0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChubyBhdWRpbyBhbmQgdmlkZW8pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19zZXRPdXRwdXRQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfT3V0cHV0UGFyYW1zKiBwUGFyYW1zKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfRW5jb2RpbmdQYXJhbXMqIHBSYXRlcykKLSAqIEBicmllZiAgIFNldCB0aGUgdmFsdWVzIG9mIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydCgpLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBSYXRlcyAgICAgICAgICAgICAoSU4pIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDogQXVkaW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gOTYga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzogQXVkaW8gYml0cmF0ZSBpcyB0b28gbG93ICgxNiBrYnBzIG1pbiBmb3IgYWFjLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIuMiBmb3IgYW1yLCA4IGZvciBtcDMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOiBCZWdpbiBjdXQgYW5kIEVuZCBjdXQgYXJlIGVxdWFscwotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjogQmVnaW4gY3V0IHRpbWUgaXMgbGFyZ2VyIHRoYW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXQgY2xpcCBkdXJhdGlvbgotICogQHJldHVybiAgTTRNQ1NfRVJSX0VORF9DVVRfU01BTExFUl9USEFOX0JFR0lOX0NVVDogRW5kIGN1dCB0aW1lIGlzIHNtYWxsZXIgdGhhbiBiZWdpbiBjdXQgdGltZQotICogQHJldHVybiAgTTRNQ1NfRVJSX01BWEZJTEVTSVpFX1RPT19TTUFMTDogTm90IGVub3VnaCBzcGFjZSB0byBzdG9yZSB3aG9sZSBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGF0IGdpdmVuIGJpdHJhdGVzCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19ISUdIOiBWaWRlbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA4MDAga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVzogVmlkZW8gYml0cmF0ZSB0b28gbG93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZ2V0RXh0ZW5kZWRFbmNvZGluZ1BhcmFtcyhNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE1DU19FbmNvZGluZ1BhcmFtcyogcFJhdGVzKQotICogQGJyaWVmICAgR2V0IHRoZSBleHRlbmRlZCB2YWx1ZXMgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAqIEBub3RlICAgIENvdWxkIGJlIGNhbGxlZCBhZnRlciBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcy4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUmF0ZXMgICAgICAgICAgICAgKE9VVCkgVHJhbnNjb2RpbmcgcGFyYW1ldGVycwotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOiBFbmNvZGluZyBzZXR0aW5ncyB3b3VsZCBwcm9kdWNlIGEKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgZHVyYXRpb24gY2xpcCA9IGVuY29kaW5nIGlzIGltcG9zc2libGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2dldEV4dGVuZGVkRW5jb2RpbmdQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfRW5jb2RpbmdQYXJhbXMqIHBSYXRlcyk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g6IEF1ZGlvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDk2IGticHMpCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c6IEF1ZGlvIGJpdHJhdGUgaXMgdG9vIGxvdyAoMTYga2JwcyBtaW4gZm9yIGFhYywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLjIgZm9yIGFtciwgOCBmb3IgbXAzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDogQmVnaW4gY3V0IGFuZCBFbmQgY3V0IGFyZSBlcXVhbHMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT046IEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXQgY2xpcCBkdXJhdGlvbgotICogQHJldHVybiAgTTRNQ1NfRVJSX0VORF9DVVRfU01BTExFUl9USEFOX0JFR0lOX0NVVDogRW5kIGN1dCB0aW1lIGlzIHNtYWxsZXIgdGhhbiBiZWdpbiBjdXQgdGltZQotICogQHJldHVybiAgTTRNQ1NfRVJSX01BWEZJTEVTSVpFX1RPT19TTUFMTDogTm90IGVub3VnaCBzcGFjZSB0byBzdG9yZSB3aG9sZSBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGF0IGdpdmVuIGJpdHJhdGVzCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19ISUdIOiBWaWRlbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA4MDAga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVzogIFZpZGVvIGJpdHJhdGUgdG9vIGxvdwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTTRNQ1NfQVBJX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19FcnJvckNvZGVzLmggYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19FcnJvckNvZGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwNDJkYmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfRXJyb3JDb2Rlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX0FQSS5oCi0gKiBAYnJpZWYgIE1DUyBlcnJvciBjb2RlcyBkZWZpbml0aW9ucyAoTWVkaWEgQ29tcHJlc3NvciBTZXJ2aWNlKQotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiovCi0KLSNpZm5kZWYgX19NNE1DU19FcnJvckNvZGVzX0hfXwotI2RlZmluZSBfX000TUNTX0Vycm9yQ29kZXNfSF9fCi0KLS8qKgotICogICAgT1NBTCBiYXNpYyB0eXBlcyBhbmQgZXJyb3JzICovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotCi0vKioKLSAqICAgIE9TQUwgY29yZSBJRCBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBXYXJuaW5nIGNvZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRW5kIG9mIHByb2Nlc3NpbmcsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00TUNTX2Nsb3NlKCkgKi8KLSNkZWZpbmUgTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkUgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00TUNTLCAweDEpCi0vKiBNZWRpYXR5cGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgTUNTICovCi0jZGVmaW5lIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00TUNTLCAweDIpCi0vKiBJbmRpY2F0ZSB0aGF0IHBpY3R1cmUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlc2l6ZWQgdG8gZml0IGludG8gdGhlIHJlcXVpcmVkCi0gICBwYXJhbWV0ZXJzIChmaWxlIHNpemUpICovCi0jZGVmaW5lIE00TUNTX1dBUl9QSUNUVVJFX0FVVE9fUkVTSVpFICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9XQVIsIE00TUNTLCAweDMpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBFcnJvciBjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKiAtLS0tLSBPUEVOIEVSUk9SUyAtLS0tLSAqLwotCi0vKiBUaGUgaW5wdXQgZmlsZSBjb250YWlucyBubyBzdXBwb3J0ZWQgc3RyZWFtIChtYXkgYmUgYSBjb3JydXB0ZWQgZmlsZSkgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0lOUFVUX0ZJTEVfQ09OVEFJTlNfTk9fU1VQUE9SVEVEX1NUUkVBTSAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MDEpCi0vKiBUaGUgaW5wdXQgZmlsZSBpcyBpbnZhbGlkL2NvcnJ1cHRlZCAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgwMikKLS8qIFRoZSBpbnB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfVklERU9fRlJBTUVfU0laRSAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MDMpCi0vKiBUaGUgaW5wdXQgdmlkZW8gZnJhbWUgc2l6ZSBpcyBub24gbXVsdGlwbGUgb2YgMTYgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0lOUFVUX1ZJREVPX1NJWkVfTk9OX1gxNiAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MDQpCi0KLQotLyogLS0tLS0gU0VUIE9VVFBVVCBQQVJBTVMgRVJST1JTIC0tLS0tICovCi0KLS8qIFRoZSBvdXRwdXQgdmlkZW8gZm9ybWF0IHBhcmFtZXRlciBpcyB1bmRlZmluZWQgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTApCi0vKiBUaGUgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxMSkKLS8qIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgcmF0ZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1JBVEUgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDEyKQotLyogVGhlIG91dHB1dCBhdWRpbyBmb3JtYXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCAqLwotI2RlZmluZSBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxMykKLS8qIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZyAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9TSVpFX0ZPUl9IMjYzICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgxNCkKLS8qIFRoZSBvdXRwdXQgdmlkZW8gZnJhbWUgcmF0ZSBwYXJhbWV0ZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggSDI2MyBlbmNvZGluZwotICAgKEl0IGNhbid0IGhhcHBlbiBpbiBjdXJyZW50IHZlcnNpb24gb2YgTUNTISkgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfUkFURV9GT1JfSDI2MyAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTUpCi0vKiBBIG51bGwgY2xpcCBkdXJhdGlvbiBhcyBiZWVuIGNvbXB1dGVkLCB3aGljaCBpcyB1bnZhbGlkIChzaG91bGQgbmV2ZXIgaGFwcGVuISkgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0RVUkFUSU9OX0lTX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MTYpCi0vKiBUaGUgLm1wNCBjb250YWluZXIgY2Fubm90IGhhbmRsZSBoMjYzIGNvZGVjICovCi0jZGVmaW5lIE00TUNTX0VSUl9IMjYzX0ZPUkJJRERFTl9JTl9NUDRfRklMRSAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDE3KQotCi0KLS8qIC0tLS0tIFBSRVBBUkUgREVDT0RFUlMgRVJST1JTIC0tLS0tICovCi0KLS8qIEgyNjMgUHJvZmlsZSAob3RoZXIgdGhhbiAwKSBpcyBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIE00TUNTX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDIwKQotLyogVGhlIGlucHV0IGZpbGUgY29udGFpbnMgYW4gQUFDIGF1ZGlvIHRyYWNrIHdpdGggYW4gaW52YWxpZCBzYW1wbGluZyBmcmVxdWVuY3kKLSAgIChzaG91bGQgbmV2ZXIgaGFwcGVuKSAqLwotI2RlZmluZSBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgyMSkKLS8qIFRoZSBhdWRpbyBjb252ZXJzaW9uIChBQUMgdG8gQU1SLU5CLCBvciBNUDMpIGZhaWxlZCAqLwotI2RlZmluZSBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgyMikKLQotCi0vKiAtLS0tLSBTRVQgRU5DT0RJTkcgUEFSQU1TIEVSUk9SUyAtLS0tLSAqLwotCi0vKiBCZWdpbiBjdXQgdGltZSBpcyBsYXJnZXIgdGhhbiB0aGUgaW5wdXQgY2xpcCBkdXJhdGlvbiAqLwotI2RlZmluZSBNNE1DU19FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzMCkKLS8qIEJlZ2luIGN1dCBhbmQgRW5kIGN1dCBhcmUgZXF1YWxzICovCi0jZGVmaW5lIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDMxKQotLyogRW5kIGN1dCB0aW1lIGlzIHNtYWxsZXIgdGhhbiBiZWdpbiBjdXQgdGltZSAqLwotI2RlZmluZSBNNE1DU19FUlJfRU5EX0NVVF9TTUFMTEVSX1RIQU5fQkVHSU5fQ1VUICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzMikKLS8qIE5vdCBlbm91Z2ggc3BhY2UgdG8gc3RvcmUgd2hvbGUgb3V0cHV0IGZpbGUgYXQgZ2l2ZW4gYml0cmF0ZXMgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX01BWEZJTEVTSVpFX1RPT19TTUFMTCAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzMpCi0vKiBWaWRlbyBiaXRyYXRlIGlzIHRvbyBsb3cgKGF2b2lkIHVnbHkgdmlkZW8pICovCi0jZGVmaW5lIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVyAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9FUlJfQ1JFQVRFKCBNNF9FUlIsIE00TUNTLCAweDM0KQotLyogQXVkaW8gYml0cmF0ZSBpcyB0b28gbG93ICgxNiBrYnBzIG1pbiBmb3IgYWFjLCAxMi4yIGZvciBhbXIsIDggZm9yIG1wMykgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzUpCi0vKiBWaWRlbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA4MDAga2JwcykgKi8KLSNkZWZpbmUgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fSElHSCAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X0VSUiwgTTRNQ1MsIDB4MzYpCi0vKiBBdWRpbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA5NiBrYnBzKSAqLwotI2RlZmluZSBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHgzNykKLQotLyogLS0tLS0gT1RIRVJTIEVSUk9SUyAtLS0tLSAqLwotI2RlZmluZSBNNE1DU19FUlJfT1VUUFVUX0ZJTEVfU0laRV9UT09fU01BTEwgICAgICAgICAgICAgICAgTTRPU0FfRVJSX0NSRUFURSggTTRfRVJSLCBNNE1DUywgMHg1MCkKLSNkZWZpbmUgTTRNQ1NfRVJSX05PTU9SRV9TUEFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE1DUywgMHg1MSkKLSNkZWZpbmUgTTRNQ1NfRVJSX0ZJTEVfRFJNX1BST1RFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLCBNNE1DUywgMHg1MikKLSNlbmRpZiAvKiBfX000TUNTX0Vycm9yQ29kZXNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsQ29uZmlnLmggYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbENvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmFmMWU2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsQ29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNE1DU19BUEkuaAotICogQGJyaWVmICBNQ1MgaW50ZXJuYWwgY29uc3RhbnQgdmFsdWVzIHNldHRpbmdzCi0gKiBAbm90ZSAgIFRoaXMgaGVhZGVyIGZpbGUgaXMgbm90IHB1YmxpYwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotI2lmbmRlZiBfX000TUNTX0lOVEVSTkFMQ09ORklHX0hfXwotI2RlZmluZSBfX000TUNTX0lOVEVSTkFMQ09ORklHX0hfXwotCi0KLS8qKgotICogRGVmaW5pdGlvbiBvZiBtYXggQVUgc2l6ZSAqLwotI2RlZmluZSBNNE1DU19BVURJT19NQVhfQ0hVTktfU0laRSAgICAgICAgNzE2OCAvKio8IGFkZCBtcDMgZW5jb2RlciBhbmQgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCBiaXRyYXRlIGlzIG5vdyAzMjBrYnBzIGluc3RlYWQgb2YgMTI4a2JwcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoaXMgdmFsdWUgaGFzIHRvIGJlIGluY3JlYXNlZCBhY2NvcmRpbmdseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKChzaXplb2YoTTRPU0FfVUludDgpKm1heF9jaGFubmVsX251bWJlcikrMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRha2UgYSBtYXJnaW4oYWZ0ZXIgdGVzdHMsIDIgd2FzIG5vdCBlbm91Z2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSpNQVhfUENNX0dSQU5VTEFSSVRZX1NBTVBMRVMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQmVmb3JlOiA0MDAwKi8vKio8IE1hZ2ljYWwgKi8KLQotLyoqCi0gKiBWaWRlbyBtYXggQVUgYW5kIGZyYWdtZW50IHNpemUgKi8KLSNkZWZpbmUgTTRNQ1NfVklERU9fTUlOX0NPTVBSRVNTSU9OX1JBVElPICAgMC44IC8qKjwgTWFnaWNhbC4gVXNlZCB0byBkZWZpbmUgdGhlIG1heCBBVSBzaXplICovCi0jZGVmaW5lIE00TUNTX1ZJREVPX0NIVU5LX0FVX1NJWkVfUkFUSU8gICAgIDEuMiAvKio8IE1hZ2ljYWwuIFVzZWQgdG8gZGVmaW5lIHRoZSBtYXggY2h1bmsgc2l6ZSAqLwotCi0vKioKLSAqIFZhcmlvdXMgTWFnaWNhbHMgKi8KLSNkZWZpbmUgTTRNQ1NfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCAgICAgICAgMQotI2RlZmluZSBNNE1DU19XUklURVJfVklERU9fU1RSRUFNX0lEICAgICAgICAyCi0KLS8qKgotICogR3JhbnVsYXJpdHkgZm9yIGF1ZGlvIGVuY29kZXIgKi8KLSAvKio8IG1pbmltdW0gbnVtYmVyIG9mIHNhbXBsZXMgdG8gcGFzcyBpbiBBTVIgZW5jb2RpbmcgY2FzZSAqLwotI2RlZmluZSBNNE1DU19QQ01fQU1SX0dSQU5VTEFSSVRZX1NBTVBMRVMgMTYwCi0vKio8IG1pbmltdW0gbnVtYmVyIG9mIHNhbXBsZXMgdG8gcGFzcyBpbiBBQUMgZW5jb2RpbmcgY2FzZSAqLwotI2RlZmluZSBNNE1DU19QQ01fQUFDX0dSQU5VTEFSSVRZX1NBTVBMRVMgMTAyNAotLyoqPCBtaW5pbXVtIG51bWJlciBvZiBzYW1wbGVzIHRvIHBhc3MgaW4gTVAzIGVuY29kaW5nIGNhc2UgKi8KLSNkZWZpbmUgTTRNQ1NfUENNX01QM19HUkFOVUxBUklUWV9TQU1QTEVTIDU3NgotCi0jZGVmaW5lIE00TUNTX0FVRElPX01BWF9BVV9TSVpFICAgICAgICAgICAxMDI0ICAvKio8IGFkZCBtcDMgZW5jb2RlciBhbmQgd3JpdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIG5vdCB1c2VkIGFueW1vcmUsIG5vdyB0aGUgbWF4IEFVCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIGlzIGNvbXB1dGVkIGR5bmFtaWNhbGx5IGFjY29yZGluZyB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBjaGFubmVscyx0aGUgbWF4IFBDTSBncmFudWxhcml0eSBzYW1wbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhIG1hcmdpbi4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCZWZvcmU6IDEwMjQqLy8qKjwgTWFnaWNhbCAqLwotLyoqCi0gKiBXcml0ZXIgZmlsZSBhbmQgbW9vdiBzaXplIGVzdGltYXRpb24gKi8KLSNkZWZpbmUgTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPICAgIDEuMDQgIC8qKjwgbWFnaWNhbCBtb292IHNpemUgaXMgbGVzcyB0aGFuIDQlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGZpbGUgc2l6ZSBpbiBhdmVyYWdlICovCi0KLS8qKgotICogSWYgM2dwIGZpbGUgZG9lcyBub3QgY29udGFpbiBhbiBTVFNTIHRhYmxlIChubyByYXAgZnJhbWVzKSwKLSAgIGp1bXAgYmFja3dhcmQgdG8gYSBzcGVjaWZpZWQgbGltaXQgKi8KLSNkZWZpbmUgTTRNQ1NfTk9fU1RTU19KVU1QX1BPSU5UICAgICAgICAgIDQwMDAwIC8qKjwgNDAgcyAqLwotCi0jZW5kaWYgLyogX19NNE1DU19JTlRFUk5BTENPTkZJR19IX18gKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsRnVuY3Rpb25zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxYzY3OWUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMvTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00TUNTX0ludGVybmFsRnVuY3Rpb25zLmgKLSAqIEBicmllZiAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBpbnRlcm5hbAotICogICAgICAgICAgdG8gdGhlIE1DUy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX000TUNTX0lOVEVSTkFMRlVOQ1RJT05TX0hfXwotI2RlZmluZSBfX000TUNTX0lOVEVSTkFMRlVOQ1RJT05TX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICJNNFZQUF9BUEkuaCIKLSNpbmNsdWRlICJNNEVOQ09ERVJfY29tbW9uLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50QXBwbHlWUFAoIE00VlBQX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLSAqIEBicmllZiAgIERvIHRoZSB2aWRlbyByZW5kZXJpbmcgYW5kIHRoZSByZXNpemUgKGlmIG5lZWRlZCkKLSAqIEBub3RlICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgcENvbnRleHQgICAgKElOKSAgICAgVlBQIGNvbnRleHQsIHdoaWNoIGFjdHVhbGx5IGlzIHRoZSBNQ1MKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgIHBQbGFuZUluICAgIChJTikgICAgIENvbnRhaW5zIHRoZSBpbWFnZQotICogQHBhcmFtICAgcFBsYW5lT3V0ICAgKElOL09VVCkgUG9pbnRlciB0byBhbiBhcnJheSBvZiAzIHBsYW5lcyB0aGF0IHdpbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW4gdGhlIG91dHB1dCBZVVY0MjAgaW1hZ2UKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgRVJSX01DU19WSURFT19ERUNPREVfRVJST1I6IHRoZSB2aWRlbyBkZWNvZGluZyBmYWlsZWQKLSAqIEByZXR1cm4gIEVSUl9NQ1NfUkVTSVpFX0VSUk9SOiAgICAgICB0aGUgcmVzaXppbmcgZmFpbGVkCi0gKiBAcmV0dXJuICBBbnkgZXJyb3IgcmV0dXJuZWQgYnkgYW4gdW5kZXJsYXlpbmcgbW9kdWxlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2ludEFwcGx5VlBQKE00VlBQX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19TdWJzY3JpYmVNZWRpYUFuZENvZGVjKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIHRoZSByZWFkZXIsIGRlY29kZXJzLCB3cml0ZXJzIGFuZCBlbmNvZGVycwotICogICAgICAgICAgIGluIHRoZSBNQ1MuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCBpcyBOVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQ2xlYXIgZW5jb2RlcnMsIGRlY29kZXJzLCByZWFkZXIgYW5kIHdyaXRlcnMgaW50ZXJmYWNlcyB0YWJsZXMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgVGhlIGNvbnRleHQgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX2NsZWFySW50ZXJmYWNlVGFibGVzKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJXcml0ZXIoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIE1lZGlhVHlwZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSAqcFd0ckdsb2JhbEludGVyZmFjZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UgKnBXdHJEYXRhSW50ZXJmYWNlKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgZmlsZSBmb3JtYXQgd3JpdGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICAgIGNvbnRleHQgdGhlIHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIHBDb250ZXh0LHBXdHJHbG9iYWxJbnRlcmZhY2Ugb3IgcFd0ckRhdGFJbnRlcmZhY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSksIG9yIGludmFsaWQgTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJXcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiBwV3RyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFd0ckRhdGFJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyRW5jb2RlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0IG1lZGlhVHlwZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgdmlkZW8gZW5jb2Rlci4KLSAqIEBub3RlICAgIEFjY29yZGluZyB0byB0aGUgTWVkaWF0eXBlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgaW4gdGhlIGludGVybmFsCi0gKiAgICAgICAgICBjb250ZXh0IHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KSwgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciggIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBtZWRpYVR5cGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIGF1ZGlvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgICAgY29udGV4dCB0aGUgZW5jb2RlciBjb250ZXh0LgotICogQHBhcmFtICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgKElOKSAgIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHBhcmFtICAgbWVkaWFUeXBlOiAgICAgICAgICAgICAgKElOKSAgIFRoZSBtZWRpYSB0eXBlLgotICogQHBhcmFtICAgcEVuY0dsb2JhbEludGVyZmFjZTogICAgKE9VVCkgIFRoZSBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlICpwRW5jR2xvYmFsSW50ZXJmYWNlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBSZWdpc3RlciByZWFkZXIuCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJSZWFkZXIoICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX01lZGlhVHlwZSBtZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICpwUmRyRGF0YUludGVyZmFjZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBSZWdpc3RlciB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgIGRlY29kZXJUeXBlICAgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIERlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KSxvciB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlciB0eXBlIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlclZpZGVvRGVjb2RlciggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFJlZ2lzdGVyIGF1ZGlvIGRlY29kZXIKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbHkgYnkgdGhlIE1DUyB0byByZWdpc3RlciBDb3JlIGF1ZGlvIGRlY29kZXJzLAotICogQHBhcmFtICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgICAgIEF1ZGlvIGRlY29kZXIgdHlwZQotICogQHBhcmFtICAgcERlY29kZXJJbnRlcmZhY2UgIChJTikgICAgIEF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCwgb3IgdGhlIGRlY29kZXIgdHlwZSBpcyBpbnZhbGlkKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEFEX0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFVucmVnaXN0ZXIgd3JpdGVyCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsV3JpdGVycyhNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBVbnJlZ2lzdGVyIHRoZSBlbmNvZGVycwotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbEVuY29kZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFVucmVnaXN0ZXIgcmVhZGVyCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsUmVhZGVycyhNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBVbnJlZ2lzdGVyIHRoZSBkZWNvZGVycwotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbERlY29kZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFNldCBjdXJyZW50IHdyaXRlcgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgIG1lZGlhVHlwZSAgICAgICAgICAgKElOKSBNZWRpYSB0eXBlLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50V3JpdGVyKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgU2V0IGEgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9Gb3JtYXQgbWVkaWFUeXBlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdCBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBTZXQgY3VycmVudCByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZSAgICAgICAgICAgKElOKSBNZWRpYSB0eXBlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRSZWFkZXIoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBtZWRpYVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRGVjb2RlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcihNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludENoZWNrQXVkaW9FZmZlY3RzKE00TUNTX0ludGVybmFsQ29udGV4dCogcENvbnRleHQpCi0gKiBAYnJpZWYgICAgQ2hlY2sgaWYgYW4gZWZmZWN0IGhhcyB0byBiZSBhcHBsaWVkIGN1cnJlbnRseQotICogQG5vdGUgICAgIEl0IGlzIGNhbGxlZCBieSB0aGUgc3RlcEVuY29kaW5nIGZ1bmN0aW9uCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSAgIE1DUyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19pbnRDaGVja0F1ZGlvRWZmZWN0cyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IEZhZGVJbiB0byBwUENNZGF0YQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUENNZGF0YSAgICAgKElOL09VVCkgSW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pICAgICBTaXplIG9mIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgIChJTikgICAgIEVmZmVjdCBwcm9ncmVzcwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbiggIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IEZhZGVJbiB0byBwUENNZGF0YQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUENNZGF0YSAgICAgKElOL09VVCkgSW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pICAgICBTaXplIG9mIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgIChJTikgICAgIEVmZmVjdCBwcm9ncmVzcwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVPdXQoIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fTTRNQ1NfSU5URVJOQUxGVU5DVElPTlNfSF9fICovCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsVHlwZXMuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jL000TUNTX0ludGVybmFsVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWU0ZjIzNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYy9NNE1DU19JbnRlcm5hbFR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX0FQSS5oCi0gKiBAYnJpZWYgIE1DUyBpbnRlcm5hbCB0eXBlcyBhbmQgc3RydWN0dXJlcyBkZWZpbml0aW9ucwotICogQG5vdGUgICBUaGlzIGhlYWRlciBmaWxlIGlzIG5vdCBwdWJsaWMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiovCi0KLSNpZm5kZWYgX19NNE1DU19JTlRFUk5BTFRZUEVTX0hfXwotI2RlZmluZSBfX000TUNTX0lOVEVSTkFMVFlQRVNfSF9fCi0KLS8qKgotICogICAgTUNTIHB1YmxpYyBBUEkgYW5kIHR5cGVzICovCi0jaW5jbHVkZSAiTTRNQ1NfQVBJLmgiCi0jaW5jbHVkZSAiTTRNQ1NfRXJyb3JDb2Rlcy5oIgotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0vKiogRGV0ZXJtaW5lIGFic29sdXRlIHZhbHVlIG9mIGEuICovCi0jZGVmaW5lIE00TUNTX0FCUyhhKSAgICAgICAgICAgICAgICggKCAoYSkgPCAoMCkgKSA/ICgtKGEpKSA6IChhKSApCi0KLQotI2RlZmluZSBZX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDAwCi0jZGVmaW5lIFVfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4ODAKLSNkZWZpbmUgVl9QTEFORV9CT1JERVJfVkFMVUUgICAgMHg4MAotCi0KLS8qKgotICogICAgSW50ZXJuYWxseSB1c2VkIG1vZHVsZXMgKi8KLSNpbmNsdWRlICJNNFJFQURFUl8zZ3BDb20uaCIgICAgICAgIC8qKjwgUmVhZCAzR1BQIGZpbGUgICAgICovCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIiAgICAgICAvKio8IERlY29kZSB2aWRlbyAgICAgICAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiICAgICAgLyoqPCBWaWRlbyByZXNpemUgICAgICAgKi8KLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIiAgICAgICAgICAgIC8qKjwgRGVjb2RlciBhdWRpbyAgICAgICovCi0jaW5jbHVkZSAiU1NSQy5oIiAgICAgICAgICAgICAgICAgICAvKio8IFNTUkMgICAgICAgICAgICAgICAqLwotI2luY2x1ZGUgIkZyb20yaVRvTW9ub18xNi5oIiAgICAgICAgLyoqPCBTdGVyZW8gdG8gTW9ubyAgICAgKi8KLSNpbmNsdWRlICJNb25vVG8ySV8xNi5oIiAgICAgICAgICAgIC8qKjwgTW9ubyB0byBTdGVyZW8gICAgICovCi0jaW5jbHVkZSAiTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgiICAvKio8IEVuY29kZSBhdWRpbyAgICAgICAqLwotI2luY2x1ZGUgIk00V1JJVEVSX2NvbW1vbi5oIiAgICAgICAgLyoqPCBXcml0ZXIgY29tbW9uIGludGVyZmFjZSAqLwotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotLyoqCi0gKiAgSW5zdGVhZCBvZiBpbmNsdWRpbmcgQUFDIGNvcmUgcHJvcGVydGllcywgaXQgaXMgYmV0dGVyIHRvIHJlZGVmaW5lIHRoZSBuZWVkZWQgdHlwZQotICogIEFBQ19ERUNfU1RSRUFNX1BST1BTCi0gKiAgSW4gY2FzZSBvZiBleHRlcm5hbCBBQUMgZGVjb2RlciwgaXQgd2lsbCBiZSBuZWNlc3NhcnkgdG8gcHV0IHRoaXMgdHlwZSBhcyBwdWJsaWMKLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCBBQUNfREVDX1NUUkVBTV9QUk9QUwotICogQGJyaWVmIEFBQyBTdHJlYW0gcHJvcGVydGllcwotICogQE5vdGUgYU5vQ2hhbiBhbmQgYVNhbXBGcmVxIGFyZSB1c2VkIGZvciBwYXJzaW5nIGV2ZW4gdGhlIHVzZXIgcGFyYW1ldGVycwotICogICAgICAgIGFyZSBkaWZmZXJlbnQuICBVc2VyIHBhcmFtZXRlcnMgd2lsbCBiZSBpbnB1dCBmb3IgdGhlIG91dHB1dCBiZWhhdmlvdXIKLSAqICAgICAgICBvZiB0aGUgZGVjb2RlciB3aGVyZWFzIGZvciBwYXJzaW5nIGJpdHN0cmVhbSBwcm9wZXJ0aWVzIGFyZSB1c2VkLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE00T1NBX0ludDMyIGFBdWRpb09iamVjdFR5cGU7ICAgICAvKio8IEF1ZGlvIG9iamVjdCB0eXBlIG9mIHRoZSBzdHJlYW0gLSBpbiBmYWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0eXBlIGZvdW5kIGluIHRoZSBBY2Nlc3MgVW5pdCBwYXJzZWQgKi8KLSAgTTRPU0FfSW50MzIgYU51bUNoYW47ICAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIGNoYW5uZWxzICg9MShtb25vKSBvciA9MihzdGVyZW8pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBpbmRpY2F0ZWQgYnkgaW5wdXQgYml0c3RyZWFtKi8KLSAgTTRPU0FfSW50MzIgYVNhbXBGcmVxOyAgICAgICAgICAgIC8qKjwgc2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6ICovCi0gIE00T1NBX0ludDMyIGFFeHRlbnNpb25TYW1wRnJlcTsgICAvKio8IGV4dGVuZGVkIHNhbXBsaW5nIGZyZXF1ZW5jeSBpbiBIeiwgPSAwIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGV4dGVuZGVkIGZyZXF1ZW5jeSAqLwotICBNNE9TQV9JbnQzMiBhU0JSUHJlc2VudDsgICAgICAgICAgLyoqPCBwcmVzZW5jZT0xL2Fic2VuY2U9MCBvZiBTQlIgKi8KLSAgTTRPU0FfSW50MzIgYVBTUHJlc2VudDsgICAgICAgICAgIC8qKjwgcHJlc2VuY2U9MS9hYnNlbmNlPTAgb2YgUFMgKi8KLSAgTTRPU0FfSW50MzIgYU1heFBDTVNhbXBsZXNQZXJDaDsgIC8qKjwgbWF4IG51bWJlciBvZiBQQ00gc2FtcGxlcyBwZXIgY2hhbm5lbCAqLwotfSBBQUNfREVDX1NUUkVBTV9QUk9QUzsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgICAgIENvZGVjcyByZWdpc3RyYXRpb24gc2FtZSBhcyBpbiBWUFMgYW5kIFZFUywgc28gbGVzcyBtYXBwaW5nCi0gKiAgICAgICAgICAgICAgaXMgcmVxdWlyZWQgdG93YXJkIE1DUyBhcGkgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqIHBHbG9iYWxGY3RzOyAgICAvKio8IG9wZW4sIGNsb3NlLCBzZXRvcHRpb24sZXRjLi4uIGZ1bmN0aW9ucyAqLwotICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqICAgIHBEYXRhRmN0czsgICAgICAgIC8qKjwgZGF0YSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zICovCi19IE00TUNTX1dyaXRlckludGVyZmFjZTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgICAgTTRNQ1NfU3RhdGVzCi0gKiBAYnJpZWYgICAgICAgIE1haW4gc3RhdGUgbWFjaGluZSBvZiB0aGUgTUNTLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBNNE1DU19rU3RhdGVfQ1JFQVRFRCwgICAgICAgICAgIC8qKjwgTTRNQ1NfaW5pdCBoYXMgYmVlbiBjYWxsZWQgICAgICAgICAgICAgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfT1BFTkVELCAgICAgICAgICAgIC8qKjwgTTRNQ1Nfb3BlbiBoYXMgYmVlbiBjYWxsZWQgICAgICAgICAgICAgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfU0VULCAgICAgICAgICAgICAgIC8qKjwgQWxsIG1hbmRhdG9yeSBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBzZXQgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfUkVBRFksICAgICAgICAgICAgIC8qKjwgQWxsIG9wdGlvbm5hbCBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBzZXQgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0pVTVAsICAgIC8qKjwgTXVzdCBqdW1wIHRvIHRoZSBJZnJhbWUgYmVmb3JlIHRoZSBiZWdpbiBjdXQgKi8KLSAgICBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0RFQ09ERSwgIC8qKjwgTXVzdCBkZWNvZGUgdXAgdG8gdGhlIGJlZ2luIGN1dCAgICAgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORywgICAgICAgIC8qKjwgU3RlcCBjYW4gYmUgY2FsbGVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBNNE1DU19rU3RhdGVfUEFVU0VELCAgICAgICAgICAgIC8qKjwgUGF1c2VkLCBSZXN1bWUgY2FuIGJlIGNhbGxlZCAgICAgICAgICAgICovCi0gICAgTTRNQ1Nfa1N0YXRlX0ZJTklTSEVELCAgICAgICAgICAvKio8IFRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICAgICAgICAgICAgICAgICovCi0gICAgTTRNQ1Nfa1N0YXRlX0NMT1NFRCAgICAgICAgICAgICAvKio8IE91dHB1dCBmaWxlIGhhcyBiZWVuIGNyZWF0ZWQgICAgICAgICAgICAqLwotfSBNNE1DU19TdGF0ZXM7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIE00TUNTX1N0cmVhbVN0YXRlCi0gKiBAYnJpZWYgICAgICAgIFN0YXRlIG9mIGEgbWVkaWEgc3RyZWFtIGVuY29kaW5nIChhdWRpbyBvciB2aWRlbykuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgZW51bQotewotICAgIE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTSAgPSAwLCAgICAvKio8IE5vIHN0cmVhbSBwcmVzZW50ICAgICAgICAgICAgICAgICAgICAqLwotICAgIE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEICAgPSAxLCAgICAvKio8IFRoZSBzdHJlYW0gZW5jb2RpbmcgaXMgaW4gcHJvZ3Jlc3MgKi8KLSAgICBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQgID0gMiAgICAvKio8IFRoZSBzdHJlYW0gaGFzIGZpbmlzaGVkIGVuY29kaW5nICAgICovCi19IE00TUNTX1N0cmVhbVN0YXRlOwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZW51bSAgICAgICAgICAgIGFub255bW91cyBlbnVtCi0gKiBAYnJpZWYgICAgICAgIGVudW0gdG8ga2VlcCB0cmFjayBvZiB0aGUgZW5jb2RlciBzdGF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1lbnVtCi17Ci0gICAgTTRNQ1Nfa05vRW5jb2RlciwKLSAgICBNNE1DU19rRW5jb2RlckNsb3NlZCwKLSAgICBNNE1DU19rRW5jb2RlclN0b3BwZWQsCi0gICAgTTRNQ1Nfa0VuY29kZXJSdW5uaW5nCi19OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQKLSAqIEBicmllZiAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgTUNTIGNvbnRleHQgKHByaXZhdGUpCi0gKiBAbm90ZSAgICAgICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIE1DUyBjYWxscyB0byBzdG9yZSB0aGUgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIE00T1NBX1VJbnQzMiAgICBiaXRQb3M7Ci0gICAgICAgICAgICAgICAgIC8qIGJpdCBjb3VudCBvZiBudW1iZXIgb2YgYml0cyB1c2VkIHNvIGZhciAqLwotCi0gICAgTTRPU0FfVUludDggICAqc3RyZWFtQnVmZmVyOwotICAgICAgICAgICAgICAgIC8qIEJpdHN0cmVhbSBCdWZmZXIgKi8KLQotICAgIE00T1NBX1VJbnQzMiAgICBieXRlQ250OwotICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBCeXRlcyB3cml0dGVuIGluIEJpdHN0cmVhbSBidWZmZXIqLwotCi0gICAgTTRPU0FfVUludDMyICAgIGN1cnJCdWZmOwotICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgYnVmZmVyIGhvbGRzLCA0Ynl0ZXMgb2YgYml0c3RyZWFtKi8KLQotICAgIE00T1NBX1VJbnQ4ICAgcHJldkJ5dGU7Ci0gICAgICAgICAgICAgICAgLyogUHJldmlvdXMgYnl0ZSB3cml0dGVuIGluIHRoZSBidWZmZXIgKi8KLQotICAgIE00T1NBX1VJbnQ4ICAgcHJldlByZXZCeXRlOwotICAgICAgICAgICAgICAgIC8qIFByZXZpb3VzIHRvIHByZXZpb3VzIGJ5dGUgd3JpdHRlbiBpbiB0aGUgYnVmZmVyICovCi0KLX1OU1dBVkNfYml0U3RyZWFtX3RfTUNTOwotCi0jZGVmaW5lIF9NQVhudW1fc2xpY2VfZ3JvdXBzICA4Ci0jZGVmaW5lIF9NQVhudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlICAyNTYKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgTTRPU0FfVUludDMyICBsZXZlbF9pZGNfaW5kZXg7Ci0gIE00T1NBX1VJbnQzMiAgTWF4RnJhbWVOdW07Ci0gIE00T1NBX1VJbnQzMiAgZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGU7Ci0gIE00T1NBX0ludDMyICAgTWF4UGljT3JkZXJDbnRMc2I7Ci0gIE00T1NBX0ludDMyICAgbWF4X2RlY19mcmFtZV9idWZmZXJpbmc7Ci0KLSAgLyogKHBpY19vcmRlcl9jbnRfdHlwZSA9PSAxKSAqLwotICBNNE9TQV9JbnQzMiAgIG9mZnNldF9mb3Jfbm9uX3JlZl9waWM7Ci0gIE00T1NBX0ludDMyICAgb2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkOwotICBNNE9TQV9JbnQzMiAgIGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQ7Ci0gIE00T1NBX0ludDMyICAgZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQ7Ci0gIE00T1NBX0ludDMyICAgZnJhbWVfY3JvcF90b3Bfb2Zmc2V0OwotICBNNE9TQV9JbnQzMiAgIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldDsKLSAgTTRPU0FfSW50MzIgICBvZmZzZXRfZm9yX3JlZl9mcmFtZVtfTUFYbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZV07Ci0KLSAgTTRPU0FfVUludDE2IFBpY1dpZHRoSW5NYnM7Ci0gIE00T1NBX1VJbnQxNiBGcmFtZUhlaWdodEluTWJzOwotICBNNE9TQV9VSW50MTYgIHBpY193aWR0aF9pbl9tYnNfbWludXMxOwotICBNNE9TQV9VSW50MTYgIHBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMTsKLQotI2lmZGVmIF9DQVBfRk1PXwotICBNNE9TQV9VSW50MTYgTnVtU2xpY2VHcm91cE1hcFVuaXRzOwotICBNNE9TQV9VSW50MTYgTWF4UGljU2l6ZUluTWJzOwotI2VuZGlmIC8qX0NBUF9GTU9fKi8KLQotICBNNE9TQV9VSW50OCAgIHByb2ZpbGVfaWRjOwotICBNNE9TQV9VSW50OCAgIHJlc2VydmVkX3plcm9fNGJpdHM7Ci0gIE00T1NBX1VJbnQ4ICAgbGV2ZWxfaWRjOwotICBNNE9TQV9VSW50OCAgIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICBNNE9TQV9VSW50OCAgIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQ7Ci0gIE00T1NBX1VJbnQ4ICAgcGljX29yZGVyX2NudF90eXBlOwotICAvKiBpZihwaWNfb3JkZXJfY250X3R5cGUgPT0gMCkgKi8KLSAgTTRPU0FfVUludDggICBsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQ7Ci0KLSAgTTRPU0FfVUludDggICBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOwotICAvKiBmb3IoIGkgPSAwOyBpIDwgbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsgaSsrICkgKi8KLSAgTTRPU0FfVUludDggICBudW1fcmVmX2ZyYW1lczsKLQotICBNNE9TQV9Cb29sICAgIGNvbnN0cmFpbnRfc2V0MF9mbGFnOwotICBNNE9TQV9Cb29sICAgIGNvbnN0cmFpbnRfc2V0MV9mbGFnOwotICBNNE9TQV9Cb29sICAgIGNvbnN0cmFpbnRfc2V0Ml9mbGFnOwotICBNNE9TQV9Cb29sICAgIGNvbnN0cmFpbnRfc2V0M19mbGFnOwotICBNNE9TQV9Cb29sICAgIGRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnOwotICBNNE9TQV9Cb29sICAgIGdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBmcmFtZV9tYnNfb25seV9mbGFnOwotICBNNE9TQV9Cb29sICAgIG1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBmcmFtZV9jcm9wcGluZ19mbGFnOwotICBNNE9TQV9Cb29sICAgIHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICBBY3RpdmU7Ci0KLSAgLyogdnVpX3NlcV9wYXJhbWV0ZXJzX3QgdnVpX3NlcV9wYXJhbWV0ZXJzOyAqLwotfSBDb21TZXF1ZW5jZVBhcmFtZXRlclNldF90X01DUzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgTTRPU0FfSW50MTYgICAgICAgcGljX2luaXRfcXBfbWludXMyNjsKLSAgTTRPU0FfSW50MTYgICAgICAgcGljX2luaXRfcXNfbWludXMyNjsKLSAgTTRPU0FfSW50MTYgICAgICAgY2hyb21hX3FwX2luZGV4X29mZnNldDsKLQotLy8jaWZkZWYgX0NBUF9GTU9fCi0gIC8qIGlmKCBzbGljZV9ncm91cF9tYXBfdHlwZSA9ID0gMCApICovCi0gIE00T1NBX1VJbnQxNiAgICAgIHJ1bl9sZW5ndGhfbWludXMxW19NQVhudW1fc2xpY2VfZ3JvdXBzXTsKLSAgLyogZWxzZSBpZiggc2xpY2VfZ3JvdXBfbWFwX3R5cGUgPSA9IDIgKSAqLwotICBNNE9TQV9VSW50MTYgICAgICB0b3BfbGVmdFtfTUFYbnVtX3NsaWNlX2dyb3Vwc107Ci0gIE00T1NBX1VJbnQxNiAgICAgIGJvdHRvbV9yaWdodFtfTUFYbnVtX3NsaWNlX2dyb3Vwc107Ci0gIC8qIGVsc2UgaWYoIHNsaWNlX2dyb3VwX21hcF90eXBlID0gPSA2ICkgKi8KLSAgTTRPU0FfVUludDE2ICAgICAgcGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMTsKLSAgTTRPU0FfVUludDE2ICAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxOwotCi0gIE00T1NBX1VJbnQxNiBGaXJzdE1iSW5TbGljZUdyb3VwW19NQVhudW1fc2xpY2VfZ3JvdXBzXTsKLSAgTTRPU0FfVUludDE2IExhc3RNYkluU2xpY2VHcm91cFtfTUFYbnVtX3NsaWNlX2dyb3Vwc107Ci0KLQotICBNNE9TQV9VSW50OCAgKnNsaWNlX2dyb3VwX2lkOwotICBNNE9TQV9VSW50OCAgKk1hcFVuaXRUb1NsaWNlR3JvdXBNYXA7Ci0gIE00T1NBX1VJbnQ4ICAqTWJUb1NsaWNlR3JvdXBNYXA7Ci0gIE00T1NBX1VJbnQxNiAgTnVtU2xpY2VHcm91cE1hcFVuaXRzOwotCi0gIE00T1NBX1VJbnQ4ICAgICAgIHNsaWNlX2dyb3VwX21hcF90eXBlOwotICAvKiBlbHNlIGlmKCBzbGljZV9ncm91cF9tYXBfdHlwZSA9ID0gMyB8fCA0IHx8IDUgKi8KLSAgTTRPU0FfQm9vbCAgICAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnOwotICBNNE9TQV9Cb29sICAgbWFwX2luaXRpYWxpemVkOwotLy8gI2VuZGlmIC8qX0NBUF9GTU9fKi8KLQotICBNNE9TQV9VSW50OCAgICAgICBwaWNfcGFyYW1ldGVyX3NldF9pZDsKLSAgTTRPU0FfVUludDggICAgICAgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gIE00T1NBX1VJbnQ4ICAgICAgbnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMTsKLSAgTTRPU0FfVUludDggICAgICBudW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxOwotICBNNE9TQV9VSW50OCAgICAgICB3ZWlnaHRlZF9iaXByZWRfaWRjOwotICBNNE9TQV9VSW50OCAgICAgICBudW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsKLQotICBNNE9TQV9Cb29sICAgICAgICBlbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWc7Ci0gIC8qIGlmKCBwaWNfb3JkZXJfY250X3R5cGUgPCAyICkgIGluIHRoZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0ICovCi0gIE00T1NBX0Jvb2wgICAgICAgIHBpY19vcmRlcl9wcmVzZW50X2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgICAgIHdlaWdodGVkX3ByZWRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICAgICAgZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWc7Ci0gIE00T1NBX0Jvb2wgICAgICAgIGNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZzsKLSAgTTRPU0FfQm9vbCAgICAgICAgcmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnOwotICBNNE9TQV9Cb29sICAgIEFjdGl2ZTsKLQotICBDb21TZXF1ZW5jZVBhcmFtZXRlclNldF90X01DUyAqcF9hY3RpdmVfc3BzOwotfSBDb21QaWN0dXJlUGFyYW1ldGVyU2V0X3RfTUNTOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgICAgTTRPU0FfVUludDMyIGJpdFBvczsgICAgICAgICAgICAgICAgLyohPCBiaXQgcG9zaXRpb24gaW4gYnVmZmVyICovCi0gICAgICBNNE9TQV9VSW50MzIgdG90YWxCaXRzOyAgICAgICAgICAgICAvKiE8IGJpdCBwb3NpdGlvbiBpbiBmaWxlICh0b3RhbCBiaXRzIHJlYWQgc28gZmFyKSAqLwotCi0gICAgICBNNE9TQV9VSW50MzIgbGFzdFRvdGFsQml0czsgICAgICAgICAvKiE8IGJpdCBwb3NpdGlvbiBpbiBmaWxlIG9mIHRoZSBsYXN0IFZPUCAqLwotICAgICAgTTRPU0FfVUludDMyIG51bUJpdHNJbkJ1ZmZlcjsgICAgICAgLyohPCBudW1iZXIgb2YgYml0cyBpbiBidWZmZXIgKi8KLSAgICAgIE00T1NBX1VJbnQzMiByZWFkYWJsZUJ5dGVzSW5CdWZmZXI7IC8qITwgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQgaW4gZGVjb2RlciBidWZmZXIqLwotICAgICAgTTRPU0FfVUludDMyIG1heEJ1ZmZlclNpemU7ICAgICAgICAgLyohPCBtYXggYnVmZmVyIHNpemUgaW4gYml0IHVuaXRzICovCi0gICAgICBNNE9TQV9VSW50OCAgKkJ1ZmZlcjsgICAgICAgICAgICAgICAvKiE8IGNoYXIgYnVmZmVyIGF0IHJlYWRpbmcgZnJvbSBmaWxlICovCi0gICAgICBNNE9TQV9JbnQzMiAgICAgaThCaXRDbnQ7Ci0gICAgICBNNE9TQV9VSW50MzIgICAgIHVpMzJUZW1wQnVmZjsKLSAgICAgIE00T1NBX0ludDgqcHVpOEJmclB0cjsKLSAgICAgIE00T1NBX1VJbnQzMiAgICB1aTMyTGFzdFR3b0J5dGVzOyAgLyohPCBzdG9yZXMgdGhlIGxhc3QgcmVhZCB0d28gYnl0ZXMgKi8KLX0gQ29tQml0U3RyZWFtTUNTX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLQotICAgIE00T1NBX0ludDMyIHByZXZfZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIGN1cl9mcmFtZV9udW07Ci0gICAgTTRPU0FfSW50MzIgcHJldl9uZXdfZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQ7Ci0gICAgTTRPU0FfSW50MzIgaXNfZG9uZTsKLSAgICBNNE9TQV9JbnQzMiBpc19maXJzdDsKLSAgICBNNE9TQV9JbnQzMiBmcmFtZV9jb3VudDsKLSAgICBNNE9TQV9JbnQzMiBmcmFtZV9tb2RfY291bnQ7Ci0gICAgTTRPU0FfSW50MzIgUE9DX2xzYjsKLSAgICBNNE9TQV9JbnQzMiBQT0NfbHNiX21vZDsKLQotCi0gICAgTTRPU0FfVUludDMyICAgIG1fTnVtX0J5dGVzX05BTFVuaXRMZW5ndGg7Ci0KLSAgICBNNE9TQV9VSW50OCogICAgbV9wRGVjb2RlclNwZWNpZmljSW5mbzsgICAvKio8IFBvaW50ZXIgb24gc3BlY2lmaWMgaW5mb3JtYXRpb24gcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNyZWF0ZSBhIGRlY29kZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgbV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsvKio8IFNpemUgb2YgdGhlIHNwZWNpZmljIGluZm9ybWF0aW9uIHBvaW50ZXIgYWJvdmUqLwotCi0gICAgTTRPU0FfVUludDgqICAgIG1fcEVuY29kZXJTUFM7Ci0gICAgTTRPU0FfVUludDMyICAgIG1fZW5jb2RlclNQU1NpemU7Ci0KLSAgICBNNE9TQV9VSW50OCogICAgbV9wRW5jb2RlclBQUzsKLSAgICBNNE9TQV9VSW50MzIgICAgbV9lbmNvZGVyUFBTU2l6ZTsKLQotICAgIE00T1NBX1VJbnQ4KiAgICBtX3BGaW5hbERTSTsKLSAgICBNNE9TQV9VSW50MzIgICAgbV9wRmluYWxEU0lTaXplOwotCi0gICAgTTRPU0FfVUludDMyICAgIG1fZW5jb2Rlcl9TUFNfQ250OwotICAgIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICpwX2NsaXBfc3BzOwotICAgIE00T1NBX1VJbnQzMiAgICBtX2VuY29kZXJfUFBTX0NudDsKLSAgICBDb21QaWN0dXJlUGFyYW1ldGVyU2V0X3RfTUNTICAqcF9jbGlwX3BwczsKLQotICAgIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICpwX2VuY29kZXJfc3BzOwotICAgIENvbVBpY3R1cmVQYXJhbWV0ZXJTZXRfdF9NQ1MgICpwX2VuY29kZXJfcHBzOwotCi0KLSAgICBDb21TZXF1ZW5jZVBhcmFtZXRlclNldF90X01DUyAgZW5jb2Rlcl9zcHM7Ci0gICAgQ29tUGljdHVyZVBhcmFtZXRlclNldF90X01DUyAgIGVuY29kZXJfcHBzOwotICAgIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICBjbGlwX3NwczsKLQotICAgIC8qIEVuY29kZXIgU1BTIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9VSW50MzIgZW5jX3NlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQzMiBlbmNfbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNDsKLSAgICBNNE9TQV9VSW50MzIgZW5jX3BpY19vcmRlcl9jbnRfdHlwZTsKLSAgICBNNE9TQV9VSW50MzIgZW5jX2xvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNDsgLyogYXBwbGljYWJsZSB3aGVuIFBPQyB0eXBlID0gMCAqLwotICAgIE00T1NBX1VJbnQzMiBlbmNfZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7Ci0gICAgTTRPU0FfSW50MzIgZW5jX29mZnNldF9mb3Jfbm9uX3JlZl9waWM7Ci0gICAgTTRPU0FfSW50MzIgZW5jX29mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZDsKLSAgICBNNE9TQV9VSW50MzIgZW5jX251bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7IC8qIHJhbmdlIDAgdG8gMjU1ICovCi0gICAgLyogYXJyYXkgb2Ygc2l6ZSBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlICovCi0gICAgTTRPU0FfSW50MzIgICBlbmNfb2Zmc2V0X2Zvcl9yZWZfZnJhbWVbMjU2XTsKLSAgICBNNE9TQV9VSW50MzIgZW5jX251bV9yZWZfZnJhbWVzOwotICAgIE00T1NBX1VJbnQzMiBlbmNfZ2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnOwotCi0KLSAgICAvKiBJbnB1dCBjbGlwIFNQUyBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfVUludDMyIGNsaXBfc2VxX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgTTRPU0FfVUludDMyIGNsaXBfbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNDsKLSAgICBNNE9TQV9VSW50MzIgY2xpcF9waWNfb3JkZXJfY250X3R5cGU7Ci0gICAgTTRPU0FfVUludDMyIGNsaXBfbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0OyAvKiBhcHBsaWNhYmxlIHdoZW4gUE9DIHR5cGUgPSAwICovCi0gICAgTTRPU0FfVUludDMyIGNsaXBfZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7Ci0gICAgTTRPU0FfSW50MzIgIGNsaXBfb2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKLSAgICBNNE9TQV9JbnQzMiAgY2xpcF9vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQ7Ci0gICAgTTRPU0FfVUludDMyIGNsaXBfbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsgLyogcmFuZ2UgMCB0byAyNTUgKi8KLSAgICAvKiBhcnJheSBvZiBzaXplIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgKi8KLSAgICBNNE9TQV9JbnQzMiAgY2xpcF9vZmZzZXRfZm9yX3JlZl9mcmFtZVsyNTZdOwotICAgIE00T1NBX1VJbnQzMiBjbGlwX251bV9yZWZfZnJhbWVzOwotICAgIE00T1NBX1VJbnQzMiBjbGlwX2dhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZzsKLQotICAgIE00T1NBX1VJbnQzMiBmaW5hbF9QUFNfSUQ7Ci0gICAgTTRPU0FfVUludDMyIGZpbmFsX1NQU19JRDsKLSAgICBOU1dBVkNfYml0U3RyZWFtX3RfTUNTICBlbmNiczsKLQotfSBOU1dBVkNfTUNTX3Q7Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQKLSAqIEBicmllZiAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBNQ1MgY29udGV4dCAocHJpdmF0ZSkKLSAqIEBub3RlICAgICAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBhbGwgTUNTIGNhbGxzIHRvIHN0b3JlIHRoZSBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyoqCi0gICAgICogTUNTIFN0YXRlIGFuZCBzZXR0aW5ncyBzdHVmZiAqLwotICAgIE00TUNTX1N0YXRlcyAgICAgICAgICAgIFN0YXRlOyAgICAgLyoqPCBNQ1MgaW50ZXJuYWwgc3RhdGUgKi8KLSAgICBNNE1DU19TdHJlYW1TdGF0ZSAgICAgICBWaWRlb1N0YXRlOy8qKjwgU3RhdGUgb2YgdGhlIHZpZGVvIGVuY29kaW5nICovCi0gICAgTTRNQ1NfU3RyZWFtU3RhdGUgICAgICAgQXVkaW9TdGF0ZTsvKio8IFN0YXRlIG9mIHRoZSBhdWRpbyBlbmNvZGluZyAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIG5vYXVkaW87LyoqPCBGbGFnIHRvIGtub3cgaWYgd2UgaGF2ZSB0byBkZWFsIHdpdGggYXVkaW8gdHJhbnNjb2RpbmcgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBub3ZpZGVvOy8qKjwgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZGVhbCB3aXRoIHZpZGVvIHRyYW5zY29kaW5nICovCi0KLSAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAgSW5wdXRGaWxlUHJvcGVydGllczsvKio8IElucHV0IGF1ZGlvL3ZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgcElucHV0RmlsZTsgICAgICAgICAgICAgLyoqPCBSZW1lbWJlciBpbnB1dCBmaWxlIHBvaW50ZXIgYmV0d2VlbiBmYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuIGFuZCBub3JtYWwgb3BlbiAqLwotICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGU7ICAgICAgICAgIC8qKjwgUmVtZW1iZXIgaW5wdXQgZmlsZSB0eXBlIGJldHdlZW4gZmFzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbiBhbmQgbm9ybWFsIG9wZW4gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBiRmlsZU9wZW5lZEluRmFzdE1vZGU7ICAvKio8IEZsYWcgdG8ga25vdyBpZiBhIHBhcnRpY3VsYXIgcmVhZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyBmYXN0IG9wZW4gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aU1heE1ldGFkYXRhU2l6ZTsgICAgICAvKio8IExpbWl0YXRpb24gb24gdGhlIG1heCBhY2NlcHRhYmxlIG1vb3YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgb2YgYSAzZ3BwIGZpbGUgKi8KLQotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgIEVuY29kaW5nVmlkZW9Gb3JtYXQ7ICAgIC8qKjwgT3V0cHV0IHZpZGVvIGZvcm1hdCwgc2V0IGJ5IHRoZSB1c2VyICovCi0gICAgTTRFTkNPREVSX0ZyYW1lV2lkdGggICAgRW5jb2RpbmdXaWR0aDsgICAgICAgICAgLyoqPCBPdXRwdXQgdmlkZW8gd2lkdGgsIHNldCBieSB0aGUgdXNlciAqLwotICAgIE00RU5DT0RFUl9GcmFtZUhlaWdodCAgIEVuY29kaW5nSGVpZ2h0OyAgICAgICAgIC8qKjwgT3V0cHV0IHZpZGVvIGhlaWdodCwgc2V0IGJ5IHRoZSB1c2VyICovCi0gICAgTTRFTkNPREVSX0ZyYW1lUmF0ZSAgICAgRW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZTsgLyoqPCBPdXRwdXQgdmlkZW8gZnJhbWVyYXRlLCBzZXQgYnkgdGhlIHVzZXIqLwotCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlCZWdpbkN1dFRpbWU7ICAgICAvKio8IEJlZ2luIGN1dCB0aW1lLCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1aUVuZEN1dFRpbWU7ICAgICAgIC8qKjwgQmVnaW4gY3V0IHRpbWUsIGluIG1pbGxpc2Vjb25kcyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHVpTWF4RmlsZVNpemU7ICAgICAgLyoqPCBNYXhpbXVtIG91dHB1dCBmaWxlIHNpemUsIGluIGJ5dGVzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGU7ICAgICAvKio8IFRhcmdldGVkIGF1ZGlvIGJpdHJhdGUgaW4gYnBzICovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlWaWRlb0JpdHJhdGU7ICAgICAvKio8IFRhcmdldGVkIHZpZGVvIGJpdHJhdGUgaW4gYnBzICovCi0KLSAgICBNNE9TQV9VSW50OCAgICAgdWlQcm9ncmVzczsgIC8qKjwgUHJvZ3Jlc3MgaW5mb3JtYXRpb24gc2F2ZWQgYXQgZWFjaCBzdGVwIHRvIGJlIGFibGUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0IGluIGNhc2Ugb2YgcGF1c2UgKi8KLQotICAgIC8qKgotICAgICAqIFJlYWRlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgIHBSZWFkZXJDb250ZXh0OyAgICAgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSByZWFkZXIgbW9kdWxlICovCi0gICAgTTRfVmlkZW9TdHJlYW1IYW5kbGVyKiAgcFJlYWRlclZpZGVvU3RyZWFtOyAgICAgICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSByZWFkIHZpZGVvIHN0cmVhbSAqLwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogIHBSZWFkZXJBdWRpb1N0cmVhbTsgICAgICAgLyoqPCBEZXNjcmlwdGlvbiBvZiB0aGUgcmVhZCBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBiVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kOyAgIC8qKjwgVHJ1ZSBpZiBhbiB1bnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaGFzIGJlZW4gZm91bmQgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBiVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kOyAgIC8qKjwgVHJ1ZSBpZiBhbiB1bnN1cHBvcnRlZCBhdWRpbyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaGFzIGJlZW4gZm91bmQgKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICBSZWFkZXJWaWRlb0FVOyAgICAgICAgICAgIC8qKjwgUmVhZCB2aWRlbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgIFJlYWRlclZpZGVvQVUxOyAgICAgICAgICAgLyoqPCBSZWFkIHZpZGVvIGFjY2VzcyB1bml0ICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgUmVhZGVyVmlkZW9BVTI7ICAgICAgICAgICAvKio8IFJlYWQgdmlkZW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICBSZWFkZXJBdWRpb0FVOyAgICAgICAgICAgIC8qKjwgUmVhZCBhdWRpbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00X0FjY2Vzc1VuaXQgICAgICAgICAgIFJlYWRlckF1ZGlvQVUxOyAgICAgICAgICAgLyoqPCBSZWFkIGF1ZGlvIGFjY2VzcyB1bml0ICovCi0gICAgTTRfQWNjZXNzVW5pdCAgICAgICAgICAgUmVhZGVyQXVkaW9BVTI7ICAgICAgICAgICAvKio8IFJlYWQgYXVkaW8gYWNjZXNzIHVuaXQgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICBtX3BEYXRhQWRkcmVzczE7ICAgICAgICAgIC8qKjwgVGVtcG9yYXJ5IGJ1ZmZlciBmb3IgQWNjZXNzIFVuaXQgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICBtX3BEYXRhQWRkcmVzczI7ICAgICAgICAgIC8qKjwgVGVtcG9yYXJ5IGJ1ZmZlciBmb3IgQWNjZXNzIFVuaXQgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICBtX3BEYXRhVmlkZW9BZGRyZXNzMTsgICAgIC8qKjwgVGVtcG9yYXJ5IGJ1ZmZlciBmb3IgQWNjZXNzIFVuaXQgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICBtX3BEYXRhVmlkZW9BZGRyZXNzMjsgICAgIC8qKjwgVGVtcG9yYXJ5IGJ1ZmZlciBmb3IgQWNjZXNzIFVuaXQgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX2F1ZGlvQVVEdXJhdGlvbjsgICAgICAgIC8qKjwgQXVkaW8gQVUgZHVyYXRpb24gKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICBpQXVkaW9DdHNPZmZzZXQ7ICAgICAgICAgIC8qKjwgQXVkaW8gQVUgQ1RTIG9mZnNldCBkdWUgdG8gYmVnaW4gY3V0ICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBkZWNvZGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgIHBWaURlY0N0eHQ7ICAgICAgICAgLyoqPCBWaWRlbyBkZWNvZGVyIGNvbnRleHQgKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgZFZpRGVjU3RhcnRpbmdDdHM7ICAvKio8IFZpZGVvIENUUyBhdCB3aGljaCB0aGUgZGVjb2RlL2VuY29kZSB3aWxsIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlZCBmb3IgYmVnaW4gY3V0IGFuZCBwYXVzZS9yZXN1bWUpICovCi0gICAgTTRPU0FfRG91YmxlICAgICAgICAgIGRWaURlY0N1cnJlbnRDdHM7ICAgLyoqPCBWaWRlbyBDVFMgdG8gZGVjb2RlICovCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgIGlWaWRlb0JlZ2luRGVjSW5jcjsgLyoqPCBDVFMgc3RlcCBmb3IgdGhlIGJlZ2luIGN1dCBkZWNvZGUgKGRvZXNuJ3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkIGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbikgKi8KLSAgICBNNE9TQV9Eb3VibGUgICAgICAgICAgZEN0c0luY3JlbWVudDsgICAgICAvKio8IEN0cyBpbmNyZW1lbnQgZnJvbSBvbmUgdmlkZW8gZnJhbWUgdG8gYW5vdGhlciovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgIGlzUmVuZGVyRHVwOyAgICAgICAgLyoqPCBUbyBoYW5kbGUgZHVwbGljYXRlIGZyYW1lIHJlbmRlcmluZyBpbiBjYXNlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgZGVjb2RpbmcgKi8KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogICAgbGFzdERlY29kZWRQbGFuZTsgICAvKio8IExhc3QgZGVjb2RlZCBwbGFuZSAqLwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZW5jb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICBwVmlFbmNDdHh0OyAgICAgICAgIC8qKjwgVmlkZW8gZW5jb2RlciBjb250ZXh0ICovCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUqICAgIHBQcmVSZXNpemVGcmFtZTsgICAgLyoqPCBUaGUgZGVjb2RlZCBpbWFnZSBiZWZvcmUgcmVzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY2F0ZWQgaWYgcmVzaXplIG5lZWRlZCBvbmx5KSovCi0gICAgTTRPU0FfVUludDMyICAgICAgICAgIHVpRW5jVmlkZW9CaXRyYXRlOyAgLyoqPCBBY3R1YWwgdmlkZW8gYml0cmF0ZSBmb3IgdGhlIHZpZGVvIGVuY29kZXIgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgb3V0cHV0VmlkZW9UaW1lc2NhbGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgIGVuY29kZXJTdGF0ZTsKLQotICAgIC8qKgotICAgICAqIEF1ZGlvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgcEF1ZGlvRGVjQ3R4dDsgICAgICAgIC8qKjwgQXVkaW8gKEFBQykgZGVjb2RlciBjb250ZXh0ICovCi0gICAgTTRBRF9CdWZmZXIgICAgICAgICAgIEF1ZGlvRGVjQnVmZmVySW47ICAgICAvKio8IElucHV0IHN0cnVjdHVyZSBmb3IgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICBNNEFEX0J1ZmZlciAgICAgICAgICAgQXVkaW9EZWNCdWZmZXJPdXQ7ICAgIC8qKjwgT3V0cHV0IHN0cnVjdHVyZSBmb3IgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgcFBvc0luRGVjQnVmZmVyT3V0OyAgIC8qKjwgUG9zaXRpb24gaW50byB0aGUgZGVjb2RlciBidWZmZXIgKi8KLSAgICBBQUNfREVDX1NUUkVBTV9QUk9QUyAgQWFjUHJvcGVydGllczsgICAvKio8IFN0cnVjdHVyZSBmb3IgbmV3IGFwaSB0byBnZXQgQUFDIHByb3BlcnRpZXMgKi8KLQotICAgIC8qKgotICAgICAqIFNhbXBsZSBSYXRlIENvbnZlcnRvciAoU1NSQykgc3R1ZmYgKi8KLSAgICBTU1JDX0luc3RhbmNlX3QgICAgICAgIFNzcmNJbnN0YW5jZTsgICAgICAgLyoqPCBDb250ZXh0IG9mIHRoZSBTc3JjICovCi0gICAgU1NSQ19TY3JhdGNoX3QqICAgICAgICBTc3JjU2NyYXRjaDsgICAgICAgIC8qKjwgV29ya2luZyBtZW1vcnkgb2YgdGhlIFNzcmMgKi8KLSAgICBzaG9ydCAgICAgICAgICAgICAgICAgIGlTc3JjTmJTYW1wbEluOyAgICAgLyoqPCBOdW1iZXIgb2Ygc2FtcGxlIHRoZSBTc3JjIG5lZWRzIGFzIGlucHV0ICovCi0gICAgc2hvcnQgICAgICAgICAgICAgICAgICBpU3NyY05iU2FtcGxPdXQ7ICAgIC8qKjwgTnVtYmVyIG9mIHNhbXBsZSB0aGUgU3NyYyBvdXRwdXRzICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICBwU3NyY0J1ZmZlckluOyAgICAgIC8qKjwgSW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgIHBTc3JjQnVmZmVyT3V0OyAgICAgLyoqPCBPdXRwdXQgb2YgdGhlIFNTUkMgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgIHBQb3NJblNzcmNCdWZmZXJJbjsgLyoqPCBQb3NpdGlvbiBpbnRvIHRoZSBTU1JDIGluIGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4ICAgICAgICAgcFBvc0luU3NyY0J1ZmZlck91dDsvKio8IFBvc2l0aW9uIGludG8gdGhlIFNTUkMgb3V0IGJ1ZmZlciAqLwotCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICBwTFZBdWRpb1Jlc2FtcGxlcjsKLQotCi0gICAgLyoqCi0gICAgICogYXVkaW8gZW5jb2RlciBzdHVmZiAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgICAgcEF1ZGlvRW5jQ3R4dDsgLyoqPCBDb250ZXh0IG9mIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX0F1ZGlvRGVjU3BlY2lmaWNJbmZvICBwQXVkaW9FbmNEU0k7IC8qKjwgRGVjb2RlciBzcGVjaWZpYyBpbmZvIGJ1aWx0IGJ5IHRoZSBlbmNvZGVyKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9QYXJhbXMgICAgICAgICAgIEF1ZGlvRW5jUGFyYW1zOy8qKjwgQ29uZmlnIG9mIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggICAgICAgICAgICBwQXVkaW9FbmNvZGVyQnVmZmVyOyAgICAgIC8qKjwgSW5wdXQgb2YgdGhlIGVuY29kZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCAgICAgICAgICAgIHBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlcjsgLyoqPCBQb3NpdGlvbiBpbnRvIHRoZSBlbmNvZGVyIGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgYXVkaW9FbmNvZGVyR3JhbnVsYXJpdHk7ICAvKio8IE1pbmltdW0gbnVtYmVyIG9mIHBjbSBzYW1wbGVzIG5lZWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGZlZWQgYXVkaW8gZW5jb2RlciAqLwotCi0gICAgLyoqCi0gICAgICogV3JpdGVyIHN0dWZmICovCi0gICAgTTRPU0FfQ29udGV4dCAgICAgICAgICAgICBwV3JpdGVyQ29udGV4dDsgICAgIC8qKjwgQ29udGV4dCBvZiB0aGUgd3JpdGVyIG1vZHVsZSAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgcE91dHB1dEZpbGU7ICAgICAgICAvKio8IE91dHB1dCBmaWxlIHRvIGJlIGNyZWF0ZWQgKi8KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlOyAgICAgLyoqPCBUZW1wb3JhcnkgZmlsZSB0byBiZSBjcmVhdGVkIHRvIHN0b3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhICgibW9vdi5iaW4iKSAqLwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uICAgV3JpdGVyVmlkZW9TdHJlYW07ICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSB3cml0dGVuIHZpZGVvIHN0cmVhbSAqLwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uICAgV3JpdGVyQXVkaW9TdHJlYW07ICAvKio8IERlc2NyaXB0aW9uIG9mIHRoZSB3cml0dGVuIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MgV3JpdGVyVmlkZW9TdHJlYW1JbmZvOy8qKjwgVmlkZW8gcHJvcGVydGllcyBvZiB0aGUgd3JpdHRlbiB2aWRlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgV3JpdGVyVmlkZW9BVTsgICAgICAgIC8qKjwgV3JpdHRlbiB2aWRlbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00U1lTX0FjY2Vzc1VuaXQgICAgICAgICAgV3JpdGVyQXVkaW9BVTsgICAgICAgIC8qKjwgV3JpdHRlbiBhdWRpbyBhY2Nlc3MgdW5pdCAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlWaWRlb0FVQ291bnQ7ICAgICAgIC8qKjwgTnVtYmVyIG9mIHZpZGVvIEFVIHdyaXR0ZW4gaW4gb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlWaWRlb01heEF1U2l6ZTsgICAgIC8qKjwgTWF4IGFjY2VzcyB1bml0IHNpemUgZm9yIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgIHVpVmlkZW9NYXhDaHVuY2tTaXplOyAvKio8IE1heCBjaHVuY2sgc2l6ZSBmb3IgdGhlIG91dHB1dCB2aWRlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlBdWRpb0FVQ291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgYXVkaW8gQVUgd3JpdHRlbiBpbiBvdXRwdXQgZmlsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlBdWRpb01heEF1U2l6ZTsgLyoqPCBNYXggYWNjZXNzIHVuaXQgc2l6ZSBmb3IgdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHN0cmVhbSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICAgdWlBdWRpb0N0czsgICAgICAgLyoqPCBBdWRpbyBBVSBjdHMgKHdoZW4gYXVkaW8gaXMgdHJhbnNjb2RlZCkgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIGJfaXNSYXdXcml0ZXI7ICAgIC8qKjwgQm9vbGVhbiB0byBrbm93IGlmIHRoZSByYXcgd3JpdGVyIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkIG9yIG5vdCAqLwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgcE91dHB1dFBDTWZpbGU7ICAgLyoqPCBPdXRwdXQgUENNIGZpbGUgaWYgbm90IE5VTEwgKi8KLQotICAgIC8qKgotICAgICAqIEZpbGVzeXN0ZW0gZnVuY3Rpb25zICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgICBwT3NhRmlsZVJlYWRQdHI7IC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLSAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciogIHBPc2FGaWxlV3JpdFB0cjsgLyoqPCBPU0FMIGZpbGUgd3JpdGUgZnVuY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb3ZpZGVkIGJ5IHVzZXIgKi8KLQotICAgIC8qKgotICAgICAgKiBNZWRpYSBhbmQgQ29kZWMgcmVnaXN0cmF0aW9uICovCi0gICAgLyoqPCBUYWJsZSBvZiBNNFZFU19Xcml0ZXJJbnRlcmZhY2Ugc3RydWN0dXJlcyBmb3IgYXZhbGFpYmxlIFdyaXRlcnMgbGlzdCAqLwotICAgIE00TUNTX1dyaXRlckludGVyZmFjZSAgICAgICAgICAgICAgIFdyaXRlckludGVyZmFjZVtNNFdSSVRFUl9rVHlwZV9OQl07Ci0gICAgLyoqPCBvcGVuLCBjbG9zZSwgc2V0b3B0aW9uLGV0Yy4uLiBmdW5jdGlvbnMgb2YgdGhlIHVzZWQgd3JpdGVyKi8KLSAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0czsKLSAgICAvKio8IGRhdGEgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucyBvZiB0aGUgdXNlZCB3cml0ZXIgKi8KLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHM7Ci0gICAgLyoqPCBUYWJsZSBvZiBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlIHN0cnVjdHVyZXMgZm9yIGF2YWxhaWJsZSBlbmNvZGVycyBsaXN0ICovCi0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogICAgICAgICAgcFZpZGVvRW5jb2RlckludGVyZmFjZVtNNEVOQ09ERVJfa1ZpZGVvX05CXTsKLSAgICAvKio8IEZ1bmN0aW9ucyBvZiB0aGUgdXNlZCBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHM7Ci0KLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtNNEVOQ09ERVJfa1ZpZGVvX05CXTsKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW000RU5DT0RFUl9rVmlkZW9fTkJdOwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGE7Ci0KLSAgICAvKio8IFRhYmxlIG9mIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSBzdHJ1Y3R1cmVzIGZvciBhdmFsYWlibGUgZW5jb2RlcnMgbGlzdCAqLwotICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSogICAgIHBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTTRFTkNPREVSX2tBdWRpb19OQl07Ci0gICAgLyoqPCBUYWJsZSBvZiBpbnRlcm5hbC9leHRlcm5hbCBmbGFncyBmb3IgYXZhbGFpYmxlIGVuY29kZXJzIGxpc3QgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyRmxhZ1tNNEVOQ09ERVJfa0F1ZGlvX05CXTsKLSAgICAvKio8IEZ1bmN0aW9ucyBvZiB0aGUgdXNlZCBlbmNvZGVyICovCi0gICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiAgICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHM7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbTTRFTkNPREVSX2tBdWRpb19OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YTsKLQotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICAgICAgICAgIG1fcFJlYWRlckdsb2JhbEl0VGFibGVbTTRSRUFERVJfa01lZGlhVHlwZV9OQl07Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0VGFibGVbTTRSRUFERVJfa01lZGlhVHlwZV9OQl07Ci0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKiAgICAgICAgICAgbV9wUmVhZGVyOwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdDsKLSAgICBNNE9TQV9VSW50OCAgICAgICAgICAgICAgICAgICAgICAgICBtX3VpTmJSZWdpc3RlcmVkUmVhZGVyczsKLQotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogICAgICAgICAgIG1fcFZpZGVvRGVjb2RlcjsKLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqICAgICAgICAgICBtX3BWaWRlb0RlY29kZXJJdFRhYmxlW000REVDT0RFUl9rVmlkZW9UeXBlX05CXTsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICBNNE9TQV9Wb2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGE7Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgbV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQl07Ci0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgICAgICAgICAgbV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjOwotCi0gICAgTTRBRF9JbnRlcmZhY2UqICAgICAgICAgbV9wQXVkaW9EZWNvZGVyOwotICAgIE00QURfSW50ZXJmYWNlKiAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbTTRBRF9rVHlwZV9OQl07Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW000QURfa1R5cGVfTkJdOyAvKio8IHN0b3JlIGluZGljZXMgb2YgZXh0ZXJuYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVycyAqLwotICAgIE00T1NBX1ZvaWQqICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbTTRBRF9rVHlwZV9OQl07Ci0gICAgTTRPU0FfVm9pZCogICAgICAgICAgICAgbV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhOwotCi0gICAgTTRNQ1NfTWVkaWFSZW5kZXJpbmcgICAgTWVkaWFSZW5kZXJpbmc7ICAgICAvKio8IEZCOiB0byBjcm9wLCByZXNpemUsIG9yIHJlbmRlciBibGFjayBib3JkZXJzKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICBtX2Fpcl9jb250ZXh0OwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJFeHRPTVhBdWREZWNvZGVyOyAgLyogRXh0ZXJuYWwgT01YIEF1ZGlvIGRlY29kZXIgKi8KLQotICAgIC8qKjwgRmxCIDIwMDkuMDMuMDQ6IEF1ZGlvIGVmZmVjdHMqLwotICAgIE00TUNTX0VmZmVjdFNldHRpbmdzICAgICpwRWZmZWN0czsgICAgICAgICAgICAgIC8qKjwgTGlzdCBvZiBlZmZlY3RzICovCi0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgbmJFZmZlY3RzOyAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWZmZWN0cyBpbiB0aGUgYWJvdmUgbGlzdCAqLwotICAgIE00T1NBX0ludDggICAgICAgICAgICAgIHBBY3RpdmVFZmZlY3ROdW1iZXI7ICAgIC8qKjwgRWZmZWN0IElEIHRvIGJlIGFwcGxpZWQsIGlmIC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGVmZmVjdCBoYXMgdG8gYmUgYXBwbGllZCBjdXJyZW50bHkqLwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgbV9iSXNTdGlsbFBpY3R1cmU7ICAgICAgIC8qKjwgPVRSVUUgaWYgaW5wdXQgZmlsZSBpcyBhIHN0aWxsIHBpY3R1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEpQRUcsIFBORywgQk1QLCBHSUYpKi8KLSAgICBNNE1DU19Db250ZXh0ICAgICAgICAgICBtX3BTdGlsbFBpY3R1cmVDb250ZXh0OyAvKio8IENvbnRleHQgb2YgdGhlIHN0aWxsIHBpY3R1cmUgcGFydCBvZiBNQ1MqLwotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLSAgICBOU1dBVkNfTUNTX3QgICAgICAgICAgICAqbV9wSW5zdGFuY2U7Ci0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgKkgyNjRNQ1NUZW1wQnVmZmVyOwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIEgyNjRNQ1NUZW1wQnVmZmVyU2l6ZTsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBIMjY0TUNTVGVtcEJ1ZmZlckRhdGFTaXplOwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgIGJIMjY0VHJpbTsKLSAgICAvKiBGbGFnIHdoZW4gdG8gZ2V0ICBsYXN0ZGVjb2RlZGZyYW1lQ1RTICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgYkxhc3REZWNvZGVkRnJhbWVDVFM7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgZW5jb2RpbmdWaWRlb1Byb2ZpbGU7Ci0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgZW5jb2RpbmdWaWRlb0xldmVsOwotCi19IE00TUNTX0ludGVybmFsQ29udGV4dDsKLQotCi0jZW5kaWYgLyogX19NNE1DU19JTlRFUk5BTFRZUEVTX0hfXyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjQ3MGU2Yi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgbGlidmlkZW9lZGl0b3JfbWNzCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJ2aWRlb2VkaXRvcl9tY3MKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgXAotICAgICAgTTRNQ1NfQVBJLmMgXAotICAgICAgTTRNQ1NfQXVkaW9FZmZlY3RzLmMgXAotICAgICAgTTRNQ1NfQ29kZWNzLmMgXAotICAgICAgTTRNQ1NfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jIFwKLSAgICAgIE00TUNTX1ZpZGVvUHJlUHJvY2Vzc2luZy5jCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyAgICAgICAgICAgICBcCi0gICAgbGlidXRpbHMgICAgICAgICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsICAgXAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLQotIyBBbGwgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgd2UgbGluayBhZ2FpbnN0LgotTE9DQUxfTERMSUJTIDo9IFwKLSAgICAtbHB0aHJlYWQgLWxkbAotCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgXAotICAgIC1ETTRNQ1NfV0lUSF9GQVNUX09QRU4KLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19BUEkuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0FQSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMDU2ZWYwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0FQSS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5NDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQVBJLmMKLSAqIEBicmllZiAgTUNTIGltcGxlbWVudGF0aW9uIChWaWRlbyBDb21wcmVzc29yIFNlcnZpY2UpCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBBUEkgYW5kIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBNQ1MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbmNsdWRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLS8qKgotICogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiIC8qKjwgT1NBTCBtZW1vcnkgbWFuYWdlbWVudCAqLwotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAvKio8IE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0vKiBQQ00gc2FtcGxlcyAqLwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yUmVzYW1wbGVyLmgiCi0vKioKLSAqIERlY29kZXIgaW50ZXJmYWNlICovCi0jaW5jbHVkZSAiTTRERUNPREVSX0NvbW1vbi5oIgotCi0vKiBFbmNvZGVyIGludGVyZmFjZSovCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotCi0vKiBFbmFibGUgZm9yIERFQlVHIGxvZ2dpbmcgKi8KLS8vI2RlZmluZSBNQ1NfRFVNUF9QQ01fVE9fRklMRQotI2lmZGVmIE1DU19EVU1QX1BDTV9UT19GSUxFCi0jaW5jbHVkZSA8c3RkaW8uaD4KLUZJTEUgKmZpbGVfYXVfcmVhZGVyID0gTlVMTDsKLUZJTEUgKmZpbGVfcGNtX2RlY29kZXIgPSBOVUxMOwotRklMRSAqZmlsZV9wY21fZW5jb2RlciA9IE5VTEw7Ci0jZW5kaWYKLQotLyogQ29yZSBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRNQ1NfQVBJLmgiCi0jaW5jbHVkZSAiTTRNQ1NfRXJyb3JDb2Rlcy5oIgotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNE1DU19JbnRlcm5hbENvbmZpZy5oIgotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsRnVuY3Rpb25zLmgiCi0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLSNpbmNsdWRlICJNNE1DU19TdGlsbFBpY3R1cmUuaCIKLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLS8qIENvbW1vbiBoZWFkZXJzIChmb3IgYWFjKSAqLwotI2luY2x1ZGUgIk00X0NvbW1vbi5oIgotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotI2luY2x1ZGUgIk00QUlSX0FQSS5oIgotI2luY2x1ZGUgIk9NWF9WaWRlby5oIgotCi0vKiBWZXJzaW9uICovCi0jZGVmaW5lIE00TUNTX1ZFUlNJT05fTUFKT1IgMwotI2RlZmluZSBNNE1DU19WRVJTSU9OX01JTk9SIDQKLSNkZWZpbmUgTTRNQ1NfVkVSU0lPTl9SRVZJU0lPTiAgMwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU3RhdGljIGxvY2FsIGZ1bmN0aW9ucwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRTdGVwU2V0KCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVXcml0ZXIoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBFbmNvZGluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFRyYW5zY29kZWRUaW1lICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9UcmFuc2NvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICAgKnBDb250ZXh0ICk7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TUNTX2ludEdldEZyYW1lU2l6ZV9BTVJOQigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICk7Ci1zdGF0aWMgTTRPU0FfVUludDMyIE00TUNTX2ludEdldEZyYW1lU2l6ZV9FVlJDKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tNYXhGaWxlU2l6ZSggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApOwotc3RhdGljIE00VklERU9FRElUSU5HX0JpdHJhdGUgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBmcmVlYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDggbW9kZSApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRDbGVhblVwX1JlYWRlcnNEZWNvZGVycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggKmFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbmV3U2l6ZSApOwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMpOwotCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludExpbWl0Qml0cmF0ZVBlckNvZGVjUHJvZmlsZUxldmVsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0FkdmFuY2VkUGFyYW1zKiBFbmNQYXJhbXMpOwotc3RhdGljIE00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvckgyNjNFbmMoTTRPU0FfSW50MzIgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGxldmVsLCBNNE9TQV9JbnQzMiBiaXRyYXRlKTsKLXN0YXRpYyBNNE9TQV9JbnQzMiBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JNcGVnNEVuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpOwotc3RhdGljIE00T1NBX0ludDMyIE00TUNTX2ludExpbWl0Qml0cmF0ZUZvckgyNjRFbmMoTTRPU0FfSW50MzIgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGxldmVsLCBNNE9TQV9JbnQzMiBiaXRyYXRlKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRXh0ZXJuYWwgZnVuY3Rpb24gdXNlZCBvbmx5IGJ5IFZpZGVvRWRpdG9yIGFuZCB0aGF0IGRvZXMgbm90IGFwcGVhcgotICogaW4gdGhlIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIElucHV0RmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBUZW1wRmlsZSApOwotCi0vKiBBbGwgZXJyb3JzIGFyZSBmYXRhbCBpbiB0aGUgTUNTICovCi0jZGVmaW5lIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpIGlmKE00Tk9fRVJST1IhPWVycikgcmV0dXJuIGVycjsKLQotLyogQSBkZWZpbmUgdXNlZCB3aXRoIFNTUkMgMS4wNCBhbmQgYWJvdmUgdG8gYXZvaWQgdGFraW5nIGJsb2NrcyBzbWFsbGVyCi0gKiB0aGF0IHRoZSBtaW5pbWFsIGJsb2NrIHNpemUKLSAqLwotI2RlZmluZSBNNE1DU19TU1JDX01JTkJMT0NLU0laRSAgICAgICAgMTAwCi0KLXN0YXRpYyBNNE9TQV9VQ2hhciBUYWJfTUNTWzhdID0KLXsKLSAgICAxNywgNSwgMywgMywgMSwgMSwgMSwgMQotfTsKLQotTTRPU0FfRVJSIEgyNjRNQ1NfR2V0aW5zdGFuY2UoIE5TV0FWQ19NQ1NfdCAqKiBpbnN0YW5jZSApCi17Ci0gICAgTlNXQVZDX01DU190ICpwX2JzID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBwX2JzID0gKE5TV0FWQ19NQ1NfdCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTlNXQVZDX01DU190KSwgTTRNQ1MsCi0gICAgICAgIChNNE9TQV9DaGFyICopIk5TV0FWQ19NQ1NfdCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcF9icyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiSDI2NE1DU19HZXRpbnN0YW5jZTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcF9icy0+cHJldl9mcmFtZV9udW0gPSAwOwotICAgIHBfYnMtPmN1cl9mcmFtZV9udW0gPSAwOwotICAgIHBfYnMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgPSAwOwotICAgIHBfYnMtPnByZXZfbmV3X2ZyYW1lX251bSA9IDA7Ci0gICAgcF9icy0+aXNfZG9uZSA9IDA7Ci0gICAgcF9icy0+aXNfZmlyc3QgPSAxOwotCi0gICAgcF9icy0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgcF9icy0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0KLSAgICBwX2JzLT5tX3BFbmNvZGVyU1BTID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5tX2VuY29kZXJTUFNTaXplID0gMDsKLQotICAgIHBfYnMtPm1fcEVuY29kZXJQUFMgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fZW5jb2RlclBQU1NpemUgPSAwOwotCi0gICAgcF9icy0+bV9wRmluYWxEU0kgPSBNNE9TQV9OVUxMOwotICAgIHBfYnMtPm1fcEZpbmFsRFNJU2l6ZSA9IDA7Ci0KLSAgICBwX2JzLT5wX2NsaXBfc3BzID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5tX2VuY29kZXJfU1BTX0NudCA9IDA7Ci0KLSAgICBwX2JzLT5wX2NsaXBfcHBzID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5tX2VuY29kZXJfUFBTX0NudCA9IDA7Ci0KLSAgICBwX2JzLT5wX2VuY29kZXJfc3BzID0gTTRPU0FfTlVMTDsKLSAgICBwX2JzLT5wX2VuY29kZXJfcHBzID0gTTRPU0FfTlVMTDsKLQotICAgIHBfYnMtPmVuY29kZXJfcHBzLnNsaWNlX2dyb3VwX2lkID0gTTRPU0FfTlVMTDsKLQotICAgICppbnN0YW5jZSA9IChOU1dBVkNfTUNTX3QgKilwX2JzOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX1VJbnQzMiBIMjY0TUNTX2dldEJpdHMoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLCBNNE9TQV9VSW50MzIgbnVtQml0cyApCi17Ci0gICAgTTRPU0FfVUludDMyIHVpMzJSZXRCaXRzOwotICAgIE00T1NBX1VJbnQ4ICpwYnM7Ci0gICAgTTRPU0FfSW50MzIgYmNudDsKLSAgICBwX2JzLT5pOEJpdENudCAtPSBudW1CaXRzOwotICAgIGJjbnQgPSBwX2JzLT5pOEJpdENudDsKLQotICAgIC8qIE1lYXN1cmUgdGhlIHF1YW50aXR5IG9mIGJpdHMgdG8gYmUgcmVhZCBpbiB1aTMyVGVtcEJ1ZmYgKi8KLSAgICB1aTMyUmV0Qml0cyA9IHBfYnMtPnVpMzJUZW1wQnVmZiA+PiAoMzIgLSBudW1CaXRzKTsKLQotICAgIC8qIFJlYWQgbnVtQml0cyBpbiB1aTMyVGVtcEJ1ZmYgKi8KLSAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgPDw9IG51bUJpdHM7Ci0gICAgcF9icy0+Yml0UG9zICs9IG51bUJpdHM7Ci0KLSAgICBpZiggYmNudCA+IDI0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAodWkzMlJldEJpdHMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAvKiBhdCBsZWFzdCBvbmUgYnl0ZSBjYW4gYmUgYnVmZmVyZWQgaW4gdWkzMlRlbXBCdWZmICovCi0gICAgICAgIHBicyA9IChNNE9TQV9VSW50OCAqKXBfYnMtPnB1aThCZnJQdHI7Ci0KLSAgICAgICAgaWYoIGJjbnQgPCAoaW50KShwX2JzLT5udW1CaXRzSW5CdWZmZXIgLSBwX2JzLT5iaXRQb3MpICkKLSAgICAgICAgeyAvKiBub3QgZW5vdWdoIHJlbWFpbmluZyBiaXRzIGluIHVpMzJUZW1wQnVmZjogbmVlZCB0byBiZSBmaWxsZWQgKi8KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogT24gdGhlIGZseSBkZXRlY3Rpb24gb2YgRVBCIGJ5dGUgKi8KLSAgICAgICAgICAgICAgICBpZiggKCAqKHBicykgPT0gMHgwMykKLSAgICAgICAgICAgICAgICAgICAgJiYgKCEoKCBwYnNbLTFdKQotICAgICAgICAgICAgICAgICAgICB8IChwYnNbLTJdKSkpKSAvLyhwX2JzLT51aTMyTGFzdFR3b0J5dGVzICYgMHgwMDAwRkZGRikgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEVQQiBieXRlIGZvdW5kOiBza2lwIGl0IGFuZCB1cGRhdGUgYml0UG9zIGFjY29yZGluZ2x5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBicykrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2JzLT5iaXRQb3MgKz0gODsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcF9icy0+dWkzMlRlbXBCdWZmIHw9ICoocGJzKSsrIDw8ICgyNCAtIGJjbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmNudCArPSA4OwotICAgICAgICAgICAgfSB3aGlsZSAoIGJjbnQgPD0gMjQgKTsKLQotICAgICAgICAgICAgcF9icy0+cHVpOEJmclB0ciA9IChNNE9TQV9JbnQ4ICopcGJzOwotICAgICAgICAgICAgcF9icy0+aThCaXRDbnQgPSBiY250OwotICAgICAgICAgICAgcmV0dXJuICh1aTMyUmV0Qml0cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggcF9icy0+Yml0UG9zIDw9IHBfYnMtPm51bUJpdHNJbkJ1ZmZlciApCi0gICAgewotICAgICAgICByZXR1cm4gKHVpMzJSZXRCaXRzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci19Ci0KLU00T1NBX1ZvaWQgSDI2NE1DU19mbHVzaEJpdHMoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLCBNNE9TQV9VSW50MzIgbnVtQml0cyApCi17Ci0gICAgTTRPU0FfVUludDggKnBiczsKLSAgICBNNE9TQV9VSW50MzIgYmNudDsKLSAgICBwX2JzLT5pOEJpdENudCAtPSBudW1CaXRzOwotICAgIGJjbnQgPSBwX2JzLT5pOEJpdENudDsKLQotICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA8PD0gbnVtQml0czsKLSAgICBwX2JzLT5iaXRQb3MgKz0gbnVtQml0czsKLQotICAgIGlmKCBiY250ID4gMjQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAvKiBhdCBsZWFzdCBvbmUgYnl0ZSBjYW4gYmUgYnVmZmVyZWQgaW4gdWkzMlRlbXBCdWZmICovCi0gICAgICAgIHBicyA9IChNNE9TQV9VSW50OCAqKXBfYnMtPnB1aThCZnJQdHI7Ci0KLSAgICAgICAgaWYoIGJjbnQgPCAocF9icy0+bnVtQml0c0luQnVmZmVyIC0gcF9icy0+Yml0UG9zKSApCi0gICAgICAgIHsgICAvKiBOb3QgZW5vdWdoIHJlbWFpbmluZyBiaXRzIGluIHVpMzJUZW1wQnVmZjogbmVlZCB0byBiZSBmaWxsZWQgKi8KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogIE9uIHRoZSBmbHkgZGV0ZWN0aW9uIG9mIEVQQiBieXRlICovCi0gICAgICAgICAgICAgICAgaWYoICggKihwYnMpID09IDB4MDMpICYmICghKCggcGJzWy0xXSkgfCAocGJzWy0yXSkpKSApCi0gICAgICAgICAgICAgICAgeyAvKiBKQzogRVBCIGJ5dGUgZm91bmQ6IHNraXAgaXQgYW5kIHVwZGF0ZSBiaXRQb3MgYWNjb3JkaW5nbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgKHBicykrKzsKLSAgICAgICAgICAgICAgICAgICAgcF9icy0+Yml0UG9zICs9IDg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfYnMtPnVpMzJUZW1wQnVmZiB8PSAqKHBicykrKyA8PCAoMjQgLSBiY250KTsKLSAgICAgICAgICAgICAgICBiY250ICs9IDg7Ci0gICAgICAgICAgICB9IHdoaWxlICggYmNudCA8PSAyNCApOwotCi0gICAgICAgICAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwYnM7Ci0gICAgICAgICAgICBwX2JzLT5pOEJpdENudCA9IGJjbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLU00T1NBX1VJbnQzMiBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKCBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icyApCi17Ci0gICAgTTRPU0FfVUludDMyIGNvZGUsIGwwID0gMCwgbDE7Ci0gICAgLyogUmVhZGluZyAzMiBCaXRzIGZyb20gbG9jYWwgY2FjaGUgYnVmZmVyIG9mIEJpdHN0cmVhbSBzdHJ1Y3R1cmUqLwotICAgIGNvZGUgPSBwX2JzLT51aTMyVGVtcEJ1ZmY7Ci0KLSAgICAvKiBDaGVja2luZyBpbiBmaXJzdCAzIGJpdHMqLwotICAgIGlmKCBjb2RlID4+IDI5ICkKLSAgICB7Ci0gICAgICAgIGwwID0gVGFiX01DU1soY29kZSA+PiAyOSldOwotICAgICAgICBjb2RlID0gY29kZSA+PiAoMzIgLSBsMCk7Ci0gICAgICAgIEgyNjRNQ1NfZmx1c2hCaXRzKHBfYnMsIGwwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggY29kZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29kZSA8PD0gMzsKLQotICAgICAgICAgICAgICAgIGZvciAoIGwwID0gMzsgY29kZSA8IDB4ODAwMDAwMDA7IGNvZGUgPDw9IDEsIGwwKysgKTsKLQotICAgICAgICAgICAgICAgIGlmKCBsMCA8IDE2ICkgLyphbGwgdXNlZnVsIGJpdHMgYXJlIGluc2lkZSB0aGUgMzIgYml0cyByZWFkICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb2RlID0gY29kZSA+PiAoMzEgLSBsMCk7Ci0gICAgICAgICAgICAgICAgICAgIEgyNjRNQ1NfZmx1c2hCaXRzKHBfYnMsIDIgKiBsMCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7IC8qIFJlYWQgdGhlIHVzZWZ1bCBiaXRzIGluIDIgcGFydHMgKi8KLSAgICAgICAgICAgICAgICAgICAgbDEgPSAoIGwwIDw8IDEpIC0gMzE7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUgPj49IGwwOwotICAgICAgICAgICAgICAgICAgICBIMjY0TUNTX2ZsdXNoQml0cyhwX2JzLCAzMik7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSAoIGNvZGUgPDwgbDEpIHwgSDI2NE1DU19nZXRCaXRzKHBfYnMsIGwxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSDI2NE1DU19mbHVzaEJpdHMocF9icywgMzIpOwotCi0gICAgICAgICAgICAgICAgaWYoIEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBpZiBudW1iZXIgb2YgbGVhZGluZyAwJ3MgaXMgMzIsIHRoZSBvbmx5IGNvZGUgYWxsb3dlZCBpcyAxIGZvbGxvd2VkCi0gICAgICAgICAgICAgICAgICAgIGJ5IDMyIDAncyAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qcmVhZGluZyAzMiBtb3JlIGJpdHMgZnJvbSBiaXRzdHJlYW0gYnVmZmVyKi8KLSAgICAgICAgICAgICAgICAgICAgY29kZSA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAzMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNvZGUgPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY29kZSAtIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qaWYgbnVtYmVyIG9mIGxlYWRpbmcgMCdzIGlzID4zMiwgdGhlbiBzeW1ib2wgaXMgPjMyIGJpdHMsCi0gICAgICAgICAgICAgICAgd2hpY2ggaXMgYW4gZXJyb3IgKi8KLSAgICAgICAgICAgICAgICAvL3BfYnMtPnN0YXRlID0gX0JTX0VSUjsKLSAgICAgICAgICAgICAgICAvL3BfYnMtPmZsYWdzIHw9IF9CRl9TWU1fRVJSOwotICAgICAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggMSApIC8vKHBfYnMtPnN0YXRlID09IF9CU19PSykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChjb2RlIC0gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICB9Ci0gICAgfQotCi1NNE9TQV9JbnQzMiBIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKCBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icyApCi17Ci0gICAgTTRPU0FfSW50MzIgY29kZU5vLCByZXQ7Ci0KLSAgICAvKiByZWFkIHRoZSB1bnNpZ25lZCBjb2RlIG51bWJlciAqLwotICAgIGNvZGVObyA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAvKiBtYXAgdG8gdGhlIHNpZ25lZCB2YWx1ZSwgaWYgdmFsdWUgaXMgb2RkIHRoZW4gaXQncyBwb3NpdGl2ZSwKLSAgICBpZiBldmVuIHRoZW4gaXQncyBuZWdhdGl2ZSwgZm9ybXVsYSBpcyAoLTEpXihrKzEpKkNFSUwoay8yKSAqLwotCi0gICAgcmV0ID0gKGNvZGVObyAmIDB4MDEpID8gKCggY29kZU5vICsgMSkgPj4gMSkgOiAoKCAtY29kZU5vKSA+PiAxKTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLU00T1NBX1ZvaWQgRGVjQml0U3RyZWFtUmVzZXRfTUNTKCBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBieXRlc19yZWFkICkKLXsKLSAgICBwX2JzLT5iaXRQb3MgPSAwOwotCi0gICAgcF9icy0+bGFzdFRvdGFsQml0cyA9IDA7Ci0gICAgcF9icy0+bnVtQml0c0luQnVmZmVyID0gYnl0ZXNfcmVhZCA8PCAzOwotICAgIHBfYnMtPnJlYWRhYmxlQnl0ZXNJbkJ1ZmZlciA9IGJ5dGVzX3JlYWQ7Ci0gICAgLy9wX2JzLT5zdGF0ZSA9IE00Tk9fRVJST1I7Ly9fQlNfT0s7Ci0gICAgLy9wX2JzLT5mbGFncyA9IDA7Ci0KLSAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgPSAwOwotICAgIHBfYnMtPmk4Qml0Q250ID0gMDsKLSAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwX2JzLT5CdWZmZXI7Ci0gICAgcF9icy0+dWkzMkxhc3RUd29CeXRlcyA9IDB4RkZGRkZGRkY7Ci0gICAgSDI2NE1DU19nZXRCaXRzKHBfYnMsIDApOwotfQotCi1NNE9TQV9FUlIgTlNXQVZDTUNTX2luaXRCaXRzdHJlYW0oIE5TV0FWQ19iaXRTdHJlYW1fdF9NQ1MgKmJTICkKLXsKLSAgICBiUy0+Yml0UG9zID0gMDsKLSAgICBiUy0+Ynl0ZUNudCA9IDA7Ci0gICAgYlMtPmN1cnJCdWZmID0gMDsKLSAgICBiUy0+cHJldkJ5dGUgPSAweGZmOwotICAgIGJTLT5wcmV2UHJldkJ5dGUgPSAweGZmOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1NfcHV0Qml0cyggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMsIE00T1NBX1VJbnQzMiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCBsZW5ndGggKQotewotICAgIE00T1NBX1VJbnQzMiBtYXNrZWRWYWx1ZSA9IDAsIHRlbXAgPSAwOwotICAgIE00T1NBX1VJbnQ4IGJ5dGVPbmU7Ci0KLSAgICBNNE9TQV9VSW50MzIgbGVuMSA9IChsZW5ndGggPT0gMzIpID8gMzEgOiBsZW5ndGg7Ci0KLSAgICBpZiggIShsZW5ndGgpICkKLSAgICB7Ci0gICAgICAgIC8qIExlbmd0aCA9IDAsIHJldHVybiBPSyovCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIG1hc2tlZFZhbHVlID0gKE00T1NBX1VJbnQzMikodmFsdWUgJigoIDEgPDwgbGVuMSkgLSAxKSk7Ci0KLSAgICBpZiggMzIgPiAobGVuZ3RoICsgYlMtPmJpdFBvcykgKQotICAgIHsKLSAgICAgICAgYlMtPmJpdFBvcyArPSBsZW5ndGg7Ci0gICAgICAgIGJTLT5jdXJyQnVmZiB8PSBtYXNrZWRWYWx1ZSA8PCAoMzIgLSBiUy0+Yml0UG9zKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdGVtcCA9ICgoIGJTLT5iaXRQb3MgKyBsZW5ndGgpIC0gMzIpOwotCi0gICAgICAgIGJTLT5jdXJyQnVmZiB8PSAobWFza2VkVmFsdWUgPj4gKHRlbXApKTsKLQotICAgICAgICBieXRlT25lID0KLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAoTTRPU0FfVUludDgpKGJTLT5jdXJyQnVmZiA+PiAyNCk7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiAxNikgJiAweGZmKTsKLQotICAgICAgICBpZiggKCggYlMtPnByZXZQcmV2Qnl0ZQotICAgICAgICAgICAgPT0gMCkgJiAoYlMtPnByZXZCeXRlID09IDApICYgKCEoYnl0ZU9uZSAmIDB4RkMpKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+Ynl0ZUNudCAtPSAxOwotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSAweDAzOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnByZXZCeXRlOwotICAgICAgICAgICAgYlMtPnByZXZCeXRlID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBieXRlT25lID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpKCggYlMtPmN1cnJCdWZmID4+IDgpICYgMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoYlMtPmN1cnJCdWZmKSAmMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBiUy0+Y3VyckJ1ZmYgPSAwOwotCi0gICAgICAgIGJTLT5jdXJyQnVmZiB8PSAoIG1hc2tlZFZhbHVlICYoKCAxIDw8IHRlbXApIC0gMSkpIDw8ICgzMiAtIHRlbXApOwotCi0gICAgICAgIGJTLT5iaXRQb3MgPSB0ZW1wOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTlNXQVZDTUNTX3B1dEJpdCggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMsIE00T1NBX1VJbnQzMiB2YWx1ZSApCi17Ci0gICAgTTRPU0FfVUludDMyIG1hc2tlZFZhbHVlID0gMCwgdGVtcCA9IDA7Ci0gICAgTTRPU0FfVUludDggYnl0ZU9uZTsKLQotICAgIG1hc2tlZFZhbHVlID0gKHZhbHVlID8gMSA6IDApOwotCi0gICAgaWYoIDMyID4gKDEgKyBiUy0+Yml0UG9zKSApCi0gICAgewotICAgICAgICBiUy0+Yml0UG9zICs9IDE7Ci0gICAgICAgIGJTLT5jdXJyQnVmZiB8PSBtYXNrZWRWYWx1ZSA8PCAoMzIgLSBiUy0+Yml0UG9zKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdGVtcCA9IDA7Ci0KLSAgICAgICAgYlMtPmN1cnJCdWZmIHw9IChtYXNrZWRWYWx1ZSk7Ci0KLSAgICAgICAgLyogd3JpdGluZyBpdCB0byBtZW1vcnkqLwotICAgICAgICBieXRlT25lID0KLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KShiUy0+Y3VyckJ1ZmYgPj4gMjQpOwotCi0gICAgICAgIGlmKCAoKCBiUy0+cHJldlByZXZCeXRlCi0gICAgICAgICAgICA9PSAwKSAmIChiUy0+cHJldkJ5dGUgPT0gMCkgJiAoIShieXRlT25lICYgMHhGQykpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5ieXRlQ250IC09IDE7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IDB4MDM7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+cHJldkJ5dGU7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVPbmUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCBiUy0+Y3VyckJ1ZmYgPj4gMTYpICYgMHhmZik7Ci0KLSAgICAgICAgaWYoICgoIGJTLT5wcmV2UHJldkJ5dGUKLSAgICAgICAgICAgID09IDApICYgKGJTLT5wcmV2Qnl0ZSA9PSAwKSAmICghKGJ5dGVPbmUgJiAweEZDKSkpICkKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPmJ5dGVDbnQgLT0gMTsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gMHgwMzsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYlMtPnByZXZQcmV2Qnl0ZSA9IGJTLT5wcmV2Qnl0ZTsKLSAgICAgICAgICAgIGJTLT5wcmV2Qnl0ZSA9IGJ5dGVPbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZU9uZSA9IGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiA4KSAmIDB4ZmYpOwotCi0gICAgICAgIGlmKCAoKCBiUy0+cHJldlByZXZCeXRlCi0gICAgICAgICAgICA9PSAwKSAmIChiUy0+cHJldkJ5dGUgPT0gMCkgJiAoIShieXRlT25lICYgMHhGQykpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5ieXRlQ250IC09IDE7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IDB4MDM7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+cHJldkJ5dGU7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVPbmUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKGJTLT5jdXJyQnVmZikgJjB4ZmYpOwotCi0gICAgICAgIGlmKCAoKCBiUy0+cHJldlByZXZCeXRlCi0gICAgICAgICAgICA9PSAwKSAmIChiUy0+cHJldkJ5dGUgPT0gMCkgJiAoIShieXRlT25lICYgMHhGQykpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5ieXRlQ250IC09IDE7Ci0gICAgICAgICAgICBiUy0+cHJldlByZXZCeXRlID0gYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IDB4MDM7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gYnl0ZU9uZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJTLT5wcmV2UHJldkJ5dGUgPSBiUy0+cHJldkJ5dGU7Ci0gICAgICAgICAgICBiUy0+cHJldkJ5dGUgPSBieXRlT25lOwotICAgICAgICB9Ci0gICAgICAgIGJTLT5jdXJyQnVmZiA9IDA7Ci0gICAgICAgIGJTLT5iaXRQb3MgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9JbnQzMiBOU1dBVkNNQ1NfcHV0UmJzcFRiaXRzKCBOU1dBVkNfYml0U3RyZWFtX3RfTUNTICpiUyApCi17Ci0gICAgTTRPU0FfVUludDggdHJhaWxCaXRzID0gMDsKLSAgICBNNE9TQV9VSW50OCBieXRlQ250ID0gMDsKLQotICAgIHRyYWlsQml0cyA9IChNNE9TQV9VSW50OCkoYlMtPmJpdFBvcyAlIDgpOwotCi0gICAgLyogQWxyZWFkeSBpbiB0aGUgYnl0ZSBhbGlnbmVkIHBvc2l0aW9uLAotICAgIFJCU1AgdHJhaWxpbmcgYml0cyB3aWxsIGJlIDEwMDAgMDAwMCAqLwotICAgIGlmKCAwID09IHRyYWlsQml0cyApCi0gICAgewotICAgICAgICB0cmFpbEJpdHMgPSAoMSA8PCA3KTsKLSAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoYlMsIHRyYWlsQml0cywgOCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRyYWlsQml0cyA9ICg4IC0gdHJhaWxCaXRzKTsKLSAgICAgICAgTlNXQVZDTUNTX3B1dEJpdChiUywgMSk7Ci0gICAgICAgIHRyYWlsQml0cy0tOwotCi0gICAgICAgIGlmKCB0cmFpbEJpdHMgKQotICAgICAgICB7IC8qIHB1dCB0cmFpbEJpdHMgdGltZXMgemVyb3MgKi8KLSAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKGJTLCAwLCB0cmFpbEJpdHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogRm9yIHdyaXR0aW5nIHRoZSBjdXJyQnVmZiBpbiBzdHJlYW1CdWZmIDRieXRlIGFsaWdubWVudCBpcyByZXF1aXJlZCovCi0gICAgYnl0ZUNudCA9IChNNE9TQV9VSW50OCkoKCBiUy0+Yml0UG9zICsgNCkgLyA4KTsKLQotICAgIHN3aXRjaCggYnl0ZUNudCApCi0gICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gKE00T1NBX1VJbnQ4KShiUy0+Y3VyckJ1ZmYgPj4gMjQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9IChNNE9TQV9VSW50OCkoYlMtPmN1cnJCdWZmID4+IDI0KTsKLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCBiUy0+Y3VyckJ1ZmYgPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBiUy0+c3RyZWFtQnVmZmVyW2JTLT5ieXRlQ250KytdID0gKE00T1NBX1VJbnQ4KShiUy0+Y3VyckJ1ZmYgPj4gMjQpOwotICAgICAgICAgICAgYlMtPnN0cmVhbUJ1ZmZlcltiUy0+Ynl0ZUNudCsrXSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KSgoIGJTLT5jdXJyQnVmZiA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgIGJTLT5zdHJlYW1CdWZmZXJbYlMtPmJ5dGVDbnQrK10gPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCBiUy0+Y3VyckJ1ZmYgPj4gOCkgJiAweGZmKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8qIEl0IHdpbGwgbm90IGNvbWUgaGVyZSAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gICAgYlMtPmJpdFBvcyA9MDsKLSAgICAvLyAgICBiUy0+Y3VyckJ1ZmYgPSAwOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBOU1dBVkNNQ1NfdUV4cFZMQyggTlNXQVZDX2JpdFN0cmVhbV90X01DUyAqYlMsIE00T1NBX0ludDMyIGNvZGVOdW0gKQotewotCi0gICAgTTRPU0FfSW50MzIgbG9vcCwgdGVtcDsKLSAgICBNNE9TQV9JbnQzMiBkYXRhID0gMDsKLSAgICBNNE9TQV9VSW50OCBjb2RlTGVuID0gMDsKLQotICAgIC8qIFRoZSBjb2RlTnVtIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybyBmb3IgdGhpcyB1ZSh2KSAqLwotICAgIGlmKCBjb2RlTnVtIDwgMCApCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBJbXBsZW1lbnRhdGlvbiBmb3IgRW5jb2Rpbmcgb2YgdGhlIFRhYmxlIDktMSBpbiB0aGUgU3RhbmRhcmQgKi8KLSAgICB0ZW1wID0gY29kZU51bSArIDE7Ci0KLSAgICBmb3IgKCBsb29wID0gMDsgdGVtcCAhPSAwOyBsb29wKysgKQotICAgIHsKLSAgICAgICAgdGVtcCAvPSAyOwotICAgIH0KLQotICAgIGNvZGVMZW4gPSAoKCBsb29wICogMikgLSAxKTsKLQotICAgIGRhdGEgPSBjb2RlTnVtICsgMTsKLQotICAgIE5TV0FWQ01DU19wdXRCaXRzKGJTLCBkYXRhLCBjb2RlTGVuKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTlNXQVZDTUNTX3NFeHBWTEMoIE5TV0FWQ19iaXRTdHJlYW1fdF9NQ1MgKmJTLCBNNE9TQV9JbnQzMiBjb2RlTnVtICkKLXsKLQotICAgIE00T1NBX0ludDMyIGxvb3AsIHRlbXAxLCB0ZW1wMjsKLSAgICBNNE9TQV9JbnQzMiBkYXRhID0gMDsKLSAgICBNNE9TQV9VSW50OCBjb2RlTGVuID0gMCwgaXNQb3NpdGl2ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGFic2NvZGVOdW07Ci0KLSAgICBpZiggY29kZU51bSA+IDAgKQotICAgIHsKLSAgICAgICAgaXNQb3NpdGl2ZSA9IDE7Ci0gICAgfQotCi0gICAgaWYoIGNvZGVOdW0gPiAwICkKLSAgICB7Ci0gICAgICAgIGFic2NvZGVOdW0gPSBjb2RlTnVtOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBhYnNjb2RlTnVtID0gLWNvZGVOdW07Ci0gICAgfQotCi0gICAgdGVtcDEgPSAoICggKCBhYnNjb2RlTnVtKSA8PCAxKSAtIGlzUG9zaXRpdmUpICsgMTsKLSAgICB0ZW1wMiA9IHRlbXAxOwotCi0gICAgZm9yICggbG9vcCA9IDA7IGxvb3AgPCAxNiAmJiB0ZW1wMiAhPSAwOyBsb29wKysgKQotICAgIHsKLSAgICAgICAgdGVtcDIgLz0gMjsKLSAgICB9Ci0KLSAgICBjb2RlTGVuID0gKCBsb29wICogMikgLSAxOwotCi0gICAgZGF0YSA9IHRlbXAxOwotCi0gICAgTlNXQVZDTUNTX3B1dEJpdHMoYlMsIGRhdGEsIGNvZGVMZW4pOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVSggICBNNE9TQV9Wb2lkICphaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKmluYnVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpbmJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpvdXRidWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpvdXRidWZfc2l6ZSApCi17Ci0gICAgQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIGJzOwotICAgIE5TV0FWQ19NQ1NfdCAqaW5zdGFuY2U7Ci0gICAgTTRPU0FfVUludDggbmFsdV9pbmZvOwotICAgIE00T1NBX0ludDMyIGZvcmJpZGRlbl9iaXQsIG5hbF9yZWZfaWRjLCBuYWxfdW5pdF90eXBlOwotICAgIE00T1NBX0ludDMyIGZpcnN0X21iX2luX3NsaWNlLCBzbGljZV90eXBlLCBwaWNfcGFyYW1ldGVyX3NldF9pZCwgZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQ4IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OwotICAgIE00T1NBX0ludDMyIHRlbXBfZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIGJpdHN0b0RpYWNhcmQsIGJ5dGVzOwotICAgIE00T1NBX1VJbnQzMiBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgIE00T1NBX0ludDMyIG5ld19ieXRlcywgaW5pdF9iaXRfcG9zOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZTsKLSAgICBNNE9TQV9VSW50MzIgY250OwotICAgIE00T1NBX1VJbnQzMiBvdXRidWZmcG9zID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbmFsX3NpemVfbG93MTYsIG5hbF9zaXplX2hpZ2gxNjsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVfc2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHRlbXAgPSAwOwotCi0gICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlciBkb2VzIG5vdCBwcm92aWRlIHRoZSBzaXplIGluIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBBVSwgYWRkIGl0Ci0gICAgTTRPU0FfSW50OCAqcFRtcEJ1ZmYxID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9JbnQ4ICpwVG1wQnVmZjIgPSBNNE9TQV9OVUxMOwotCi0gICAgcF9icyA9ICZiczsKLSAgICBpbnN0YW5jZSA9IChOU1dBVkNfTUNTX3QgKilhaW5zdGFuY2U7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgIkluICBIMjY0TUNTX1Byb2Nlc3NFbmNvZGVkTkFMVSB3aXRoIEZyYW1lU2l6ZSA9ICVkICBpbkJ1Zl9TaXplPSVkIiwKLSAgICAgICAgZnJhbWVfc2l6ZSwgaW5idWZfc2l6ZSk7Ci0KLSAgICAvLyBTdGFnZUZyaWdodCBjb2RlY3MgbWF5IGFkZCBhIHN0YXJ0IGNvZGUsIG1ha2Ugc3VyZSBpdCBpcyBub3QgcHJlc2VudAotCi0gICAgaWYoICFtZW1jbXAoKHZvaWQgKilpbmJ1ZmYsCi0gICAgICAgICJceDAwXHgwMFx4MDBceDAxIiwgNCkgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzMoCi0gICAgICAgICAgICAiSDI2NE1DU19Qcm9jZXNzTkFMVSBFUlJPUiA6IE5BTFUgc3RhcnQgY29kZSBoYXMgbm90IGJlZW4gcmVtb3ZlZCAlZCAiCi0gICAgICAgICAgICAiMHglWCAweCVYIiwgaW5idWZfc2l6ZSwgKChNNE9TQV9VSW50MzIgKilpbmJ1ZmYpWzBdLAotICAgICAgICAgICAgKChNNE9TQV9VSW50MzIgKilpbmJ1ZmYpWzFdKTsKLQotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXIgZG9lcyBub3QgcHJvdmlkZSB0aGUgc2l6ZSBpbiB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgQVUsIGFkZCBpdAotICAgIHBUbXBCdWZmMSA9IChNNE9TQV9JbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGluYnVmX3NpemUgKyA0LCBNNE1DUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikidG1wTkFMVSIpOwotICAgIG1lbWNweSgodm9pZCAqKShwVG1wQnVmZjEgKyA0KSwgKHZvaWQgKilpbmJ1ZmYsCi0gICAgICAgIGluYnVmX3NpemUpOwotICAgIHBUbXBCdWZmMVszXSA9ICggKE00T1NBX1VJbnQzMilpbmJ1Zl9zaXplKSAmIDB4MDAwMDAwRkY7Ci0gICAgcFRtcEJ1ZmYxWzJdID0gKCAoTTRPU0FfVUludDMyKWluYnVmX3NpemUgPj4gOCkgJiAweDAwMDAwMEZGOwotICAgIHBUbXBCdWZmMVsxXSA9ICggKE00T1NBX1VJbnQzMilpbmJ1Zl9zaXplID4+IDE2KSAmIDB4MDAwMDAwRkY7Ci0gICAgcFRtcEJ1ZmYxWzBdID0gKCAoTTRPU0FfVUludDMyKWluYnVmX3NpemUgPj4gMjQpICYgMHgwMDAwMDBGRjsKLSAgICBwVG1wQnVmZjIgPSAoTTRPU0FfSW50OCAqKWluYnVmZjsKLSAgICBpbmJ1ZmYgPSAoTTRPU0FfVUludDggKilwVG1wQnVmZjE7Ci0gICAgaW5idWZfc2l6ZSArPSA0OwotCi0gICAgLy8gTWFrZSBzdXJlIHRoZSBhdmFpbGFibGUgc2l6ZSB3YXMgc2V0Ci0gICAgaWYoIGluYnVmX3NpemUgPj0gKm91dGJ1Zl9zaXplICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIiEhISBIMjY0TUNTX1Byb2Nlc3NOQUxVIEVSUk9SIDogc3BlY2lmaWVkIGF2YWlsYWJsZSBzaXplIGlzIGluY29ycmVjdCAlZCAiLAotICAgICAgICAgICAgKm91dGJ1Zl9zaXplKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLQotCi0gICAgd2hpbGUoIChNNE9TQV9JbnQzMilmcmFtZV9zaXplIDwgaW5idWZfc2l6ZSApCi0gICAgewotICAgICAgICBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikoaW5idWZmICsgZnJhbWVfc2l6ZSk7Ci0KLSAgICAgICAgLy8gVXNlIHVuc2lnbmVkIHZhbHVlIHRvIGZpeCBlcnJvcnMgZHVlIHRvIGJpdCBzaWduIGV4dGVuc2lvbiwgdGhpcyBmaXggc2hvdWxkIGJlIGdlbmVyaWMKLQotICAgICAgICBuYWxfc2l6ZV9oaWdoMTYgPSAoICggKE00T1NBX1VJbnQ4ICopcF9icy0+QnVmZmVyKVswXSA8PCA4KQotICAgICAgICAgICAgKyAoKE00T1NBX1VJbnQ4ICopcF9icy0+QnVmZmVyKVsxXTsKLSAgICAgICAgbmFsX3NpemVfbG93MTYgPSAoICggKE00T1NBX1VJbnQ4ICopcF9icy0+QnVmZmVyKVsyXSA8PCA4KQotICAgICAgICAgICAgKyAoKE00T1NBX1VJbnQ4ICopcF9icy0+QnVmZmVyKVszXTsKLQotICAgICAgICBuYWx1X2luZm8gPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbNF07Ci0KLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zXSA9IHBfYnMtPkJ1ZmZlcls0XTsKLQotICAgICAgICBwX2JzLT5CdWZmZXIgPSBwX2JzLT5CdWZmZXIgKyA1OwotCi0gICAgICAgIHBfYnMtPmJpdFBvcyA9IDA7Ci0gICAgICAgIHBfYnMtPmxhc3RUb3RhbEJpdHMgPSAwOwotICAgICAgICBwX2JzLT5udW1CaXRzSW5CdWZmZXIgPSAoIGluYnVmX3NpemUgLSBmcmFtZV9zaXplIC0gNSkgPDwgMzsKLSAgICAgICAgcF9icy0+cmVhZGFibGVCeXRlc0luQnVmZmVyID0gaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA1OwotCi0gICAgICAgIHBfYnMtPnVpMzJUZW1wQnVmZiA9IDA7Ci0gICAgICAgIHBfYnMtPmk4Qml0Q250ID0gMDsKLSAgICAgICAgcF9icy0+cHVpOEJmclB0ciA9IChNNE9TQV9JbnQ4ICopcF9icy0+QnVmZmVyOwotICAgICAgICBwX2JzLT51aTMyTGFzdFR3b0J5dGVzID0gMHhGRkZGRkZGRjsKLQotICAgICAgICBIMjY0TUNTX2dldEJpdHMocF9icywgMCk7Ci0KLSAgICAgICAgbmFsX3NpemUgPSAoIG5hbF9zaXplX2hpZ2gxNiA8PCAxNikgKyBuYWxfc2l6ZV9sb3cxNjsKLQotICAgICAgICBmcmFtZV9zaXplICs9IG5hbF9zaXplICsgNDsKLQotICAgICAgICBmb3JiaWRkZW5fYml0ID0gKCBuYWx1X2luZm8gPj4gNykgJiAxOwotICAgICAgICBuYWxfcmVmX2lkYyA9ICggbmFsdV9pbmZvID4+IDUpICYgMzsKLSAgICAgICAgbmFsX3VuaXRfdHlwZSA9IChuYWx1X2luZm8pICYweDFmOwotCi0gICAgICAgIE5TV0FWQ01DU19pbml0Qml0c3RyZWFtKCZpbnN0YW5jZS0+ZW5jYnMpOwotCi0gICAgICAgIGluc3RhbmNlLT5lbmNicy5zdHJlYW1CdWZmZXIgPSBvdXRidWZmICsgb3V0YnVmZnBvcyArIDE7Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gOCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJFcnJvciA6IFBQUyIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA3ICkKLSAgICAgICAgewotICAgICAgICAgICAgLypTUFMgUGFja2V0ICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgOiBTUFMiKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIChuYWxfdW5pdF90eXBlID09IDUpICkKLSAgICAgICAgewotICAgICAgICAgICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gMDsKLSAgICAgICAgICAgIGluc3RhbmNlLT5QT0NfbHNiID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAoIG5hbF91bml0X3R5cGUgPT0gMSkgfHwgKG5hbF91bml0X3R5cGUgPT0gNSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaXJzdF9tYl9pbl9zbGljZSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBzbGljZV90eXBlID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIHBpY19wYXJhbWV0ZXJfc2V0X2lkID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAgICAgLyogRmlyc3QgTUIgaW4gc2xpY2UgKi8KLSAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIGZpcnN0X21iX2luX3NsaWNlKTsKLQotICAgICAgICAgICAgLyogU2xpY2UgVHlwZSAqLwotICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgc2xpY2VfdHlwZSk7Ci0KLSAgICAgICAgICAgIC8qIFBpY3R1cmUgUGFyYW1ldGVyIHNldCBJZCAqLwotICAgICAgICAgICAgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSBpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMucGljX3BhcmFtZXRlcl9zZXRfaWQ7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBwaWNfcGFyYW1ldGVyX3NldF9pZCk7Ci0KLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywKLSAgICAgICAgICAgICAgICBpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMubG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgaW5zdGFuY2UtPmZyYW1lX2NvdW50LAotICAgICAgICAgICAgICAgIGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCk7Ci0KLSAgICAgICAgICAgIC8vIEluIEJhc2VsaW5lIFByb2ZpbGU6IGZyYW1lX21ic19vbmx5X2ZsYWcgc2hvdWxkIGJlIE9OCi0gICAgICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA1ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Nwcy5waWNfb3JkZXJfY250X3R5cGUgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLAotICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0Ci0gICAgICAgICAgICAgICAgICAgICsgNCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpbiBiYXNlbGluZSBwcm9maWxlIGZpZWxkX3BpY19mbGFnIHNob3VsZCBiZSBvZmYuCi0gICAgICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5waWNfb3JkZXJfcHJlc2VudF9mbGFnICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoICggaW5zdGFuY2UtPmVuY29kZXJfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAxKQotICAgICAgICAgICAgICAgICYmIChpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19EZWNWTENSZWFkU2lnbmVkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICAgICAgICAgIC8vIGluIGJhc2VsaW5lIHByb2ZpbGUgZmllbGRfcGljX2ZsYWcgc2hvdWxkIGJlIG9mZi4KLSAgICAgICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY29kZXJfcHBzLnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggaW5zdGFuY2UtPmNsaXBfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+UE9DX2xzYiwKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpOwotCi0gICAgICAgICAgICAgICAgLy8gaW4gYmFzZWxpbmUgcHJvZmlsZSBmaWVsZF9waWNfZmxhZyBzaG91bGQgYmUgb2ZmLgotICAgICAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMucGljX29yZGVyX3ByZXNlbnRfZmxhZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOU1dBVkNNQ1Nfc0V4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCAoIGluc3RhbmNlLT5jbGlwX3Nwcy5waWNfb3JkZXJfY250X3R5cGUgPT0gMSkKLSAgICAgICAgICAgICAgICAmJiAoaW5zdGFuY2UtPmNsaXBfc3BzLmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3NFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgMCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpbiBiYXNlbGluZSBwcm9maWxlIGZpZWxkX3BpY19mbGFnIHNob3VsZCBiZSBvZmYuCi0gICAgICAgICAgICAgICAgaWYoIGluc3RhbmNlLT5lbmNvZGVyX3Bwcy5waWNfb3JkZXJfcHJlc2VudF9mbGFnICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5TV0FWQ01DU19zRXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY250ID0gcF9icy0+Yml0UG9zICYgMHg3OwotCi0gICAgICAgICAgICBpZiggY250ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbnQgPSA4IC0gY250OwotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgY250KTsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCBjbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbnQgPSBwX2JzLT5iaXRQb3MgPj4gMzsKLQotICAgICAgICAgICAgd2hpbGUoIGNudCA8IChuYWxfc2l6ZSAtIDIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIDgpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsIDgpOwotICAgICAgICAgICAgICAgIGNudCA9IHBfYnMtPmJpdFBvcyA+PiAzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsIDgpOwotCi0gICAgICAgICAgICBpZiggdGVtcCAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbnQgPSAwOwotCi0gICAgICAgICAgICAgICAgd2hpbGUoICggdGVtcCAmIDB4MSkgPT0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjbnQrKzsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY250Kys7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLQotICAgICAgICAgICAgICAgIGlmKCA4IC0gY250ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsICg4IC0gY250KSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dFJic3BUYml0cygmaW5zdGFuY2UtPmVuY2JzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiSDI2NE1DU19Qcm9jZXNzRW5jb2RlZE5BTFUgOiAxMyB0ZW1wID0gMCB0cmFpbGluZyBiaXRzID0gJWQiLAotICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggaW5zdGFuY2UtPmVuY2JzLmJpdFBvcyAlIDggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICg4IC0gaW5zdGFuY2UtPmVuY2JzLmJpdFBvcyAlIDgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRlbXAgPSBpbnN0YW5jZS0+ZW5jYnMuYnl0ZUNudDsKLSAgICAgICAgICAgIHRlbXAgPSB0ZW1wICsgMTsKLQotICAgICAgICAgICAgb3V0YnVmZnBvcyA9IG91dGJ1ZmZwb3MgKyB0ZW1wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKm91dGJ1Zl9zaXplID0gb3V0YnVmZnBvczsKLQotICAgIGluc3RhbmNlLT5QT0NfbHNiID0gaW5zdGFuY2UtPlBPQ19sc2IgKyAxOwotCi0gICAgaWYoIGluc3RhbmNlLT5QT0NfbHNiID09IGluc3RhbmNlLT5QT0NfbHNiX21vZCApCi0gICAgewotICAgICAgICBpbnN0YW5jZS0+UE9DX2xzYiA9IDA7Ci0gICAgfQotICAgIGluc3RhbmNlLT5mcmFtZV9jb3VudCA9IGluc3RhbmNlLT5mcmFtZV9jb3VudCArIDE7Ci0KLSAgICBpZiggaW5zdGFuY2UtPmZyYW1lX2NvdW50ID09IGluc3RhbmNlLT5mcmFtZV9tb2RfY291bnQgKQotICAgIHsKLSAgICAgICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVyIGRvZXMgbm90IHByb3ZpZGUgdGhlIHNpemUgaW4gdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIEFVLCBhZGQgaXQKLQotICAgIGZyZWUocFRtcEJ1ZmYxKTsKLSAgICBwVG1wQnVmZjEgPSBNNE9TQV9OVUxMOwotICAgIGluYnVmZiA9IChNNE9TQV9VSW50OCAqKXBUbXBCdWZmMjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9JbnQzMiBEZWNTUFNNQ1MoIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLAotICAgICAgICAgICAgICAgICAgICAgIENvbVNlcXVlbmNlUGFyYW1ldGVyU2V0X3RfTUNTICpzcHMgKQotewotICAgIE00T1NBX1VJbnQzMiBpOwotICAgIE00T1NBX0ludDMyIHRlbXBfbWF4X2RwYl9zaXplOwotICAgIE00T1NBX0ludDMyIG5iX2lnbm9yZV9iaXRzOwotICAgIE00T1NBX0ludDMyIGVycm9yOwotICAgIE00T1NBX1VJbnQ4IHByb2ZpbGVfaWRjLCBsZXZlbF9pZGMsIHJlc2VydmVkX3plcm9fNGJpdHMsCi0gICAgICAgIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQ4IGNvbnN0cmFpbnRfc2V0MF9mbGFnLCBjb25zdHJhaW50X3NldDFfZmxhZywKLSAgICAgICAgY29uc3RyYWludF9zZXQyX2ZsYWcsIGNvbnN0cmFpbnRfc2V0M19mbGFnOwotCi0gICAgc3BzLT5wcm9maWxlX2lkYyA9IChNNE9TQV9VSW50OClIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgc3BzLT5jb25zdHJhaW50X3NldDBfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBzcHMtPmNvbnN0cmFpbnRfc2V0MV9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotICAgIHNwcy0+Y29uc3RyYWludF9zZXQyX2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0gICAgc3BzLT5jb25zdHJhaW50X3NldDNfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICByZXNlcnZlZF96ZXJvXzRiaXRzID0gKE00T1NBX1VJbnQ4KUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCA0KTsKLSAgICBzcHMtPmxldmVsX2lkYyA9IChNNE9TQV9VSW50OClIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgc3BzLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA9Ci0gICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIHNwcy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA9Ci0gICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIHNwcy0+TWF4RnJhbWVOdW0gPSAxIDw8IChzcHMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKLSAgICBzcHMtPnBpY19vcmRlcl9jbnRfdHlwZSA9Ci0gICAgICAgIChNNE9TQV9VSW50OClIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgaWYgKHNwcy0+cGljX29yZGVyX2NudF90eXBlID09IDApCi0gICAgewotICAgICAgICBzcHMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5NYXhQaWNPcmRlckNudExzYiA9Ci0gICAgICAgICAgICAxIDw8IChzcHMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpOwotICAgIH0KLSAgICBlbHNlIGlmKCBzcHMtPnBpY19vcmRlcl9jbnRfdHlwZSA9PSAxICkKLSAgICB7Ci0gICAgICAgIHNwcy0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcgPQotICAgICAgICAgICAgKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgICAgIC8vIFRoaXMgZml4IHNob3VsZCBiZSBnZW5lcmljIHRvIHJlbW92ZSBjb2RlYyBkZXBlbmRlbmN5Ci0KLSAgICAgICAgc3BzLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljID0KLSAgICAgICAgICAgIEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgIHNwcy0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkID0KLSAgICAgICAgICAgIEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLQotICAgICAgICAvKm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwgMjU1Ki8KLQotICAgICAgICBzcHMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAgICAgLyogY29tcHV0ZSBkZWx0YVBPQyAqLwotICAgICAgICBzcHMtPmV4cGVjdGVkRGVsdGFQZXJQaWNPcmRlckNudEN5Y2xlID0gMDsKLQotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHNwcy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhpcyBmaXggc2hvdWxkIGJlIGdlbmVyaWMgdG8gcmVtb3ZlIGNvZGVjIGRlcGVuZGVuY3kKLSAgICAgICAgICAgIHNwcy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaV0gPQotICAgICAgICAgICAgICAgIEgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAgICAgICAgIHNwcy0+ZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGUgKz0KLSAgICAgICAgICAgICAgICBzcHMtPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogbnVtX3JlZl9mcmFtZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCwxNiAqLwotICAgIHNwcy0+bnVtX3JlZl9mcmFtZXMgPSAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICBzcHMtPmdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZyA9Ci0gICAgICAgIChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIHNwcy0+cGljX3dpZHRoX2luX21ic19taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgc3BzLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICBzcHMtPmZyYW1lX21ic19vbmx5X2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICBpZiAoIXNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZykKLSAgICB7Ci0gICAgICAgIHNwcy0+bWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZyA9Ci0gICAgICAgICAgICAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNwcy0+bWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZyA9IDA7Ci0gICAgfQotCi0gICAgc3BzLT5QaWNXaWR0aEluTWJzID0gc3BzLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSArIDE7Ci0gICAgc3BzLT5GcmFtZUhlaWdodEluTWJzID0gKCAyIC0gc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnKSAqIFwKLSAgICAgICAgKHNwcy0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMSk7Ci0jaWZkZWYgX0NBUF9GTU9fCi0KLSAgICBzcHMtPk51bVNsaWNlR3JvdXBNYXBVbml0cyA9Ci0gICAgICAgIHNwcy0+UGljV2lkdGhJbk1icyAqIChzcHMtPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSArIDEpOwotICAgIHNwcy0+TWF4UGljU2l6ZUluTWJzID0gc3BzLT5QaWNXaWR0aEluTWJzICogc3BzLT5GcmFtZUhlaWdodEluTWJzOwotCi0jZW5kaWYgLypfQ0FQX0ZNT18qLwotCi0gICAgc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnID0gKE00T1NBX0Jvb2wpSDI2NE1DU19nZXRCaXRzKHBfYnMsIDEpOwotCi0gICAgaWYoIHNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZyA9PSAwICkKLSAgICAgICAgc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnID0gMTsKLQotICAgIHNwcy0+ZnJhbWVfY3JvcHBpbmdfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIGlmKCBzcHMtPmZyYW1lX2Nyb3BwaW5nX2ZsYWcgKQotICAgIHsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0ID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgIHNwcy0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0ID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgPSAwOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gMDsKLSAgICAgICAgc3BzLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSAwOwotICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IDA7Ci0gICAgfQotCi0gICAgc3BzLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICBpZiAoc3BzLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpIHsKLSAgICAgICAgLyogbm8gZXJyb3IgbWVzc2FnZSBhcyBzdHJlYW0gY2FuIGJlIGRlY29kZWQgd2l0aG91dCBWVUkgbWVzc2FnZXMgKi8KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfSW50MzIgRGVjUFBTTUNTKCBDb21CaXRTdHJlYW1NQ1NfdCAqcF9icywKLSAgICAgICAgICAgICAgICAgICAgICBDb21QaWN0dXJlUGFyYW1ldGVyU2V0X3RfTUNTICpwcHMgKQotewotICAgIE00T1NBX0ludDMyIGVycm9yOwotICAgIE00T1NBX1VJbnQzMiBwaWNfcGFyYW1ldGVyX3NldF9pZDsKLQotI2lmZGVmIF9DQVBfRk1PXwotICAgIE00T1NBX1VJbnQzMiBpLCBsZW5ndGgsIHY7Ci0jZW5kaWYKLQotICAgIE00T1NBX0ludDMyIG5iX2lnbm9yZV9iaXRzOwotCi0gICAgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgIHBwcy0+cGljX3BhcmFtZXRlcl9zZXRfaWQgPSAoTTRPU0FfVUludDgpcGljX3BhcmFtZXRlcl9zZXRfaWQ7Ci0KLSAgICBwcHMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAvKiBlbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgbXVzdCBiZSAwIG9yIDEgKi8KLSAgICBwcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBwcHMtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICBwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSNpZmRlZiBfQ0FQX0ZNT18KLSAgICAvKiBGTU8gc3R1ZmYgYmVnaW5zIGhlcmUgKi8KLQotICAgIHBwcy0+bWFwX2luaXRpYWxpemVkID0gRkFMU0U7Ci0KLSAgICBpZiggcHBzLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA+IDAgKQotICAgIHsKLSAgICAgICAgcHBzLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLQotICAgICAgICBzd2l0Y2goIHBwcy0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPD0gcHBzLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBwcy0+cnVuX2xlbmd0aF9taW51czFbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcHBzLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaSsrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBwcy0+dG9wX2xlZnRbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgICAgICBwcHMtPmJvdHRvbV9yaWdodFtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgcHBzLT5zbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0gICAgICAgICAgICAgICAgcHBzLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czEgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICBwcHMtPnBpY19zaXplX2luX21hcF91bml0c19taW51czEgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAgICAgICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX2lkID0gKEgyNjRVSW50OAotICAgICAgICAgICAgICAgICAgICAqKU00SDI2NERlY19tYWxsb2MoKHBwcy0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMQotICAgICAgICAgICAgICAgICAgICArIDEpLCBNNEgyNjRfQ09SRUlELCAoTTRPU0FfQ2hhciAqKSJQUFMiKTsKLQotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBwcy0+c2xpY2VfZ3JvdXBfaWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRGVjUFBTTUNTOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBsZW5ndGggPSAwLCB2ID0gcHBzLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSArIDE7IHYgIT0gMDsKLSAgICAgICAgICAgICAgICAgICAgdiA+Pj0gMSwgbGVuZ3RoKysgKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8PSBwcHMtPnBpY19zaXplX2luX21hcF91bml0c19taW51czE7IGkrKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBwcy0+c2xpY2VfZ3JvdXBfaWRbaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClnZXRCaXRzKHBfdmxjX2VuZ2luZS0+cF9icywgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwcHMtPnNsaWNlX2dyb3VwX21hcF90eXBlID0gMDsKLSAgICB9Ci0gICAgLyogRW5kIG9mIEZNTyBzdHVmZiAqLwotCi0jZWxzZQotCi0jZW5kaWYgLyogX0NBUF9GTU9fICovCi0KLSAgICAvKiBudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAsIDMxICovCi0KLSAgICBwcHMtPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPQotICAgICAgICAoTTRPU0FfVUludDgpSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAvKiBudW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAsIDMxICovCi0gICAgcHBzLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxID0KLSAgICAgICAgKE00T1NBX1VJbnQ4KUgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgcHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcgPSAoTTRPU0FfQm9vbClIMjY0TUNTX2dldEJpdHMocF9icywgMSk7Ci0KLSAgICAvKiB3ZWlnaHRlZF9iaXByZWRfaWRjIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAsMiAqLwotICAgIHBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAyKTsKLQotICAgIC8qIHBpY19pbml0X3FwX21pbnVzMjYgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgLTI2LDI1ICovCi0gICAgcHBzLT5waWNfaW5pdF9xcF9taW51czI2ID0KLSAgICAgICAgKE00T1NBX0ludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAvKiBwaWNfaW5pdF9xc19taW51czI2IG11c3QgYmUgaW4gdGhlIHJhbmdlIC0yNiwyNSAqLwotICAgIHBwcy0+cGljX2luaXRfcXNfbWludXMyNiA9Ci0gICAgICAgIChNNE9TQV9JbnQxNilIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotCi0gICAgLyogY2hyb21hX3FwX2luZGV4X29mZnNldCBtdXN0IGJlIGluIHRoZSByYW5nZSAtMTIsKzEyICovCi0gICAgcHBzLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ID0KLSAgICAgICAgKE00T1NBX0ludDE2KUgyNjRNQ1NfRGVjVkxDUmVhZFNpZ25lZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgcHBzLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9Ci0gICAgICAgIChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBwcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLSAgICBwcHMtPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZyA9IChNNE9TQV9Cb29sKUgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAxKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgSDI2NE1DU19Qcm9jZXNzU1BTX1BQUyggTlNXQVZDX01DU190ICppbnN0YW5jZSwgTTRPU0FfVUludDggKmluYnVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGluYnVmX3NpemUgKQotewotICAgIENvbUJpdFN0cmVhbU1DU190ICpwX2JzLCBiczsKLSAgICBDb21CaXRTdHJlYW1NQ1NfdCAqcF9iczEsIGJzMTsKLQotICAgIE00T1NBX1VJbnQ4IG5hbHVfaW5mbyA9IDA7Ci0gICAgTTRPU0FfSW50MzIgZm9yYmlkZGVuX2JpdCwgbmFsX3JlZl9pZGMsIG5hbF91bml0X3R5cGU7Ci0gICAgTTRPU0FfSW50MzIgZmlyc3RfbWJfaW5fc2xpY2UsIHNsaWNlX3R5cGUsIHBpY19wYXJhbWV0ZXJfc2V0X2lkID0gMCwKLSAgICAgICAgZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQ4IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OwotICAgIE00T1NBX0ludDMyIHRlbXBfZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIGJpdHN0b0RpYWNhcmQsIGJ5dGVzOwotICAgIE00T1NBX1VJbnQzMiBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgIE00T1NBX0ludDMyIG5ld19ieXRlcywgaW5pdF9iaXRfcG9zOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGNudCwgY250MTsKLSAgICBNNE9TQV9VSW50MzIgb3V0YnVmZnBvcyA9IDA7Ci0gICAgTTRPU0FfVUludDMyIG5hbF9zaXplX2xvdzE2LCBuYWxfc2l6ZV9oaWdoMTY7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lX3NpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wID0gMDsKLSAgICBNNE9TQV9VSW50OCAqbENsaXBEU0k7Ci0gICAgTTRPU0FfVUludDggKmxDbGlwRFNJX1BQU19zdGFydDsKLSAgICBNNE9TQV9VSW50MzIgbENsaXBEU0lfUFBTX29mZnNldCA9IDA7Ci0KLSAgICBNNE9TQV9VSW50OCAqbFBQU19CdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBsUFBTX0J1ZmZlcl9TaXplID0gMDsKLQotICAgIE00T1NBX1VJbnQzMiBsU2l6ZSwgbFNpemUxOwotICAgIE00T1NBX1VJbnQzMiBsQWN0aXZlU1BTSURfQ2xpcDsKLSAgICBNNE9TQV9VSW50MzIgbENsaXBQUFNSZW1CaXRzID0gMDsKLQotICAgIE00T1NBX1VJbnQzMiBsRW5jb2Rlcl9TUFNJRCA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGxFbmNvZGVyX1BQU0lEID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbEVuY29kZXJQUFNSZW1CaXRzID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbEZvdW5kID0gMDsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZTsKLQotICAgIE00T1NBX1VJbnQ4IENsaXBfU1BTSURbMzJdID0geyAwIH07Ci0gICAgTTRPU0FfVUludDggQ2xpcF9Vc2VkU1BTSURbMzJdID0geyAwIH07Ci0gICAgTTRPU0FfVUludDggQ2xpcF9QUFNJRFsyNTZdID0geyAwIH07Ci0gICAgTTRPU0FfVUludDggQ2xpcF9TUFNJRF9pbl9QUFNbMjU2XSA9IHsgMCB9OwotICAgIE00T1NBX1VJbnQ4IENsaXBfVXNlZFBQU0lEWzI1Nl0gPSB7IDAgfTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIHBfYnMgPSAmYnM7Ci0gICAgcF9iczEgPSAmYnMxOwotCi0gICAgLyogRmluZCB0aGUgYWN0aXZlIFNQUyBJRCAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBpbnN0YW5jZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIkgyNjRNQ1NfUHJvY2Vzc1NQU19QUFM6IGluc3RhbmNlIGlzIE00T1NBX05VTEwiKTsKLQotICAgIGluc3RhbmNlLT5tX051bV9CeXRlc19OQUxVbml0TGVuZ3RoID0KLSAgICAgICAgICAgIChpbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mb1s0XSAmIDB4MDMpICsgMTsKLQotICAgIGluc3RhbmNlLT5tX2VuY29kZXJfU1BTX0NudCA9IGluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvWzVdICYgMHgxRjsKLQotICAgIGxDbGlwRFNJID0gaW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8gKyA2OwotCi0gICAgbENsaXBEU0lfUFBTX29mZnNldCA9IDY7Ci0KLSAgICBmb3IgKCBjbnQgPSAwOyBjbnQgPCBpbnN0YW5jZS0+bV9lbmNvZGVyX1NQU19DbnQ7IGNudCsrICkKLSAgICB7Ci0gICAgICAgIGxTaXplID0gKCBsQ2xpcERTSVswXSA8PCA4KSArIGxDbGlwRFNJWzFdOwotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgMjsKLQotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikobENsaXBEU0kgKyA0KTsKLSAgICAgICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMsIGxTaXplIC0gNCk7Ci0KLSAgICAgICAgQ2xpcF9TUFNJRFtjbnRdID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgQ2xpcF9Vc2VkU1BTSURbQ2xpcF9TUFNJRFtjbnRdXSA9IDE7Ci0KLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIGxTaXplOwotICAgICAgICBsQ2xpcERTSV9QUFNfb2Zmc2V0ID0gbENsaXBEU0lfUFBTX29mZnNldCArIDIgKyBsU2l6ZTsKLSAgICB9Ci0KLSAgICBpbnN0YW5jZS0+bV9lbmNvZGVyX1BQU19DbnQgPSBsQ2xpcERTSVswXTsKLSAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgMTsKLQotICAgIGxDbGlwRFNJX1BQU19zdGFydCA9IGxDbGlwRFNJOwotCi0gICAgZm9yICggY250ID0gMDsgY250IDwgaW5zdGFuY2UtPm1fZW5jb2Rlcl9QUFNfQ250OyBjbnQrKyApCi0gICAgewotICAgICAgICBsU2l6ZSA9ICggbENsaXBEU0lbMF0gPDwgOCkgKyBsQ2xpcERTSVsxXTsKLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIDI7Ci0KLSAgICAgICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGxDbGlwRFNJICsgMSk7Ci0gICAgICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzLCBsU2l6ZSAtIDEpOwotCi0gICAgICAgIENsaXBfUFBTSURbY250XSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgIENsaXBfVXNlZFBQU0lEW0NsaXBfUFBTSURbY250XV0gPSAxOwotICAgICAgICBDbGlwX1NQU0lEX2luX1BQU1tDbGlwX1BQU0lEW2NudF1dID0KLSAgICAgICAgICAgIEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0KLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIGxTaXplOwotICAgIH0KLQotICAgIC8qIEZpbmQgdGhlIGNsaXAgU1BTIElEIHVzZWQgYXQgdGhlIGN1dCBzdGFydCBmcmFtZSAqLwotICAgIHdoaWxlKCAoIChNNE9TQV9JbnQzMilmcmFtZV9zaXplKSA8IGluYnVmX3NpemUgKQotICAgIHsKLSAgICAgICAgbWFza19iaXRzID0gMHhGRkZGRkZGRjsKLSAgICAgICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGluYnVmZiArIGZyYW1lX3NpemUpOwotCi0gICAgICAgIHN3aXRjaCggaW5zdGFuY2UtPm1fTnVtX0J5dGVzX05BTFVuaXRMZW5ndGggKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgbmFsX3NpemUgPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbMF07Ci0gICAgICAgICAgICAgICAgbmFsdV9pbmZvID0gKHVuc2lnbmVkIGNoYXIpcF9icy0+QnVmZmVyWzFdOwotICAgICAgICAgICAgICAgIHBfYnMtPkJ1ZmZlciA9IHBfYnMtPkJ1ZmZlciArIDI7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIG5hbF9zaXplX2hpZ2gxNiA9ICggcF9icy0+QnVmZmVyWzBdIDw8IDgpICsgcF9icy0+QnVmZmVyWzFdOwotICAgICAgICAgICAgICAgIG5hbF9zaXplID0gbmFsX3NpemVfaGlnaDE2OwotICAgICAgICAgICAgICAgIG5hbHVfaW5mbyA9ICh1bnNpZ25lZCBjaGFyKXBfYnMtPkJ1ZmZlclsyXTsKLSAgICAgICAgICAgICAgICBwX2JzLT5CdWZmZXIgPSBwX2JzLT5CdWZmZXIgKyAzOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZV9oaWdoMTYgPSAoIHBfYnMtPkJ1ZmZlclswXSA8PCA4KSArIHBfYnMtPkJ1ZmZlclsxXTsKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZV9sb3cxNiA9ICggcF9icy0+QnVmZmVyWzJdIDw8IDgpICsgcF9icy0+QnVmZmVyWzNdOwotICAgICAgICAgICAgICAgIG5hbF9zaXplID0gKCBuYWxfc2l6ZV9oaWdoMTYgPDwgMTYpICsgbmFsX3NpemVfbG93MTY7Ci0gICAgICAgICAgICAgICAgbmFsdV9pbmZvID0gKHVuc2lnbmVkIGNoYXIpcF9icy0+QnVmZmVyWzRdOwotICAgICAgICAgICAgICAgIHBfYnMtPkJ1ZmZlciA9IHBfYnMtPkJ1ZmZlciArIDU7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuYWxfc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiMCBzaXplIG5hbCB1bml0IGF0IGxpbmUgJWQiLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICBmcmFtZV9zaXplICs9IGluc3RhbmNlLT5tX051bV9CeXRlc19OQUxVbml0TGVuZ3RoOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwX2JzLT5iaXRQb3MgPSAwOwotICAgICAgICBwX2JzLT5sYXN0VG90YWxCaXRzID0gMDsKLSAgICAgICAgcF9icy0+bnVtQml0c0luQnVmZmVyID0KLSAgICAgICAgICAgICggaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSBpbnN0YW5jZS0+bV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aCAtIDEpCi0gICAgICAgICAgICA8PCAzOwotICAgICAgICBwX2JzLT5yZWFkYWJsZUJ5dGVzSW5CdWZmZXIgPQotICAgICAgICAgICAgaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSBpbnN0YW5jZS0+bV9OdW1fQnl0ZXNfTkFMVW5pdExlbmd0aCAtIDE7Ci0KLSAgICAgICAgcF9icy0+dWkzMlRlbXBCdWZmID0gMDsKLSAgICAgICAgcF9icy0+aThCaXRDbnQgPSAwOwotICAgICAgICBwX2JzLT5wdWk4QmZyUHRyID0gKE00T1NBX0ludDggKilwX2JzLT5CdWZmZXI7Ci0gICAgICAgIHBfYnMtPnVpMzJMYXN0VHdvQnl0ZXMgPSAweEZGRkZGRkZGOwotCi0gICAgICAgIEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCAwKTsKLQotICAgICAgICBmcmFtZV9zaXplICs9IG5hbF9zaXplICsgaW5zdGFuY2UtPm1fTnVtX0J5dGVzX05BTFVuaXRMZW5ndGg7Ci0KLSAgICAgICAgZm9yYmlkZGVuX2JpdCA9ICggbmFsdV9pbmZvID4+IDcpICYgMTsKLSAgICAgICAgbmFsX3JlZl9pZGMgPSAoIG5hbHVfaW5mbyA+PiA1KSAmIDM7Ci0gICAgICAgIG5hbF91bml0X3R5cGUgPSAobmFsdV9pbmZvKSAmMHgxZjsKLQotICAgICAgICBpZiggbmFsX3VuaXRfdHlwZSA9PSA4ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkgyNjRNQ1NfUHJvY2Vzc1NQU19QUFMoKSBFcnJvcjogUFBTIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gNyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qU1BTIFBhY2tldCAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkgyNjRNQ1NfUHJvY2Vzc1NQU19QUFMoKSBFcnJvcjogU1BTIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggbmFsX3VuaXRfdHlwZSA9PSAxKSB8fCAobmFsX3VuaXRfdHlwZSA9PSA1KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpcnN0X21iX2luX3NsaWNlID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIHNsaWNlX3R5cGUgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgcGljX3BhcmFtZXRlcl9zZXRfaWQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBsQWN0aXZlU1BTSURfQ2xpcCA9IENsaXBfU1BTSURfaW5fUFBTW3BpY19wYXJhbWV0ZXJfc2V0X2lkXTsKLQotICAgIGluc3RhbmNlLT5maW5hbF9TUFNfSUQgPSBsQWN0aXZlU1BTSURfQ2xpcDsKLSAgICAvKiBEbyB3ZSBuZWVkIHRvIGFkZCBlbmNvZGVyIFBQUyB0byBjbGlwIFBQUyAqLwotCi0gICAgbENsaXBEU0kgPSBsQ2xpcERTSV9QUFNfc3RhcnQ7Ci0KLSAgICBmb3IgKCBjbnQgPSAwOyBjbnQgPCBpbnN0YW5jZS0+bV9lbmNvZGVyX1BQU19DbnQ7IGNudCsrICkKLSAgICB7Ci0gICAgICAgIGxTaXplID0gKCBsQ2xpcERTSVswXSA8PCA4KSArIGxDbGlwRFNJWzFdOwotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgMjsKLQotICAgICAgICBpZiggbEFjdGl2ZVNQU0lEX0NsaXAgPT0gQ2xpcF9TUFNJRF9pbl9QUFNbQ2xpcF9QUFNJRFtjbnRdXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxQUFNfQnVmZmVyID0gbENsaXBEU0kgKyAxOwotICAgICAgICAgICAgbFBQU19CdWZmZXJfU2l6ZSA9IGxTaXplIC0gMTsKLQotICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gKE00T1NBX1VJbnQ4ICopKGxDbGlwRFNJICsgMSk7Ci0gICAgICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9icywgbFNpemUgLSAxKTsKLQotICAgICAgICAgICAgQ2xpcF9QUFNJRFtjbnRdID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIENsaXBfVXNlZFBQU0lEW0NsaXBfU1BTSURbY250XV0gPSAxOwotICAgICAgICAgICAgQ2xpcF9TUFNJRF9pbl9QUFNbY250XSA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBsQ2xpcFBQU1JlbUJpdHMgPSAoIGxTaXplIC0gMSkgPDwgMzsKLSAgICAgICAgICAgIGxDbGlwUFBTUmVtQml0cyAtPSBwX2JzLT5iaXRQb3M7Ci0KLSAgICAgICAgICAgIHRlbXAgPSBsQ2xpcERTSVtsU2l6ZSAtIDFdOwotCi0gICAgICAgICAgICBjbnQxID0gMDsKLQotICAgICAgICAgICAgd2hpbGUoICggdGVtcCAmIDB4MSkgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY250MSsrOwotICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wID4+IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbnQxKys7Ci0gICAgICAgICAgICBsQ2xpcFBQU1JlbUJpdHMgLT0gY250MTsKLQotICAgICAgICAgICAgbFNpemUxID0gaW5zdGFuY2UtPm1fZW5jb2RlclBQU1NpemUgLSAxOwotICAgICAgICAgICAgcF9iczEtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbnN0YW5jZS0+bV9wRW5jb2RlclBQUyArIDEpOwotICAgICAgICAgICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMxLCBsU2l6ZTEpOwotCi0gICAgICAgICAgICBsRW5jb2Rlcl9QUFNJRCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9iczEpOwotICAgICAgICAgICAgbEVuY29kZXJfU1BTSUQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMxKTsKLQotICAgICAgICAgICAgbEVuY29kZXJQUFNSZW1CaXRzID0gKCBsU2l6ZTEpIDw8IDM7Ci0gICAgICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgLT0gcF9iczEtPmJpdFBvczsKLQotICAgICAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTW2xTaXplMV07Ci0KLSAgICAgICAgICAgIGNudDEgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbnQxKys7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgPj4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNudDErKzsKLSAgICAgICAgICAgIGxFbmNvZGVyUFBTUmVtQml0cyAtPSBjbnQxOwotCi0gICAgICAgICAgICBpZiggbEVuY29kZXJQUFNSZW1CaXRzID09IGxDbGlwUFBTUmVtQml0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUoIGxFbmNvZGVyUFBTUmVtQml0cyA+IDggKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAyID0gSDI2NE1DU19nZXRCaXRzKHBfYnMxLCA4KTsKLSAgICAgICAgICAgICAgICAgICAgbEVuY29kZXJQUFNSZW1CaXRzID0gbEVuY29kZXJQUFNSZW1CaXRzIC0gODsKLQotICAgICAgICAgICAgICAgICAgICBpZiggdGVtcDEgIT0gdGVtcDIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBsRW5jb2RlclBQU1JlbUJpdHMgPCA4ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBsRW5jb2RlclBQU1JlbUJpdHMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCBsRW5jb2RlclBQU1JlbUJpdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSBIMjY0TUNTX2dldEJpdHMocF9iczEsIGxFbmNvZGVyUFBTUmVtQml0cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0ZW1wMSA9PSB0ZW1wMiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbEZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxGb3VuZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsQ2xpcERTSSA9IGxDbGlwRFNJICsgbFNpemU7Ci0gICAgfQotCi0gICAgLyogRm9ybSB0aGUgZmluYWwgU1BTIGFuZCBQUFMgZGF0YSAqLwotCi0gICAgaWYoIGxGb3VuZCA9PSAxICkKLSAgICB7Ci0gICAgICAgIC8qIE5vIG5lZWQgdG8gYWRkIFBQUyAqLwotICAgICAgICBpbnN0YW5jZS0+ZmluYWxfUFBTX0lEID0gQ2xpcF9QUFNJRFtjbnRdOwotCi0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikiaW5zdGFuY2UtPm1fcEZpbmFsRFNJIik7Ci0KLSAgICAgICAgaWYoIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImluc3RhbmNlLT5tX3BGaW5hbERTSTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJU2l6ZSA9IGluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilpbnN0YW5jZS0+bV9wRmluYWxEU0ksCi0gICAgICAgICAgICAodm9pZCAqKWluc3RhbmNlLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBBREQgUFBTICovCi0gICAgICAgIC8qIGZpbmQgdGhlIGZyZWUgUFBTIElEICovCi0KLSAgICAgICAgY250ID0gMDsKLQotICAgICAgICB3aGlsZSggQ2xpcF9Vc2VkUFBTSURbY250XSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNudCsrOwotICAgICAgICB9Ci0gICAgICAgIGluc3RhbmNlLT5maW5hbF9QUFNfSUQgPSBjbnQ7Ci0KLSAgICAgICAgc2l6ZSA9IGluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICsgaW5zdGFuY2UtPm1fZW5jb2RlclBQU1NpemUKLSAgICAgICAgICAgICsgMTA7Ci0KLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJID0gKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemUsIE00TUNTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiaW5zdGFuY2UtPm1fcEZpbmFsRFNJIik7Ci0KLSAgICAgICAgaWYoIGluc3RhbmNlLT5tX3BGaW5hbERTSSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImluc3RhbmNlLT5tX3BGaW5hbERTSTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopaW5zdGFuY2UtPm1fcEZpbmFsRFNJLAotICAgICAgICAgICAgKHZvaWQgKilpbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgIGluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLQotICAgICAgICB0ZW1wID0gaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2xDbGlwRFNJX1BQU19vZmZzZXRdOwotICAgICAgICB0ZW1wID0gdGVtcCArIDE7Ci0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSVtsQ2xpcERTSV9QUFNfb2Zmc2V0XSA9IHRlbXA7Ci0KLSAgICAgICAgLy90ZW1wID0gaW5zdGFuY2UtPm1fcEVuY29kZXJQUFNbMF07Ci0gICAgICAgIGxTaXplMSA9IGluc3RhbmNlLT5tX2VuY29kZXJQUFNTaXplIC0gMTsKLSAgICAgICAgcF9iczEtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbnN0YW5jZS0+bV9wRW5jb2RlclBQUyArIDEpOwotICAgICAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9iczEsIGxTaXplMSk7Ci0KLSAgICAgICAgbEVuY29kZXJfUFBTSUQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMxKTsKLSAgICAgICAgbEVuY29kZXJfU1BTSUQgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMxKTsKLQotICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgPSAoIGxTaXplMSkgPDwgMzsKLSAgICAgICAgbEVuY29kZXJQUFNSZW1CaXRzIC09IHBfYnMxLT5iaXRQb3M7Ci0KLSAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5tX3BFbmNvZGVyUFBTW2xTaXplMV07Ci0KLSAgICAgICAgY250MSA9IDA7Ci0KLSAgICAgICAgd2hpbGUoICggdGVtcCAmIDB4MSkgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNudDErKzsKLSAgICAgICAgICAgIHRlbXAgPSB0ZW1wID4+IDE7Ci0gICAgICAgIH0KLSAgICAgICAgY250MSsrOwotICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgLT0gY250MTsKLQotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0lbaW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgKyAyXSA9Ci0gICAgICAgICAgICBpbnN0YW5jZS0+bV9wRW5jb2RlclBQU1swXTsKLQotICAgICAgICBOU1dBVkNNQ1NfaW5pdEJpdHN0cmVhbSgmaW5zdGFuY2UtPmVuY2JzKTsKLSAgICAgICAgaW5zdGFuY2UtPmVuY2JzLnN0cmVhbUJ1ZmZlciA9Ci0gICAgICAgICAgICAmKGluc3RhbmNlLT5tX3BGaW5hbERTSVtpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSArIDNdKTsKLSAgICAgICAgbFBQU19CdWZmZXIgPSBpbnN0YW5jZS0+ZW5jYnMuc3RyZWFtQnVmZmVyOwotCi0gICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIGluc3RhbmNlLT5maW5hbF9QUFNfSUQpOwotICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+ZmluYWxfU1BTX0lEKTsKLQotICAgICAgICB3aGlsZSggbEVuY29kZXJQUFNSZW1CaXRzID4gOCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9iczEsIDgpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgOCk7Ci0gICAgICAgICAgICBsRW5jb2RlclBQU1JlbUJpdHMgPSBsRW5jb2RlclBQU1JlbUJpdHMgLSA4OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGxFbmNvZGVyUFBTUmVtQml0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9iczEsIGxFbmNvZGVyUFBTUmVtQml0cyk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCB0ZW1wLCBsRW5jb2RlclBQU1JlbUJpdHMpOwotICAgICAgICB9Ci0gICAgICAgIE5TV0FWQ01DU19wdXRSYnNwVGJpdHMoJmluc3RhbmNlLT5lbmNicyk7Ci0KLSAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5lbmNicy5ieXRlQ250OwotICAgICAgICBsUFBTX0J1ZmZlcl9TaXplID0gdGVtcDsKLSAgICAgICAgdGVtcCA9IHRlbXAgKyAxOwotCi0gICAgICAgIGluc3RhbmNlLT5tX3BGaW5hbERTSVtpbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZV0gPQotICAgICAgICAgICAgKCB0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgaW5zdGFuY2UtPm1fcEZpbmFsRFNJW2luc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICsgMV0gPQotICAgICAgICAgICAgKHRlbXApICYweEZGOwotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0lTaXplID0KLSAgICAgICAgICAgIGluc3RhbmNlLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICsgMiArIHRlbXA7Ci0gICAgfQotCi0gICAgLyogRGVjb2RlIHRoZSBjbGlwIFNQUyAqLwotCi0gICAgbENsaXBEU0kgPSBpbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyArIDY7Ci0KLSAgICBsQ2xpcERTSV9QUFNfb2Zmc2V0ID0gNjsKLQotICAgIGZvciAoIGNudCA9IDA7IGNudCA8IGluc3RhbmNlLT5tX2VuY29kZXJfU1BTX0NudDsgY250KysgKQotICAgIHsKLSAgICAgICAgbFNpemUgPSAoIGxDbGlwRFNJWzBdIDw8IDgpICsgbENsaXBEU0lbMV07Ci0gICAgICAgIGxDbGlwRFNJID0gbENsaXBEU0kgKyAyOwotCi0gICAgICAgIGlmKCBDbGlwX1NQU0lEW2NudF0gPT0gaW5zdGFuY2UtPmZpbmFsX1NQU19JRCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShsQ2xpcERTSSArIDEpOwotICAgICAgICAgICAgRGVjQml0U3RyZWFtUmVzZXRfTUNTKHBfYnMsIGxTaXplIC0gMSk7Ci0KLSAgICAgICAgICAgIGVyciA9IERlY1NQU01DUyhwX2JzLCAmaW5zdGFuY2UtPmNsaXBfc3BzKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9DbGlwX1NQU0lEW2NudF0gPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgLy9DbGlwX1VzZWRTUFNJRFtDbGlwX1NQU0lEW2NudF1dID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbENsaXBEU0kgPSBsQ2xpcERTSSArIGxTaXplOwotICAgIH0KLQotICAgIC8qIERlY29kZSBlbmNvZGVyIFNQUyAqLwotICAgIHBfYnMtPkJ1ZmZlciA9IChNNE9TQV9VSW50OCAqKShpbnN0YW5jZS0+bV9wRW5jb2RlclNQUyArIDEpOwotICAgIERlY0JpdFN0cmVhbVJlc2V0X01DUyhwX2JzLCBpbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZSAtIDEpOwotICAgIGVyciA9IERlY1NQU01DUyhwX2JzLCAmaW5zdGFuY2UtPmVuY29kZXJfc3BzKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBpbnN0YW5jZS0+ZW5jb2Rlcl9zcHMubnVtX3JlZl9mcmFtZXMKLSAgICA+IGluc3RhbmNlLT5jbGlwX3Nwcy5udW1fcmVmX2ZyYW1lcyApCi0gICAgewotICAgICAgICByZXR1cm4gMTAwOyAvL25vdCBzdXBwb3J0ZWQKLSAgICB9Ci0KLSAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKilsUFBTX0J1ZmZlcjsKLSAgICBEZWNCaXRTdHJlYW1SZXNldF9NQ1MocF9icywgbFBQU19CdWZmZXJfU2l6ZSk7Ci0gICAgRGVjUFBTTUNTKHBfYnMsICZpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMpOwotCi0gICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gMDsKLSAgICBpbnN0YW5jZS0+ZnJhbWVfbW9kX2NvdW50ID0KLSAgICAgICAgMSA8PCAoaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKLQotICAgIGluc3RhbmNlLT5QT0NfbHNiID0gMDsKLSAgICBpbnN0YW5jZS0+UE9DX2xzYl9tb2QgPQotICAgICAgICAxIDw8IChpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSIEgyNjRNQ1NfUHJvY2Vzc05BTFUoIE5TV0FWQ19NQ1NfdCAqYWluc3RhbmNlLCBNNE9TQV9VSW50OCAqaW5idWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGluYnVmX3NpemUsIE00T1NBX1VJbnQ4ICpvdXRidWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyICpvdXRidWZfc2l6ZSApCi17Ci0gICAgQ29tQml0U3RyZWFtTUNTX3QgKnBfYnMsIGJzOwotICAgIE5TV0FWQ19NQ1NfdCAqaW5zdGFuY2U7Ci0gICAgTTRPU0FfVUludDggbmFsdV9pbmZvOwotICAgIE00T1NBX0ludDMyIGZvcmJpZGRlbl9iaXQsIG5hbF9yZWZfaWRjLCBuYWxfdW5pdF90eXBlOwotICAgIE00T1NBX0ludDMyIGZpcnN0X21iX2luX3NsaWNlLCBzbGljZV90eXBlLCBwaWNfcGFyYW1ldGVyX3NldF9pZCwgZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIHNlcV9wYXJhbWV0ZXJfc2V0X2lkOwotICAgIE00T1NBX1VJbnQ4IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OwotICAgIE00T1NBX0ludDMyIHRlbXBfZnJhbWVfbnVtOwotICAgIE00T1NBX0ludDMyIGJpdHN0b0RpYWNhcmQsIGJ5dGVzOwotICAgIE00T1NBX1VJbnQzMiBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgIE00T1NBX0ludDMyIG5ld19ieXRlcywgaW5pdF9iaXRfcG9zOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZTsKLSAgICBNNE9TQV9VSW50MzIgY250OwotICAgIE00T1NBX1VJbnQzMiBvdXRidWZmcG9zID0gMDsKLSAgICAvLyNpZm5kZWYgREdSX0ZJWCAvLyArIG5ldwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZV9sb3cxNiwgbmFsX3NpemVfaGlnaDE2OwotICAgIC8vI2VuZGlmIC8vICsgZW5kIG5ldwotICAgIE00T1NBX1VJbnQzMiBmcmFtZV9zaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdGVtcCA9IDA7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDggKmJ1ZmY7Ci0KLSAgICBwX2JzID0gJmJzOwotICAgIGluc3RhbmNlID0gKE5TV0FWQ19NQ1NfdCAqKWFpbnN0YW5jZTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gaW5zdGFuY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJIMjY0TUNTX1Byb2Nlc3NOQUxVOiBpbnN0YW5jZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiggaW5zdGFuY2UtPmlzX2RvbmUgKQotICAgICAgICByZXR1cm4gZXJyOwotCi0gICAgaW5idWZmWzBdID0gMHgwMDsKLSAgICBpbmJ1ZmZbMV0gPSAweDAwOwotICAgIGluYnVmZlsyXSA9IDB4MDA7Ci0gICAgaW5idWZmWzNdID0gMHgwMTsKLQotCi0gICAgd2hpbGUoIChNNE9TQV9JbnQzMilmcmFtZV9zaXplIDwgaW5idWZfc2l6ZSApCi0gICAgewotICAgICAgICBtYXNrX2JpdHMgPSAweEZGRkZGRkZGOwotICAgICAgICBwX2JzLT5CdWZmZXIgPSAoTTRPU0FfVUludDggKikoaW5idWZmICsgZnJhbWVfc2l6ZSk7Ci0KLQotICAgICAgICBuYWx1X2luZm8gPSAodW5zaWduZWQgY2hhcilwX2JzLT5CdWZmZXJbNF07Ci0KLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zXSA9IHBfYnMtPkJ1ZmZlclswXTsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMV0gPSBwX2JzLT5CdWZmZXJbMV07Ci0gICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDJdID0gcF9icy0+QnVmZmVyWzJdOwotICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAzXSA9IHBfYnMtPkJ1ZmZlclszXTsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgNF0gPSBwX2JzLT5CdWZmZXJbNF07Ci0KLSAgICAgICAgcF9icy0+QnVmZmVyID0gcF9icy0+QnVmZmVyICsgNTsKLQotICAgICAgICBwX2JzLT5iaXRQb3MgPSAwOwotICAgICAgICBwX2JzLT5sYXN0VG90YWxCaXRzID0gMDsKLSAgICAgICAgcF9icy0+bnVtQml0c0luQnVmZmVyID0gKCBpbmJ1Zl9zaXplIC0gZnJhbWVfc2l6ZSAtIDUpIDw8IDM7Ci0gICAgICAgIHBfYnMtPnJlYWRhYmxlQnl0ZXNJbkJ1ZmZlciA9IGluYnVmX3NpemUgLSBmcmFtZV9zaXplIC0gNTsKLQotICAgICAgICBwX2JzLT51aTMyVGVtcEJ1ZmYgPSAwOwotICAgICAgICBwX2JzLT5pOEJpdENudCA9IDA7Ci0gICAgICAgIHBfYnMtPnB1aThCZnJQdHIgPSAoTTRPU0FfSW50OCAqKXBfYnMtPkJ1ZmZlcjsKLSAgICAgICAgcF9icy0+dWkzMkxhc3RUd29CeXRlcyA9IDB4RkZGRkZGRkY7Ci0KLSAgICAgICAgSDI2NE1DU19nZXRCaXRzKHBfYnMsIDApOwotCi0KLQotICAgICAgICBuYWxfc2l6ZSA9IGluYnVmX3NpemUgLSBmcmFtZV9zaXplIC0gNDsKLSAgICAgICAgYnVmZiA9IGluYnVmZiArIGZyYW1lX3NpemUgKyA0OwotCi0gICAgICAgIHdoaWxlKCBuYWxfc2l6ZSA+IDQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggKCBidWZmWzBdID09IDB4MDApICYmIChidWZmWzFdID09IDB4MDApICYmIChidWZmWzJdID09IDB4MDApCi0gICAgICAgICAgICAgICAgJiYgKGJ1ZmZbM10gPT0gMHgwMSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZiA9IGJ1ZmYgKyAxOwotICAgICAgICAgICAgbmFsX3NpemUgPSBuYWxfc2l6ZSAtIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggbmFsX3NpemUgPD0gNCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5hbF9zaXplID0gMDsKLSAgICAgICAgfQotICAgICAgICBuYWxfc2l6ZSA9ICggaW5idWZfc2l6ZSAtIGZyYW1lX3NpemUgLSA0KSAtIG5hbF9zaXplOwotCi0gICAgICAgIC8vICAgICAgTTRPU0FfVFJBQ0UxXzMoIkgyNjRNQ1NfUHJvY2Vzc05BTFUgZnJhbWUgIGlucHV0IGJ1ZmYgc2l6ZSA9ICVkICBjdXJyZW50IHBvc2l0aW9uCi0gICAgICAgIC8vPSAlZCAgIG5hbCBzaXplID0gJWQiLAotICAgICAgICAvLyAgaW5idWZfc2l6ZSwgZnJhbWVfc2l6ZSwgIG5hbF9zaXplICsgNCk7Ci0gICAgICAgIGZyYW1lX3NpemUgKz0gbmFsX3NpemUgKyA0OwotCi0KLQotICAgICAgICBmb3JiaWRkZW5fYml0ID0gKCBuYWx1X2luZm8gPj4gNykgJiAxOwotICAgICAgICBuYWxfcmVmX2lkYyA9ICggbmFsdV9pbmZvID4+IDUpICYgMzsKLSAgICAgICAgbmFsX3VuaXRfdHlwZSA9IChuYWx1X2luZm8pICYweDFmOwotCi0gICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKklEUi9QUFMgUGFja2V0IC0gRG8gbm90aGluZyovCi0gICAgICAgICAgICBpbnN0YW5jZS0+aXNfZG9uZSA9IDE7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgTlNXQVZDTUNTX2luaXRCaXRzdHJlYW0oJmluc3RhbmNlLT5lbmNicyk7Ci0gICAgICAgIGluc3RhbmNlLT5lbmNicy5zdHJlYW1CdWZmZXIgPSBvdXRidWZmICsgb3V0YnVmZnBvcyArIDU7Ci0KLSAgICAgICAgaWYoIG5hbF91bml0X3R5cGUgPT0gOCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJIMjY0TUNTX1Byb2Nlc3NOQUxVKCkgRXJyb3I6IFBQUyIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDcgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKlNQUyBQYWNrZXQgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJIMjY0TUNTX1Byb2Nlc3NOQUxVKCkgRXJyb3I6IFNQUyIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKG5hbF91bml0X3R5cGUgPT0gNSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgICAgICAgICAgaW5zdGFuY2UtPlBPQ19sc2IgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIChuYWxfdW5pdF90eXBlID09IDEpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmlyc3RfbWJfaW5fc2xpY2UgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3VFeHBWTEMoJmluc3RhbmNlLT5lbmNicywgZmlyc3RfbWJfaW5fc2xpY2UpOwotCi0gICAgICAgICAgICBzbGljZV90eXBlID0gSDI2NE1DU19EZWNWTENSZWFkRXhwR29sb21iQ29kZShwX2JzKTsKLSAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHNsaWNlX3R5cGUpOwotCi0gICAgICAgICAgICBwaWNfcGFyYW1ldGVyX3NldF9pZCA9IEgyNjRNQ1NfRGVjVkxDUmVhZEV4cEdvbG9tYkNvZGUocF9icyk7Ci0gICAgICAgICAgICBOU1dBVkNNQ1NfdUV4cFZMQygmaW5zdGFuY2UtPmVuY2JzLCBwaWNfcGFyYW1ldGVyX3NldF9pZCk7Ci0KLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywKLSAgICAgICAgICAgICAgICBpbnN0YW5jZS0+Y2xpcF9zcHMubG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpOwotICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgaW5zdGFuY2UtPmZyYW1lX2NvdW50LAotICAgICAgICAgICAgICAgIGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCk7Ci0KLSAgICAgICAgICAgIC8vIEluIEJhc2VsaW5lIFByb2ZpbGU6IGZyYW1lX21ic19vbmx5X2ZsYWcgc2hvdWxkIGJlIE9OCi0KLSAgICAgICAgICAgIGlmKCBuYWxfdW5pdF90eXBlID09IDUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU191RXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggaW5zdGFuY2UtPmNsaXBfc3BzLnBpY19vcmRlcl9jbnRfdHlwZSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gSDI2NE1DU19nZXRCaXRzKHBfYnMsCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLT5jbGlwX3Nwcy5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQKLSAgICAgICAgICAgICAgICAgICAgKyA0KTsKLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCBpbnN0YW5jZS0+UE9DX2xzYiwKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UtPmNsaXBfc3BzLmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggKCBpbnN0YW5jZS0+Y2xpcF9zcHMucGljX29yZGVyX2NudF90eXBlID09IDEpCi0gICAgICAgICAgICAgICAgJiYgKGluc3RhbmNlLT5jbGlwX3Nwcy5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZykgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX0RlY1ZMQ1JlYWRTaWduZWRFeHBHb2xvbWJDb2RlKHBfYnMpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19zRXhwVkxDKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbnQgPSBwX2JzLT5iaXRQb3MgJiAweDc7Ci0KLSAgICAgICAgICAgIGlmKCBjbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudCA9IDggLSBjbnQ7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEgyNjRNQ1NfZ2V0Qml0cyhwX2JzLCBjbnQpOwotICAgICAgICAgICAgICAgIE5TV0FWQ01DU19wdXRCaXRzKCZpbnN0YW5jZS0+ZW5jYnMsIHRlbXAsIGNudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNudCA9IHBfYnMtPmJpdFBvcyA+PiAzOwotCi0gICAgICAgICAgICB3aGlsZSggY250IDwgKG5hbF9zaXplIC0gMikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0gICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgOCk7Ci0gICAgICAgICAgICAgICAgY250ID0gcF9icy0+Yml0UG9zID4+IDM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRlbXAgPSBIMjY0TUNTX2dldEJpdHMocF9icywgOCk7Ci0KLSAgICAgICAgICAgIGlmKCB0ZW1wICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSggKCB0ZW1wICYgMHgxKSA9PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbnQrKzsKLSAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOwotCi0gICAgICAgICAgICAgICAgaWYoIDggLSBjbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTlNXQVZDTUNTX3B1dEJpdHMoJmluc3RhbmNlLT5lbmNicywgdGVtcCwgKDggLSBjbnQpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0UmJzcFRiaXRzKCZpbnN0YW5jZS0+ZW5jYnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOU1dBVkNNQ1NfcHV0Qml0cygmaW5zdGFuY2UtPmVuY2JzLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKDggLSBpbnN0YW5jZS0+ZW5jYnMuYml0UG9zICUgOCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGVtcCA9IGluc3RhbmNlLT5lbmNicy5ieXRlQ250OwotICAgICAgICAgICAgdGVtcCA9IHRlbXAgKyAxOwotCi0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3NdID0gKE00T1NBX1VJbnQ4KSgoIHRlbXAgPj4gMjQpICYgMHhGRik7Ci0gICAgICAgICAgICBvdXRidWZmW291dGJ1ZmZwb3MgKyAxXSA9IChNNE9TQV9VSW50OCkoKCB0ZW1wID4+IDE2KSAmIDB4RkYpOwotICAgICAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgMl0gPSAoTTRPU0FfVUludDgpKCggdGVtcCA+PiA4KSAmIDB4RkYpOwotICAgICAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgM10gPSAoTTRPU0FfVUludDgpKCh0ZW1wKSAmMHhGRik7Ci0gICAgICAgICAgICBvdXRidWZmcG9zID0gb3V0YnVmZnBvcyArIHRlbXAgKyA0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcF9icy0+QnVmZmVyID0gcF9icy0+QnVmZmVyIC0gNTsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSAmb3V0YnVmZltvdXRidWZmcG9zXSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnMtPkJ1ZmZlciwgbmFsX3NpemUgKyA0KTsKLQotICAgICAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zXSA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplID4+IDI0KSYgMHhGRik7Ci0gICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDFdID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gMTYpJiAweEZGKTs7Ci0gICAgICAgIG91dGJ1ZmZbb3V0YnVmZnBvcyArIDJdID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gOCkmIDB4RkYpOzsKLSAgICAgICAgb3V0YnVmZltvdXRidWZmcG9zICsgM10gPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSkmIDB4RkYpOzsKLQotICAgICAgICAgICAgb3V0YnVmZnBvcyA9IG91dGJ1ZmZwb3MgKyBuYWxfc2l6ZSArIDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqb3V0YnVmX3NpemUgPSBvdXRidWZmcG9zOwotCi0gICAgaW5zdGFuY2UtPlBPQ19sc2IgPSBpbnN0YW5jZS0+UE9DX2xzYiArIDE7Ci0KLSAgICBpZiggaW5zdGFuY2UtPlBPQ19sc2IgPT0gaW5zdGFuY2UtPlBPQ19sc2JfbW9kICkKLSAgICB7Ci0gICAgICAgIGluc3RhbmNlLT5QT0NfbHNiID0gMDsKLSAgICB9Ci0gICAgaW5zdGFuY2UtPmZyYW1lX2NvdW50ID0gaW5zdGFuY2UtPmZyYW1lX2NvdW50ICsgMTsKLQotICAgIGlmKCBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPT0gaW5zdGFuY2UtPmZyYW1lX21vZF9jb3VudCApCi0gICAgewotICAgICAgICBpbnN0YW5jZS0+ZnJhbWVfY291bnQgPSAwOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfRVJSICAgTTRNQ1NfY29udmV0RnJvbUJ5dGVTdHJlYW10b05BTFN0cmVhbSggIE00T1NBX1VJbnQ4ICppbmJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGluYnVmX3NpemUgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZXNpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBuYWxfc2l6ZSA9MDsKLSAgICBNNE9TQV9VSW50OCAqYnVmZjsKLQotCi0gICAgd2hpbGUoZnJhbWVzaXplIDwgaW5idWZfc2l6ZSkKLSAgICB7Ci0gICAgICAgICAgICBuYWxfc2l6ZSA9IGluYnVmX3NpemUgLSBmcmFtZXNpemUgLSA0OwotICAgICAgICAgICAgYnVmZiA9ICBpbmJ1ZmYgKyBmcmFtZXNpemUgKyA0OwotCi0gICAgICAgICAgICB3aGlsZShuYWxfc2l6ZSA+IDQpewotICAgICAgICAgICAgICAgIGlmKChidWZmWzBdID09IDB4MDApICYmCi0gICAgICAgICAgICAgICAgKGJ1ZmZbMV0gPT0gMHgwMCkgJiYKLSAgICAgICAgICAgICAgICAoYnVmZlsyXSA9PSAweDAwKSAmJgotICAgICAgICAgICAgICAgIChidWZmWzNdID09IDB4MDEpKXsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1ZmYgPSBidWZmICsgMTsKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZSA9IG5hbF9zaXplIC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihuYWxfc2l6ZSA8PSA0KXsKLSAgICAgICAgICAgICAgICBuYWxfc2l6ZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYWxfc2l6ZSA9IChpbmJ1Zl9zaXplIC0gZnJhbWVzaXplIC0gNCkgLSBuYWxfc2l6ZTsKLQotICAgICAgICBpbmJ1ZmZbZnJhbWVzaXplICsgMF0gID0gKE00T1NBX1VJbnQ4KSgobmFsX3NpemUgPj4gMjQpJiAweEZGKTsKLSAgICAgICAgaW5idWZmW2ZyYW1lc2l6ZSArIDFdICA9IChNNE9TQV9VSW50OCkoKG5hbF9zaXplID4+IDE2KSYgMHhGRik7Ci0gICAgICAgIGluYnVmZltmcmFtZXNpemUgKyAyXSAgPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSA+PiA4KSYgMHhGRik7Ci0gICAgICAgIGluYnVmZltmcmFtZXNpemUgKyAzXSAgPSAoTTRPU0FfVUludDgpKChuYWxfc2l6ZSApJiAweEZGKTsKLSAgICAgICAgZnJhbWVzaXplICs9IG5hbF9zaXplICsgNDsKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRNQ1NfY29udmV0RnJvbUJ5dGVTdHJlYW10b05BTFN0cmVhbSBmcmFtZXNpemUgPSAleCBuYWxzaXplID0gJXgiLAotICAgICAgICAgICAgZnJhbWVzaXplLCBuYWxfc2l6ZSkKLSAgICB9Ci0KLSAgICByZXR1cm4gIGVycjsKLX0KLQotCi1NNE9TQV9FUlIgSDI2NE1DU19GcmVlaW5zdGFuY2UoIE5TV0FWQ19NQ1NfdCAqaW5zdGFuY2UgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBpbnN0YW5jZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIkgyNjRNQ1NfRnJlZWluc3RhbmNlOiBpbnN0YW5jZSBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMuc2xpY2VfZ3JvdXBfaWQgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZS0+ZW5jb2Rlcl9wcHMuc2xpY2VfZ3JvdXBfaWQpOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IGluc3RhbmNlLT5wX2VuY29kZXJfc3BzICkKLSAgICB7Ci0gICAgICAgIGZyZWUoaW5zdGFuY2UtPnBfZW5jb2Rlcl9zcHMpOwotICAgICAgICBpbnN0YW5jZS0+cF9lbmNvZGVyX3NwcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gaW5zdGFuY2UtPnBfZW5jb2Rlcl9wcHMgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZS0+cF9lbmNvZGVyX3Bwcyk7Ci0gICAgICAgIGluc3RhbmNlLT5wX2VuY29kZXJfcHBzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBpbnN0YW5jZS0+bV9wRmluYWxEU0kgKQotICAgIHsKLSAgICAgICAgZnJlZShpbnN0YW5jZS0+bV9wRmluYWxEU0kpOwotICAgICAgICBpbnN0YW5jZS0+bV9wRmluYWxEU0kgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IGluc3RhbmNlICkKLSAgICB7Ci0gICAgICAgIGZyZWUoaW5zdGFuY2UpOwotICAgICAgICBpbnN0YW5jZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldFZlcnNpb24oTTRfVmVyc2lvbkluZm8qIHBWZXJzaW9uSW5mbyk7Ci0gKiBAYnJpZWYgICAgR2V0IHRoZSBNQ1MgdmVyc2lvbi4KLSAqIEBub3RlIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZ2V0VmVyc2lvbiggTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uSW5mbyApCi17Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX2dldFZlcnNpb24gY2FsbGVkIHdpdGggcFZlcnNpb25JbmZvPTB4JXgiLAotICAgICAgICBwVmVyc2lvbkluZm8pOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBWZXJzaW9uSW5mbyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2dldFZlcnNpb246IHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBwVmVyc2lvbkluZm8tPm1fbWFqb3IgPSBNNE1DU19WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9taW5vciA9IE00TUNTX1ZFUlNJT05fTUlOT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX3JldmlzaW9uID0gTTRNQ1NfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfZ2V0VmVyc2lvbigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBJbml0aWFsaXplcyB0aGUgTUNTIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIE1DUyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqIEByZXR1cm4gICBNNEVSUl9BTExPQzogICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNE1DU19pbml0KCBNNE1DU19Db250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKnBGaWxlV3JpdGVQdHJGY3QgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIk00TUNTX2luaXQgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcEZpbGVSZWFkUHRyRmN0PTB4JXgsIHBGaWxlV3JpdGVQdHJGY3Q9MHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBwRmlsZVJlYWRQdHJGY3QsIHBGaWxlV3JpdGVQdHJGY3QpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfaW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19pbml0OiBwRmlsZVJlYWRQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVdyaXRlUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfaW5pdDogcEZpbGVXcml0ZVB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIHRoZSBNQ1MgY29udGV4dCBhbmQgcmV0dXJuIGl0IHRvIHRoZSB1c2VyICovCi0gICAgcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNE1DU19JbnRlcm5hbENvbnRleHQpLAotICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikiTTRNQ1NfSW50ZXJuYWxDb250ZXh0Iik7Ci0gICAgKnBDb250ZXh0ID0gcEM7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19pbml0KCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBNNE1DU19JbnRlcm5hbENvbnRleHQsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0IHRoZSBjb250ZXh0LiBBbGwgcG9pbnRlcnMgbXVzdCBiZSBpbml0aWFsaXplZCB0byBNNE9TQV9OVUxMCi0gICAgKiBiZWNhdXNlIENsZWFuVXAoKSBjYW4gYmUgY2FsbGVkIGp1c3QgYWZ0ZXIgSW5pdCgpLiAqLwotICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9DUkVBVEVEOwotICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIgPSBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgcEMtPnBPc2FGaWxlV3JpdFB0ciA9IHBGaWxlV3JpdGVQdHJGY3Q7Ci0gICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPm5vYXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bm92aWRlbyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT51aVByb2dyZXNzID0gMDsKLQotICAgIC8qKgotICAgICogUmVhZGVyIHN0dWZmICovCi0gICAgcEMtPnBJbnB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5JbnB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkOwotICAgIHBDLT5iRmlsZU9wZW5lZEluRmFzdE1vZGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+cFJlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmJVbnN1cHBvcnRlZEF1ZGlvRm91bmQgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+aUF1ZGlvQ3RzT2Zmc2V0ID0gMDsKLSAgICAvKiBGaXJzdCB0ZW1wb3JhcnkgdmlkZW8gQVUgdG8gaGF2ZSBtb3JlIHByZWNpc2UgZW5kIHZpZGVvIGN1dCovCi0gICAgcEMtPlJlYWRlclZpZGVvQVUxLm1fc3RydWN0U2l6ZSA9IDA7Ci0gICAgLyogU2Vjb25kIHRlbXBvcmFyeSB2aWRlbyBBVSB0byBoYXZlIG1vcmUgcHJlY2lzZSBlbmQgdmlkZW8gY3V0Ki8KLSAgICBwQy0+UmVhZGVyVmlkZW9BVTIubV9zdHJ1Y3RTaXplID0gMDsKLSAgICBwQy0+UmVhZGVyQXVkaW9BVTEubV9zdHJ1Y3RTaXplID0gMDsKLSAgICBwQy0+UmVhZGVyQXVkaW9BVTIubV9zdHJ1Y3RTaXplID0gMDsKLSAgICBwQy0+bV9hdWRpb0FVRHVyYXRpb24gPSAwOwotICAgIHBDLT5tX3BEYXRhQWRkcmVzczEgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BEYXRhQWRkcmVzczIgPSBNNE9TQV9OVUxMOwotICAgIC8qIEZpcnN0IHRlbXBvcmFyeSB2aWRlbyBBVSBkYXRhIHRvIGhhdmUgbW9yZSBwcmVjaXNlIGVuZCB2aWRlbyBjdXQqLwotICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSA9IE00T1NBX05VTEw7Ci0gICAgLyogU2Vjb25kIHRlbXBvcmFyeSB2aWRlbyBBVSBkYXRhIHRvIGhhdmUgbW9yZSBwcmVjaXNlIGVuZCB2aWRlbyBjdXQqLwotICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioKLSAgICAqIFZpZGVvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBwQy0+cFZpRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmRWaURlY1N0YXJ0aW5nQ3RzID0gMC4wOwotICAgIHBDLT5pVmlkZW9CZWdpbkRlY0luY3IgPSAwOwotICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gMC4wOwotICAgIHBDLT5kQ3RzSW5jcmVtZW50ID0gMC4wOwotICAgIHBDLT5pc1JlbmRlckR1cCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBWaWRlbyBlbmNvZGVyIHN0dWZmICovCi0gICAgcEMtPnBWaUVuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUHJlUmVzaXplRnJhbWUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tOb0VuY29kZXI7Ci0KLSAgICAvKioKLSAgICAqIEF1ZGlvIGRlY29kZXIgc3R1ZmYgKi8KLSAgICBwQy0+cEF1ZGlvRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkF1ZGlvRGVjQnVmZmVySW4ubV9idWZmZXJTaXplID0gMDsKLSAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9IDA7Ci0gICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgLyoqCi0gICAgKiBTc3JjIHN0dWZmICovCi0gICAgcEMtPnBTc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5pU3NyY05iU2FtcGxJbiA9IDA7Ci0gICAgcEMtPmlTc3JjTmJTYW1wbE91dCA9IDA7Ci0gICAgcEMtPlNzcmNTY3JhdGNoID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBNNE9TQV9OVUxMOwotICAgIC8qKgotICAgICogQXVkaW8gZW5jb2RlciAqLwotICAgIHBDLT5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEF1ZGlvRW5jRFNJLmluZm9TaXplID0gMDsKLSAgICBwQy0+cEF1ZGlvRW5jRFNJLnBJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5ID0gMDsKLQotICAgIC8qKgotICAgICogV3JpdGVyIHN0dWZmICovCi0gICAgcEMtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFRlbXBvcmFyeUZpbGUgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnVpVmlkZW9BVUNvdW50ID0gMDsKLSAgICBwQy0+dWlWaWRlb01heEF1U2l6ZSA9IDA7Ci0gICAgcEMtPnVpVmlkZW9NYXhDaHVuY2tTaXplID0gMDsKLSAgICBwQy0+dWlBdWRpb0FVQ291bnQgPSAwOwotICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gMDsKLQotICAgIHBDLT51aUF1ZGlvQ3RzID0gMDsKLSAgICBwQy0+Yl9pc1Jhd1dyaXRlciA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5wT3V0cHV0UENNZmlsZSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBFbmNvZGluZyBjb25maWcgKi8KLSAgICBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9IE00RU5DT0RFUl9rTlVMTDsgLyoqPCBObyBmb3JtYXQgc2V0IHlldCAqLwotICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gMDsgICAgICAgICAgICAgICAgICAgICAvKio8IE5vIHNpemUgc2V0IHlldCAqLwotICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IDA7ICAgICAgICAgICAgICAgICAgICAvKio8IE5vIHNpemUgc2V0IHlldCAqLwotICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gMDsgICAgICAgICAgICAvKio8IE5vIGZyYW1lcmF0ZSBzZXQgeWV0ICovCi0KLSAgICBwQy0+dWlCZWdpbkN1dFRpbWUgPSAwOyAgICAgICAgICAgICAgICAgICAgLyoqPCBObyBiZWdpbiBjdXQgKi8KLSAgICBwQy0+dWlFbmRDdXRUaW1lID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBObyBlbmQgY3V0ICovCi0gICAgcEMtPnVpTWF4RmlsZVNpemUgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTm8gbGltaXQgKi8KLSAgICBwQy0+dWlBdWRpb0JpdHJhdGUgPQotICAgICAgICBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZTsgLyoqPCBObyBiaXRyYXRlIHNldCB5ZXQgKi8KLSAgICBwQy0+dWlWaWRlb0JpdHJhdGUgPQotICAgICAgICBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZTsgLyoqPCBObyBiaXRyYXRlIHNldCB5ZXQgKi8KLQotICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa1ZpZGVvVW5rbm93bjsKLSAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5wQnVmID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0KLSAgICBwQy0+b3V0cHV0VmlkZW9UaW1lc2NhbGUgPSAwOwotCi0gICAgLypGQiAyMDA4LzEwLzIwOiBhZGQgbWVkaWEgcmVuZGVyaW5nIHBhcmFtZXRlciBhbmQgQUlSIGNvbnRleHQgdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotICAgIHBDLT5NZWRpYVJlbmRlcmluZyA9IE00TUNTX2tSZXNpemluZzsKLSAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgLyoqLwotCi0gICAgLyoqCi0gICAgKiBGbEIgMjAwOS4wMy4wNDogYWRkIGF1ZGlvIEVmZmVjdHMqLwotICAgIHBDLT5wRWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm5iRWZmZWN0cyA9IDA7Ci0gICAgcEMtPnBBY3RpdmVFZmZlY3ROdW1iZXIgPSAtMTsKLSAgICAvKiovCi0KLSAgICAvKgotICAgICogUmVzZXQgcG9pbnRlcnMgZm9yIG1lZGlhIGFuZCBjb2RlY3MgaW50ZXJmYWNlcyAqLwotICAgIGVyciA9IE00TUNTX2NsZWFySW50ZXJmYWNlVGFibGVzKHBDKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qCi0gICAgKiAgQ2FsbCB0aGUgbWVkaWEgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24gbW9kdWxlICovCi0gICAgZXJyID0gTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYyhwQyk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLSAgICAvKioKLSAgICAqIEluaXRpYWxpemUgdGhlIFN0aWxsIHBpY3R1cmUgcGFydCBvZiBNQ1MqLwotCi0gICAgZXJyID0gTTRNQ1Nfc3RpbGxQaWNJbml0KHBDLCBwRmlsZVJlYWRQdHJGY3QsIHBGaWxlV3JpdGVQdHJGY3QpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgcEMtPm1fYklzU3RpbGxQaWN0dXJlID0gTTRPU0FfRkFMU0U7Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICBwQy0+bV9wSW5zdGFuY2UgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyU2l6ZSA9IDA7Ci0gICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyRGF0YVNpemUgPSAwOwotICAgIHBDLT5iSDI2NFRyaW0gPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIEZsYWcgdG8gZ2V0IHRoZSBsYXN0IGRlY29kZWQgZnJhbWUgY3RzICovCi0gICAgcEMtPmJMYXN0RGVjb2RlZEZyYW1lQ1RTID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBpZiggcEMtPm1fcEluc3RhbmNlID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZXJyID0gSDI2NE1DU19HZXRpbnN0YW5jZSgmcEMtPm1fcEluc3RhbmNlKTsKLSAgICB9Ci0gICAgcEMtPmJFeHRPTVhBdWREZWNvZGVyID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2luaXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfb3BlbihNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE1DUyBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLgotICogQG5vdGUgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgaXMgbm90IGNyZWF0ZWQgeWV0LgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwRmlsZUluICAgICAgICAgICAgIChJTikgSW5wdXQgZmlsZSB0byB0cmFuc2NvZGUgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIENvbnRhaW5lciB0eXBlICguM2dwLC5hbXIsbXAzIC4uLikgb2YgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgIHBGaWxlT3V0ICAgICAgICAgICAgKElOKSBPdXRwdXQgZmlsZSB0byBjcmVhdGUgIChUaGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVVJMLCBwaXBlLi4uKSBkZXBlbmRzIG9uIHRoZSBPU0FMIGltcGxlbWVudGF0aW9uKS4KLSAqIEBwYXJhbSAgIHBUZW1wRmlsZSAgICAgICAgICAgKElOKSBUZW1wb3JhcnkgZmlsZSBmb3IgdGhlIGNvbnN0YW50IG1lbW9yeSB3cml0ZXIgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlIG1ldGFkYXRhICgibW9vdi5iaW4iKS4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRFUlJfQUxMT0M6ICAgICAgICBUaGVyZSBpcyBubyBtb3JlIGF2YWlsYWJsZSBtZW1vcnkKLSAqIEByZXR1cm4gIE00RVJSX0ZJTEVfTk9UX0ZPVU5EOiAgIFRoZSBpbnB1dCBmaWxlIGhhcyBub3QgYmVlbiBmb3VuZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRTogICBUaGUgaW5wdXQgZmlsZSBpcyBub3QgYSB2YWxpZCBmaWxlLCBvciBpcyBjb3JydXB0ZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU06ICBUaGUgaW5wdXQgZmlsZSBjb250YWlucyBubwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBhdWRpbyBvciB2aWRlbyBzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX29wZW4oIE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQgKnBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBJbnB1dEZpbGVUeXBlLCBNNE9TQV9Wb2lkICpwRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBUZW1wRmlsZSApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNFJFQURFUl9NZWRpYUZhbWlseSBtZWRpYUZhbWlseTsKLSAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcjsKLQotICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAiTTRNQ1Nfb3BlbiBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwRmlsZUluPTB4JXgsIHBGaWxlT3V0PTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcEZpbGVJbiwgcEZpbGVPdXQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfb3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZUluKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfb3BlbjogcEZpbGVJbiBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiggKCBJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9KUEcpCi0gICAgICAgIHx8IChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QTkcpCi0gICAgICAgIHx8IChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9HSUYpCi0gICAgICAgIHx8IChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9CTVApICkKLSAgICB7Ci0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0gICAgICAgIC8qKgotICAgICAgICAqIEluZGljYXRlIHRoYXQgd2UgbXVzdCB1c2UgdGhlIHN0aWxsIHBpY3R1cmUgZnVuY3Rpb25zKi8KLQotICAgICAgICBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9ucyovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY09wZW4ocEMsIHBGaWxlSW4sIElucHV0RmlsZVR5cGUsIHBGaWxlT3V0KTsKLQotI2Vsc2UKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19vcGVuOiBTdGlsbCBwaWN0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzIHZlcnNpb24gb2YgTUNTIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNOwotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX0NSRUFURUQgIT0gcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ29weSBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzIGludG8gb3VyIGNvbnRleHQgKi8KLSAgICBwQy0+cElucHV0RmlsZSA9IHBGaWxlSW47Ci0gICAgcEMtPklucHV0RmlsZVR5cGUgPSBJbnB1dEZpbGVUeXBlOwotICAgIHBDLT5wT3V0cHV0RmlsZSA9IHBGaWxlT3V0OwotICAgIHBDLT5wVGVtcG9yYXJ5RmlsZSA9IHBUZW1wRmlsZTsKLSAgICBwQy0+dWlQcm9ncmVzcyA9IDA7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogT3BlbiBpbnB1dCBmaWxlIHdpdGggdGhlIHJlYWRlciAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRSZWFkZXIocENvbnRleHQsIHBDLT5JbnB1dEZpbGVUeXBlKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgcmVhZGVyIHJlbGF0ZWQgdmFyaWFibGVzICovCi0gICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBJbml0aWFsaXplcyB0aGUgcmVhZGVyIHNoZWxsIGFuZCBvcGVuIHRoZSBkYXRhIGZpbGUgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUoJnBDLT5wUmVhZGVyQ29udGV4dCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBMaW5rIHRoZSByZWFkZXIgaW50ZXJmYWNlIHRvIHRoZSByZWFkZXIgY29udGV4dCAqLwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcmVhZGVyQ29udGV4dCA9IHBDLT5wUmVhZGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSByZWFkZXIgc2hlbGwgZmlsZSBhY2Nlc3MgZnVuY3Rpb25zICovCi0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilwQy0+cE9zYUZpbGVSZWFkUHRyKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSNpZmRlZiBNNE1DU19XSVRIX0ZBU1RfT1BFTgotCi0gICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5iRmlsZU9wZW5lZEluRmFzdE1vZGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfQm9vbCB0cnVlVmFsdWUgPSBNNE9TQV9UUlVFOwotCi0gICAgICAgIC8qIEZvciBmaXJzdCBjYWxsIHVzZSBmYXN0IG9wZW4gbW9kZSAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24ocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9GYXN0T3Blbk1vZGUsICZ0cnVlVmFsdWUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5iRmlsZU9wZW5lZEluRmFzdE1vZGUgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogTTRSRUFERVJfM0dQX2tPcHRpb25JRF9GYXN0T3Blbk1vZGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICBpZiggKCAoIChNNE9TQV9VSW50MzIpTTRFUlJfQkFEX09QVElPTl9JRCkgPT0gZXJyKQotICAgICAgICAgICAgICAgIHx8ICgoIChNNE9TQV9VSW50MzIpTTRFUlJfUEFSQU1FVEVSKSA9PSBlcnIpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBOb3QgZmF0YWwsIHNvbWUgcmVhZGVycyBtYXkgbm90IHN1cHBvcnQgZmFzdCBvcGVuIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBwQy0+YkZpbGVPcGVuZWRJbkZhc3RNb2RlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9Cb29sIGZhbHNlVmFsdWUgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAvKiBGb3Igc2Vjb25kIGNhbGwgdXNlIG5vcm1hbCBvcGVuIG1vZGUgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0U2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlLCAmZmFsc2VWYWx1ZSk7Ci0gICAgfQotCi0jZW5kaWYgLyogTTRNQ1NfV0lUSF9GQVNUX09QRU4gKi8KLQotICAgIC8qKgotICAgICogT3BlbiB0aGUgaW5wdXQgZmlsZSAqLwotCi0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0T3BlbihwQy0+cFJlYWRlckNvbnRleHQsIHBDLT5wSW5wdXRGaWxlKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdWlEdW1teSwgdWlDb3JlSWQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0T3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIElmIHRoZSBlcnJvciBpcyBmcm9tIHRoZSBjb3JlIHJlYWRlciwgd2UgY2hhbmdlIGl0IHRvIGEgcHVibGljIFZYUyBlcnJvciAqLwotICAgICAgICBNNE9TQV9FUlJfU1BMSVQoZXJyLCB1aUR1bW15LCB1aUNvcmVJZCwgdWlEdW1teSk7Ci0KLSAgICAgICAgaWYoIE00TVA0X1JFQURFUiA9PSB1aUNvcmVJZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBzdHJlYW1zIGZyb20gdGhlIGlucHV0IGZpbGUgKi8KLSAgICB3aGlsZSggTTROT19FUlJPUiA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIHBDLT5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRTdHJlYW0oIHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYUZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gY2FzZSB3ZSBmb3VuZCBhIEJJRlMgc3RyZWFtIG9yIHNvbWV0aGluZyBlbHNlLi4uKi8KLSAgICAgICAgaWYoICggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX1JFQURFUl9VTktOT1dOX1NUUkVBTV9UWVBFKSkKLSAgICAgICAgICAgIHx8IChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRXQVJfVE9PX01VQ0hfU1RSRUFNUykpICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgLyoqPCBPbmUgc3RyZWFtIGZvdW5kICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGb3VuZCB0aGUgZmlyc3QgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICBpZiggKCBNNFJFQURFUl9rTWVkaWFGYW1pbHlWaWRlbyA9PSBtZWRpYUZhbWlseSkKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0Ci0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogRm91bmQgYSBIMjYzIG9yIE1QRUctNCB2aWRlbyBzdHJlYW0gaW4gaW5wdXQgM2dwcCBjbGlwIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfVmlkZW9TdHJlYW1IYW5kbGVyICopcFN0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0IG91ciB2aWRlbyBzdHJlYW0gc3RhdGUgdmFyaWFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgc3RyZWFtIHJlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0UmVzZXQodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXIsICZwQy0+UmVhZGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBIMjYzIG9yIE1QRUctNCAoSDI2NCwgZXRjLikgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IEZvdW5kIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSAoMHgleCkgaW5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IDNncHAgY2xpcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogK0NSTFY2Nzc1IC1ILjI2NCBUcmltbWluZyAqLwotICAgICAgICAgICAgICAgIGlmKCBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgKQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBTUFMgYW5kIFBQUyBhcmUgc3RvcmVhZCBhcyBwZXIgdGhlIDNncCBmaWxlIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiAtQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRm91bmQgdGhlIGZpcnN0IGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgZWxzZSBpZiggKCBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbyA9PSBtZWRpYUZhbWlseSkKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9NcDMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYwotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IEZvdW5kIGFuIEFNUi1OQiwgQUFDIG9yIE1QMyBhdWRpbyBzdHJlYW0gaW4gaW5wdXQgY2xpcCIpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEtlZXAgcG9pbnRlciB0byB0aGUgYXVkaW8gc3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00X0F1ZGlvU3RyZWFtSGFuZGxlciAqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdCBvdXIgYXVkaW8gc3RyZWFtIHN0YXRlIHZhcmlhYmxlICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0UmVzZXQocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfb3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdFJlc2V0KGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLCAmcEMtPlJlYWRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogT3V0cHV0IG1heCBBVSBzaXplIGlzIGVxdWFsIHRvIGlucHV0IG1heCBBVSBzaXplICh0aGlzIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICogd2lsbCBiZSBjaGFuZ2VkIGlmIHRoZXJlIGlzIGF1ZGlvIHRyYW5zY29kaW5nKSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBOb3QgQU1SLU5CLCBBQUMsIE1QMyBub3IgRVZSQyAoQU1SLVdCLCBXQVYuLi4pICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuKCk6IEZvdW5kIGFuIHVuc3VwcG9ydGVkIGF1ZGlvIHN0cmVhbSAoMHgleCkgaW4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCAzZ3BwIGNsaXAiLCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+YlVuc3VwcG9ydGVkQXVkaW9Gb3VuZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAvKio8IGVuZCBvZiB3aGlsZSAoTTROT19FUlJPUiA9PSBlcnIpICovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHdlIGZvdW5kIGF0IGxlYXN0IG9uZSBzdXBwb3J0ZWQgc3RyZWFtICovCi0gICAgaWYoICggTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtKQotICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IHJldHVybmluZyBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNOwotICAgIH0KLQotICAgIGlmKCBwQy0+VmlkZW9TdGF0ZSA9PSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRCApCi0gICAgewotICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgLypGQiAyMDA5LTAyLTA5OiB0aGUgZXJyb3IgaXMgY2hlY2sgYW5kIHJldHVybmVkIG9ubHkgaWYgdmlkZW8gY29kZWNzIGFyZSBjb21waWxlZCwKLSAgICAgICAgZWxzZSBvbmx5IGF1ZGlvIGlzIHVzZWQsIHRoYXQgaXMgd2h5IHRoZSBlZGl0aW5nIHByb2Nlc3MgY2FuIGNvbnRpbnVlKi8KLSNpZm5kZWYgTTRNQ1NfQVVESU9PTkxZCi0KLSAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSNlbHNlCi0KLSAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQgIT0gZXJyKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX0FVRElPT05MWSovCi0KLSAgICB9Ci0KLSAgICBpZiggcEMtPkF1ZGlvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQgKQotICAgIHsKLSAgICAgICAgLy9FVlJDCi0gICAgICAgIGlmKCBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmMKLSAgICAgICAgICAgICE9IHBTdHJlYW1IYW5kbGVyLT4KLSAgICAgICAgICAgIG1fc3RyZWFtVHlwZSApIC8qIGRlY29kZXIgbm90IHN1cHBvcnRlZCB5ZXQsIGJ1dCBhbGxvdyB0byBkbyBudWxsIGVuY29kaW5nICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0RlY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgIGVyciA9IE00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX29wZW4oKTogTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBiZWdpbiBjdXQgZGVjb2RpbmcgaW5jcmVtZW50IGFjY29yZGluZyB0byB0aGUgaW5wdXQgZnJhbWUgcmF0ZSAqLwotICAgIGlmKCAwLiAhPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSApIC8qKjwgc2FuaXR5IGNoZWNrICovCi0gICAgewotICAgICAgICBwQy0+aVZpZGVvQmVnaW5EZWNJbmNyID0gKE00T1NBX0ludDMyKSgzMDAwLgotICAgICAgICAgICAgLyBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy4KLSAgICAgICAgICAgIGZBdmVyYWdlRnJhbWVSYXRlKTsgLyoqPCBhYm91dCAzIGZyYW1lcyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+aVZpZGVvQmVnaW5EZWNJbmNyID0KLSAgICAgICAgICAgIDIwMDsgLyoqPCBkZWZhdWx0IHZhbHVlOiAyMDAgbWlsbGlzZWNvbmRzICgzIGZyYW1lcyBAIDE1ZnBzKSovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgc3RhdGUgYXV0b21hdG9uICovCi0gICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX09QRU5FRDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1Nfb3BlbigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19zdGVwKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpOwotICogQGJyaWVmICAgUGVyZm9ybSBvbmUgc3RlcCBvZiB0cmFuY29kaW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFByb2dyZXNzICAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIHRyYW5zY29kaW5nCi0gKiBAbm90ZSAgICBwUHJvZ3Jlc3MgbXVzdCBiZSBhIHZhbGlkIGFkZHJlc3MuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIE9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkU6IFRyYW5zY29kaW5nIGlzIG92ZXIsIHVzZXIgc2hvdWxkIG5vdyBjYWxsIE00TUNTX2Nsb3NlKCkKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT19DT05WRVJTSU9OX0ZBSUxFRDogVGhlIGF1ZGlvIGNvbnZlcnNpb24gKEFBQyB0byBBTVItTkIgb3IgTVAzKSBmYWlsZWQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX0FBQ19TQU1QTElOR19GUkVRVUVOQ1k6IFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIGFuIEFBQyBhdWRpbyB0cmFjawotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIGludmFsaWQgc2FtcGxpbmcgZnJlcXVlbmN5IChzaG91bGQgbmV2ZXIgaGFwcGVuKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfc3RlcCggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX3N0ZXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX3N0ZXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFByb2dyZXNzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc3RlcDogcFByb2dyZXNzIGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbnMqLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNTdGVwKHBDLCBwUHJvZ3Jlc3MpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9SRUFEWToKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX2ludFN0ZXBTZXQocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0pVTVA6Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gcEMtPnVpUHJvZ3Jlc3M7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9ERUNPREU6Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gcEMtPnVpUHJvZ3Jlc3M7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRTdGVwRW5jb2RpbmcocEMsIHBQcm9ncmVzcyk7Ci0gICAgICAgICAgICAgICAgLyogU2F2ZSBwcm9ncmVzcyBpbmZvIGluIGNhc2Ugb2YgcGF1c2UgKi8KLSAgICAgICAgICAgICAgICBwQy0+dWlQcm9ncmVzcyA9ICpwUHJvZ3Jlc3M7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6IC8qKjwgU3RhdGUgZXJyb3IgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19zdGVwKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3BhdXNlKE00TUNTX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgUGF1c2UgdGhlIHRyYW5zY29kaW5nIGkuZS4gcmVsZWFzZSB0aGUgKGV4dGVybmFsIGhhcmR3YXJlKSB2aWRlbyBkZWNvZGVyLgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgbmVlZGVkIGlmIG5vIGhhcmR3YXJlIGFjY2VsZXJhdG9ycyBhcmUgdXNlZC4KLSAqICAgICAgICAgIEluIHRoYXQgY2FzZSwgcGF1c2luZyB0aGUgTUNTIGlzIHNpbXBseSBhY2hpZXZlZCBieSB0ZW1wb3JhcmlseSBzdXNwZW5kaW5nCi0gKiAgICAgICAgICB0aGUgTTRNQ1Nfc3RlcCBmdW5jdGlvbiBjYWxscy4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfcGF1c2UoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00TUNTX3BhdXNlIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19wYXVzZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb24qLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNQYXVzZShwQyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX0JFR0lOVklERU9KVU1QOiAvKio8IHRoZSB2aWRlbyBkZWNvZGVyIGhhcyBiZWVuIGNyZWF0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlIG11c3QgZGVzdHJveSBpdCAqLwotICAgICAgICBjYXNlIE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPREVDT0RFOiAvKio8IHRoZSB2aWRlbyBpcyBiZWluZyB1c2VkLCB3ZSBtdXN0IGRlc3Ryb3kgaXQgKi8KLSAgICAgICAgY2FzZSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzogLyoqPCB0aGUgdmlkZW8gaXMgYmVpbmcgdXNlZCwgd2UgbXVzdCBkZXN0cm95IGl0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qKjwgT0ssIG5vdGhpbmcgdG8gZG8gaGVyZSAqLwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyoqPCBTdGF0ZSBlcnJvciAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX3BhdXNlKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgQ1RTIGF0IHdoaWNoIHdlIHdpbGwgcmVzdW1lIHRoZSBkZWNvZGluZyAqLwotICAgIGlmKCBwQy0+ZFZpRGVjQ3VycmVudEN0cyA+IHBDLT5kVmlEZWNTdGFydGluZ0N0cyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBwYXNzZWQgdGhlIHN0YXJ0aW5nIENUUywgc28gdGhlIHJlc3VtZSB0YXJnZXQgaXMgdGhlIGN1cnJlbnQgQ1RTICovCi0gICAgICAgIHBDLT5kVmlEZWNTdGFydGluZ0N0cyA9IHBDLT5kVmlEZWNDdXJyZW50Q3RzOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgaGF2ZW4ndCBwYXNzZWQgdGhlIHN0YXJ0aW5nIENUUyB5ZXQsIHNvIHRoZSByZXN1bWUgdGFyZ2V0IGlzIHN0aWxsIHRoZSBzdGFydGluZyBDVFMKLSAgICAgICAgKiAtLT4gbm90aGluZyB0byBkbyBpbiB0aGUgZWxzZSBibG9jayAqLwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB2aWRlbyBkZWNvZGVyIHN0dWZmICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBWaURlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0RGVzdHJveShwQy0+cFZpRGVjQ3R4dCk7Ci0gICAgICAgIHBDLT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfcGF1c2U6IG1fcFZpZGVvRGVjb2Rlci0+cEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFN0YXRlIHRyYW5zaXRpb24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUEFVU0VEOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX3BhdXNlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX3Jlc3VtZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgIFJlc3VtZSB0aGUgdHJhbnNjb2RpbmcgYWZ0ZXIgYSBwYXVzZSAoc2VlIE00TUNTX3BhdXNlKS4KLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IG5lZWRlZCBpZiBubyBoYXJkd2FyZSBhY2NlbGVyYXRvcnMgYXJlIHVzZWQuCi0gKiAgICAgICAgICBJbiB0aGF0IGNhc2UsIHJlc3VtaW5nIHRoZSBNQ1MgaXMgc2ltcGx5IGFjaGlldmVkIGJ5IGNhbGxpbmcKLSAqICAgICAgICAgIHRoZSBNNE1DU19zdGVwIGZ1bmN0aW9uLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19yZXN1bWUoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzEoIk00TUNTX3Jlc3VtZSBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfcmVzdW1lOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1Jlc3VtZShwQyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRNQ1Nfa1N0YXRlX1BBVVNFRDogLyoqPCBPSywgbm90aGluZyB0byBkbyBoZXJlICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIC8qKjwgU3RhdGUgZXJyb3IgKi8KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19yZXN1bWUoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB2aWRlbyBkZWNvZGVyICovCi0gICAgZXJyID0gTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcihwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfcmVzdW1lKCk6IE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU3RhdGUgdHJhbnNpdGlvbiAqLwotICAgIGlmKCAwLjAgPT0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBzdGlsbCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkZWNvZGVkIHN0cmVhbSwgbm8gbmVlZCB0byBqdW1wLCB3ZSBjYW4gcHJvY2VlZCAqLwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSnVtcGluZyAqLwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0pVTVA7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX3Jlc3VtZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19jbG9zZShNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIE1DUyB0cmFuc2NvZGluZy4KLSAqIEBub3RlIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2Nsb3NlKCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRFTkNPREVSX0hlYWRlciAqZW5jSGVhZGVyOwotICAgIE00U1lTX1N0cmVhbUlEbWVtQWRkciBzdHJlYW1IZWFkZXI7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUiwgZXJyMjsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE1DU19jbG9zZSBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfY2xvc2U6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBJbmRpY2F0ZSB0aGF0IGN1cnJlbnQgZmlsZSBpcyBubyBsb25nZXIgYSBzdGlsbCBwaWN0dXJlKi8KLSAgICAgICAgcEMtPm1fYklzU3RpbGxQaWN0dXJlID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY0Nsb3NlKHBDKTsKLSAgICB9Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotCi0gICAgaWYoIE00TUNTX2tTdGF0ZV9GSU5JU0hFRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2Nsb3NlKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ2xvc2UgdGhlIGVuY29kZXIgYmVmb3JlIHRoZSB3cml0ZXIgdG8gYmUgY2VydGFpbiBhbGwgdGhlIEFVcyBoYXZlIGJlZW4gd3JpdHRlbiBhbmQgd2UgY2FuCi0gICAgZ2V0IHRoZSBEU0kuICovCi0KLSAgICAvKiBIYXMgdGhlIGVuY29kZXIgYWN0dWFsbHkgYmVlbiBzdGFydGVkPyBEb24ndCBzdG9wIGl0IGlmIHRoYXQncyBub3QgdGhlIGNhc2UuICovCi0gICAgaWYoIE00TUNTX2tFbmNvZGVyUnVubmluZyA9PSBwQy0+ZW5jb2RlclN0YXRlICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wKHBDLT5wVmlFbmNDdHh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBXZWxsLi4uIGhvdyB0aGUgaGVjayBkbyB5b3UgaGFuZGxlIGEgZmFpbGVkIGNsZWFudXA/ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa0VuY29kZXJTdG9wcGVkOwotICAgIH0KLQotICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIG9wZW5lZD8gRG9uJ3QgY2xvc2UgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICBpZiggTTRNQ1Nfa0VuY29kZXJTdG9wcGVkID09IHBDLT5lbmNvZGVyU3RhdGUgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UocEMtPnBWaUVuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKiBXZWxsLi4uIGhvdyB0aGUgaGVjayBkbyB5b3UgaGFuZGxlIGEgZmFpbGVkIGNsZWFudXA/ICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa0VuY29kZXJDbG9zZWQ7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqIENsb3NlIHRoZSB3cml0ZXIgKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBXcml0ZXJDb250ZXh0ICkgLyogaGFwcGVucyBpbiBzdGF0ZSBfU0VUICovCi0gICAgewotICAgICAgICAvKiBIVyBlbmNvZGVyOiBmZXRjaCB0aGUgRFNJIGZyb20gdGhlIHNoZWxsIHZpZGVvIGVuY29kZXIsIGFuZCBmZWVkIGl0IHRvIHRoZSB3cml0ZXIgYmVmb3JlCi0gICAgICAgIGNsb3NpbmcgaXQuICovCi0KLSAgICAgICAgaWYoIHBDLT5ub3ZpZGVvICE9IE00T1NBX1RSVUUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggKCBNNEVOQ09ERVJfa01QRUc0ID09IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0KQotICAgICAgICAgICAgICAgIHx8IChNNEVOQ09ERVJfa0gyNjQgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RHZXRPcHRpb24ocEMtPnBWaUVuY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZlbmNIZWFkZXIpOwotCi0gICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpIHx8IChNNE9TQV9OVUxMID09IGVuY0hlYWRlci0+cEJ1ZikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfY2xvc2U6IGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLyoqPCBubyByZXR1cm4gaGVyZSwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBkZWFsbG9jYXRlIGFmdGVyIGNsb3NlLCBldmVuCi0gICAgICAgICAgICAgICAgICAgICBpZiBpdCBmYWlscy4gKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRoaXMgaGVhZGVyIGluIHRoZSB3cml0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnN0cmVhbUlEID0gTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLnNpemUgPSBlbmNIZWFkZXItPlNpemU7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5hZGRyID0gKE00T1NBX01lbUFkZHIzMillbmNIZWFkZXItPnBCdWY7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImNhbGxpbmcgc2V0IG9wdGlvbiIpOwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tEU0ksICZzdHJlYW1IZWFkZXIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJzZXQgb3B0aW9uIGRvbmUiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogZmFpbGVkIHRvIHNldCB0aGUgRFNJIGluIHRoZSB3cml0ZXIgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoICggTTRPU0FfVFJVRSA9PSBwQy0+YkgyNjRUcmltKQotICAgICAgICAgICAgICAgICYmIChNNEVOQ09ERVJfa05VTEwgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwQy0+dWlCZWdpbkN1dFRpbWUgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJEZWNvZGVyIHNwZWNpZmljIGluZm8gc2l6ZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9wRmluYWxEU0lTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkRlY29kZXIgc3BlY2lmaWMgaW5mbyBwb2ludGVyID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5tX3BJbnN0YW5jZS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPm1fcEluc3RhbmNlLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgbV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJpbnN0YW5jZS0+bV9wRmluYWxEU0kiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImluc3RhbmNlLT5tX3BGaW5hbERTSTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BJbnN0YW5jZS0+bV9wRmluYWxEU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgbV9wSW5zdGFuY2UtPm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdHJlYW1IZWFkZXIuc3RyZWFtSUQgPSBNNE1DU19XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5zaXplID0gcEMtPm1fcEluc3RhbmNlLT5tX3BGaW5hbERTSVNpemU7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSGVhZGVyLmFkZHIgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKXBDLT5tX3BJbnN0YW5jZS0+bV9wRmluYWxEU0k7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoImNhbGxpbmcgc2V0IG9wdGlvbiIpOwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tEU0ksICZzdHJlYW1IZWFkZXIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJzZXQgb3B0aW9uIGRvbmUiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19jbG9zZTogZmFpbGVkIHRvIHNldCB0aGUgRFNJIGluIHRoZSB3cml0ZXIgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBXcml0ZSBhbmQgY2xvc2UgdGhlIDNHUCBvdXRwdXQgZmlsZSAqLwotICAgICAgICBlcnIyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZShwQy0+cFdyaXRlckNvbnRleHQpOwotICAgICAgICBwQy0+cFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVycjIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xvc2U6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycjIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgICAgICAvKio8IG5vIHJldHVybiBoZXJlLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGRlYWxsb2NhdGUgYWZ0ZXIgY2xvc2UsIGV2ZW4gaWYgaXQgZmFpbHMuKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENsb3NlIG91dHB1dCBQQ00gZmlsZSBpZiBuZWVkZWQgKi8KLSAgICBpZiggcEMtPnBPdXRwdXRQQ01maWxlICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgcEMtPnBPc2FGaWxlV3JpdFB0ci0+Y2xvc2VXcml0ZShwQy0+cE91dHB1dFBDTWZpbGUpOwotICAgICAgICBwQy0+cE91dHB1dFBDTWZpbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qRmxCIDIwMDkuMDMuMDQ6IGFkZCBhdWRpbyBlZmZlY3RzLAotICAgIGZyZWUgZWZmZWN0cyBsaXN0Ki8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEVmZmVjdHMgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cEVmZmVjdHMpOwotICAgICAgICBwQy0+cEVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBwQy0+bmJFZmZlY3RzID0gMDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdE51bWJlciA9IC0xOwotCi0gICAgLyoqCi0gICAgKiBTdGF0ZSB0cmFuc2l0aW9uICovCi0gICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX0NMT1NFRDsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlcik7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2Nsb3NlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfY2xlYW5VcChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTUNTLgotICogQG5vdGUgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICogQHJldHVybiAgIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2NsZWFuVXAoIE00TUNTX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNE1DU19jbGVhblVwIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSNpZmRlZiBNQ1NfRFVNUF9QQ01fVE9fRklMRQotCi0gICAgaWYoIGZpbGVfYXVfcmVhZGVyICkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShmaWxlX2F1X3JlYWRlcik7Ci0gICAgICAgIGZpbGVfYXVfcmVhZGVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggZmlsZV9wY21fZGVjb2RlciApCi0gICAgewotICAgICAgICBmY2xvc2UoZmlsZV9wY21fZGVjb2Rlcik7Ci0gICAgICAgIGZpbGVfcGNtX2RlY29kZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmKCBmaWxlX3BjbV9lbmNvZGVyICkKLSAgICB7Ci0gICAgICAgIGZjbG9zZShmaWxlX3BjbV9lbmNvZGVyKTsKLSAgICAgICAgZmlsZV9wY21fZW5jb2RlciA9IE5VTEw7Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ29udGV4dCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX0NMT1NFRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcCgpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5tX3BJbnN0YW5jZSApCi0gICAgewotICAgICAgICBlcnIgPSBIMjY0TUNTX0ZyZWVpbnN0YW5jZShwQy0+bV9wSW5zdGFuY2UpOwotICAgICAgICBwQy0+bV9wSW5zdGFuY2UgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgdmlkZW8gZW5jb2RlciBzdHVmZiwgaWYgbmVlZGVkIC0tLS0tICovCi0KLSAgICBpZiggKCBNNE9TQV9OVUxMICE9IHBDLT5wVmlFbmNDdHh0KQotICAgICAgICAmJiAoTTRPU0FfTlVMTCAhPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMpICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAocEMtPnBWaUVuY0N0eHQpOwotICAgICAgICBwQy0+cFZpRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2NsZWFuVXA6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa05vRW5jb2RlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluIHRoZSBIMjYzIGNhc2UsIHdlIGFsbG9jYXRlZCBvdXIgb3duIERTSSBidWZmZXIgKi8KLSAgICBpZiggKCBNNEVOQ09ERVJfa0gyNjMgPT0gcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQpCi0gICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYpICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1Zik7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUHJlUmVzaXplRnJhbWUgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocEMtPnBQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgdGhlIHNzcmMgc3R1ZmYgLS0tLS0gKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5Tc3JjU2NyYXRjaCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5Tc3JjU2NyYXRjaCk7Ci0gICAgICAgIHBDLT5Tc3JjU2NyYXRjaCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFNzcmNCdWZmZXJJbik7Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFNzcmNCdWZmZXJPdXQpOwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChwQy0+cExWQXVkaW9SZXNhbXBsZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIExWRGVzdHJveShwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgICAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgdGhlIGF1ZGlvIGVuY29kZXIgc3R1ZmYgLS0tLS0gKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9FbmNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKHBDLT5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcDogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhblVwKHBDLT5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcDogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhblVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyKTsKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgYWxsIG90aGVyIHN0dWZmIC0tLS0tICovCi0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHJlYWRlcnMgYW5kIHRoZSBkZWNvZGVycyAqLwotICAgIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKHBDKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc3RpbGwgcGljdHVyZSByZXNvdXJjZXMgKi8KLQotICAgIE00TUNTX3N0aWxsUGljQ2xlYW5VcChwQyk7Ci0KLSNlbmRpZiAvKk00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRSovCi0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHNoZWxscyBpbnRlcmZhY2VzICovCi0KLSAgICBNNE1DU191blJlZ2lzdGVyQWxsV3JpdGVycyhwQ29udGV4dCk7Ci0gICAgTTRNQ1NfdW5SZWdpc3RlckFsbEVuY29kZXJzKHBDb250ZXh0KTsKLSAgICBNNE1DU191blJlZ2lzdGVyQWxsUmVhZGVycyhwQ29udGV4dCk7Ci0gICAgTTRNQ1NfdW5SZWdpc3RlckFsbERlY29kZXJzKHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgY29udGV4dCBpdHNlbGYgKi8KLSAgICBmcmVlKHBDKTsKLSAgICBwQyA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfY2xlYW5VcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19hYm9ydChNNE1DU19Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIE1DUyB0cmFuc2NvZGluZyBhbmQgZnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIE1DUwotICogICAgICAgICAgd2hhdGV2ZXIgdGhlIHN0YXRlIGlzLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19hYm9ydCggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfRVJSIGVycjEgPSBNNE5PX0VSUk9SOwotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICopKHBDb250ZXh0KTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIGlmKCAoIHBDLT5TdGF0ZSA9PSBNNE1DU19rU3RhdGVfQ1JFQVRFRCkKLSAgICAgICAgfHwgKHBDLT5TdGF0ZSA9PSBNNE1DU19rU3RhdGVfQ0xPU0VEKSApCi0gICAgewotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQ0xPU0VEOwotCi0gICAgICAgIGVyciA9IE00TUNTX2NsZWFuVXAocENvbnRleHQpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19hYm9ydCA6IE00TUNTX2NsZWFuVXAgZmFpbHMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgICAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENhbmNlbCB0aGUgb25nb2luZyBwcm9jZXNzZXMgaWYgYW55Ki8KLSAgICAgICAgICAgIGVyciA9IE00TUNTX3N0aWxsUGljQ2FuY2VsKHBDKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2Fib3J0IDogTTRNQ1Nfc3RpbGxQaWNDYW5jZWwgZmFpbHMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKlN0aWxsIHBpY3R1cmUgcHJvY2VzcyBpcyBub3cgc3RvcHBlZDsgQ2Fycnkgb24gd2l0aCBjbG9zZSBhbmQgY2xlYW51cCovCi0gICAgICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfRklOSVNIRUQ7Ci0KLSAgICAgICAgZXJyID0gTTRNQ1NfY2xvc2UocENvbnRleHQpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19hYm9ydCA6IE00TUNTX2Nsb3NlIGZhaWxzIGVyciA9IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgZXJyMSA9IGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00TUNTX2NsZWFuVXAocENvbnRleHQpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19hYm9ydCA6IE00TUNTX2NsZWFuVXAgZmFpbHMgZXJyID0gMHgleCIsIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZXJyID0gKGVycjEgPT0gTTROT19FUlJPUikgPyBlcnIgOiBlcnIxOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyogcEZpbGVQcm9wZXJ0aWVzKTsKLSAqIEBicmllZiAgIFJldHJpZXZlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgZnJvbSB0aGUgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFByb3BlcnRpZXMgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIGFuIGFsbG9jYXRlZCBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcwotc3RydWN0dXJlIHdoaWNoIGlzIGZpbGxlZCB3aXRoIHRoZSBpbnB1dCBzdHJlYW0gcHJvcGVydGllcy4KLSAqIEBub3RlICAgIFRoZSBzdHJ1Y3R1cmUgcFByb3BlcnRpZXMgbXVzdCBiZSBhbGxvY2F0ZWQgYW5kIGZ1cnRoZXIgZGUtYWxsb2NhdGVkCi1ieSB0aGUgYXBwbGljYXRpb24uIFRoZSBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgb3BlbmVkIHN0YXRlLgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXMoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcEZpbGVQcm9wZXJ0aWVzICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMigiTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBcCi0gICAgICAgICAgICAgICAgICAgcEZpbGVQcm9wZXJ0aWVzPTB4JXgiLCBwQ29udGV4dCwgcEZpbGVQcm9wZXJ0aWVzKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2dldElucHV0RmlsZVByb3BlcnRpZXM6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEZpbGVQcm9wZXJ0aWVzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllczogcFByb3BlcnRpZXMgaXMgTTRPU0FfTlVMTCIpOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb24qLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNHZXRJbnB1dEZpbGVQcm9wZXJ0aWVzKHBDLCBwRmlsZVByb3BlcnRpZXMpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX09QRU5FRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcygpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSBwcmV2aW91c2x5IGNvbXB1dGVkIHByb3BlcnRpZXMgaW50byBnaXZlbiBzdHJ1Y3R1cmUgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwRmlsZVByb3BlcnRpZXMsCi0gICAgICAgICh2b2lkICopICZwQy0+SW5wdXRGaWxlUHJvcGVydGllcywKLSAgICAgICAgc2l6ZW9mKE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzKSk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00TUNTX091dHB1dFBhcmFtcyogcFBhcmFtcyk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE1DUyB2aWRlbyBvdXRwdXQgcGFyYW1ldGVycy4KLSAqIEBub3RlICAgIE11c3QgYmUgY2FsbGVkIGFmdGVyIE00TUNTX29wZW4uIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBNNE1DU19zdGVwLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwUGFyYW1zICAgICAgICAgICAgIChJTi9PVVQpIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MyA6IE91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlciBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIEgyNjMgZW5jb2RpbmcKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1JBVEVfRk9SX0gyNjMgOiBPdXRwdXQgdmlkZW8gZnJhbWUgc2l6ZSBwYXJhbWV0ZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQgICAgIDogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmb3JtYXQgcGFyYW1ldGVyCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFIDogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFIDogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmcmFtZSByYXRlCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQgOiBVbmRlZmluZWQgb3V0cHV0IGF1ZGlvIGZvcm1hdCBwYXJhbWV0ZXIKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9EVVJBVElPTl9JU19OVUxMIDogU3BlY2lmaWVkIG91dHB1dCBwYXJhbWV0ZXJzIGRlZmluZSBhIG51bGwgZHVyYXRpb24gc3RyZWFtCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vIGF1ZGlvIGFuZCB2aWRlbykKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3NldE91dHB1dFBhcmFtcyggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfT3V0cHV0UGFyYW1zICpwUGFyYW1zICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfVUludDMyIHVpRnJhbWVXaWR0aDsKLSAgICBNNE9TQV9VSW50MzIgdWlGcmFtZUhlaWdodDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoCi0gICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcFBhcmFtcz0weCV4IiwKLSAgICAgICAgcENvbnRleHQsIHBQYXJhbXMpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBQYXJhbXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXM6IHBQYXJhbSBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1NldE91dHB1dFBhcmFtcyhwQywgcFBhcmFtcyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIGlmKCBNNE1DU19rU3RhdGVfT1BFTkVEICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBJZ25vcmUgYXVkaW8gb3IgdmlkZW8gc3RyZWFtIGlmIHRoZSBvdXRwdXQgZG8gbm90IG5lZWQgaXQsICovCi0gICAgLyogb3IgaWYgdGhlIGlucHV0IGZpbGUgZG9lcyBub3QgaGF2ZSBhbnkgYXVkaW8gb3IgdmlkZW8gc3RyZWFtICovCi0gICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBtY3Mgb3V0cHV0IGZvcm1hdCovCi0gICAgaWYoICggcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgPT0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbykKLSAgICAgICAgfHwgKHBDLT5WaWRlb1N0YXRlID09IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTSkKLSAgICAgICAgfHwgKHBQYXJhbXMtPk91dHB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVIpCi0gICAgICAgIHx8IChwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVAzKSApCi0gICAgewotICAgICAgICBwQy0+bm92aWRlbyA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgaWYoICggcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQgPT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbykKLSAgICAgICAgfHwgKHBDLT5BdWRpb1N0YXRlID09IE00TUNTX2tTdHJlYW1TdGF0ZV9OT1NUUkVBTSkgKQotICAgIHsKLSAgICAgICAgcEMtPm5vYXVkaW8gPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIGlmKCBwQy0+bm9hdWRpbyAmJiBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICIhISEgTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zIDogY2xpcCBpcyBOVUxMLCB0aGVyZSBpcyBubyBhdWRpbywgbm8gdmlkZW8iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9EVVJBVElPTl9JU19OVUxMOwotICAgIH0KLQotICAgIC8qIFNldCB3cml0ZXIgKi8KLSAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50V3JpdGVyKHBDb250ZXh0LCBwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKiBTZXQgdmlkZW8gcGFyYW1ldGVycyAqLwotICAgIGlmKCBwQy0+bm92aWRlbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBWaWRlbyBGb3JtYXQgY29ycmVjdG5lc3MgKi8KLQotICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNCApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSDI2M19GT1JCSURERU5fSU5fTVA0X0ZJTEU7Ci0KLSAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50VmlkZW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotCi0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPSBNNEVOQ09ERVJfa01QRUc0OwotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLQotICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID0gTTRFTkNPREVSX2tIMjY0OwotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTnVsbFZpZGVvOgotICAgICAgICAgICAgICAgIGlmKCAoIHBQYXJhbXMtPk91dHB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDQpCi0gICAgICAgICAgICAgICAgICAgICYmIChwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0gyNjMpICkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9IMjYzX0ZPUkJJRERFTl9JTl9NUDRfRklMRTsKLQotCi0gICAgICAgICAgICAgICAgLyogRW5jb2RlciBuZWVkZWQgZm9yIGJlZ2luIGN1dCB0byBnZW5lcmF0ZSBhbiBJLWZyYW1lICovCi0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPSBNNEVOQ09ERVJfa05VTEw7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZvcm1hdCAoJWQpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIFZpZGVvIGZyYW1lIHNpemUgY29ycmVjdG5lc3MgKi8KLSAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tOdWxsVmlkZW8gPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUZyYW1lV2lkdGggPQotICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoOwotICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFNldCBvdXRwdXQgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwgKi8KLSAgICAgICAgICAgIHBDLT5lbmNvZGluZ1ZpZGVvUHJvZmlsZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlOwotICAgICAgICAgICAgLyoqIFNldCB0aGUgdGFyZ2V0IHZpZGVvIGxldmVsLCBiZWNhdXNlIGlucHV0IDNncCBmaWxlIG1heQotICAgICAgICAgICAgICogIGhhdmUgd3JvbmcgdmlkZW8gbGV2ZWwgdmFsdWUgKHNvbWUgZW5jb2RlcnMgZG8gbm90IHJlc3BlY3QKLSAgICAgICAgICAgICAqICBsZXZlbCByZXN0cmljdGlvbnMgbGlrZSB2aWRlbyByZXNvbHV0aW9uIHdoZW4gY29udGVudCBpcyBjcmVhdGVkKS4KLSAgICAgICAgICAgICAqKi8KLSAgICAgICAgICAgIHBDLT5lbmNvZGluZ1ZpZGVvTGV2ZWwgPSBwUGFyYW1zLT5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgICAgICAgICAvLyBDbGlwJ3Mgb3JpZ2luYWwgd2lkdGggYW5kIGhlaWdodCBtYXkgbm90IGJlCi0gICAgICAgICAgICAvLyBtdWx0aXBsZSBvZiAxNi4KLSAgICAgICAgICAgIC8vIEVuc3VyZSBlbmNvZGluZyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBtdWx0aXBsZSBvZiAxNgotCi0gICAgICAgICAgICB1aW50MzJfdCByZW1haW5kZXIgPSBwQy0+RW5jb2RpbmdXaWR0aCAlIDE2OwotICAgICAgICAgICAgaWYgKHJlbWFpbmRlciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRlciA+PSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJvbGwgZm9yd2FyZAotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCArICgxNi1yZW1haW5kZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJvbGwgYmFja3dhcmQKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nV2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nV2lkdGggLSByZW1haW5kZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZW1haW5kZXIgPSBwQy0+RW5jb2RpbmdIZWlnaHQgJSAxNjsKLSAgICAgICAgICAgIGlmIChyZW1haW5kZXIgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChyZW1haW5kZXIgPj0gOCkgewotICAgICAgICAgICAgICAgICAgICAvLyBSb2xsIGZvcndhcmQKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCArICgxNi1yZW1haW5kZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJvbGwgYmFja3dhcmQKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCAtIHJlbWFpbmRlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFNldCBvdXRwdXQgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwgKi8KLSAgICAgICAgICAgIHBDLT5lbmNvZGluZ1ZpZGVvUHJvZmlsZSA9IHBQYXJhbXMtPm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgICAgIHBDLT5lbmNvZGluZ1ZpZGVvTGV2ZWwgPSBwUGFyYW1zLT5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfU1FDSUZfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfU1FDSUZfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9RUVZHQV9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9RUVZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfUUNJRl9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl9RQ0lGX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9RVkdBX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX1FWR0FfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGggPSBNNEVOQ09ERVJfQ0lGX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX0NJRl9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9WR0FfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfVkdBX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8qICtQUiBMVjU4MDcgKi8KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tXVkdBOgotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl9XVkdBX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSX1dWR0FfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa05UU0M6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSX05UU0NfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPSBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfTlRTQ19IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAvKiAtUFIgTFY1ODA3Ki8KLSAgICAgICAgICAgICAgICAgICAgLyogK0NSIEdvb2dsZSAqLwotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9IHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzY0MF8zNjBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzY0MF8zNjBfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl84NTRfNDgwX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl84NTRfNDgwX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjgwXzcyMDoKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1dpZHRoID0gTTRFTkNPREVSXzEyODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl8xMjgwXzcyMF9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTA4MF83MjA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgdWlGcmFtZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdIZWlnaHQgPSBNNEVOQ09ERVJfMTA4MF83MjBfSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl85NjBfNzIwX1dpZHRoOwotICAgICAgICAgICAgICAgICAgICB1aUZyYW1lSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ0hlaWdodCA9IE00RU5DT0RFUl85NjBfNzIwX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVXaWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdXaWR0aCA9IE00RU5DT0RFUl8xOTIwXzEwODBfV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHVpRnJhbWVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nSGVpZ2h0ID0gTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAvKiAtQ1IgR29vZ2xlICovCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHNpemUgXAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkKSwgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdmlkZW8gbWF4IGF1IHNpemUgYW5kIG1heCBjaHVuY2sgc2l6ZS4KLSAgICAgICAgKiBXZSBkbyBpdCBoZXJlIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgZnJhbWUgc2l6ZSBvbmx5LCBhbmQKLSAgICAgICAgKiBiZWNhdXNlIHdlIG5lZWQgaXQgZm9yIHRoZSBmaWxlIHNpemUvdmlkZW8gYml0cmF0ZSBlc3RpbWF0aW9ucyAqLwotICAgICAgICBwQy0+dWlWaWRlb01heEF1U2l6ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSgxLjVGICooTTRPU0FfRmxvYXQpKHVpRnJhbWVXaWR0aCAqIHVpRnJhbWVIZWlnaHQpIFwKLSAgICAgICAgICAgICpNNE1DU19WSURFT19NSU5fQ09NUFJFU1NJT05fUkFUSU8pOwotICAgICAgICBwQy0+dWlWaWRlb01heENodW5ja1NpemUgPSAoTTRPU0FfVUludDMyKShwQy0+dWlWaWRlb01heEF1U2l6ZSAgICAgICBcCi0gICAgICAgICAgICAqCi0gICAgICAgICAgICBNNE1DU19WSURFT19DSFVOS19BVV9TSVpFX1JBVElPKTsgLyoqPCBmcm9tIG1heCBBVSBzaXplIHRvIG1heCBDaHVuY2sgc2l6ZSAqLwotCi0gICAgICAgIGlmKCAwID09IHBDLT51aVZpZGVvTWF4QXVTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogU2l6ZSBtYXkgYmUgemVybyBpbiBjYXNlIG9mIG51bGwgZW5jb2Rpbmcgd2l0aCB1bnJlY29nbml6ZWQgc3RyZWFtICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiB2aWRlbyBmcmFtZSBzaXplIGlzIDAgcmV0dXJuaW5nXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfU0laRSIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNpemUgY2hlY2sgZm9yIEgyNjMgKG9ubHkgdmFsaWQgc2l6ZXMgYXJlIENJRiwgUUNJRiBhbmQgU1FDSUYpICovCi0KLSAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tIMjYzID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKCBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tDSUY6Ci0gICAgICAgICAgICAgICAgICAgIC8qIE9LICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBWaWRlbyBGcmFtZSByYXRlIGNvcnJlY3RuZXNzICovCi0gICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rTnVsbFZpZGVvICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKCBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2s1X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA9IE00RU5DT0RFUl9rN181X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2sxMF9GUFM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTJfNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2sxMl81X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2sxNV9GUFM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjBfRlBTOgotICAgICAgICAgICAgICAgICAgICBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA9IE00RU5DT0RFUl9rMjBfRlBTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgPSBNNEVOQ09ERVJfazI1X0ZQUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlID0gTTRFTkNPREVSX2szMF9GUFM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBVbmRlZmluZWQgb3V0cHV0IHZpZGVvIGZyYW1lIHJhdGVcCi0gICAgICAgICAgICAgICAgICAgICAgICAoJWQpLCByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9SQVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRnJhbWUgcmF0ZSBjaGVjayBmb3IgSDI2MyAob25seSBkaXZpZGVycyBvZiAzMCBmcHMgKDI5Ljk3IGFjdHVhbGx5KSkgKi8KLSAgICAgICAgaWYoIE00VklERU9FRElUSU5HX2tIMjYzID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKCBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazVfRlBTOgotICAgICAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2sxMF9GUFM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazE1X0ZQUzoKLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMzBfRlBTOgotICAgICAgICAgICAgICAgICAgICAvKiBPSyAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9SQVRFX0ZPUl9IMjYzIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9WSURFT19GUkFNRV9SQVRFX0ZPUl9IMjYzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogU2V0IGF1ZGlvIHBhcmFtZXRlcnMgKi8KLSAgICBpZiggcEMtPm5vYXVkaW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgQXVkaW8gRm9ybWF0IGNvcnJlY3RuZXNzICovCi0gICAgICAgIHN3aXRjaCggcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBTVJOQjsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFtclNJRCA9IE00RU5DT0RFUl9rQW1yTm9TSUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLQotICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FBQzsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxNjAwMEh6OwotCi0gICAgICAgICAgICAgICAgc3dpdGNoKCBwUGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazgwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIyMDUwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazIyMDUwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2syNDAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ0MTAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazQ0MTAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0ODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s0ODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTEwMjVfQVNGOgotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAocFBhcmFtcy0+YkF1ZGlvTW9ubyA9PSBNNE9TQV9UUlVFKSA/IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rTW9ubyA6IE00RU5DT0RFUl9rU3RlcmVvOwotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uUmVndWxhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa0FhY1JlZ3VsTm9uZTsgLy9NNEVOQ09ERVJfa0FhY0JpdFJlc2Vydm9pcgotICAgICAgICAgICAgICAgICAgICAvKiB1bnVzZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJJUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYk1TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iUE5TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iVE5TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gY2hhbmdlIGludG8gaGlnaHNwZWVkIGFzYXAgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJIaWdoU3BlZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgbWNzIG91dHB1dCBmb3JtYXQsIGFkZCBtcDMgZW5jb2RlciovCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOgotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUDM7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChwUGFyYW1zLT5iQXVkaW9Nb25vID09IE00T1NBX1RSVUUpID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tNb25vIDogTTRFTkNPREVSX2tTdGVyZW87Ci0KLSAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazExMDI1X0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2sxMTAyNUh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIyMDUwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2syMjA1MEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjQwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazMyMDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ0MTAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s0NDEwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0ODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa051bGxBdWRpbzoKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBFZmZlY3RzID09IE00T1NBX05VTEwgfHwgcFBhcmFtcy0+bmJFZmZlY3RzID09IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBlbmNvZGVyIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rQXVkaW9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID09IDEpID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rTW9ubyA6IE00RU5DT0RFUl9rU3RlcmVvOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID09IDEpID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rTW9ubyA6IE00RU5DT0RFUl9rU3RlcmVvOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMgY2FsbGluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyIE00VklERU9FRElUSU5HX2tOdWxsLCBBTVIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0gTTRFTkNPREVSX2s4MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID0gTTRFTkNPREVSX2tNb25vOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSA4MDAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rQU1STkI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFtclNJRCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa0Ftck5vU0lEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zIGNhbGxpbmcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRW5jb2RlciBNNFZJREVPRURJVElOR19rTnVsbCwgQUFDIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBQUM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5SZWd1bGF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rQWFjUmVndWxOb25lOyAvL000RU5DT0RFUl9rQWFjQml0UmVzZXJ2b2lyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazE2MDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2syMjA1MEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMjQwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazMyMDAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2s0NDEwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rNDgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tBQUM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW51c2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJJUyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iTVMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYlBOUyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iVE5TID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyBjaGFuZ2UgaW50byBoaWdoc3BlZWQgYXNhcCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iSGlnaFNwZWVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QMzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcyBjYWxsaW5nXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyIE00VklERU9FRElUSU5HX2tOdWxsLCBNUDMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rTVAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazE2MDAwSHo7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazIyMDUwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2syNDAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfazQ0MTAwSHo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2s0ODAwMEh6OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa01QMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW86Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zOiBPdXRwdXQgYXVkaW8gZm9ybWF0ICglZCkgaXNcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tcGF0aWJsZSB3aXRoIGF1ZGlvIGVmZmVjdHMsIHJldHVybmluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgLyogRVZSQwotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX3NldEN1cnJlbnRBdWRpb0VuY29kZXIocENvbnRleHQsIHBQYXJhbXMtPlwKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIE91dHB1dEF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0VWUkM7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGJyZWFrOyAqLwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX3NldE91dHB1dFBhcmFtczogVW5kZWZpbmVkIG91dHB1dCBhdWRpbyBmb3JtYXQgKCVkKSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggcFBhcmFtcy0+cE91dHB1dFBDTWZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBwQy0+cE91dHB1dFBDTWZpbGUgPSBwUGFyYW1zLT5wT3V0cHV0UENNZmlsZTsKLQotICAgICAgICAvKiBPcGVuIG91dHB1dCBQQ00gZmlsZSAqLwotICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLT5vcGVuV3JpdGUoJihwQy0+cE91dHB1dFBDTWZpbGUpLAotICAgICAgICAgICAgcFBhcmFtcy0+cE91dHB1dFBDTWZpbGUsIE00T1NBX2tGaWxlV3JpdGUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+cE91dHB1dFBDTWZpbGUgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qU3RvcmUgbWVkaWEgcmVuZGVyaW5nIHBhcmFtZXRlciBpbnRvIHRoZSBpbnRlcm5hbCBjb250ZXh0Ki8KLSAgICBwQy0+TWVkaWFSZW5kZXJpbmcgPSBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZzsKLQotICAgIC8qIEFkZCBhdWRpbyBlZmZlY3RzKi8KLSAgICAvKkNvcHkgTUNTIGVmZmVjdHMgc3RydWN0dXJlIGludG8gaW50ZXJuYWwgY29udGV4dCovCi0gICAgaWYoIHBQYXJhbXMtPm5iRWZmZWN0cyA+IDAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGogPSAwOwotICAgICAgICBwQy0+bmJFZmZlY3RzID0gcFBhcmFtcy0+bmJFZmZlY3RzOwotICAgICAgICBwQy0+cEVmZmVjdHMgPSAoTTRNQ1NfRWZmZWN0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPm5iRWZmZWN0cyBcCi0gICAgICAgICAgICAqc2l6ZW9mKE00TUNTX0VmZmVjdFNldHRpbmdzKSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJBbGxvY2F0aW9uIG9mIGVmZmVjdHMgbGlzdCIpOwotCi0gICAgICAgIGlmKCBwQy0+cEVmZmVjdHMgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBwQy0+bmJFZmZlY3RzOyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb3B5IGVmZmVjdCB0byAibG9jYWwiIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICYocEMtPnBFZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKSAmKHBQYXJhbXMtPnBFZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRNQ1NfRWZmZWN0U2V0dGluZ3MpKTsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQy0+cEVmZmVjdHNbal0uQXVkaW9FZmZlY3RUeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfTm9uZToKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IGVmZmVjdCB0eXBlICVpIGlzIE5vbmUiLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlSW46Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBlZmZlY3QgdHlwZSAlaSBpcyBGYWRlSW4iLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLnBFeHRBdWRpb0VmZmVjdEZjdEN0eHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00TUNTX2tBdWRpb0VmZmVjdFR5cGVfRmFkZU91dDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IGVmZmVjdCB0eXBlICVpIGlzIEZhZGVPdXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgaik7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5wRXh0QXVkaW9FZmZlY3RGY3RDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBFZmZlY3RzW2pdLkV4dEF1ZGlvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdF9GYWRlT3V0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRNQ1Nfa0F1ZGlvRWZmZWN0VHlwZV9FeHRlcm5hbDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1Nfc2V0T3V0cHV0UGFyYW1zKCk6IGVmZmVjdCB0eXBlICVpIGlzIEV4dGVybmFsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGopOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRWZmZWN0cyAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBFZmZlY3RzW2pdLkV4dEF1ZGlvRWZmZWN0RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX3NldE91dHB1dFBhcmFtcygpOiBubyBleHRlcm5hbCBlZmZlY3QgZnVuY3Rpb25cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB0byBleHRlcm5hbCBlZmZlY3QgbnVtYmVyICVpIiwgaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS5wRXh0QXVkaW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRWZmZWN0c1tqXS5wRXh0QXVkaW9FZmZlY3RGY3RDdHh0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0uRXh0QXVkaW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBFZmZlY3RzW2pdLkV4dEF1ZGlvRWZmZWN0RmN0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogZWZmZWN0IHR5cGUgbm90IHJlY29nbml6ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+bmJFZmZlY3RzID0gMDsKLSAgICAgICAgcEMtPnBFZmZlY3RzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfU0VUOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19zZXRPdXRwdXRQYXJhbXMoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfRW5jb2RpbmdQYXJhbXMqIHBSYXRlcykKLSAqIEBicmllZiAgIFNldCB0aGUgdmFsdWVzIG9mIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydCgpLgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBSYXRlcyAgICAgICAgICAgICAoSU4pIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDogQXVkaW8gYml0cmF0ZSB0b28gaGlnaCAod2UgbGltaXQgdG8gOTYga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzogQXVkaW8gYml0cmF0ZSBpcyB0b28gbG93ICgxNiBrYnBzIG1pbiBmb3IgYWFjLCAxMi4yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFtciwgOCBmb3IgbXAzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDogQmVnaW4gY3V0IGFuZCBFbmQgY3V0IGFyZSBlcXVhbHMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT046IEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuIHRoZSBpbnB1dCBjbGlwCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24KLSAqIEByZXR1cm4gIE00TUNTX0VSUl9FTkRfQ1VUX1NNQUxMRVJfVEhBTl9CRUdJTl9DVVQ6IEVuZCBjdXQgdGltZSBpcyBzbWFsbGVyIHRoYW4gYmVnaW4gY3V0IHRpbWUKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9NQVhGSUxFU0laRV9UT09fU01BTEw6IE5vdCBlbm91Z2ggc3BhY2UgdG8gc3RvcmUgd2hvbGUgb3V0cHV0IGZpbGUgYXQgZ2l2ZW4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZXMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g6IFZpZGVvIGJpdHJhdGUgdG9vIGhpZ2ggKHdlIGxpbWl0IHRvIDgwMCBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX1ZJREVPQklUUkFURV9UT09fTE9XOiAgVmlkZW8gYml0cmF0ZSB0b28gbG93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FbmNvZGluZ1BhcmFtcyAqcFJhdGVzICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfVUludDMyIGogPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UyXzIoCi0gICAgICAgICJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwUmF0ZXM9MHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBwUmF0ZXMpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXM6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFJhdGVzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXM6IHBSYXRlcyBpcyBNNE9TQV9OVUxMIik7Ci0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUKLQotICAgIGlmKCBwQy0+bV9iSXNTdGlsbFBpY3R1cmUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2FsbCB0aGUgY29ycmVzcG9uZGluZyBzdGlsbCBwaWN0dXJlIE1DUyBmdW5jdGlvbiovCi0gICAgICAgIHJldHVybiBNNE1DU19zdGlsbFBpY1NldEVuY29kaW5nUGFyYW1zKHBDLCBwUmF0ZXMpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0KLSAgICBpZiggTTRNQ1Nfa1N0YXRlX1NFVCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBTZXQgZ2l2ZW4gdmFsdWVzICovCi0gICAgcEMtPnVpVmlkZW9CaXRyYXRlID0gcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGU7Ci0gICAgcEMtPnVpQXVkaW9CaXRyYXRlID0gcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgcEMtPnVpQmVnaW5DdXRUaW1lID0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgcEMtPnVpRW5kQ3V0VGltZSA9IHBSYXRlcy0+RW5kQ3V0VGltZTsKLSAgICBwQy0+dWlNYXhGaWxlU2l6ZSA9IHBSYXRlcy0+T3V0cHV0RmlsZVNpemU7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGJlZ2luIGN1dCB0aW1lIHZhbGlkaXR5ICovCi0gICAgaWYoIHBDLT51aUJlZ2luQ3V0VGltZSA+PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoKTogQmVnaW4gY3V0IGxhcmdlciB0aGFuIGR1cmF0aW9uICglZD4lZCksXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBDLT51aUJlZ2luQ3V0VGltZSwgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24pOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9MQVJHRVJfVEhBTl9EVVJBVElPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIElmIGVuZCBjdXQgdGltZSBpcyB0b28gbGFyZ2UsIHdlIHNldCBpdCB0byB0aGUgY2xpcCBkdXJhdGlvbiAqLwotICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgcEMtPnVpRW5kQ3V0VGltZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgZW5kIGN1dCB0aW1lIHZhbGlkaXR5ICovCi0gICAgaWYoIHBDLT51aUVuZEN1dFRpbWUgPiAwICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lIDwgcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00TUNTX3NldEVuY29kaW5nUGFyYW1zKCk6IEJlZ2luIGN1dCBncmVhdGVyIHRoYW4gZW5kIGN1dCAoJWQsJWQpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0VORF9DVVRfU01BTExFUl9USEFOX0JFR0lOX0NVVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dWlCZWdpbkN1dFRpbWUsIHBDLT51aUVuZEN1dFRpbWUpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9FTkRfQ1VUX1NNQUxMRVJfVEhBTl9CRUdJTl9DVVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPnVpRW5kQ3V0VGltZSA9PSBwQy0+dWlCZWdpbkN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMoKTogQmVnaW4gYW5kIEVuZCBjdXRzIGFyZSBlcXVhbCAoJWQsJWQpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51aUJlZ2luQ3V0VGltZSwgcEMtPnVpRW5kQ3V0VGltZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogRmxCIDIwMDkuMDMuMDQ6IGNoZWNrIGF1ZGlvIGVmZmVjdHMgc3RhcnQgdGltZSBhbmQgZHVyYXRpb24gdmFsaWRpdHkqLwotICAgIGZvciAoIGogPSAwOyBqIDwgcEMtPm5iRWZmZWN0czsgaisrICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBvdXRwdXRFbmRDdXQgPSBwQy0+dWlFbmRDdXRUaW1lOwotCi0gICAgICAgIGlmKCBwQy0+dWlFbmRDdXRUaW1lID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRFbmRDdXQgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBwQy0+cEVmZmVjdHNbal0udWlTdGFydFRpbWUgPiAob3V0cHV0RW5kQ3V0IC0gcEMtPnVpQmVnaW5DdXRUaW1lKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNE1DU19zZXRFbmNvZGluZ1BhcmFtcygpOiBFZmZlY3RzIHN0YXJ0IHRpbWUgaXMgbGFyZ2VyIHRoYW5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiAoJWQsJWQpLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS51aVN0YXJ0VGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5wRWZmZWN0c1tqXS51aVN0YXJ0VGltZSArIHBDLT5wRWZmZWN0c1tqXS51aUR1cmF0aW9uID4gXAotICAgICAgICAgICAgKG91dHB1dEVuZEN1dCAtIHBDLT51aUJlZ2luQ3V0VGltZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBSZS1hZGp1c3QgdGhlIGVmZmVjdCBkdXJhdGlvbiB1bnRpbCB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgY2xpcCovCi0gICAgICAgICAgICBwQy0+cEVmZmVjdHNbal0udWlEdXJhdGlvbiA9IChvdXRwdXRFbmRDdXQgLSBwQy0+dWlCZWdpbkN1dFRpbWUpIC0gXAotICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1tqXS51aVN0YXJ0VGltZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENoZWNrIGF1ZGlvIGJpdHJhdGUgY29uc2lzdGVuY3kgKi8KLSAgICBpZiggKCBwQy0+bm9hdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgJiYgKHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgIT0gTTRFTkNPREVSX2tBdWRpb05VTEwpICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+dWlBdWRpb0JpdHJhdGUgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0FNUk5CICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotCi0gICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IE00VklERU9FRElUSU5HX2sxMl8yX0tCUFMgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9FVlJDCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIGVsc2UgaWYocEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0VWUkMpCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmKHBDLT51aUF1ZGlvQml0cmF0ZSA+IE00VklERU9FRElUSU5HX2s5XzJfS0JQUykKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmKHBDLT51aUF1ZGlvQml0cmF0ZSA8IE00VklERU9FRElUSU5HX2s5XzJfS0JQUykKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgfQotICAgICAgICAgICAgLypGbEIgMjYuMDIuMjAwOTogYWRkIG1wMyBhcyBtY3Mgb3V0cHV0IGZvcm1hdCwgYWRkIG1wMyBlbmNvZGVyKi8KLSAgICAgICAgICAgIGVsc2UgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tNUDMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID49IE00RU5DT0RFUl9rMzIwMDBIeiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1wZWcgbGF5ZXIgMSovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+dWlBdWRpb0JpdHJhdGUgPiAzMjAwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IDMyMDAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPj0gTTRFTkNPREVSX2sxNjAwMEh6ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qTXBlZyBsYXllciAyKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IDE2MDAwMCApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fSElHSDsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBwQy0+dWlBdWRpb0JpdHJhdGUgPCA4MDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9PSBNNEVOQ09ERVJfa01vbm8pCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAocEMtPnVpQXVkaW9CaXRyYXRlIDwgMTYwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNEVOQ09ERVJfa1N0ZXJlbykgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9PSBNNEVOQ09ERVJfazgwMDBIegotICAgICAgICAgICAgICAgICAgICB8fCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID09IE00RU5DT0RFUl9rMTEwMjVIegotICAgICAgICAgICAgICAgICAgICB8fCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5ID09IE00RU5DT0RFUl9rMTIwMDBIeiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1wZWcgbGF5ZXIgMi41Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IDY0MDAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IDgwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubykKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwQy0+dWlBdWRpb0JpdHJhdGUgPCAxNjAwMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0KLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00RU5DT0RFUl9rU3RlcmVvKSApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXM6IE1QMyBhdWRpbyBzYW1wbGluZyBmcmVxdWVuY3kgZXJyb3JcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICglZCkiLCBwQy0+QXVkaW9FbmNQYXJhbXMuRnJlcXVlbmN5KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA+IE00VklERU9FRElUSU5HX2sxOTJfS0JQUyApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOwotCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rTW9ubyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpQXVkaW9CaXRyYXRlIDwgTTRWSURFT0VESVRJTkdfazE2X0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA8IE00VklERU9FRElUSU5HX2szMl9LQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5VTEwgYXVkaW8gOiBjb3B5IGlucHV0IGZpbGUgYml0cmF0ZSAqLwotICAgICAgICBwQy0+dWlBdWRpb0JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayB2aWRlbyBiaXRyYXRlIGNvbnNpc3RlbmN5ICovCi0gICAgaWYoICggcEMtPm5vdmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCAhPSBNNEVOQ09ERVJfa05VTEwpICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+dWlWaWRlb0JpdHJhdGUgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPnVpVmlkZW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazhfTUJQUyApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0hJR0g7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+dWlWaWRlb0JpdHJhdGUgPCBNNFZJREVPRURJVElOR19rMTZfS0JQUyApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBOVUxMIHZpZGVvIDogY29weSBpbnB1dCBmaWxlIGJpdHJhdGUgKi8KLSAgICAgICAgcEMtPnVpVmlkZW9CaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgfQotCi0gICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9UaW1lc2NhbGUgPD0gMzAwMDAKLSAgICAgICAgJiYgcFJhdGVzLT5PdXRwdXRWaWRlb1RpbWVzY2FsZSA+IDAgKQotICAgIHsKLSAgICAgICAgcEMtPm91dHB1dFZpZGVvVGltZXNjYWxlID0gcFJhdGVzLT5PdXRwdXRWaWRlb1RpbWVzY2FsZTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmaWxlIHNpemUgKi8KLSAgICByZXR1cm4gTTRNQ1NfaW50Q2hlY2tNYXhGaWxlU2l6ZShwQyk7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2dldEV4dGVuZGVkRW5jb2RpbmdQYXJhbXMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRNQ1NfRW5jb2RpbmdQYXJhbXMqIHBSYXRlcykKLSAqIEBicmllZiAgIEdldCB0aGUgZXh0ZW5kZWQgdmFsdWVzIG9mIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBDb3VsZCBiZSBjYWxsZWQgYWZ0ZXIgTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXMuCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHBhcmFtICAgcFJhdGVzICAgICAgICAgICAgIChPVVQpIFRyYW5zY29kaW5nIHBhcmFtZXRlcnMKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNQ1MgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDogRW5jb2Rpbmcgc2V0dGluZ3Mgd291bGQgcHJvZHVjZSBhIG51bGwgZHVyYXRpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcCA9IGVuY29kaW5nIGlzIGltcG9zc2libGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2dldEV4dGVuZGVkRW5jb2RpbmdQYXJhbXMoIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19FbmNvZGluZ1BhcmFtcyAqcFJhdGVzICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9JbnQzMiBtaW5hdWRpb2JpdHJhdGU7Ci0gICAgTTRPU0FfSW50MzIgbWludmlkZW9iaXRyYXRlOwotICAgIE00T1NBX0ludDMyIG1heGNvbWJpbmVkYml0cmF0ZTsKLQotICAgIE00T1NBX0ludDMyIGNhbGNiaXRyYXRlOwotCi0gICAgTTRPU0FfVUludDMyIG1heGR1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiBjYWxjZHVyYXRpb247Ci0KLSAgICBNNE9TQV9Cb29sIGZpeGVkX2F1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQm9vbCBmaXhlZF92aWRlbyA9IE00T1NBX0ZBTFNFOwotCi0jaWZkZWYgTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFCi0KLSAgICBpZiggcEMtPm1fYklzU3RpbGxQaWN0dXJlICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgdGhlIGNvcnJlc3BvbmRpbmcgc3RpbGwgcGljdHVyZSBNQ1MgZnVuY3Rpb24qLwotICAgICAgICByZXR1cm4gTTRNQ1Nfc3RpbGxQaWNHZXRFeHRlbmRlZEVuY29kaW5nUGFyYW1zKHBDLCBwUmF0ZXMpOwotICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfU1VQUE9SVF9TVElMTF9QSUNUVVJFKi8KLQotICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUocEMtPnVpVmlkZW9CaXRyYXRlLCAwKTsKLSAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKHBDLT51aUF1ZGlvQml0cmF0ZSwgMCk7Ci0gICAgcFJhdGVzLT5CZWdpbkN1dFRpbWUgPSBwQy0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gcEMtPnVpRW5kQ3V0VGltZTsKLSAgICBwUmF0ZXMtPk91dHB1dEZpbGVTaXplID0gcEMtPnVpTWF4RmlsZVNpemU7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCBNNE1DU19rU3RhdGVfU0VUICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfZ2V0RXh0ZW5kZWRFbmNvZGluZ1BhcmFtcygpOiBXcm9uZyBTdGF0ZSAoJWQpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgbWluIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICBpZiggcEMtPm5vYXVkaW8gKQotICAgIHsKLSAgICAgICAgZml4ZWRfYXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IDA7Ci0gICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBdWRpb05VTEwgKQotICAgIHsKLSAgICAgICAgZml4ZWRfYXVkaW8gPSBNNE9TQV9UUlVFOwotICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgICAgICBtaW5hdWRpb2JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBTVJOQiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpeGVkX2F1ZGlvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxMl8yX0tCUFM7Ci0gICAgICAgIH0KLSAgICAgICAgLy9FVlJDCi0gICAgICAgIC8vICAgICAgICBpZihwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rRVZSQykKLSAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICBmaXhlZF9hdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIC8vICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOV8yX0tCUFM7Ci0gICAgICAgIC8vICAgICAgICAgICAgbWluYXVkaW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazlfMl9LQlBTOwotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAvKkZsQiAyNi4wMi4yMDA5OiBhZGQgbXAzIGFzIG1jcyBvdXRwdXQgZm9ybWF0Ki8KLSAgICAgICAgZWxzZSBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa01QMyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFM7IC8qRGVmYXVsdCBtaW4gYXVkaW8gYml0cmF0ZSBmb3IgTVBFRyBsYXllciAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGJvdGggbW9ubyBhbmQgc3RlcmVvIGNoYW5uZWxzKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbmF1ZGlvYml0cmF0ZSA9IChwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9PSBNNEVOQ09ERVJfa01vbm8pCi0gICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rMTZfS0JQUyA6IE00VklERU9FRElUSU5HX2szMl9LQlBTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgYXVkaW8gYml0cmF0ZSBpcyBpbiB0aGUgY29ycmVjdCByYW5nZSAqLwotICAgIGlmKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBpZiggKCBwQy0+dWlBdWRpb0JpdHJhdGUgPiAwKQotICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlIDwgbWluYXVkaW9iaXRyYXRlKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gbWluYXVkaW9iaXRyYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazk2X0tCUFMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5Nl9LQlBTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSBtaW4gdmlkZW8gYml0cmF0ZSAqLwotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICBmaXhlZF92aWRlbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gMDsKLSAgICAgICAgbWludmlkZW9iaXRyYXRlID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPT0gTTRFTkNPREVSX2tOVUxMICkKLSAgICB7Ci0gICAgICAgIGZpeGVkX3ZpZGVvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgbWludmlkZW9iaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1pbnZpZGVvYml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxNl9LQlBTOwotICAgIH0KLQotICAgIC8qIENoZWNrIHZpZGVvIGJpdHJhdGUgaXMgaW4gdGhlIGNvcnJlY3QgcmFuZ2UgKi8KLSAgICBpZiggZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgaWYoICggcEMtPnVpVmlkZW9CaXRyYXRlID4gMCkKLSAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA8IG1pbnZpZGVvYml0cmF0ZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLSAgICAgICAgfQotICAgICAgICAvKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazhfTUJQUyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazhfTUJQUzsKLSAgICAgICAgfQotICAgICAgICAvKi0gTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICB9Ci0KLSAgICAvKiBDaGVjayBjdXQgdGltZXMgYXJlIGluIGNvcnJlY3QgcmFuZ2UgKi8KLSAgICBpZiggKCBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA+PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbikKLSAgICAgICAgfHwgKCggcFJhdGVzLT5CZWdpbkN1dFRpbWUgPj0gcFJhdGVzLT5FbmRDdXRUaW1lKQotICAgICAgICAmJiAocFJhdGVzLT5FbmRDdXRUaW1lID4gMCkpICkKLSAgICB7Ci0gICAgICAgIHBSYXRlcy0+QmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgcFJhdGVzLT5FbmRDdXRUaW1lID0gMDsKLSAgICB9Ci0KLSAgICBpZiggcFJhdGVzLT5FbmRDdXRUaW1lID09IDAgKQotICAgICAgICBjYWxjZHVyYXRpb24gPQotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgIGVsc2UKLSAgICAgICAgY2FsY2R1cmF0aW9uID0gcFJhdGVzLT5FbmRDdXRUaW1lIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0KLSAgICAvKiBwcmlvcml0eSAxIDogbWF4IGZpbGUgc2l6ZSAqLwotICAgIGlmKCBwUmF0ZXMtPk91dHB1dEZpbGVTaXplID09IDAgKQotICAgIHsKLSAgICAgICAgLyogd2UgY2FuIHB1dCBtYXhpbXVtIHZhbHVlcyBmb3IgYWxsIHVuZGVmaW5lZCBwYXJhbWV0ZXJzICovCi0gICAgICAgIGlmKCBwUmF0ZXMtPkVuZEN1dFRpbWUgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+RW5kQ3V0VGltZSA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpCi0gICAgICAgICAgICAmJiAoZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UpICkKLSAgICAgICAgewotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOTZfS0JQUzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKQotICAgICAgICAgICAgJiYgKGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOF9NQlBTOwotICAgICAgICAgICAgLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogY29tcHV0ZSBtYXggZHVyYXRpb24gKi8KLSAgICAgICAgbWF4ZHVyYXRpb24gPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgLyAobWludmlkZW9iaXRyYXRlICsgbWluYXVkaW9iaXRyYXRlKSAqIDgwMDAuMCk7Ci0KLSAgICAgICAgaWYoIG1heGR1cmF0aW9uCi0gICAgICAgICAgICArIHBSYXRlcy0+QmVnaW5DdXRUaW1lID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhkdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHByaW9yaXR5IDIgOiBjdXQgdGltZXMgKi8KLSAgICAgICAgaWYoICggcFJhdGVzLT5CZWdpbkN1dFRpbWUgPiAwKSB8fCAocFJhdGVzLT5FbmRDdXRUaW1lID4gMCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID4gbWF4ZHVyYXRpb24gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhbGNkdXJhdGlvbiA9IG1heGR1cmF0aW9uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYXhjb21iaW5lZGJpdHJhdGUgPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8gLyAoY2FsY2R1cmF0aW9uIC8gODAwMC4wKSk7Ci0KLSAgICAgICAgICAgIC8qIGF1ZGlvIGFuZCB2aWRlbyBiaXRyYXRlcyAqLwotICAgICAgICAgICAgaWYoICggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkKLSAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHNldCBhdWRpbyA9IDEvMyBhbmQgdmlkZW8gPSAyLzMgKi8KLSAgICAgICAgICAgICAgICBpZiggZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZSAvIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPCBtaW5hdWRpb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBtaW5hdWRpb2JpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazk2X0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOTZfS0JQUzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPCBtaW52aWRlb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBtaW52aWRlb2JpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazhfTUJQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rOF9NQlBTOyAvKisgTmV3IEVuY29kZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGVzICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IDMgOiBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlKCAoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID49IG1pbmF1ZGlvYml0cmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBtaW52aWRlb2JpdHJhdGUgPiBtYXhjb21iaW5lZGJpdHJhdGUpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA8IG1pbmF1ZGlvYml0cmF0ZSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb21iaW5lZGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUsIDApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjYml0cmF0ZSA8IG1pbnZpZGVvYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjYml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2JpdHJhdGUgPiBNNFZJREVPRURJVElOR19rOF9NQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazhfTUJQUzsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICgoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA+IGNhbGNiaXRyYXRlKSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IGNhbGNiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IDQgOiB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPj0gbWludmlkZW9iaXRyYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWluYXVkaW9iaXRyYXRlID4gbWF4Y29tYmluZWRiaXRyYXRlKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggZml4ZWRfdmlkZW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlIDwgbWludmlkZW9iaXRyYXRlKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPSBtaW52aWRlb2JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZShtYXhjb21iaW5lZGJpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNiaXRyYXRlIDwgbWluYXVkaW9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjYml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNiaXRyYXRlID4gTTRWSURFT0VESVRJTkdfazk2X0tCUFMgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNiaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazk2X0tCUFM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIGZpeGVkX2F1ZGlvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID4gY2FsY2JpdHJhdGUpKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBjYWxjYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHByaW9yaXR5IDMgOiBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgIT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IDQgOiB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgbWF4IGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlKSAqIDgwMDAuMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIG1heGR1cmF0aW9uICsgcFJhdGVzLT5CZWdpbkN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwUmF0ZXMtPkJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPiBtYXhkdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNkdXJhdGlvbiA9IG1heGR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9CRUdJTl9DVVRfRVFVQUxTX0VORF9DVVQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgd2l0aCBtaW4gdmlkZW8gYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IG1pbnZpZGVvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBjb21wdXRlIG1heCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSkgKiA4MDAwLjApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBtYXhkdXJhdGlvbiArIHBSYXRlcy0+QmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID4gbWF4ZHVyYXRpb24gKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjZHVyYXRpb24gPSBtYXhkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPT0gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogc2VhcmNoIG1heCBwb3NzaWJsZSB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgICAgIG1heGNvbWJpbmVkYml0cmF0ZSA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChjYWxjZHVyYXRpb24gLyA4MDAwLjApKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSggKCBmaXhlZF92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPCBNNFZJREVPRURJVElOR19rOF9NQlBTKSApIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxjYml0cmF0ZSA9IE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlLCArMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjYWxjYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPD0gbWF4Y29tYmluZWRiaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IGNhbGNiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IDQgOiB2aWRlbyBiaXRyYXRlICovCi0gICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IHdpdGggbWluIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBtaW5hdWRpb2JpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogY29tcHV0ZSBtYXggZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb24gPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgICAgICAgICAgICAgLyAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUpICogODAwMC4wKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggbWF4ZHVyYXRpb24gKyBwUmF0ZXMtPkJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA+IG1heGR1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2R1cmF0aW9uID0gbWF4ZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID09IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHNlYXJjaCBtYXggcG9zc2libGUgYXVkaW8gYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICBtYXhjb21iaW5lZGJpdHJhdGUgPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgICAgICAgICAgICAgLyAoY2FsY2R1cmF0aW9uIC8gODAwMC4wKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoICggZml4ZWRfYXVkaW8gPT0gTTRPU0FfRkFMU0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIDwgTTRWSURFT0VESVRJTkdfazk2X0tCUFMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2JpdHJhdGUgPSBNNE1DU19pbnRHZXROZWFyZXN0Qml0cmF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSwgKzEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlIDw9IG1heGNvbWJpbmVkYml0cmF0ZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPSBjYWxjYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBjb21wdXRlIG1heCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHBSYXRlcy0+T3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gTTRNQ1NfTU9PVl9PVkVSX0ZJTEVTSVpFX1JBVElPCi0gICAgICAgICAgICAgICAgICAgICAgICAvIChtaW52aWRlb2JpdHJhdGUgKyBtaW5hdWRpb2JpdHJhdGUpICogODAwMC4wKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggbWF4ZHVyYXRpb24gKyBwUmF0ZXMtPkJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPiBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGNhbGNkdXJhdGlvbiA+IG1heGR1cmF0aW9uICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2R1cmF0aW9uID0gbWF4ZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggY2FsY2R1cmF0aW9uID09IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHNldCBhdWRpbyA9IDEvMyBhbmQgdmlkZW8gPSAyLzMgKi8KLSAgICAgICAgICAgICAgICAgICAgbWF4Y29tYmluZWRiaXRyYXRlID0gKE00T1NBX1VJbnQzMikocFJhdGVzLT5PdXRwdXRGaWxlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgLyBNNE1DU19NT09WX09WRVJfRklMRVNJWkVfUkFUSU8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gKGNhbGNkdXJhdGlvbiAvIDgwMDAuMCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmaXhlZF9hdWRpbyA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUobWF4Y29tYmluZWRiaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAzLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlIDwgbWluYXVkaW9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IG1pbmF1ZGlvYml0cmF0ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICA+IE00VklERU9FRElUSU5HX2s5Nl9LQlBTICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s5Nl9LQlBTOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGZpeGVkX3ZpZGVvID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKG1heGNvbWJpbmVkYml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcFJhdGVzLT5PdXRwdXRBdWRpb0JpdHJhdGUsIDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgPCBtaW52aWRlb2JpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSYXRlcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0gbWludmlkZW9iaXRyYXRlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gTTRWSURFT0VESVRJTkdfazhfTUJQUyApCi0gICAgICAgICAgICAgICAgICAgICAgICBwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rOF9NQlBTOyAvKisgTmV3IEVuY29kZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGVzICovCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiByZWNvbXB1dGUgbWF4IGR1cmF0aW9uIHdpdGggZmluYWwgYml0cmF0ZXMgKi8KLSAgICBpZiggcFJhdGVzLT5PdXRwdXRGaWxlU2l6ZSA+IDAgKQotICAgIHsKLSAgICAgICAgbWF4ZHVyYXRpb24gPSAoTTRPU0FfVUludDMyKShwUmF0ZXMtPk91dHB1dEZpbGVTaXplCi0gICAgICAgICAgICAvIE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAgICAgLyAocFJhdGVzLT5PdXRwdXRWaWRlb0JpdHJhdGUgKyBwUmF0ZXMtPk91dHB1dEF1ZGlvQml0cmF0ZSkKLSAgICAgICAgICAgICogODAwMC4wKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbWF4ZHVyYXRpb24gPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICBpZiggbWF4ZHVyYXRpb24KLSAgICAgICAgKyBwUmF0ZXMtPkJlZ2luQ3V0VGltZSA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICB7Ci0gICAgICAgIG1heGR1cmF0aW9uID0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uIC0gcFJhdGVzLT5CZWdpbkN1dFRpbWU7Ci0gICAgfQotCi0gICAgaWYoIHBSYXRlcy0+RW5kQ3V0VGltZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIHBSYXRlcy0+RW5kQ3V0VGltZSA9IHBSYXRlcy0+QmVnaW5DdXRUaW1lICsgbWF4ZHVyYXRpb247Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGNhbGNkdXJhdGlvbiA9IHBSYXRlcy0+RW5kQ3V0VGltZSAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lOwotCi0gICAgICAgIGlmKCBjYWxjZHVyYXRpb24gPiBtYXhkdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBSYXRlcy0+RW5kQ3V0VGltZSA9IHBSYXRlcy0+QmVnaW5DdXRUaW1lICsgbWF4ZHVyYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuIDogY29uc3RyYWludHMgYXJlIHRvbyBzdHJvbmcgKi8KLSAgICBpZiggcFJhdGVzLT5FbmRDdXRUaW1lID09IHBSYXRlcy0+QmVnaW5DdXRUaW1lICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQkVHSU5fQ1VUX0VRVUFMU19FTkRfQ1VUOwotICAgIH0KLQotICAgIC8qIGVzdGltYXRlZCByZXN1bHRpbmcgZmlsZSBzaXplICovCi0gICAgcFJhdGVzLT5PdXRwdXRGaWxlU2l6ZSA9IChNNE9TQV9VSW50MzIpKE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAqIChwUmF0ZXMtPk91dHB1dFZpZGVvQml0cmF0ZSArIHBSYXRlcy0+T3V0cHV0QXVkaW9CaXRyYXRlKQotICAgICAgICAqICgoIHBSYXRlcy0+RW5kQ3V0VGltZSAtIHBSYXRlcy0+QmVnaW5DdXRUaW1lKSAvIDgwMDAuMCkpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgIENoZWNrIHBhcmFtZXRlcnMgdG8gc3RhcnQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURTogICAgICAgIE1DUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfQVVESU9CSVRSQVRFX1RPT19ISUdIOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA5NiBrYnBzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0FVRElPQklUUkFURV9UT09fTE9XOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpbyBiaXRyYXRlIGlzIHRvbyBsb3cgKDE2IGticHMgbWluIGZvciBhYWMsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLjIgZm9yIGFtciwgOCBmb3IgbXAzKQotICogQHJldHVybiAgTTRNQ1NfRVJSX0JFR0lOX0NVVF9FUVVBTFNfRU5EX0NVVDoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVnaW4gY3V0IGFuZCBFbmQgY3V0IGFyZSBlcXVhbHMKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT046Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlZ2luIGN1dCB0aW1lIGlzIGxhcmdlciB0aGFuIHRoZSBpbnB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwIGR1cmF0aW9uCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfRU5EX0NVVF9TTUFMTEVSX1RIQU5fQkVHSU5fQ1VUOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmQgY3V0IHRpbWUgaXMgc21hbGxlciB0aGFuIGJlZ2luIGN1dCB0aW1lCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIHdob2xlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGF0IGdpdmVuIGJpdHJhdGVzCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19ISUdIOgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlbyBiaXRyYXRlIHRvbyBoaWdoICh3ZSBsaW1pdCB0byA4MDAga2JwcykKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9WSURFT0JJVFJBVEVfVE9PX0xPVzoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW8gYml0cmF0ZSB0b28gbG93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KCBNNE1DU19Db250ZXh0IHBDb250ZXh0ICkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCAqKShwQ29udGV4dCk7Ci0gICAgTTRNQ1NfRW5jb2RpbmdQYXJhbXMgVmVyaWZ5UmF0ZXM7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQ6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotI2lmZGVmIE00TUNTX1NVUFBPUlRfU1RJTExfUElDVFVSRQotCi0gICAgaWYoIHBDLT5tX2JJc1N0aWxsUGljdHVyZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSBjb3JyZXNwb25kaW5nIHN0aWxsIHBpY3R1cmUgTUNTIGZ1bmN0aW9uKi8KLSAgICAgICAgcmV0dXJuIE00TUNTX3N0aWxsUGljQ2hlY2tQYXJhbXNBbmRTdGFydChwQyk7Ci0gICAgfQotCi0jZW5kaWYgLypNNE1DU19TVVBQT1JUX1NUSUxMX1BJQ1RVUkUqLwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLQotICAgIGlmKCBNNE1DU19rU3RhdGVfU0VUICE9IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0KCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQXVkaW8gYml0cmF0ZSBzaG91bGQgbm90IHN0YXkgdW5kZWZpbmVkIGF0IHRoaXMgcG9pbnQgKi8KLSAgICBpZiggKCBwQy0+bm9hdWRpbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgJiYgKHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgIT0gTTRFTkNPREVSX2tBdWRpb05VTEwpCi0gICAgICAgICYmIChwQy0+dWlBdWRpb0JpdHJhdGUgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0IDogdW5kZWZpbmVkIGF1ZGlvIGJpdHJhdGUiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9BVURJT0JJVFJBVEVfVE9PX0xPVzsKLSAgICB9Ci0KLSAgICAvKiBWaWRlbyBiaXRyYXRlIHNob3VsZCBub3Qgc3RheSB1bmRlZmluZWQgYXQgdGhpcyBwb2ludCAqLwotICAgIGlmKCAoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFKQotICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgIT0gTTRFTkNPREVSX2tOVUxMKQotICAgICAgICAmJiAocEMtPnVpVmlkZW9CaXRyYXRlID09IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydCA6IHVuZGVmaW5lZCB2aWRlbyBiaXRyYXRlIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfVklERU9CSVRSQVRFX1RPT19MT1c7Ci0gICAgfQotCi0gICAgLyogU2V0IGVuZCBjdXQgdGltZSBpZiBuZWNlc3NhcnkgKG5vdCBhbiBlcnJvcikgKi8KLSAgICBpZiggcEMtPnVpRW5kQ3V0VGltZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIHBDLT51aUVuZEN1dFRpbWUgPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiBGb3JjZSBhIHJlLXNldCB0byBjaGVjayB2YWxpZGl0eSBvZiBwYXJhbWV0ZXJzICovCi0gICAgVmVyaWZ5UmF0ZXMuT3V0cHV0VmlkZW9CaXRyYXRlID0gcEMtPnVpVmlkZW9CaXRyYXRlOwotICAgIFZlcmlmeVJhdGVzLk91dHB1dEF1ZGlvQml0cmF0ZSA9IHBDLT51aUF1ZGlvQml0cmF0ZTsKLSAgICBWZXJpZnlSYXRlcy5CZWdpbkN1dFRpbWUgPSBwQy0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgVmVyaWZ5UmF0ZXMuRW5kQ3V0VGltZSA9IHBDLT51aUVuZEN1dFRpbWU7Ci0gICAgVmVyaWZ5UmF0ZXMuT3V0cHV0RmlsZVNpemUgPSBwQy0+dWlNYXhGaWxlU2l6ZTsKLSAgICBWZXJpZnlSYXRlcy5PdXRwdXRWaWRlb1RpbWVzY2FsZSA9IHBDLT5vdXRwdXRWaWRlb1RpbWVzY2FsZTsKLQotICAgIGVyciA9IE00TUNTX3NldEVuY29kaW5nUGFyYW1zKHBDb250ZXh0LCAmVmVyaWZ5UmF0ZXMpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBwYXJhbWV0ZXJzIGNvbnNpc3RlbmN5ICovCi0gICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0IDogaW52YWxpZCBwYXJhbWV0ZXIgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbCBpcyBPSyA6IHVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPSBwQy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgcEMtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+dWlBdWRpb0JpdHJhdGU7Ci0KLSNpZmRlZiBNNE1DU19XSVRIX0ZBU1RfT1BFTgotICAgIC8qKgotICAgICogUmVtYWtlIHRoZSBvcGVuIGlmIGl0IHdhcyBkb25lIGluIGZhc3QgbW9kZSAqLwotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJGaWxlT3BlbmVkSW5GYXN0TW9kZSApCi0gICAgewotICAgICAgICAvKiBDbG9zZSB0aGUgZmlsZSBvcGVuZWQgaW4gZmFzdCBtb2RlICovCi0gICAgICAgIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKHBDKTsKLQotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQ1JFQVRFRDsKLQotICAgICAgICAvKiBSZW9wZW4gaXQgaW4gbm9ybWFsIG1vZGUgKi8KLSAgICAgICAgZXJyID0gTTRNQ1Nfb3BlbihwQ29udGV4dCwgcEMtPnBJbnB1dEZpbGUsIHBDLT5JbnB1dEZpbGVUeXBlLAotICAgICAgICAgICAgcEMtPnBPdXRwdXRGaWxlLCBwQy0+cFRlbXBvcmFyeUZpbGUpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jaGVja1BhcmFtc0FuZFN0YXJ0IDogTTRNQ1NfT3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotI2VuZGlmIC8qIE00TUNTX1dJVEhfRkFTVF9PUEVOICovCi0KLSAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUkVBRFk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcFNldChNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBTZXQoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRFTkNPREVSX0hlYWRlciAqZW5jSGVhZGVyOwotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB2aWRlbyBkZWNvZGVyICovCi0gICAgZXJyID0gTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcihwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcFNldCgpOiBNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoICggcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KQotICAgICAgICAmJiAocEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPT0gTTRFTkNPREVSX2tOVUxMKSApCi0gICAgewotICAgICAgICBwQy0+YkgyNjRUcmltID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgdGhlIHZpZGVvIGVuY29kZXIgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggKCBwQy0+dWlCZWdpbkN1dFRpbWUgIT0gMCkKLSAgICAgICAgJiYgKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkKLSAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ID09IE00RU5DT0RFUl9rTlVMTCkgKQotICAgIHsKLQotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBWaUVuY0N0eHQsCi0gICAgICAgICAgICBNNEVOQ09ERVJfa09wdGlvbklEX0gyNjRQcm9jZXNzTkFMVUNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilwQy0+bV9wSW5zdGFuY2UpOwotCi0gICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRTdGV0U2V0IDpwRmN0U2V0T3B0aW9uIGZhaWxlZCAgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBWaUVuY0N0eHQsCi0gICAgICAgICAgICBNNEVOQ09ERVJfa09wdGlvbklEX1NldEgyNjRQcm9jZXNzTkFMVWZjdHNQdHIsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJkgyNjRNQ1NfUHJvY2Vzc0VuY29kZWROQUxVKTsKLQotICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50U3RldFNldCA6cEZjdFNldE9wdGlvbiBmYWlsZWQgIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0R2V0T3B0aW9uKHBDLT5wVmlFbmNDdHh0LAotICAgICAgICAgICAgTTRFTkNPREVSX2tPcHRpb25JRF9FbmNvZGVySGVhZGVyLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZlbmNIZWFkZXIpOwotCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2Nsb3NlOiBmYWlsZWQgdG8gZ2V0IHRoZSBlbmNvZGVyIGhlYWRlciAoZXJyIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBubyByZXR1cm4gaGVyZSwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBkZWFsbG9jYXRlIGFmdGVyIGNsb3NlLCBldmVuIGlmIGl0IGZhaWxzLiovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBIYW5kbGUgRFNJIGZpcnN0IGJpdHMKLSNkZWZpbmUgU1BTX1NUQVJUX1BPUyA2Ci0KLSAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKCBlbmNIZWFkZXItPnBCdWZbU1BTX1NUQVJUX1BPU10gPDwgOCkKLSAgICAgICAgICAgICAgICArIGVuY0hlYWRlci0+cEJ1ZltTUFNfU1RBUlRfUE9TICsgMV07Ci0gICAgICAgICAgICBwQy0+bV9wSW5zdGFuY2UtPm1fcEVuY29kZXJTUFMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKShlbmNIZWFkZXItPnBCdWYpICsgU1BTX1NUQVJUX1BPUyArIDI7Ci0KLSAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKCBlbmNIZWFkZXItPnBCdWZbU1BTX1NUQVJUX1BPUyArIDMKLSAgICAgICAgICAgICAgICArIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyU1BTU2l6ZV0gPDwgOCkKLSAgICAgICAgICAgICAgICArIGVuY0hlYWRlci0+cEJ1ZltTUFNfU1RBUlRfUE9TICsgNAotICAgICAgICAgICAgICAgICsgcEMtPm1fcEluc3RhbmNlLT5tX2VuY29kZXJTUFNTaXplXTsKLSAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9wRW5jb2RlclBQUyA9IChNNE9TQV9VSW50OCAqKWVuY0hlYWRlci0+cEJ1ZiArIFNQU19TVEFSVF9QT1MgKyA1Ci0gICAgICAgICAgICAgICAgKyBwQy0+bV9wSW5zdGFuY2UtPm1fZW5jb2RlclNQU1NpemU7Ci0KLSAgICAgICAgICAgIC8qIENoZWNrIHRoZSBEU0kgaW50ZWdyaXR5ICovCi0gICAgICAgICAgICBpZiggZW5jSGVhZGVyLT5TaXplICE9IChwQy0+bV9wSW5zdGFuY2UtPm1fZW5jb2RlclNQU1NpemUKLSAgICAgICAgICAgICAgICArIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZSArIDUgKyBTUFNfU1RBUlRfUE9TKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoCi0gICAgICAgICAgICAgICAgICAgICIhISEgTTRNQ1NfaW50U3RlcFNldCBFUlJPUiA6IGludmFsaWQgU1BTIC8gUFBTICVkICVkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5TaXplLCBwQy0+bV9wSW5zdGFuY2UtPm1fZW5jb2RlclNQU1NpemUsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BJbnN0YW5jZS0+bV9lbmNvZGVyUFBTU2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUHJlcGFyZSBhdWRpbyBwcm9jZXNzaW5nICovCi0gICAgZXJyID0gTTRNQ1NfaW50UHJlcGFyZUF1ZGlvUHJvY2Vzc2luZyhwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcFNldCgpOiBNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB3cml0ZXIgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlV3JpdGVyKHBDKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwU2V0KCk6IE00TUNTX2ludFByZXBhcmVXcml0ZXIoKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogSnVtcCB0aGUgYXVkaW8gc3RyZWFtIHRvIHRoZSBiZWdpbiBjdXQgdGltZSAoYWxsIEFVcyBhcmUgUkFQKQotICAgICogTXVzdCBiZSBkb25lIGFmdGVyIHRoZSAzZ3BwIHdyaXRlciBpbml0LCBiZWNhdXNlIGl0IG1heSB3cml0ZSB0aGUgZmlyc3QKLSAgICAqIGF1ZGlvIEFVIGluIHNvbWUgY2FzZXMgKi8KLSAgICBlcnIgPSBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dChwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcFNldCgpOiBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmKCAwID09IHBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgewotICAgICAgICBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgPSAwLjA7Ci0gICAgICAgIC8qKgotICAgICAgICAqIE5vIGJlZ2luIGN1dCwgZG8gdGhlIGVuY29kaW5nICovCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9QUk9DRVNTSU5HOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBSZW1lbWJlciB0aGF0IHdlIG11c3Qgc3RhcnQgdGhlIGRlY29kZS9lbmNvZGUgcHJvY2VzcyBhdCB0aGUgYmVnaW4gY3V0IHRpbWUgKi8KLSAgICAgICAgcEMtPmRWaURlY1N0YXJ0aW5nQ3RzID0gKE00T1NBX0RvdWJsZSlwQy0+dWlCZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSnVtcGluZyAqLwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfQkVHSU5WSURFT0pVTVA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRTdGVwU2V0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgUHJlcGFyZSB0aGUgdmlkZW8gZGVjb2Rlci4KLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAoSU4pIE1DUyBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICBObyBlcnJvcgotICogQHJldHVybiAgIE00TUNTX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRAotICogQHJldHVybiAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1ZvaWQgKmRlY29kZXJVc2VyRGF0YTsKLSAgICBNNERFQ09ERVJfT3V0cHV0RmlsdGVyIEZpbHRlck9wdGlvbjsKLQotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiBDcmVhdGUgdGhlIGRlY29kZXIsIGlmIGl0IGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldCAodG8gZ2V0IHZpZGVvIHByb3BlcnRpZXMgZm9yIGV4YW1wbGUpICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBWaURlY0N0eHQgKQotICAgIHsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotICAgICAgICBkZWNvZGVyVXNlckRhdGEgPSBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhOwotCi0jZWxzZQotCi0gICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgPyAqLwotCi0gICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSgmcEMtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAmcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMsIHBDLT5tX3BSZWFkZXIsCi0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0LCAmcEMtPlJlYWRlclZpZGVvQVUsIGRlY29kZXJVc2VyRGF0YSk7Ci0KLSAgICAgICAgaWYoIChNNE9TQV9VSW50MzIpKE00RVJSX0RFQ09ERVJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQpID09IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPdXIgZGVjb2RlciBpcyBub3QgY29tcGF0aWJsZSB3aXRoIEgyNjMgcHJvZmlsZSBvdGhlciB0aGFuIDAuCi0gICAgICAgICAgICAqIFNvIGl0IHJldHVybnMgdGhpcyBpbnRlcm5hbCBlcnJvciBjb2RlLgotICAgICAgICAgICAgKiBXZSB0cmFuc2xhdGUgaXQgdG8gb3VyIG93biBlcnJvciBjb2RlICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXI6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RDcmVhdGUgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRWSURFT0VESVRJTkdfa0gyNjQgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsdGVyT3B0aW9uLm1fcEZpbHRlckZ1bmN0aW9uID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKSAmTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjA7Ci0gICAgICAgICAgICBGaWx0ZXJPcHRpb24ubV9wRmlsdGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKHBDLT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfT3V0cHV0RmlsdGVyLAotICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmRmlsdGVyT3B0aW9uKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgUHJlcGFyZSB0aGUgdmlkZW8gZW5jb2Rlci4KLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAoSU4pIE1DUyBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICBObyBlcnJvcgotICogQHJldHVybiAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtcyBFbmNQYXJhbXM7IC8qKjwgRW5jb2RlciBhZHZhbmNlZCBwYXJhbWV0ZXJzICovCi0gICAgTTRFTkNPREVSX1BhcmFtcyBFbmNQYXJhbXMxOwotICAgIE00T1NBX0RvdWJsZSBkRnJhbWVSYXRlOyAgICAgICAgICAgIC8qKjwgdG1wIHZhcmlhYmxlICovCi0KLSAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLQotICAgIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgIHsKLSAgICAgICAgLyogQXBwcm94aW1hdGl2ZSBjdHMgaW5jcmVtZW50ICovCi0gICAgICAgIHBDLT5kQ3RzSW5jcmVtZW50ID0gMTAwMC4wIC8gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9hdmVyYWdlRnJhbWVSYXRlOwotCi0gICAgICAgIGlmKCBwQy0+dWlCZWdpbkN1dFRpbWUgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IE51bGwgZW5jb2RpbmcsIGRvIG5vdGhpbmcuIik7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IE51bGwgZW5jb2RpbmcsIEktZnJhbWUgZGVmYXVsdHMuIik7Ci0KLSAgICAgICAgICAgIC8qIFNldCB1c2VmdWwgcGFyYW1ldGVycyB0byBlbmNvZGUgdGhlIGZpcnN0IEktZnJhbWUgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy5JbnB1dEZvcm1hdCA9IE00RU5DT0RFUl9rSVlVVjQyMDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZW5jb2RpbmdWaWRlb1Byb2ZpbGU7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudmlkZW9MZXZlbD0gcEMtPmVuY29kaW5nVmlkZW9MZXZlbDsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa01QRUc0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0gICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IHVua25vd24gZW5jb2RpbmcgdmlkZW8gZm9ybWF0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJWQpLCByZXR1cm5pbmcgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggPSBwQy0+RW5jb2RpbmdXaWR0aDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5CaXRyYXRlID0gcEMtPnVpRW5jVmlkZW9CaXRyYXRlOwotICAgICAgICAgICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOyAvKiBkbyBub3QgY29uc3RyYWluIHRoZSBJLWZyYW1lICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVSYXRlID0gcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGU7Ci0KLSAgICAgICAgICAgIC8qIE90aGVyIGVuY29kaW5nIHNldHRpbmdzIChxdWl0ZSBhbGwgZHVtbXkuLi4pICovCi0gICAgICAgICAgICBFbmNQYXJhbXMudWlIb3Jpem9udGFsU2VhcmNoUmFuZ2UgPSAwOyAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpVmVydGljYWxTZWFyY2hSYW5nZSA9IDA7ICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7IC8qIG5vIGVycm9yIHJlc2lsaWVuY2UgKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aUlWb3BQZXJpb2QgPSAwOyAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgICAgICAgICBFbmNQYXJhbXMudWlNb3Rpb25Fc3RpbWF0aW9uVG9vbHMgPQotICAgICAgICAgICAgICAgIDA7IC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLmJBY1ByZWRpY3Rpb24gPSBNNE9TQV9UUlVFOyAgICAgLyogdXNlIEFDIHByZWRpY3Rpb24gKi8KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSA1OyAgIC8qIGluaXRpYWwgUVAgPSA1ICovCi0gICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOyAvKiBubyBkYXRhIHBhcnRpdGlvbmluZyAqLwotCi0gICAgICAgICAgICAvKiBSYXRlIGZhY3RvciAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogTm9ybWFsIGVuY29kaW5nLCBzZXQgZnVsbCBjb25maWcuIik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IGVuY29kZXIgc2hlbGwgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gTUNTIHNldHRpbmdzICovCi0gICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdDsKLSAgICAgICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotICAgICAgICBFbmNQYXJhbXMudmlkZW9Qcm9maWxlID0gcEMtPmVuY29kaW5nVmlkZW9Qcm9maWxlOwotICAgICAgICBFbmNQYXJhbXMudmlkZW9MZXZlbD0gcEMtPmVuY29kaW5nVmlkZW9MZXZlbDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBWaWRlbyBmcmFtZSBzaXplICovCi0gICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoID0gcEMtPkVuY29kaW5nV2lkdGg7Ci0gICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IHBDLT5FbmNvZGluZ0hlaWdodDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBWaWRlbyBiaXRyYXRlIGhhcyBiZWVuIHByZXZpb3VzbHkgY29tcHV0ZWQgKi8KLSAgICAgICAgRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+dWlFbmNWaWRlb0JpdHJhdGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTUNTIHVzZSB0aGUgInRydWUiIGNvcmUgaW50ZXJuYWwgYml0cmF0ZSByZWd1bGF0aW9uICovCi0gICAgICAgIEVuY1BhcmFtcy5iSW50ZXJuYWxSZWd1bGF0aW9uID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBPdGhlciBlbmNvZGVyIHNldHRpbmdzICovCi0KLSAgICAgICAgRW5jUGFyYW1zLnVpSG9yaXpvbnRhbFNlYXJjaFJhbmdlID0gMDsgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICAgICAgRW5jUGFyYW1zLnVpVmVydGljYWxTZWFyY2hSYW5nZSA9IDA7ICAgICAgLyogdXNlIGRlZmF1bHQgKi8KLSAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsgLyogbm8gZXJyb3IgcmVzaWxpZW5jZSAqLwotICAgICAgICBFbmNQYXJhbXMudWlJVm9wUGVyaW9kID0gMDsgICAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgICAgICBFbmNQYXJhbXMudWlNb3Rpb25Fc3RpbWF0aW9uVG9vbHMgPQotICAgICAgICAgICAgMDsgLyogTTRWX01PVElPTl9FU1RfVE9PTFNfQUxMICovCi0gICAgICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uID0gTTRPU0FfVFJVRTsgICAgIC8qIHVzZSBBQyBwcmVkaWN0aW9uICovCi0gICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsgIC8qIGluaXRpYWwgUVAgPSAxMCAqLwotICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPQotICAgICAgICAgICAgTTRPU0FfRkFMU0U7IC8qIG5vIGRhdGEgcGFydGl0aW9uaW5nICovCi0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBWaWRlbyBlbmNvZGVyIGZyYW1lIHJhdGUgYW5kIHJhdGUgZmFjdG9yICovCi0gICAgICAgIEVuY1BhcmFtcy5GcmFtZVJhdGUgPSBwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZTsKLSAgICAgICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gcEMtPm91dHB1dFZpZGVvVGltZXNjYWxlOwotCi0gICAgICAgIHN3aXRjaCggcEMtPkVuY29kaW5nVmlkZW9GcmFtZXJhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rNV9GUFM6Ci0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDUuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazdfNV9GUFM6Ci0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDcuNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEwX0ZQUzoKLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gMTAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAxMi41OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTVfRlBTOgotICAgICAgICAgICAgICAgIGRGcmFtZVJhdGUgPSAxNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rMjBfRlBTOiAvKio8IE1QRUctNCBvbmx5ICovCi0gICAgICAgICAgICAgICAgZEZyYW1lUmF0ZSA9IDIwLjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2syNV9GUFM6IC8qKjwgTVBFRy00IG9ubHkgKi8KLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gMjUuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazMwX0ZQUzoKLSAgICAgICAgICAgICAgICBkRnJhbWVSYXRlID0gMzAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IHVua25vd24gZW5jb2RpbmcgdmlkZW8gZnJhbWUgcmF0ZVwKLSAgICAgICAgICAgICAgICAgICAgKDB4JXgpLCByZXR1cm5pbmcgTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRlJBTUVfUkFURTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmV0d2VlbiB0d28gZnJhbWVzICovCi0gICAgICAgIGlmKCBNNEVOQ09ERVJfa0gyNjMgPT0gRW5jUGFyYW1zLkZvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5kQ3RzSW5jcmVtZW50ID0gMTAwMS4wIC8gZEZyYW1lUmF0ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qKjwgTVBFRzQgb3IgSC4yNjQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmRDdHNJbmNyZW1lbnQgPSAxMDAwLjAgLyBkRnJhbWVSYXRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGltaXQgdGhlIHZpZGVvIGJpdHJhdGUgYWNjb3JkaW5nIHRvIGVuY29kZXIgcHJvZmlsZQotICAgICAqIGFuZCBsZXZlbCAqLwotICAgIGVyciA9IE00TUNTX2ludExpbWl0Qml0cmF0ZVBlckNvZGVjUHJvZmlsZUxldmVsKCZFbmNQYXJhbXMpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyOiBsaW1pdCBiaXRyYXRlIHJldHVybmVkIGVyciBcCi0gICAgICAgICAgICAgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDcmVhdGUgdmlkZW8gZW5jb2RlciAqLwotICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDLT5wVmlFbmNDdHh0LAotICAgICAgICBwQy0+cFdyaXRlckRhdGFGY3RzLCBcCi0gICAgICAgIE00TUNTX2ludEFwcGx5VlBQLCBwQywgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEksIFwKLSAgICAgICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEpOwotCi0gICAgLyoqPCBXZSBwdXQgdGhlIE1DUyBjb250ZXh0IGluIHBsYWNlIG9mIHRoZSBWUFAgY29udGV4dCAqLwotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyOiBFbmNvZGVySW50LT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZW5jb2RlclN0YXRlID0gTTRNQ1Nfa0VuY29kZXJDbG9zZWQ7Ci0KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkgyNjRUcmltICkKLSAgICAgICAgLy9pZigoTTRFTkNPREVSX2tOVUxMID09IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0KQotICAgICAgICAvLyAgICAmJiAoTTRWSURFT0VESVRJTkdfa0gyNjQgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlKSkKLSAgICB7Ci0gICAgICAgIEVuY1BhcmFtczEuSW5wdXRGb3JtYXQgPSBFbmNQYXJhbXMuSW5wdXRGb3JtYXQ7Ci0gICAgICAgIC8vRW5jUGFyYW1zMS5JbnB1dEZyYW1lV2lkdGggPSBFbmNQYXJhbXMuSW5wdXRGcmFtZVdpZHRoOwotICAgICAgICAvL0VuY1BhcmFtczEuSW5wdXRGcmFtZUhlaWdodCA9IEVuY1BhcmFtcy5JbnB1dEZyYW1lSGVpZ2h0OwotICAgICAgICBFbmNQYXJhbXMxLkZyYW1lV2lkdGggPSBFbmNQYXJhbXMuRnJhbWVXaWR0aDsKLSAgICAgICAgRW5jUGFyYW1zMS5GcmFtZUhlaWdodCA9IEVuY1BhcmFtcy5GcmFtZUhlaWdodDsKLSAgICAgICAgRW5jUGFyYW1zMS52aWRlb1Byb2ZpbGU9IEVuY1BhcmFtcy52aWRlb1Byb2ZpbGU7Ci0gICAgICAgIEVuY1BhcmFtczEudmlkZW9MZXZlbD0gRW5jUGFyYW1zLnZpZGVvTGV2ZWw7Ci0gICAgICAgIEVuY1BhcmFtczEuQml0cmF0ZSA9IEVuY1BhcmFtcy5CaXRyYXRlOwotICAgICAgICBFbmNQYXJhbXMxLkZyYW1lUmF0ZSA9IEVuY1BhcmFtcy5GcmFtZVJhdGU7Ci0gICAgICAgIEVuY1BhcmFtczEuRm9ybWF0ID0gTTRFTkNPREVSX2tIMjY0OyAvL0VuY1BhcmFtcy5Gb3JtYXQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJtY3MgZW5jb2RlciBvcGVuIHByb2ZpbGUgOiVkLCBsZXZlbCAlZCIsCi0gICAgICAgICAgICBFbmNQYXJhbXMxLnZpZGVvUHJvZmlsZSwgRW5jUGFyYW1zMS52aWRlb0xldmVsKTsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgICZwQy0+V3JpdGVyVmlkZW9BVSwgJkVuY1BhcmFtczEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigibWNzIGVuY29kZXIgb3BlbiBBZHYgcHJvZmlsZSA6JWQsIGxldmVsICVkIiwKLSAgICAgICAgICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUsIEVuY1BhcmFtcy52aWRlb0xldmVsKTsKLSAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQy0+cFZpRW5jQ3R4dCwKLSAgICAgICAgICAgICZwQy0+V3JpdGVyVmlkZW9BVSwgJkVuY1BhcmFtcyk7Ci0gICAgfQotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IEVuY29kZXJJbnQtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlclN0b3BwZWQ7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydChwQy0+cFZpRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXI6IEVuY29kZXJJbnQtPnBGY3RTdGFydCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPmVuY29kZXJTdGF0ZSA9IE00TUNTX2tFbmNvZGVyUnVubmluZzsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogVmlkZW8gcmVzaXplIG1hbmFnZW1lbnQgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKgotICAgICogQ29tcGFyZSB2aWRlbyBpbnB1dCBzaXplIGFuZCB2aWRlbyBvdXRwdXQgc2l6ZSB0byBjaGVjayBpZiByZXNpemUgaXMgbmVlZGVkICovCi0gICAgaWYoICggKE00T1NBX1VJbnQzMilFbmNQYXJhbXMuRnJhbWVXaWR0aAotICAgICAgICAhPSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGgpCi0gICAgICAgIHx8ICgoTTRPU0FfVUludDMyKUVuY1BhcmFtcy5GcmFtZUhlaWdodAotICAgICAgICAhPSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX3ZpZGVvSGVpZ2h0KSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIHZpZGVvIHBsYW5lIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBkZWNvZGVkIGltYWdlIGJlZm9yZQotICAgICAgICAgcmVzaXppbmcgKi8KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZSA9Ci0gICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMyAqIHNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikibV9wUHJlUmVzaXplRnJhbWUiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFByZVJlc2l6ZUZyYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWUsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSB0aGUgWSBwbGFuZSAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCA9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgbV92aWRlb1dpZHRoOyAvKio8IGlucHV0IHdpZHRoICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQgPSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fdmlkZW9IZWlnaHQ7IC8qKjwgaW5wdXQgaGVpZ2h0ICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0udV9zdHJpZGUgPSBwQy0+Ci0gICAgICAgICAgICBwUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aDsgLyoqPCBzaW1wbGUgY2FzZTogc3RyaWRlIGVxdWFscyB3aWR0aCAqLwotCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEgPQotICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfc3RyaWRlIFwKLSAgICAgICAgICAgICpwQy0+cFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0LCBNNE1DUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6XAotICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRoZSBVIHBsYW5lICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMV0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsxXS51X3dpZHRoID0gcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoCi0gICAgICAgICAgICA+PiAxOyAvKio8IFUgd2lkdGggaXMgaGFsZiB0aGUgWSB3aWR0aCAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0ID0gcEMtPnBQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodAotICAgICAgICAgICAgPj4gMTsgLyoqPCBVIGhlaWdodCBpcyBoYWxmIHRoZSBZIGhlaWdodCAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnVfc3RyaWRlID0gcEMtPgotICAgICAgICAgICAgcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGg7IC8qKjwgc2ltcGxlIGNhc2U6IHN0cmlkZSBlcXVhbHMgd2lkdGggKi8KLQotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhID0KLSAgICAgICAgICAgIChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPnBQcmVSZXNpemVGcmFtZVsxXS51X3N0cmlkZSBcCi0gICAgICAgICAgICAqcEMtPnBQcmVSZXNpemVGcmFtZVsxXS51X2hlaWdodCwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOlwKLSAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRoZSBWIHBsYW5lICovCi0gICAgICAgIHBDLT5wUHJlUmVzaXplRnJhbWVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgcEMtPnBQcmVSZXNpemVGcmFtZVsyXS51X3dpZHRoID0gcEMtPgotICAgICAgICAgICAgcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGg7IC8qKjwgViB3aWR0aCBlcXVhbHMgVSB3aWR0aCAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfaGVpZ2h0ID0gcEMtPgotICAgICAgICAgICAgcFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0OyAvKio8IFYgaGVpZ2h0IGVxdWFscyBVIGhlaWdodCAqLwotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnVfc3RyaWRlID0gcEMtPgotICAgICAgICAgICAgcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGg7IC8qKjwgc2ltcGxlIGNhc2U6IHN0cmlkZSBlcXVhbHMgd2lkdGggKi8KLQotICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhID0KLSAgICAgICAgICAgIChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPnBQcmVSZXNpemVGcmFtZVsyXS51X3N0cmlkZSBcCi0gICAgICAgICAgICAqcEMtPnBQcmVSZXNpemVGcmFtZVsyXS51X2hlaWdodCwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOlwKLSAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpOwotICogQGJyaWVmICAgIFByZXBhcmUgdGhlIEFBQyBkZWNvZGVyLCB0aGUgU1JDIGFuZCB0aGUgQU1SLU5CIGVuY29kZXIgYW5kIHRoZSBNUDMgZW5jb2Rlci4KLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAoSU4pIE1DUyBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICBObyBlcnJvcgotICogQHJldHVybiAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgU1NSQ19SZXR1cm5TdGF0dXNfZW4KLSAgICAgICAgUmV0dXJuU3RhdHVzOyAvKiBGdW5jdGlvbiByZXR1cm4gc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWTV9JTlQxNiBOclNhbXBsZXNNaW4gPQotICAgICAgICAwOyAvKiBNaW5pbWFsIG51bWJlciBvZiBzYW1wbGVzIG9uIHRoZSBpbnB1dCBvciBvbiB0aGUgb3V0cHV0ICovCi0gICAgTFZNX0lOVDMyIFNjcmF0Y2hTaXplOyAvKiBUaGUgc2l6ZSBvZiB0aGUgc2NyYXRjaCBtZW1vcnkgICAgICAgICAgICAgICAqLwotICAgIExWTV9JTlQxNgotICAgICAgICAqcElucHV0SW5TY3JhdGNoOyAvKiBQb2ludGVyIHRvIGlucHV0IGluIHRoZSBzY3JhdGNoIGJ1ZmZlciAgICAgICAqLwotICAgIExWTV9JTlQxNgotICAgICAgICAqcE91dHB1dEluU2NyYXRjaDsgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGluIHRoZSBzY3JhdGNoIGJ1ZmZlciAgKi8KLSAgICBTU1JDX1BhcmFtc190IHNzcmNQYXJhbXM7ICAgICAgICAgIC8qIE1lbW9yeSBmb3IgaW5pdCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZkZWYgTUNTX0RVTVBfUENNX1RPX0ZJTEUKLQotICAgIGZpbGVfYXVfcmVhZGVyID0gZm9wZW4oIm1jc19SZWFkZXJPdXRwdXQucmF3IiwgIndiIik7Ci0gICAgZmlsZV9wY21fZGVjb2RlciA9IGZvcGVuKCJtY3NfRGVjb2Rlck91dHB1dC5wY20iLCAid2IiKTsKLSAgICBmaWxlX3BjbV9lbmNvZGVyID0gZm9wZW4oIm1jc19FbmNvZGVySW5wdXQucGNtIiwgIndiIik7Ci0KLSNlbmRpZgotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKCk6IE51bGwgZW5jb2RpbmcsIGRvIG5vdGhpbmcuIik7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgQ3JlYXRlIGFuZCAic3RhcnQiIHRoZSBkZWNvZGVyIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+bV9wQXVkaW9EZWNvZGVyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3NpbmcoKTogRmFpbHMgdG8gaW5pdGlhdGUgdGhlIGF1ZGlvIGRlY29kZXIuIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfQVVESU9fQ09OVkVSU0lPTl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBBdWRpb0RlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoJnBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwgcEMtPm1fcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXI6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rQU1SX05CID09IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApIHsKLSAgICAgICAgLyogQU1SIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTRWSURFT0VESVRJTkdfa0VWUkMgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkgewotICAgICAgICAvKiBFVlJDIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTRWSURFT0VESVRJTkdfa01QMyA9PSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKSB7Ci0gICAgICAgIC8qIE1QMyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBub3RoaW5nIHNwZWNpZmljIHRvIGRvICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEFBQyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLSAgICAgICAgTTRfQWFjRGVjb2RlckNvbmZpZyBBYWNEZWNQYXJhbTsKLQotICAgICAgICBBYWNEZWNQYXJhbS5tX0FBQ0RlY29kZXJQcm9maWxlID0gQUFDX2tBQUM7Ci0gICAgICAgIEFhY0RlY1BhcmFtLm1fRG93blNhbXBsaW5nTW9kZSA9IEFBQ19rRFNfT0ZGOwotCi0gICAgICAgIGlmKCBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID09IE00RU5DT0RFUl9rQU1STkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa01vbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBGb3IgdGhpcyB2ZXJzaW9uLCB3ZSBlbmNvZGUgb25seSBpbiBBQUMgKi8KLSAgICAgICAgICAgIGlmKCBNNEVOQ09ERVJfa01vbm8gPT0gcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFhY0RlY1BhcmFtLm1fT3V0cHV0TW9kZSA9IEFBQ19rTW9ubzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa1N0ZXJlbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfVXNlclBhcmFtLCAoTTRPU0FfRGF0YU9wdGlvbikgJkFhY0RlY1BhcmFtKTsKLSAgICB9Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlLCAoTTRPU0FfRGF0YU9wdGlvbikgcEMtPm1fcFJlYWRlckRhdGFJdCk7Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9BVSwgKE00T1NBX0RhdGFPcHRpb24pICZwQy0+UmVhZGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIE5vdCBpbXBsZW1lbnRlZCBpbiBhbGwgZGVjb2RlcnMgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXI6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemUgPQotICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgKiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0KLSAgICBpZiggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZSA+IDAgKQotICAgIHsKLSAgICAgICAgcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aURlY29kZWRQY21TaXplOwotICAgICAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgXAotICAgICAgICAgICAgKnNpemVvZihzaG9ydCksIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJBdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUiKTsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCk6XAotICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IFNldCB0aGUgU1NSQyBwYXJhbWV0ZXJzIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIHN3aXRjaCggcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgewotICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfODAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMTEwMjU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDEyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzEyMDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMjIwNTA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzI0MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfNDQxMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzQ4MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyOiBpbnZhbGlkIGlucHV0IEFBQyBzYW1wbGluZyBmcmVxdWVuY3kgKCVkIEh6KSxcCi0gICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZIiwKLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5KTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZOwotICAgIH0KLQotICAgIGlmKCAxID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscyApCi0gICAgewotICAgICAgICBzc3JjUGFyYW1zLlNTUkNfTnJPZkNoYW5uZWxzID0gTFZNX01PTk87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fU1RFUkVPOwotICAgIH0KLQotICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgb3V0cHV0IGZvcm1hdCovCi0gICAgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBQUMKLSAgICAgICAgfHwgcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa01QMyApCi0gICAgewotICAgICAgICBzd2l0Y2goIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rODAwMEh6OgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazExMDI1SHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18xMTAyNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEyMDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18xMjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazE2MDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazIyMDUwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazI0MDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18yNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazMyMDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazQ0MTAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU180NDEwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfazQ4MDAwSHo6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU180ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3Npbmc6IGludmFsaWQgb3V0cHV0IEFBQyBzYW1wbGluZyBmcmVxdWVuY3kgXAotICAgICAgICAgICAgICAgICAgICAoJWQgSHopLCByZXR1cm5pbmcgTTRNQ1NfRVJSX0lOVkFMSURfQUFDX1NBTVBMSU5HX0ZSRVFVRU5DWSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9BQUNfU0FNUExJTkdfRlJFUVVFTkNZOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfODAwMDsKLSAgICB9Ci0KLQotCi0gICAgUmV0dXJuU3RhdHVzID0gMDsKLQotICAgIHN3aXRjaCggc3NyY1BhcmFtcy5TU1JDX0ZzX0luICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gNDQxOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTYwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gNjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gODgyOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMjQwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gOTYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMzIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMTI4MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzQ0MTAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9IDE3NjQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU180ODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFJldHVyblN0YXR1cyA9IC0xOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc3dpdGNoKCBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzgwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDMyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzExMDI1OgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSA0NDE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18xMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMTYwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDY0MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzIyMDUwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSA4ODI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU18yNDAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gOTYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMVk1fRlNfMzIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9IDEyODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExWTV9GU180NDEwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMTc2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFZNX0ZTXzQ4MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFJldHVyblN0YXR1cyA9IC0xOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0KLQotICAgIGlmKCBSZXR1cm5TdGF0dXMgIT0gU1NSQ19PSyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nOlwKLSAgICAgICAgICAgICBFcnJvciBjb2RlICVkIHJldHVybmVkIGJ5IHRoZSBTU1JDX0dldE5yU2FtcGxlcyBmdW5jdGlvbiIsCi0gICAgICAgICAgICBSZXR1cm5TdGF0dXMpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEOwotICAgIH0KLQotICAgIE5yU2FtcGxlc01pbiA9Ci0gICAgICAgIChMVk1fSU5UMTYpKChzc3JjUGFyYW1zLk5yU2FtcGxlc0luID4gc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQpCi0gICAgICAgID8gc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgOiBzc3JjUGFyYW1zLk5yU2FtcGxlc0luKTsKLQotICAgIHdoaWxlKCBOclNhbXBsZXNNaW4gPCBNNE1DU19TU1JDX01JTkJMT0NLU0laRSApCi0gICAgeyAvKiBEb24ndCB0YWtlIGJsb2NrcyBzbWFsbGVyIHRoYXQgdGhlIG1pbmltYWwgYmxvY2sgc2l6ZSAqLwotICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gKExWTV9JTlQxNikoc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA8PCAxKTsKLSAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA8PCAxKTsKLSAgICAgICAgTnJTYW1wbGVzTWluID0gKExWTV9JTlQxNikoTnJTYW1wbGVzTWluIDw8IDEpOwotICAgIH0KLQotCi0gICAgcEMtPmlTc3JjTmJTYW1wbEluID0gKExWTV9JTlQxNikoCi0gICAgICAgIHNzcmNQYXJhbXMuCi0gICAgICAgIE5yU2FtcGxlc0luKTsgLyogbXVsdGlwbGljYXRpb24gYnkgTnJPZkNoYW5uZWxzIGlzIGRvbmUgYmVsb3cgKi8KLSAgICBwQy0+aVNzcmNOYlNhbXBsT3V0ID0gKExWTV9JTlQxNikoc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQpOwotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBpbnB1dCBvZiB0aGUgU1NSQyAqLwotICAgIHBDLT5wU3NyY0J1ZmZlckluID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+aVNzcmNOYlNhbXBsSW4gKiBzaXplb2Yoc2hvcnQpIFwKLSAgICAgICAgKnBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVscywgTTRNQ1MsCi0gICAgICAgIChNNE9TQV9DaGFyICopInBTc3JjQnVmZmVySW4iKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlckluICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVWaWRlb0RlY29kZXIoKTpcCi0gICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBTc3JjQnVmZmVySW4sIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSAoTTRPU0FfTWVtQWRkcjgpcEMtPnBTc3JjQnVmZmVySW47Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIG91dHB1dCBvZiB0aGUgU1NSQyAqLwotICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9Ci0gICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgXAotICAgICAgICAqcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzLCBNNE1DUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlck91dCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlVmlkZW9EZWNvZGVyKCk6XAotICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwU3NyY0J1ZmZlck91dCwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLQotICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IExWQXVkaW9SZXNhbXBsZXJDcmVhdGUoCi0gICAgICAgIDE2LCAvKmdJbnB1dFBhcmFtcy5sdkJUQ2hhbm5lbENvdW50Ki8KLSAgICAgICAgKE00T1NBX0ludDE2KXBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscy8qc3NyY1BhcmFtcy5TU1JDX05yT2ZDaGFubmVscyovLAotICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kpLypzc3JjUGFyYW1zLlNTUkNfRnNfT3V0Ki8sIDEpOwotCi0gICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wTFZBdWRpb1Jlc2FtcGxlcikKLSAgICAgewotICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICB9Ci0KLSAgICBMVkF1ZGlvc2V0U2FtcGxlUmF0ZShwQy0+cExWQXVkaW9SZXNhbXBsZXIsCi0gICAgICAgIC8qZ0lucHV0UGFyYW1zLmx2SW5TYW1wbGVSYXRlKi8KLSAgICAgICAgLypwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSovCi0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kvKnNzcmNQYXJhbXMuU1NSQ19Gc19JbiovKTsKLQotICAgIExWQXVkaW9zZXRWb2x1bWUocEMtPnBMVkF1ZGlvUmVzYW1wbGVyLCAoTTRPU0FfSW50MTYpKDB4MTAwMCAvKiAweDdmZmYgKi8pLAotICAgICAgICAoTTRPU0FfSW50MTYpKDB4MTAwMC8qMHg3ZmZmKi8pKTsKLQotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IEluaXQgdGhlIGF1ZGlvIGVuY29kZXIgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBhdWRpbyBlbmNvZGVyICovCi0KLSAgICBlcnIgPSBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0KCZwQy0+cEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgcEMtPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3Npbmc6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBPcGVuIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgZXJyID0gcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQy0+cEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgJnBDLT5BdWRpb0VuY1BhcmFtcywgJnBDLT5wQXVkaW9FbmNEU0ksCi0gICAgICAgIE00T1NBX05VTEwgLyogbm8gZ3JhYmJpbmcgKi8pOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb1Byb2Nlc3Npbmc6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgaW5wdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZW5jb2RlciAqLwotICAgIHN3aXRjaCggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCApCi0gICAgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rQU1STkI6Ci0gICAgICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgPSBNNE1DU19QQ01fQU1SX0dSQU5VTEFSSVRZX1NBTVBMRVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rQUFDOgotICAgICAgICAgICAgcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5ID0gTTRNQ1NfUENNX0FBQ19HUkFOVUxBUklUWV9TQU1QTEVTOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgb3V0cHV0IGZvcm1hdCovCi0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNUDM6Ci0gICAgICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgPSBNNE1DU19QQ01fTVAzX0dSQU5VTEFSSVRZX1NBTVBMRVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmKCBNNEVOQ09ERVJfa01vbm8gPT0gcEMtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gKQotICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgKj0gc2l6ZW9mKHNob3J0KTsKLSAgICBlbHNlCi0gICAgICAgIHBDLT5hdWRpb0VuY29kZXJHcmFudWxhcml0eSAqPSBzaXplb2Yoc2hvcnQpICogMjsKLQotICAgIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHksIE00TUNTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJwQy0+cEF1ZGlvRW5jb2RlckJ1ZmZlciIpOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRQcmVwYXJlQXVkaW9Qcm9jZXNzaW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVXcml0ZXIoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgUHJlcGFyZSB0aGUgd3JpdGVyLgotICogQHBhcmFtICAgIHBDICAgICAgICAgIChJTikgTUNTIHByaXZhdGUgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFByZXBhcmVXcml0ZXIoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpVmVyc2lvbjsgLyoqPCBUbyB3cml0ZSBjb21wb25lbnQgdmVyc2lvbiBpbiAzZ3Agd3JpdGVyICovCi0gICAgTTRPU0FfTWVtQWRkcjggcERTSSA9IE00T1NBX05VTEw7IC8qKjwgVG8gY3JlYXRlIHRoZSBEZWNvZGVyIFNwZWNpZmljIEluZm8gKi8KLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlIG9wdGlvblZhbHVlOyAvKio8IEZvciB0aGUgc2V0b3B0aW9uIGNhbGxzICovCi0gICAgTTRPU0FfVUludDMyIFRhcmdldGVkRmlsZVNpemU7Ci0gICAgTTRPU0FfQm9vbCBiTVVMUFBTU1BTID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIHdyaXRlciAqLwotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4oJnBDLT5wV3JpdGVyQ29udGV4dCwgcEMtPnBPdXRwdXRGaWxlLAotICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLCBwQy0+cFRlbXBvcmFyeUZpbGUsIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIExpbmsgdG8gdGhlIHdyaXRlciBjb250ZXh0IGluIHRoZSB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFdyaXRlckNvbnRleHQgPSBwQy0+cFdyaXRlckNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgcHJvZHVjdCBkZXNjcmlwdGlvbiBzdHJpbmcgaW4gdGhlIHdyaXR0ZW4gZmlsZSAqLwotICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX2tFbWJlZGRlZFN0cmluZywgKE00T1NBX0RhdGFPcHRpb24pIk5YUC1TVyA6IE1DUyAgICAiKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjpcCi0gICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgcHJvZHVjdCB2ZXJzaW9uIGluIHRoZSB3cml0dGVuIGZpbGUgKi8KLSAgICB1aVZlcnNpb24gPQotICAgICAgICBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SICogMTAwICsgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NSU5PUiAqIDEwCi0gICAgICAgICsgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9SRVZJU0lPTjsKLSAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uLCAoTTRPU0FfRGF0YU9wdGlvbikgJnVpVmVyc2lvbik7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKCggKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IFwKLSAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgYSB2aWRlbyBpbnB1dCwgYWxsb2NhdGUgYW5kIGZpbGwgdGhlIHZpZGVvIHN0cmVhbSBzdHJ1Y3R1cmVzIGZvciB0aGUgd3JpdGVyICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEZpbGwgVmlkZW8gcHJvcGVydGllcyBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uaGVpZ2h0ID0gcEMtPkVuY29kaW5nSGVpZ2h0OwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLndpZHRoID0gcEMtPkVuY29kaW5nV2lkdGg7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uZnBzID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPQotICAgICAgICAgICAgTTRPU0FfTlVMTDsgLyoqPCBXaWxsIGJlIHVwZGF0ZWQgbGF0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIuU2l6ZSA9IDA7IC8qKjwgV2lsbCBiZSB1cGRhdGVkIGxhdGVyICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogRmlsbCBWaWRlbyBzdHJlYW0gZGVzY3JpcHRpb24gc3RydWN0dXJlIGZvciB0aGUgQWRkU3RyZWFtIG1ldGhvZCAqLwotICAgICAgICBzd2l0Y2goIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QRUc0OgotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa01QRUdfNDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjM6Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rSDI2MzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjQ6Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa05VTEw6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tNUEVHXzQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rSDI2MzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tIMjY0OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBjYXNlIGlucHV0PU00RU5DT0RFUl9rTlVMTCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKio8IEl0IHNob3VsZCBuZXZlciBoYXBwZW4sIGFscmVhZHkgdGVzdGVkICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiB1bmtub3duIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVmlkZW8gYml0cmF0ZSB2YWx1ZSB3aWxsIGJlIHRoZSByZWFsIHZhbHVlICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfSW50MzIpcEMtPnVpRW5jVmlkZW9CaXRyYXRlOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0ubWF4Qml0cmF0ZSA9IChNNE9TQV9JbnQzMilwQy0+dWlFbmNWaWRlb0JpdHJhdGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogbW9zdCBvdGhlciBwYXJhbWV0ZXJzIGFyZSAiZHVtbXkiICovCi0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbS50aW1lU2NhbGUgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW0uZHVyYXRpb24gPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgIHNpemVvZihNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKTsKLSAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikgJihwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgRW5jb2RlciBIZWFkZXIgcHJvcGVydGllcyBmb3IgVmlkZW8gc3RyZWFtIGlmIG5lZWRlZCAqLwotICAgICAgICBpZiggTTRFTkNPREVSX2tIMjYzID09IHBDLT5FbmNvZGluZ1ZpZGVvRm9ybWF0ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENyZWF0ZXMgdGhlIEgyNjMgRFNJICovCi0gICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5TaXplID0KLSAgICAgICAgICAgICAgICA3OyAvKio8IEgyNjMgb3V0cHV0IERTSSBpcyBhbHdheXMgNyBieXRlcyAqLwotICAgICAgICAgICAgcERTSSA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoNywgTTRNQ1MsIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAgICAgKikicEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiAoRFNJIEgyNjMpIik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBEU0kgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlV3JpdGVyKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBwRFNJIChIMjYzKSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVmVuZG9yIGlzIE5YUCBTb2Z0d2FyZTogTiwgWCwgUCwgUy4gKi8KLSAgICAgICAgICAgIHBEU0lbMF0gPSAnTic7Ci0gICAgICAgICAgICBwRFNJWzFdID0gJ1gnOwotICAgICAgICAgICAgcERTSVsyXSA9ICdQJzsKLSAgICAgICAgICAgIHBEU0lbM10gPSAnUyc7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBEZWNvZGVyIHZlcnNpb24gaXMgMCAqLwotICAgICAgICAgICAgcERTSVs0XSA9IDA7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBMZXZlbCBpcyB0aGUgc2l4dGggYnl0ZSBvZiB0aGUgRFNJLiAqLwotICAgICAgICAgICAgc3dpdGNoKCBwQy0+RW5jb2RpbmdXaWR0aCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfU1FDSUZfV2lkdGg6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfUUNJRl9XaWR0aDoKLSAgICAgICAgICAgICAgICAgICAgaWYoICggcEMtPnVpRW5jVmlkZW9CaXRyYXRlIDw9IE00RU5DT0RFUl9rNjRfS0JQUykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazE1X0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gMTA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPD0gTTRFTkNPREVSX2sxMjhfS0JQUykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazE1X0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gNDU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPD0gTTRFTkNPREVSX2sxMjhfS0JQUykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazMwX0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gMjA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUgPD0gTTRFTkNPREVSX2szODRfS0JQUykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazMwX0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gMzA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwQy0+dWlFbmNWaWRlb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIDw9IE00RU5DT0RFUl9rODAwX0tCUFMvKjIwNDgqLykKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwQy0+RW5jb2RpbmdWaWRlb0ZyYW1lcmF0ZSA8PSBNNEVOQ09ERVJfazMwX0ZQUykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRFNJWzVdID0gNDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9DSUZfV2lkdGg6Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazEyOF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMTVfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAyMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZSA8PSBNNEVOQ09ERVJfazM4NF9LQlBTKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSAzMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIHBDLT51aUVuY1ZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRFTkNPREVSX2s4MDBfS0JQUy8qMjA0OCovKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5FbmNvZGluZ1ZpZGVvRnJhbWVyYXRlIDw9IE00RU5DT0RFUl9rMzBfRlBTKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEU0lbNV0gPSA0MDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFByb2ZpbGUgaXMgdGhlIHNldmVudGggYnl0ZSBvZiB0aGUgRFNJLiAqLwotICAgICAgICAgICAgcERTSVs2XSA9IDA7Ci0KLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPSBwRFNJOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00RU5DT0RFUl9rTlVMTCA9PSBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIHdlIGNvcHkgdGhlIHN0cmVhbSBmcm9tIHRoZSBpbnB1dCwgd2UgY29weSBpdHMgRFNJICovCi0KLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLlNpemUgPSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvU3RyZWFtSW5mby5IZWFkZXIucEJ1ZiA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0KLSAgICAgICAgfQotICAgICAgICAvKiBvdGhlcndpc2UgKE1QRUc0KSwgdGhlIERTSSB3aWxsIGJlIHJlY292ZXJlZCBmcm9tIHRoZSBlbmNvZGVyIGxhdGVyIG9uLiAqLwotCi0gICAgICAgIC8qK0NSTFY2Nzc1IC0gSC4yNjQgVHJpbW1pbmcgICovCi0gICAgICAgIGlmKCBwQy0+YkgyNjRUcmltID09IE00T1NBX1RSVUUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiTVVMUFBTU1BTID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTVVMX1BQU19TUFMsCi0gICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZiTVVMUFBTU1BTKTsKLQotICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgJiYgKCggKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAgICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjpcCi0gICAgICAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTVVMX1BQU19TUFMpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKi1DUkxWNjc3NSAtIEguMjY0IFRyaW1taW5nICAqLwotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgdGhlIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgJnBDLT5Xcml0ZXJWaWRlb1N0cmVhbSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0QWRkU3RyZWFtKHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVwZGF0ZSBBVSBwcm9wZXJ0aWVzIGZvciB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuc3RyZWFtID0gJihwQy0+V3JpdGVyVmlkZW9TdHJlYW0pOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLnNpemUgPSAwOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5DVFMgPSAwOyAvKiogUmVzZXQgdGltZSAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5EVFMgPSAwOwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5hdHRyaWJ1dGUgPSBBVV9SQVA7Ci0gICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLm5iRnJhZyA9IDA7IC8qKiBObyBmcmFnbWVudCAqLwotICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5mcmFnID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHdyaXRlciBtYXggdmlkZW8gQVUgc2l6ZSAqLwotICAgICAgICBvcHRpb25WYWx1ZS5zdHJlYW1JRCA9IE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgIG9wdGlvblZhbHVlLnZhbHVlID0gcEMtPnVpVmlkZW9NYXhBdVNpemU7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogXAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCB2aWRlbyBjaHVuayBzaXplICovCi0gICAgICAgIG9wdGlvblZhbHVlLnZhbHVlID0gcEMtPnVpVmlkZW9NYXhDaHVuY2tTaXplOwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6XAotICAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTWF4QVVTaXplLCB2aWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIElmIHRoZXJlIGlzIGFuIGF1ZGlvIGlucHV0LCBhbGxvY2F0ZSBhbmQgZmlsbCB0aGUgYXVkaW8gc3RyZWFtIHN0cnVjdHVyZXMgZm9yIHRoZSB3cml0ZXIgKi8KLSAgICBpZiggcEMtPm5vYXVkaW8gPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyBzdHJlYW1BdWRpb0luZm87Ci0KLSAgICAgICAgc3RyZWFtQXVkaW9JbmZvLm5iU2FtcGxlc1BlclNlYyA9IDA7IC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLSAgICAgICAgc3RyZWFtQXVkaW9JbmZvLm5iQml0c1BlclNhbXBsZSA9IDA7IC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLSAgICAgICAgc3RyZWFtQXVkaW9JbmZvLm5iQ2hhbm5lbHMgPSAxOyAgICAgIC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLQotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgMDsgLyoqPCBJdCBpcyBub3QgdXNlZCBieSB0aGUgc2hlbGwsIHRoZSBEU0kgaXMgdGFrZW4gaW50byBhY2NvdW50IGluc3RlYWQgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBGaWxsIEF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgICAgIHN3aXRjaCggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tBTVJOQjoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tBQUM6Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlOwotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5tYXhCaXRyYXRlID0gcEMtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAvKkZsQiAyNi4wMi4yMDA5OiBhZGQgbXAzIGFzIG91dHB1dCBmb3JtYXQqLwotICAgICAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QMzoKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tNUDM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tBdWRpb05VTEw6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIC8qRmxCIDI2LjAyLjIwMDk6IGFkZCBtcDMgYXMgb3V0cHV0IGZvcm1hdCovCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVAzOgotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tNUDM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSA9IE00U1lTX2tFVlJDOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tQQ006Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW86Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDogLyoqPCBJdCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBhbHJlYWR5IHRlc3RlZCAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogXAotICAgICAgICAgICAgICAgICAgICB1bmtub3duIGZvcm1hdCAoMHgleCksIHJldHVybmluZyBNNE1DU19FUlJfVU5ERUZJTkVEX09VVFBVVF9BVURJT19GT1JNQVQiLAotICAgICAgICAgICAgICAgICAgICBwQy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTUNTIHByb2R1Y2VzIG9ubHkgQU1SLU5CIG91dHB1dCAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtSUQgPSBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uZHVyYXRpb24gPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvU3RyZWFtLnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9TdHJlYW0udGltZVNjYWxlID0gcEMtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeTsKLQotICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIHdlIGNvcHkgdGhlIHN0cmVhbSBmcm9tIHRoZSBpbnB1dCwgd2UgY29weSBpdHMgRFNJICovCi0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLlNpemUgPSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5wQnVmID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+cEF1ZGlvRW5jRFNJLnBJbmZvICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFVzZSB0aGUgRFNJIGdpdmVuIGJ5IHRoZSBlbmNvZGVyIG9wZW4oKSAqLwotICAgICAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIuU2l6ZSA9IHBDLT5wQXVkaW9FbmNEU0kuaW5mb1NpemU7Ci0gICAgICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5wQnVmID0gcEMtPnBBdWRpb0VuY0RTSS5wSW5mbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXcml0ZXIgd2lsbCBwdXQgYSBkZWZhdWx0IFBoaWxpcHMgRFNJICovCi0gICAgICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5TaXplID0gMDsKLSAgICAgICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogT3VyIHdyaXRlciBzaGVsbCBpbnRlcmZhY2UgaXMgYSBsaXR0bGUgdHJpY2t5OiB3ZSBwdXQgTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcwotICAgICAgICAgaW4gdGhlIERTSSBwb2ludGVyLi4uICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpICZzdHJlYW1BdWRpb0luZm87Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWRkIHRoZSBhdWRpbyBzdHJlYW0gdG8gdGhlIHdyaXRlciAqLwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgJnBDLT5Xcml0ZXJBdWRpb1N0cmVhbSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0QWRkU3RyZWFtKGF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTGluayB0aGUgQVUgYW5kIHRoZSBzdHJlYW0gKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc3RyZWFtID0gJihwQy0+V3JpdGVyQXVkaW9TdHJlYW0pOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSAwOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5DVFMgPSAwOyAvKiogUmVzZXQgdGltZSAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5EVFMgPSAwOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5hdHRyaWJ1dGUgPSAwOwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5uYkZyYWcgPSAwOyAvKiogTm8gZnJhZ21lbnQgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuZnJhZyA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgYXVkaW8gbWF4IEFVIHNpemUgKi8KLSAgICAgICAgLyogQXMgbWF4IGJpdHJhdGUgaXMgbm93IDMyMGticHMgaW5zdGVhZCBvZiAxMjhrYnBzLCBtYXggQVUKLSAgICAgICAgICogc2l6ZSBoYXMgdG8gYmUgaW5jcmVhc2VkIGFkYXB0IHRoZSBtYXggQVUgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIHN0cmVhbSB0eXBlIGFuZCB0aGUKLSAgICAgICAgICogY2hhbm5lbHMgbnVtYmVycyovCi0gICAgICAgIC8qIEFmdGVyIHRlc3RzLCBhIG1hcmdpbiBvZiAzIGlzIHRha2VuICgyIHdhcyBub3QgZW5vdWdoIGFuZCByYWlzZXMgdG8gbWVtb3J5IG92ZXJ3cml0ZSkKLSAgICAgICAgICovCi0gICAgICAgIC8vcEMtPnVpQXVkaW9NYXhBdVNpemUgPSBNNE1DU19BVURJT19NQVhfQVVfU0laRTsKLSAgICAgICAgc3dpdGNoKCBwQy0+V3JpdGVyQXVkaW9TdHJlYW0uc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IE00TUNTX1BDTV9BTVJfR1JBTlVMQVJJVFlfU0FNUExFUwotICAgICAgICAgICAgICAgICAgICAqICgoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihzaG9ydCkpICsgMyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa01QMzoKLSAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IE00TUNTX1BDTV9NUDNfR1JBTlVMQVJJVFlfU0FNUExFUwotICAgICAgICAgICAgICAgICAgICAqICgoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihzaG9ydCkpICsgMyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLSAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IE00TUNTX1BDTV9BQUNfR1JBTlVMQVJJVFlfU0FNUExFUwotICAgICAgICAgICAgICAgICAgICAqICgoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihzaG9ydCkpICsgMyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgLypjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgICAgIHBDLT51aUF1ZGlvTWF4QXVTaXplID0gTTRNQ1NfUENNX0VWUkNfR1JBTlVMQVJJVFlfU0FNUExFUyoKLSAgICAgICAgICAgICAgICAoKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyAqIHNpemVvZihzaG9ydCkpKzMpOwotICAgICAgICAgICAgICAgIGJyZWFrOyovCi0gICAgICAgICAgICBkZWZhdWx0OiAvKio8IEl0IHNob3VsZCBuZXZlciBoYXBwZW4sIGFscmVhZHkgdGVzdGVkICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiB1bmtub3duIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00TUNTX0VSUl9VTkRFRklORURfT1VUUFVUX0FVRElPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uVmFsdWUuc3RyZWFtSUQgPSBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBvcHRpb25WYWx1ZS52YWx1ZSA9IHBDLT51aUF1ZGlvTWF4QXVTaXplOwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4QVVTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVXcml0ZXI6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKGF1ZGlvLFwKLSAgICAgICAgICAgICAgICBNNFdSSVRFUl9rTWF4QVVTaXplKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uVmFsdWUudmFsdWUgPSBNNE1DU19BVURJT19NQVhfQ0hVTktfU0laRTsKLSAgICAgICAgZXJyID0gcEMtPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heENodW5ja1NpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKCggKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAgICAgIT0gZXJyKSApIC8qIHRoaXMgb3B0aW9uIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYnkgc29tZSB3cml0ZXJzICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihhdWRpbyxcCi0gICAgICAgICAgICAgICAgTTRXUklURVJfa01heENodW5ja1NpemUpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICogU2V0IHRoZSBsaW1pdGF0aW9uIHNpemUgb2YgdGhlIHdyaXRlciAqLwotICAgIFRhcmdldGVkRmlsZVNpemUgPSBwQy0+dWlNYXhGaWxlU2l6ZTsKLSAgICAvKiBhZGQgMSBrQiBtYXJnaW4gKi8KLSAgICBpZiggVGFyZ2V0ZWRGaWxlU2l6ZSA+IDgxOTIgKQotICAgICAgICBUYXJnZXRlZEZpbGVTaXplIC09IDEwMjQ7Ci0KLSAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhGaWxlU2l6ZSwKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZUYXJnZXRlZEZpbGVTaXplKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoKCAoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZVdyaXRlcjogcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb25cCi0gICAgICAgICAgICAoTTRXUklURVJfa01heEZpbGVTaXplKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSB0aGUgc3RyZWFtIHJlZ2lzdGVyaW5nIGluIG9yZGVyIHRvIGJlIHJlYWR5IHRvIHdyaXRlIGRhdGEgKi8KLSAgICBlcnIgPSBwQy0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTdGFydFdyaXRpbmcocEMtPnBXcml0ZXJDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlV3JpdGVyOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0V3JpdGluZyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFByZXBhcmVXcml0ZXIoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyk7Ci0gKiBAYnJpZWYgICAgRE8gdGhlIGF1ZGlvIGJlZ2luIGN1dC4KLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAoSU4pIE1DUyBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SICBObyBlcnJvcgotICogQHJldHVybiAgIEFueSBlcnJvciByZXR1cm5lZCBieSBhbiB1bmRlcmxheWluZyBtb2R1bGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9JbnQzMiBpQ3RzOwotICAgIE00T1NBX1VJbnQzMiB1aUZyYW1lU2l6ZTsKLQotICAgIGlmKCBwQy0+bm9hdWRpbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBhbiBhdWRpbyBiZWdpbiBjdXQgaXMgbmVlZGVkICovCi0gICAgaWYoICggTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSB8fCAoMCA9PSBwQy0+dWlCZWdpbkN1dFRpbWUpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIChhKSIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEp1bXAgYXQgdGhlIGJlZ2luIGN1dCB0aW1lICovCi0gICAgaUN0cyA9IHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RKdW1wKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLCAmaUN0cyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQ6IG1fcEZjdEp1bXAoQXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJlbWVtYmVyIGF1ZGlvIGJlZ2luIGN1dCBvZmZzZXQgKi8KLSAgICBwQy0+aUF1ZGlvQ3RzT2Zmc2V0ID0gaUN0czsKLQotICAgIC8qKgotICAgICogQU1SLU5CICYgRVZSQzogdGhlcmUgbWF5IGJlIG1hbnkgZnJhbWVzIHBlciBBVS4KLSAgICAqIEluIHRoYXQgY2FzZSB3ZSBuZWVkIHRvIHNsaWNlIHRoZSBmaXJzdCBBVSB0byBrZWVwIHRoZSAyMCBtcyBjdXQgcHJlY2lzaW9uICovCi0gICAgaWYoICggTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kCi0gICAgICAgID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkKLSAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYwotICAgICAgICA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIElmIHRoZSBuZXh0IGZyYW1lIENUUyBpcyBsb3dlciB0aGFuIHRoZSBiZWdpbiBjdXQgdGltZSwKLSAgICAgICAgKiB3ZSBtdXN0IHJlYWQgdGhlIEFVIGFuZCBwYXJzZSBpdHMgZnJhbWVzIHRvIHJlYWNoIHRoZQotICAgICAgICAqIG5lYXJlc3QgdG8gdGhlIGJlZ2luIGN1dCAqLwotICAgICAgICBpZiggKCBpQ3RzICsgMjApIDwgKE00T1NBX0ludDMyKXBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBSZWFkIHRoZSBmaXJzdCBhdWRpbyBBVSBhZnRlciB0aGUganVtcCAqLwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCk6IG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KGF1ZGlvKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSEgUmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBubyBmYXRhbCBlcnJvciBoZXJlLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBwdXJzdWUgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFByZXBhcmVBdWRpb0JlZ2luQ3V0KCk6IG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KEF1ZGlvKVwKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFdoaWxlIHRoZSBuZXh0IEFVIGhhcyBhIGxvd2VyIENUUyB0aGFuIHRoZSBiZWdpbiBjdXQgdGltZSwgd2UgYWR2YW5jZSB0bwotICAgICAgICAgICAgdGhlIG5leHQgZnJhbWUgKi8KLSAgICAgICAgICAgIHdoaWxlKCAoIGlDdHMgKyAyMCkgPD0gKE00T1NBX0ludDMyKXBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIGZyYW1lICovCi0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aUZyYW1lU2l6ZSA9IE00TUNTX2ludEdldEZyYW1lU2l6ZV9BTVJOQigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjOgotICAgICAgICAgICAgICAgICAgICAgICAgdWlGcmFtZVNpemUgPSBNNE1DU19pbnRHZXRGcmFtZVNpemVfRVZSQygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aUZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggMCA9PSB1aUZyYW1lU2l6ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBDb3JydXB0ZWQgZnJhbWUhIFdlIGdldCBvdXQgb2YgdGhpcyBtZXNzIQotICAgICAgICAgICAgICAgICAgICAqIFdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZS4uLiAqLwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRQcmVwYXJlQXVkaW9CZWdpbkN1dCgpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19pbnRHZXRGcmFtZVNpemVfeHh4IHJldHVybnMgMCEgUmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IG5vIGZhdGFsIGVycm9yIGhlcmUsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHB1cnN1ZSAqLwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogR28gdG8gdGhlIG5leHQgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzICs9IHVpRnJhbWVTaXplOwotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSAtPSB1aUZyYW1lU2l6ZTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogR2V0IHRoZSBDVFMgb2YgdGhlIG5leHQgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBpQ3RzICs9IDIwOyAvKio8IEFNUiwgRVZSQyBmcmFtZSBkdXJhdGlvbiBpcyBhbHdheXMgMjAgbXMgKi8KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUyA9IGlDdHM7Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9EVFMgPSBpQ3RzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVXBkYXRlIHRoZSBhdWRpbyBiZWdpbiBjdXQgb2Zmc2V0ICovCi0gICAgICAgICAgICBwQy0+aUF1ZGlvQ3RzT2Zmc2V0ID0gaUN0czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50UHJlcGFyZUF1ZGlvQmVnaW5DdXQoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEVuY29kaW5nKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMsIE00T1NBX1VJbnQ4KiBwUHJvZ3Jlc3MpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEVuY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggKnBQcm9ncmVzcyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdWlBdWRpb1N0ZXBDb3VudCA9IDA7Ci0KLSAgICAvKiAtLS0tLS0tLS0tIFZJREVPIFRSQU5TQ09ESU5HIC0tLS0tLS0tLS0gKi8KLQotICAgIGlmKCAoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFKSAmJiAoTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQKLSAgICAgICAgPT0gcEMtPlZpZGVvU3RhdGUpICkgLyoqPCBJZiB0aGUgdmlkZW8gZW5jb2RpbmcgaXMgZ29pbmcgb24gKi8KLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyhwQyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKHBDKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIE5vIG1vcmUgc3BhY2UsIHF1aXQgcHJvcGVybHkgKi8KLSAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSgoICggKE00T1NBX1VJbnQzMilwQy0+ZFZpRGVjQ3VycmVudEN0cwotICAgICAgICAgICAgICAgIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSAqIDEwMCkKLSAgICAgICAgICAgICAgICAvIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0KLSAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9GSU5JU0hFRDsKLQotICAgICAgICAgICAgLyogYmFkIGZpbGUgcHJvZHVjZWQgb24gdmVyeSBzaG9ydCAzZ3AgZmlsZSAqLwotICAgICAgICAgICAgaWYoIHBDLT5kVmlEZWNDdXJyZW50Q3RzIC0gcEMtPnVpQmVnaW5DdXRUaW1lID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgaGFzIGJlZW4gZW5jb2RlZCAtPiBiYWQgcHJvZHVjZWQgZmlsZSAtPiBlcnJvciByZXR1cm5lZCAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IHZpZGVvIHRyYW5zY29kaW5nIHJldHVybnNcCi0gICAgICAgICAgICAgICAgICAgICBNNE1DU19FUlJfT1VUUFVUX0ZJTEVfU0laRV9UT09fU01BTEwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX09VVFBVVF9GSUxFX1NJWkVfVE9PX1NNQUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSAgICAgICAgICAgICAgICAvKiBjbGVhbiBBSVIgY29udGV4dCBuZWVkZWQgdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPm1fYWlyX2NvbnRleHQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IEVycm9yIHdoZW4gY2xlYW5pbmcgQUlSOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLypNNE1DU19BVURJT09OTFkqLwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogdmlkZW8gdHJhbnNjb2RpbmcgcmV0dXJucyBNNE1DU19FUlJfTk9NT1JFX1NQQUNFIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9OT01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKio8IFRoZSBpbnB1dCBwbGFuZSBpcyBudWxsIGJlY2F1c2UgdGhlIGlucHV0IGltYWdlIHdpbGwgYmUgb2J0YWluZWQgYnkgdGhlCi0gICAgICAgIFZQUCBmaWx0ZXIgZnJvbSB0aGUgY29udGV4dCAqLwotICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogdmlkZW8gdHJhbnNjb2RpbmcgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tIEFVRElPIFRSQU5TQ09ESU5HIC0tLS0tLS0tLS0gKi8KLQotICAgIGlmKCAoIHBDLT5ub2F1ZGlvID09IE00T1NBX0ZBTFNFKSAmJiAoTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQKLSAgICAgICAgPT0gcEMtPkF1ZGlvU3RhdGUpICkgLyoqPCBJZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIHdoaWxlKAotICAgICAgICAgICAgLyoqPCBJZiB0aGUgdmlkZW8gZW5jb2RpbmcgaXMgcnVubmluZywgZW5jb2RlIGF1ZGlvIHVudGlsIHdlIHJlYWNoIHZpZGVvIHRpbWUgKi8KLSAgICAgICAgICAgICggKCBwQy0+bm92aWRlbyA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgICYmIChNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRCA9PSBwQy0+VmlkZW9TdGF0ZSkKLSAgICAgICAgICAgICYmIChwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgKyBwQy0+bV9hdWRpb0FVRHVyYXRpb24gPCBwQy0+UmVhZGVyVmlkZW9BVS5tX0NUUykpIHx8Ci0gICAgICAgICAgICAvKio8IElmIHRoZSB2aWRlbyBlbmNvZGluZyBpcyBub3QgcnVubmluZywgcGVyZm9ybSAxIHN0ZXAgb2YgYXVkaW8gZW5jb2RpbmcgKi8KLSAgICAgICAgICAgICgoIE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEID09IHBDLT5BdWRpb1N0YXRlKQotICAgICAgICAgICAgJiYgKHVpQXVkaW9TdGVwQ291bnQgPCAxKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUF1ZGlvU3RlcENvdW50Kys7Ci0KLSAgICAgICAgICAgIC8qKjwgY2hlY2sgaWYgYW4gYWRpbyBlZmZlY3QgaGFzIHRvIGJlIGFwcGxpZWQqLwotICAgICAgICAgICAgZXJyID0gTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMocEMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IE00TUNTX2ludENoZWNrQXVkaW9FZmZlY3RzIHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcEMtPkF1ZGlvRW5jUGFyYW1zLkZvcm1hdCA9PSBNNEVOQ09ERVJfa0F1ZGlvTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcocEMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKio8IEF1ZGlvIHRyYW5zY29kaW5nICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZyhwQyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBObyBtb3JlIHNwYWNlLCBxdWl0IHByb3Blcmx5ICovCi0gICAgICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQcm9ncmVzcyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCkoKCAoIChNNE9TQV9VSW50MzIpcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMKLSAgICAgICAgICAgICAgICAgICAgLSBwQy0+dWlCZWdpbkN1dFRpbWUpICogMTAwKQotICAgICAgICAgICAgICAgICAgICAvIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0KLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfRklOSVNIRUQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBiYWQgZmlsZSBwcm9kdWNlZCBvbiB2ZXJ5IHNob3J0IDNncCBmaWxlICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTIC0gcEMtPnVpQmVnaW5DdXRUaW1lID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogTm90aGluZyBoYXMgYmVlbiBlbmNvZGVkIC0+IGJhZCBwcm9kdWNlZCBmaWxlIC0+IGVycm9yIHJldHVybmVkICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFuc2NvZGluZyByZXR1cm5zIE00TUNTX0VSUl9PVVRQVVRfRklMRV9TSVpFX1RPT19TTUFMTCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX09VVFBVVF9GSUxFX1NJWkVfVE9PX1NNQUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSAgICAgICAgICAgICAgICAgICAgLyogY2xlYW4gQUlSIGNvbnRleHQgbmVlZGVkIHRvIGtlZXAgbWVkaWEgYXNwZWN0IHJhdGlvKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+bV9haXJfY29udGV4dCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogRXJyb3Igd2hlbiBjbGVhbmluZyBBSVI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRTdGVwRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gdHJhbnNjb2RpbmcgcmV0dXJucyBNNE1DU19FUlJfTk9NT1JFX1NQQUNFIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfTk9NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiBhdWRpbyB0cmFuc2NvZGluZyByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBFbmNvZGluZygpOiBhdWRpbyB0cmFuc2NvZGluZyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDaGVjayBmb3IgZW5kIGN1dCAqLwotICAgICAgICAgICAgLyogV2UgYWJzb2x1dGVseSB3YW50IHRvIGhhdmUgbGVzcyBvciBzYW1lIGF1ZGlvIGR1cmF0aW9uIGFzIHZpZGVvIC0+Ci0gICAgICAgICAgICAoMipwQy0+bV9hdWRpb0FVRHVyYXRpb24pICovCi0gICAgICAgICAgICBpZiggKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgICAgICsgKDIgKnBDLT5tX2F1ZGlvQVVEdXJhdGlvbikgPiBwQy0+dWlFbmRDdXRUaW1lICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+QXVkaW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIC0tLS0tLS0tLS0gUFJPR1JFU1MgTUFOQUdFTUVOVCAtLS0tLS0tLS0tICovCi0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgcHJvZ3Jlc3MgKi8KLSAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTIDwgcEMtPnVpQmVnaW5DdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSgoICggKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUwotICAgICAgICAgICAgICAgIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSAqIDEwMCkKLSAgICAgICAgICAgICAgICAvIChwQy0+dWlFbmRDdXRUaW1lIC0gcEMtPnVpQmVnaW5DdXRUaW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9wcmludGYoIjogJTYuMGZcYlxiXGJcYlxiXGJcYlxiIiwgcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMpOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+ZFZpRGVjQ3VycmVudEN0cyA8IHBDLT51aUJlZ2luQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwUHJvZ3Jlc3MgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IChNNE9TQV9VSW50OCkoKCAoIChNNE9TQV9VSW50MzIpcEMtPmRWaURlY0N1cnJlbnRDdHMKLSAgICAgICAgICAgICAgICAtIHBDLT51aUJlZ2luQ3V0VGltZSkgKiAxMDApCi0gICAgICAgICAgICAgICAgLyAocEMtPnVpRW5kQ3V0VGltZSAtIHBDLT51aUJlZ2luQ3V0VGltZSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vcHJpbnRmKCI6ICU2LjBmXGJcYlxiXGJcYlxiXGJcYiIsIHBDLT5kVmlEZWNDdXJyZW50Q3RzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKCAqcFByb2dyZXNzID4gOTkgKQotICAgIHsKLSAgICAgICAgKnBQcm9ncmVzcyA9IDk5OwotICAgIH0KLQotICAgIC8qKgotICAgICogSW5jcmVtZW50IENUUyBmb3IgbmV4dCBzdGVwICovCi0gICAgaWYoIHBDLT5ub3ZpZGVvID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzICs9ICAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmRWaURlY0N1cnJlbnRDdHMgKz0gcEMtPmRDdHNJbmNyZW1lbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFRoZSB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCB3aGVuIG5vIHN0cmVhbSBpcyBiZWluZyBlbmNvZGVkIGFueW1vcmUgKi8KLSAgICBpZiggKCAoIHBDLT5ub3ZpZGVvKSB8fCAoTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEID09IHBDLT5WaWRlb1N0YXRlKSkKLSAgICAgICAgJiYgKCggcEMtPm5vYXVkaW8pIHx8IChNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQgPT0gcEMtPkF1ZGlvU3RhdGUpKSApCi0gICAgewotICAgICAgICAvKiB0aGUgQUlSIHBhcnQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHZpZGVvIGNvZGVjcyBhcmUgY29tcGlsZWQqLwotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSAgICAgICAgLyogY2xlYW4gQUlSIGNvbnRleHQgbmVlZGVkIHRvIGtlZXAgbWVkaWEgYXNwZWN0IHJhdGlvKi8KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+bV9haXJfY29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogRXJyb3Igd2hlbiBjbGVhbmluZyBBSVI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qTTRNQ1NfQVVESU9PTkxZKi8KLSAgICAgICAgLyoqLwotCi0gICAgICAgICpwUHJvZ3Jlc3MgPSAxMDA7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IHRyYW5zY29kaW5nIGZpbmlzaGVkLCByZXR1cm5pbmcgTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkUiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9UUkFOU0NPRElOR19ET05FOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50U3RlcEVuY29kaW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcChNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcCggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9JbnQzMiBpQ3RzOwotCi0gICAgaWYoIHBDLT5ub3ZpZGVvICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPREVDT0RFOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEp1bXAgdG8gdGhlIHByZXZpb3VzIFJBUCBpbiB0aGUgY2xpcCAoZmlyc3QgZ2V0IHRoZSB0aW1lLCB0aGVuIGp1bXApICovCi0gICAgaUN0cyA9IChNNE9TQV9JbnQzMilwQy0+ZFZpRGVjU3RhcnRpbmdDdHM7Ci0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0UHJldlJhcFRpbWUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sICZpQ3RzKTsKLQotICAgIGlmKCBNNFdBUl9SRUFERVJfSU5GT1JNQVRJT05fTk9UX1BSRVNFTlQgPT0gZXJyICkKLSAgICB7Ci0gICAgICAgIC8qIE5vIFJBUCB0YWJsZSwganVtcCBiYWNrd2FyZCBhbmQgcHJlZGVjb2RlICovCi0gICAgICAgIGlDdHMgPSAoTTRPU0FfSW50MzIpcEMtPmRWaURlY1N0YXJ0aW5nQ3RzIC0gTTRNQ1NfTk9fU1RTU19KVU1QX1BPSU5UOwotCi0gICAgICAgIGlmKCBpQ3RzIDwgMCApCi0gICAgICAgICAgICBpQ3RzID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wOiBtX3BGY3RHZXRQcmV2UmFwVGltZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogKyBDUkxWNjc3NSAtSC4yNjQgVHJpbW1pbmcgKi8KLQotICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0gKQotICAgIHsKLQotICAgICAgICAvLyBTYXZlIGp1bXAgdGltZSBmb3Igc2FmZXR5LCB0aGlzIGZpeCBzaG91bGQgYmUgZ2VuZXJpYwotCi0gICAgICAgIE00T1NBX0ludDMyIGlDdHNPcmkgPSBpQ3RzOwotCi0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0SnVtcChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sICZpQ3RzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wOiBtX3BGY3RKdW1wKFYpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVMS5tX3N0cnVjdFNpemUgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVMSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgIC8qIFRoZSBhdWRpbyB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICAgICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVMS5tX3N0cnVjdFNpemUgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gSDI2NE1DU19Qcm9jZXNzU1BTX1BQUyhwQy0+bV9wSW5zdGFuY2UsCi0gICAgICAgICAgICAoTTRPU0FfVUludDggKilwQy0+UmVhZGVyVmlkZW9BVTEubV9kYXRhQWRkcmVzcywgcEMtPlJlYWRlclZpZGVvQVUxLm1fc2l6ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFN0ZXBCZWdpblZpZGVvSnVtcDogSDI2NE1DU19Qcm9jZXNzU1BTX1BQUyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gUmVzdG9yZSBqdW1wIHRpbWUgZm9yIHNhZmV0eSwgdGhpcyBmaXggc2hvdWxkIGJlIGdlbmVyaWMKLQotICAgICAgICBpQ3RzID0gaUN0c09yaTsKLQotCi0gICAgfQotICAgIC8qIC0gQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0KLSAgICAvKioKLSAgICAqIERlY29kZSBvbmUgc3RlcCAqLwotICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gKE00T1NBX0RvdWJsZSkoaUN0cyArIHBDLT5pVmlkZW9CZWdpbkRlY0luY3IpOwotCi0gICAgLyoqCi0gICAgKiBCZSBzdXJlIHdlIGRvbid0IGRlY29kZSB0b28gZmFyICovCi0gICAgaWYoIHBDLT5kVmlEZWNDdXJyZW50Q3RzID4gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzICkKLSAgICB7Ci0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzOwotICAgIH0KLQotICAgIC8qKgotICAgICogRGVjb2RlIGF0IGxlYXN0IG9uY2Ugd2l0aCB0aGUgYkp1bXAgZmxhZyB0byB0cnVlICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0czogRGVjb2RpbmcgdXBUbyBDVFMgJS4zZiIsCi0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzKTsKLSAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9GQUxTRTsKLSAgICBlcnIgPQotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUocEMtPnBWaURlY0N0eHQsICZwQy0+ZFZpRGVjQ3VycmVudEN0cywKLSAgICAgICAgTTRPU0FfVFJVRSwgMCk7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKQotICAgICAgICAmJiAoZXJyICE9IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRTdGVwQmVnaW5WaWRlb0p1bXA6IG1fcEZjdERlY29kZSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggZXJyID09IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJEZWNvZGluZyBvdXRwdXQgdGhlIHNhbWUgZnJhbWUgYXMgYmVmb3JlIDEiKTsKLSAgICAgICAgcEMtPmlzUmVuZGVyRHVwID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluY3JlbWVudCBkZWNvZGluZyBjdHMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyArPSAoTTRPU0FfRG91YmxlKXBDLT5pVmlkZW9CZWdpbkRlY0luY3I7Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggcEMtPmRWaURlY0N1cnJlbnRDdHMgPiBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQmUgc3VyZSB3ZSBkb24ndCBkZWNvZGUgdG9vIGZhciAqLwotICAgICAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyA9IHBDLT5kVmlEZWNTdGFydGluZ0N0czsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX1BST0NFU1NJTkc7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00TUNTX2tTdGF0ZV9CRUdJTlZJREVPREVDT0RFOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9KdW1wKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFN0ZXBCZWdpblZpZGVvRGVjb2RlKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGUoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRfTWVkaWFUaW1lIGREZWNUYXJnZXQ7Ci0KLSAgICBpZiggcEMtPm5vdmlkZW8gKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX1BST0NFU1NJTkc7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICogRGVjb2RlICovCi0gICAgZERlY1RhcmdldCA9IHBDLT5kVmlEZWNDdXJyZW50Q3RzOwotICAgIE00T1NBX1RSQUNFM18xKCJNNE1DU19pbnRTdGVwQmVnaW5EZWNvZGU6IERlY29kaW5nIHVwVG8gQ1RTICUuM2YiLAotICAgICAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyk7Ci0gICAgcEMtPmlzUmVuZGVyRHVwID0gTTRPU0FfRkFMU0U7Ci0gICAgZXJyID0gcEMtPm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0RGVjb2RlKHBDLT5wVmlEZWNDdHh0LCAmZERlY1RhcmdldCwKLSAgICAgICAgTTRPU0FfRkFMU0UsIDApOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikKLSAgICAgICAgJiYgKGVyciAhPSBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSkgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50U3RlcEJlZ2luVmlkZW9EZWNvZGU6IG1fcEZjdERlY29kZSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggZXJyID09IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJEZWNvZGluZyBvdXRwdXQgdGhlIHNhbWUgZnJhbWUgYXMgYmVmb3JlIDIiKTsKLSAgICAgICAgcEMtPmlzUmVuZGVyRHVwID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluY3JlbWVudCBkZWNvZGluZyBjdHMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyArPSAoTTRPU0FfRG91YmxlKXBDLT5pVmlkZW9CZWdpbkRlY0luY3I7Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24sIGlmIG5lZWRlZCAqLwotICAgIGlmKCAoIChNNE9TQV9VSW50MzIpcEMtPmRWaURlY0N1cnJlbnRDdHMgPiBwQy0+ZFZpRGVjU3RhcnRpbmdDdHMpCi0gICAgICAgIHx8IChNNFdBUl9OT19NT1JFX0FVID09IGVycikgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQmUgc3VyZSB3ZSBkb24ndCBkZWNvZGUgdG9vIGZhciAqLwotICAgICAgICBwQy0+ZFZpRGVjQ3VycmVudEN0cyA9IChNNE9TQV9Eb3VibGUpcEMtPmRWaURlY1N0YXJ0aW5nQ3RzOwotICAgICAgICBwQy0+U3RhdGUgPSBNNE1DU19rU3RhdGVfUFJPQ0VTU0lORzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludFN0ZXBCZWdpblZpZGVvRGVjb2RlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGRlZmluZSBBTVIgc2lsZW5jZSBmcmFtZXMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUgMTMKLSNkZWZpbmUgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9EVVJBVElPTiAxNjAKLQotI2lmZGVmIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotCi1jb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4WwotICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRV0gPQotICAgIHsKLSAgICAgICAgMHgwNCwgMHhGRiwgMHgxOCwgMHhDNywgMHhGMCwgMHgwRCwgMHgwNCwgMHgzMywgMHhGRiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMAotICAgIH07Ci0jZWxzZQotCi1leHRlcm4KLWNvbnN0Ci1NNE9TQV9VSW50OAotTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OFtNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkVdOwotCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogZGVmaW5lIEFBQyBzaWxlbmNlIGZyYW1lcyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkUgICAgICA0Ci0KLSNpZmRlZiBNNFZTUzNHUFBfU0lMRU5DRV9GUkFNRVMKLQotY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9bCi0gICAgTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRV0gPQotICAgIHsKLSAgICAgICAgMHgwMCwgMHhDOCwgMHgyMCwgMHgwNwotICAgIH07Ci0jZWxzZQotCi1leHRlcm4gY29uc3QgTTRPU0FfVUludDgKLU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PW000VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkVdOwotCi0jZW5kaWYKLQotI2RlZmluZSBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkUgICAgICAgIDYKLQotI2lmZGVmIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotCi1jb25zdCBNNE9TQV9VSW50OCBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPWwotICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRV0gPQotICAgIHsKLSAgICAgICAgMHgyMSwgMHgxMCwgMHgwMywgMHgyMCwgMHg1NCwgMHgxQwotICAgIH07Ci0jZWxzZQotCi1leHRlcm4gY29uc3QKLU00T1NBX1VJbnQ4Ci1NNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPW000VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRV07Ci0KLSNlbmRpZgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBpZiBhbGwgYXVkaW8gZnJhbWUgaGFzIGJlZW4gd3JpdHRlbiAoaGFwcGVucyBhdCBiZWdpbiBjdXQpICovCi0gICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluaXRpYWxpemVzIGEgbmV3IEFVIGlmIG5lZWRlZCAqLwotICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUxLm1fc3RydWN0U2l6ZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlckF1ZGlvQVUxKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplLAotICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJUZW1wb3JhcnkgQVUxIGJ1ZmZlciIpOwotCi0gICAgICAgICAgICBpZiggcEMtPm1fcERhdGFBZGRyZXNzMSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVTEpOwotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTpcCi0gICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qRkIgMjAwOS4wNC4wMjogUFIgc3VybnhwIzYxNjogQ3Jhc2ggaW4gTUNTIHdoaWxlIEF1ZGlvIEFVIGNvcHlpbmcgLAotICAgICAgICAgICAgIGNvbnN0YW50IG1lbW9yeSByZWFkZXIgY2FzZSovCi0gICAgICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUxLm1fbWF4c2l6ZQotICAgICAgICA+IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMSksIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgICAgICAvKiBiZWNhdXNlIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplIHRha2UKLSAgICAgICAgICAgICAgICAgbWF4aW11bSB2YWx1ZS4gVGhlbiB0aGUgdGVzdCAiaWYocEMtPlJlYWRlckF1ZGlvQVU/Lm1fbWF4c2l6ZSA+Ci0gICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSkiIGlzIG5ldmVyIHRydWUgKi8KLSAgICAgICAgICAgICAgICAvKiBhbmQgdGhlIHNpemUgb2YgdGhlIHNlY29uZCBidWZmZXIgaXMgbmV2ZXIgY2hhbmdlZC4gKi8KLSAgICAgICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFBZGRyZXNzMiksIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhQWRkcmVzczEgYW5kCi0gICAgICAgICAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX21heHNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YUFkZHJlc3MxLAotICAgICAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlckF1ZGlvQVUxLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUxLm1fc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUyLm1fc3RydWN0U2l6ZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcEMtPlJlYWRlckF1ZGlvQVUyKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5tX3BEYXRhQWRkcmVzczIgPQotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPlJlYWRlckF1ZGlvQVUyLm1fbWF4c2l6ZSwKLSAgICAgICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikiVGVtcG9yYXJ5IEFVIGJ1ZmZlciIpOwotCi0gICAgICAgICAgICBpZiggcEMtPm1fcERhdGFBZGRyZXNzMiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICogUmVhZCB0aGUgbmV4dCBhdWRpbyBBVSBpbiB0aGUgaW5wdXQgZmlsZSAqLwotICAgICAgICBpZiggcEMtPlJlYWRlckF1ZGlvQVUyLm1fQ1RTID4gcEMtPlJlYWRlckF1ZGlvQVUxLm1fQ1RTICkKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICZwQy0+UmVhZGVyQXVkaW9BVSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKSAmcEMtPlJlYWRlckF1ZGlvQVUyLCBzaXplb2YoTTRfQWNjZXNzVW5pdCkpOwotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJBdWRpb0FVMSk7Ci0KLSAgICAgICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplCi0gICAgICAgICAgICAgICAgPiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQ29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlLCB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIHRlbXBvcmFyeSBidWZmZXJzICovCi0gICAgICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhQWRkcmVzczEpLCBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplKTsKLSAgICAgICAgICAgICAgICAvKiAgIHBDLT5tX3BEYXRhQWRkcmVzczEKLSAgICAgICAgICAgICAgICAgKiBhbmQgcEMtPm1fcERhdGFBZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKgotICAgICAgICAgICAgICAgICAqIGJlY2F1c2UgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZQotICAgICAgICAgICAgICAgICAqIG1heGltdW0gdmFsdWUuIFRoZW4gdGhlIHRlc3QgImlmKHBDLT5SZWFkZXJBdWRpb0FVPy5tX21heHNpemUgPgotICAgICAgICAgICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplKSIgaXMgbmV2ZXIgdHJ1ZSAqCi0gICAgICAgICAgICAgICAgICogYW5kIHRoZSBzaXplIG9mIHRoZSBzZWNvbmQgYnVmZmVyIGlzIG5ldmVyIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhQWRkcmVzczIpLCBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplKTsKLSAgICAgICAgICAgICAgICAvKiBwQy0+bV9wRGF0YUFkZHJlc3MxIGFuZAotICAgICAgICAgICAgICAgICAqIHBDLT5tX3BEYXRhQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lCi0gICAgICAgICAgICAgICAgICogVXBkYXRlIHN0cmVhbSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgPQotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTEubV9tYXhzaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPm1fcERhdGFBZGRyZXNzMSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVMS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVMS5tX3NpemUpOwotICAgICAgICAgICAgcEMtPm1fYXVkaW9BVUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTEubV9DVFMgLSBwQy0+UmVhZGVyQXVkaW9BVTIubV9DVFM7Ci0gICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gcEMtPm1fcERhdGFBZGRyZXNzMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSAmcEMtPlJlYWRlckF1ZGlvQVUsCi0gICAgICAgICAgICAgICAgKHZvaWQgKikgJnBDLT5SZWFkZXJBdWRpb0FVMSwgc2l6ZW9mKE00X0FjY2Vzc1VuaXQpKTsKLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVTIpOwotICAgICAgICAgICAgLyogQ3Jhc2ggaW4gTUNTIHdoaWxlIEF1ZGlvIEFVIGNvcHlpbmcgLAotICAgICAgICAgICAgICogY29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmKCBwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplCi0gICAgICAgICAgICAgICAgPiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQ29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlLCB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIHRlbXBvcmFyeSBidWZmZXJzICovCi0gICAgICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhQWRkcmVzczIpLCBwQy0+UmVhZGVyQXVkaW9BVTIubV9tYXhzaXplKTsKLSAgICAgICAgICAgICAgICAvKiBwQy0+bV9wRGF0YUFkZHJlc3MxIGFuZAotICAgICAgICAgICAgICAgICAqIHBDLT5tX3BEYXRhQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lCi0gICAgICAgICAgICAgICAgICogYmVjYXVzZSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSB0YWtlIG1heGltdW0KLSAgICAgICAgICAgICAgICAgKiB2YWx1ZS4gVGhlbiB0aGUgdGVzdCAiaWYocEMtPlJlYWRlckF1ZGlvQVU/Lm1fbWF4c2l6ZSA+IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAqIG1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplKSIgaXMgbmV2ZXIgdHJ1ZQotICAgICAgICAgICAgICAgICAqIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YUFkZHJlc3MxKSwgcEMtPlJlYWRlckF1ZGlvQVUyLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAgICAgLyogWyBFTkQgXSAyMDA5MTAwOCAgSkZWIFBSIGZpeCBzdXJueHBzdyMxMDcxOiBwQy0+bV9wRGF0YUFkZHJlc3MxIGFuZAotICAgICAgICAgICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUyLm1fbWF4c2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhQWRkcmVzczIsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyQXVkaW9BVTIubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVTIubV9zaXplKTsKLSAgICAgICAgICAgIHBDLT5tX2F1ZGlvQVVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUyLm1fQ1RTIC0gcEMtPlJlYWRlckF1ZGlvQVUxLm1fQ1RTOwotICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9kYXRhQWRkcmVzcyA9IHBDLT5tX3BEYXRhQWRkcmVzczE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2RpbmcoKTogXAotICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KGF1ZGlvKSByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgIC8qIFRoZSBhdWRpbyB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IFwKLSAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShBdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUHJlcGFyZSB0aGUgd3JpdGVyIEFVICovCi0gICAgZXJyID0gcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICBNNE1DU19XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPldyaXRlckF1ZGlvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBwQy0+dWlBdWRpb0FVQ291bnQKLSAgICAgICAgPT0gMCApIC8qIElmIGl0IGlzIHRoZSBmaXJzdCBBVSwgd2Ugc2V0IGl0IHRvIHNpbGVuY2UKLSAgICAgICAgKGVsc2UsIGVycm9ycyAweDM4NDEsIDB4Mzg0NyBpbiBvdXIgQUFDIGRlY29kZXIpICovCi0gICAgewotICAgICAgICBpZiggcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tBQUMKLSAgICAgICAgICAgIHx8IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FBQ3BsdXMKLSAgICAgICAgICAgIHx8IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX01PTk9fU0laRTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTywKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPT0gMiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPLAotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBNdXN0IG5ldmVyIGhhcHBlbiAuLi4qLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9OdWxsRW5jb2Rpbmc6IEJhZCBudW1iZXIgb2YgY2hhbm5lbHMgaW4gYXVkaW8gaW5wdXQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFOwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4LAotICAgICAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUpOwotICAgICAgICAgICAgLyogU29tZSByZW1haW5pbmcgQU1SIEFVIG5lZWRzIHRvIGJlIGNvcGllZCAqLwotICAgICAgICAgICAgaWYoIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgV3JpdGVyIEFVICovCi0gICAgICAgICAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSArPSBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemU7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKHBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgICsgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFKSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLypNUDMgY2FzZTogY29weSB0aGUgQVUqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IENvcHlpbmcgYXVkaW8gQVU6IHNpemU9JWQiLAotICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSk7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJBdWRpb0FVLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSBwQy0+UmVhZGVyQXVkaW9BVS5tX3NpemU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29weSBhdWRpbyBkYXRhIGZyb20gcmVhZGVyIEFVIHRvIHdyaXRlciBBVSAqLwotICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZygpOiBDb3B5aW5nIGF1ZGlvIEFVOiBzaXplPSVkIiwKLSAgICAgICAgICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgKHZvaWQgKilwQy0+UmVhZGVyQXVkaW9BVS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEMtPlJlYWRlckF1ZGlvQVUubV9zaXplKTsKLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbnZlcnQgQ1RTIHVuaXQgZnJvbSBtaWxsaXNlY29uZHMgdG8gdGltZXNjYWxlICovCi0gICAgcEMtPldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgKE00T1NBX1RpbWUpKCgoIHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTIC0gcEMtPmlBdWRpb0N0c09mZnNldCkKLSAgICAgICAgKiAocEMtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZSAvIDEwMDAuMCkpKTsKLQotICAgIGlmKCBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQgotICAgICAgICAmJiBwQy0+dWlBdWRpb0FVQ291bnQgPT0gMCApCi0gICAgewotICAgICAgICBwQy0+aUF1ZGlvQ3RzT2Zmc2V0IC09Ci0gICAgICAgICAgICAyMDsgLyogRHVyYXRpb24gb2YgYSBzaWxlbmNlIEFNUiBBVSwgdG8gaGFuZGxlIHRoZSBkdXJhdGlvbiBvZiB0aGUgYWRkZWQKLSAgICAgICAgICAgICAgICBzaWxlbmNlIGZyYW1lICovCi0gICAgfQotICAgIHBDLT5Xcml0ZXJBdWRpb0FVLm5iRnJhZyA9IDA7Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IGF1ZGlvIEFVOiBDVFM9JWQgbXMiLAotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5DVFMpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSBpdCB0byB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBwQy0+dWlBdWRpb0FVQ291bnQrKzsKLSAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRNQ1NfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb051bGxFbmNvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoQXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIEFsbCB0aGUgYXVkaW8gaGFzIGJlZW4gd3JpdHRlbiAqLwotICAgIHBDLT5SZWFkZXJBdWRpb0FVLm1fc2l6ZSA9IDA7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludEF1ZGlvTnVsbEVuY29kaW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIEluaXQgQXVkaW8gVHJhbnNjb2RpbmcKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEdlbmVyYWwgZXJyb3IgKi8KLQotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aUJ5dGVzRGVjOyAvKio8IE5iIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgZGVjb2RlciBPVVQgYnVmZmVyICovCi0gICAgTTRPU0FfVUludDMyCi0gICAgICAgIHVpRGVjb2RlcjJTc3JjX05iQnl0ZXM7IC8qKjwgTmIgb2YgYnl0ZXMgY29waWVkIGludG8gdGhlIHNzcmMgSU4gYnVmZmVyICovCi0KLSAgICBpbnQgc3NyY0VycjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRXJyb3Igd2hpbGUgc3NyYyBwcm9jZXNzaW5nICovCi0gICAgTTRPU0FfVUludDMyIHVpU3NyY0luU2l6ZTsgLyoqPCBTaXplIGluIGJ5dGVzIG9mIHNzcmMgaW50cHV0IGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aVNzcmNJblJvb207IC8qKjwgTmIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBzc3JjIElOIGJ1ZmZlciAqLwotICAgIE00T1NBX01lbUFkZHI4Ci0gICAgICAgIHBTc3JjSW5wdXQ7IC8qKjwgUG9pbnRlciB0byB0aGUgZ29vZCBidWZmZXIgbG9jYXRpb24gZm9yIHNzcmMgaW5wdXQgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlTc3JjT3V0U2l6ZTsgLyoqPCBTaXplIGluIGJ5dGVzIG9mIHNzcmMgb3V0cHV0IGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aUJ5dGVzU3NyYzsgLyoqPCBOYiBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIHNzcmMgT1VUIGJ1ZmZlciAqLwotCi0gICAgTTRPU0FfVUludDgKLSAgICAgICAgbmVlZENoYW5uZWxDb252ZXJzaW9uOyAvKio8IEZsYWcgdG8gaW5kaWNhdGUgaWYgYSBzdGVyZW8gPC0+IG1vbm8gY29udmVyc2lvbiBpcyBuZWVkZWQgKi8KLSAgICBNNE9TQV9VSW50MzIKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yQ29lZmY7IC8qKjwgTXVsdGlwbGljYXRpdmUgY29lZmZpY2llbnQgaWYgc3RlcmVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LT4gbW9ubyBjb252ZXJzaW9uIGlzIGFwcGxpZWQgKi8KLSAgICBNNE9TQV9NZW1BZGRyOCBwQ2hhbm5lbENvbnZlcnRvcklucHV0ID0KLSAgICAgICAgTTRPU0FfTlVMTDsgLyoqPCBQb2ludGVyIHRvIHRoZSBnb29kIGJ1ZmZlciBsb2NhdGlvbiBmb3IgY2hhbm5lbCBjb252ZXJ0b3IgaW5wdXQgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0KLSAgICAgICAgMDsgLyoqPCBOYiBvZiBwY20gc2FtcGxlcyB0byBjb252ZXJ0IGluIGNoYW5uZWwgY29udmVydG9yICovCi0gICAgTTRPU0FfTWVtQWRkcjggcENoYW5uZWxDb252ZXJ0b3JPdXRwdXQgPQotICAgICAgICBNNE9TQV9OVUxMOyAvKio8IFBvaW50ZXIgdG8gdGhlIGdvb2QgYnVmZmVyIGxvY2F0aW9uIGZvciBjaGFubmVsIGNvbnZlcnRvciBvdXRwdXQgKi8KLQotICAgIE00T1NBX1RpbWUKLSAgICAgICAgZnJhbWVUaW1lRGVsdGE7IC8qKjwgRHVyYXRpb24gb2YgdGhlIGVuY29kZWQgKHRoZW4gd3JpdHRlbikgZGF0YSAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aUVuY29kZXJJblJvb207IC8qKjwgTmIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBlbmNvZGVyIElOIGJ1ZmZlciAqLwotICAgIE00T1NBX1VJbnQzMgotICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzOyAvKio8IE5iIG9mIGJ5dGVzIGNvcGllZCBmcm9tIHRoZSBzc3JjIE9VVCBidWZmZXIgKi8KLSAgICBNNE9TQV9NZW1BZGRyOAotICAgICAgICBwRW5jb2RlcklucHV0OyAvKio8IFBvaW50ZXIgdG8gdGhlIGdvb2QgYnVmZmVyIGxvY2F0aW9uIGZvciBlbmNvZGVyIGlucHV0ICovCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgICAvKio8IEVuY29kZXIgaW5wdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY091dEJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBvdXRwdXQgYnVmZmVyIGZvciBhcGkgKi8KLQotICAgIE00T1NBX0ludDE2ICp0ZW1wQnVmZk91dCA9IE00T1NBX05VTEw7Ci0gICAgLypGbEIgMjAwOS4wMy4wNDogYXBwbHkgYXVkaW8gZWZmZWN0cyBpZiBhbiBlZmZlY3QgaXMgYWN0aXZlKi8KLSAgICBNNE9TQV9JbnQ4ICpwQWN0aXZlRWZmZWN0TnVtYmVyID0gJihwQy0+cEFjdGl2ZUVmZmVjdE51bWJlcik7Ci0KLSAgICB1aW50MzJfdCBlcnJDb2RlID0gTTROT19FUlJPUjsKLQotICAgIGlmKCBwQy0+bm9hdWRpbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBSRUFEIEFORCBERUNPREUgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgdG8gZW1wdHkgdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciBmaXJzdCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgKQotICAgIHsKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2ZlZWRfcmVzYW1wbGVyOwotICAgIH0KLQotICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0ZXBBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgTTRPU0FfTlVMTCwgJnBDLT5BdWRpb0RlY0J1ZmZlck91dCwgTTRPU0FfRkFMU0UpOwotCi0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBtX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0ZXBBdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSNpZmRlZiBNQ1NfRFVNUF9QQ01fVE9fRklMRQotCi0gICAgZndyaXRlKHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplLCAxLCBmaWxlX3BjbV9kZWNvZGVyKTsKLQotI2VuZGlmCi0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfR2V0QXVkaW9BVUVyckNvZGUsIChNNE9TQV9EYXRhT3B0aW9uKSAmZXJyQ29kZSk7Ci0KLSAgICBpZiAoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyQ29kZSApIHsKLSAgICAgICAgcEMtPkF1ZGlvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgcmV0dXJuIGVyckNvZGU7Ci0gICB9Ci0KLSAgICAvKiBTZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciAqLwotICAgIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgPSBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLQotICAgIC8qIF9fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IEZFRUQgUkVTQU1QTEVSIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19mZWVkX3Jlc2FtcGxlcjoKLQotICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgdG8gZW1wdHkgdGhlIHNzcmMgb3V0IGJ1ZmZlciBmaXJzdCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICkKLSAgICB7Ci0gICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19wcmVwYXJlX2lucHV0X2J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIGRlY29kZXIgYnVmZmVyICovCi0gICAgdWlTc3JjSW5TaXplID0gcEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLSAgICB1aUJ5dGVzRGVjID0gKCBwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcwotICAgICAgICArIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpIC0gcEMtPnBQb3NJbkRlY0J1ZmZlck91dDsKLQotICAgIC8qIENoZWNrIGlmIHdlIGNhbiBmZWVkIGRpcmVjdGx5IHRoZSBTc3JjIHdpdGggdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciAqLwotICAgIGlmKCAoIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPT0gcEMtPnBTc3JjQnVmZmVySW4pCi0gICAgICAgICYmICh1aUJ5dGVzRGVjID49IHVpU3NyY0luU2l6ZSkgKQotICAgIHsKLSAgICAgICAgcFNzcmNJbnB1dCA9IHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQ7Ci0KLSAgICAgICAgLyogdXBkYXRlIGRhdGEgY29uc3VtZWQgaW50byBkZWNvZGVyIGJ1ZmZlciBhZnRlciByZXNhbXBsaW5nICovCi0gICAgICAgIGlmKCB1aUJ5dGVzRGVjID09IHVpU3NyY0luU2l6ZSApCi0gICAgICAgICAgICBwQy0+cFBvc0luRGVjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcEMtPnBQb3NJbkRlY0J1ZmZlck91dCArPSB1aVNzcmNJblNpemU7Ci0KLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2RvX3Jlc2FtcGxpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIHJlbWFpbmluZyBzcGFjZSBpbiBTc3JjIGJ1ZmZlciBpbiAqLwotICAgIHVpU3NyY0luUm9vbSA9ICggcEMtPnBTc3JjQnVmZmVySW4gKyB1aVNzcmNJblNpemUpIC0gcEMtPnBQb3NJblNzcmNCdWZmZXJJbjsKLQotICAgIC8qKgotICAgICogTmIgb2YgYnl0ZXMgY29waWVkIGlzIHRoZSBtaW5pbXVtIGJldHdlZW4gbmIgb2YgYnl0ZXMgcmVtYWluaW5nIGluCi0gICAgKiBkZWNvZGVyIG91dCBidWZmZXIgYW5kIHNwYWNlIHJlbWFpbmluZyBpbiBzc3JjIGluIGJ1ZmZlciAqLwotICAgIHVpRGVjb2RlcjJTc3JjX05iQnl0ZXMgPQotICAgICAgICAodWlTc3JjSW5Sb29tIDwgdWlCeXRlc0RlYykgPyB1aVNzcmNJblJvb20gOiB1aUJ5dGVzRGVjOwotCi0gICAgLyoqCi0gICAgKiBDb3B5IGZyb20gdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciBpbnRvIHRoZSBTc3JjIGluIGJ1ZmZlciAqLwotICAgIG1lbWNweSgodm9pZCAqKXBDLT5wUG9zSW5Tc3JjQnVmZmVySW4sICh2b2lkICopcEMtPnBQb3NJbkRlY0J1ZmZlck91dCwKLSAgICAgICAgdWlEZWNvZGVyMlNzcmNfTmJCeXRlcyk7Ci0KLSAgICAvKioKLSAgICAqIFVwZGF0ZSB0aGUgcG9zaXRpb24gaW4gdGhlIGRlY29kZXIgb3V0IGJ1ZmZlciAqLwotICAgIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgKz0gdWlEZWNvZGVyMlNzcmNfTmJCeXRlczsKLQotICAgIC8qKgotICAgICogVXBkYXRlIHRoZSBwb3NpdGlvbiBpbiB0aGUgU3NyYyBpbiBidWZmZXIgKi8KLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluICs9IHVpRGVjb2RlcjJTc3JjX05iQnl0ZXM7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHRoZSBkZWNvZGVyIGJ1ZmZlciBvdXQgaXMgZW1wdHkgKi8KLSAgICBpZiggKCBwQy0+cFBvc0luRGVjQnVmZmVyT3V0IC0gcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpCi0gICAgICAgID09IChNNE9TQV9JbnQzMilwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICB7Ci0gICAgICAgIHBDLT5wUG9zSW5EZWNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIHRoZSBTc3JjIGluIGJ1ZmZlciBpcyByZWFkeSAoPSBmdWxsKSAqLwotICAgIGlmKCAoIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSBwQy0+cFNzcmNCdWZmZXJJbikKLSAgICAgICAgPCAoTTRPU0FfSW50MzIpdWlTc3JjSW5TaXplICkKLSAgICB7Ci0gICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmQ7Ci0gICAgfQotCi0gICAgcFNzcmNJbnB1dCA9IHBDLT5wU3NyY0J1ZmZlckluOwotCi0gICAgLyogdXBkYXRlIGRhdGEgY29uc3VtZWQgaW50byBzc3JjIGJ1ZmZlciBpbiBhZnRlciByZXNhbXBsaW5nIChlbXB0eSkgKi8KLSAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluID0gcEMtPnBTc3JjQnVmZmVySW47Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBETyBUSEUgUkVTQU1QTElORyB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19ffCovCi0KLW00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZG9fcmVzYW1wbGluZzoKLQotICAgIC8qKgotICAgICogTm8gbmVlZCBmb3IgbWVtY29weSwgd2UgY2FuIGZlZWQgU3NyYyBkaXJlY3RseSB3aXRoIHRoZSBkYXRhIGluIHRoZSBhdWRpbwotICAgIGRlY29kZXIgb3V0IGJ1ZmZlciovCi0KLSAgICBzc3JjRXJyID0gMDsKLQotICAgIGlmKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMSApCi0gICAgewotICAgICAgICB0ZW1wQnVmZk91dCA9Ci0gICAgICAgICAgICAoc2hvcnQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpICogMgotICAgICAgICAgICAgKiAoKCpwQykuSW5wdXRGaWxlUHJvcGVydGllcykudWlOYkNoYW5uZWxzKSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwoTTRPU0FfQ2hhciAqKSAidGVtcEJ1ZmZPdXQiKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopdGVtcEJ1ZmZPdXQsIDAsKHBDLT5pU3NyY05iU2FtcGxPdXQgKiBzaXplb2Yoc2hvcnQpICogMgotICAgICAgICAgICAgKiAoKCpwQykuSW5wdXRGaWxlUHJvcGVydGllcykudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoKHNob3J0ICopdGVtcEJ1ZmZPdXQsIChzaG9ydCAqKXBTc3JjSW5wdXQsCi0gICAgICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0LCBwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtZW1zZXQoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJPdXQsIDAsIChwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgKiAoKCpwQykuSW5wdXRGaWxlUHJvcGVydGllcykudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgKHNob3J0ICopcFNzcmNJbnB1dCwgcEMtPmlTc3JjTmJTYW1wbE91dCwgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKLSAgICB9Ci0KLSAgICBpZiggcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID09IDEgKQotICAgIHsKLSAgICAgICAgRnJvbTJpVG9Nb25vXzE2KChzaG9ydCAqKXRlbXBCdWZmT3V0LCAoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAoc2hvcnQpcEMtPmlTc3JjTmJTYW1wbE91dCk7Ci0gICAgICAgIGZyZWUodGVtcEJ1ZmZPdXQpOwotICAgIH0KLQotCi0gICAgaWYoIDAgIT0gc3NyY0VyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nOiBTU1JDX1Byb2Nlc3MgcmV0dXJucyAweCV4LCBcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEIiwKLSAgICAgICAgICAgIHNzcmNFcnIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0FVRElPX0NPTlZFUlNJT05fRkFJTEVEOwotICAgIH0KLQotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgUFJFUEFSRSBJTlBVVCBCVUZGRVIgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX3wqLwotCi1tNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX3ByZXBhcmVfaW5wdXRfYnVmZmVyOgotCi0gICAgLyogU2V0IHRoZSBmbGFnIGZvciBjaGFubmVsIGNvbnZlcnNpb24gcmVxdWlyZW1lbnQgKi8KLSAgICBpZiggKCBwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9PSBNNEVOQ09ERVJfa01vbm8pCi0gICAgICAgICYmIChwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPT0gMikgKQotICAgIHsKLSAgICAgICAgbmVlZENoYW5uZWxDb252ZXJzaW9uID0gMTsKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yQ29lZmYgPSA0OwotICAgIH0KLSAgICBlbHNlIGlmKCAoIHBDLT5BdWRpb0VuY1BhcmFtcy5DaGFubmVsTnVtID09IE00RU5DT0RFUl9rU3RlcmVvKQotICAgICAgICAmJiAocEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID09IDEpICkKLSAgICB7Ci0gICAgICAgIG5lZWRDaGFubmVsQ29udmVyc2lvbiA9IDI7Ci0gICAgICAgIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbmVlZENoYW5uZWxDb252ZXJzaW9uID0gMDsKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yQ29lZmYgPSAyOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgU3NyYyBidWZmZXIgKi8KLSAgICB1aVNzcmNPdXRTaXplID0gcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgKiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgdWlCeXRlc1NzcmMgPQotICAgICAgICAoIHBDLT5wU3NyY0J1ZmZlck91dCArIHVpU3NyY091dFNpemUpIC0gcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQ7Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgc3NyYyBidWZmZXIgaXMgZnVsbCAqLwotICAgIGlmKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9PSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgIHsKLSAgICAgICAgdWlTc3JjMkVuY29kZXJfTmJCeXRlcyA9Ci0gICAgICAgICAgICBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgKiB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiAvIDI7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgd2UgY2FuIGZlZWQgZGlyZWN0bHkgdGhlIGVuY29kZXIgd2l0aCB0aGUgc3NyYyBvdXQgYnVmZmVyICovCi0gICAgICAgIGlmKCAoIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICYmICh1aUJ5dGVzU3NyYyA+PSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHVwZGF0ZSBwb3NpdGlvbiBpbiBzc3JjIG91dCBidWZmZXIgYWZ0ZXIgZW5jb2RpbmcgKi8KLSAgICAgICAgICAgIGlmKCB1aUJ5dGVzU3NyYyA9PSB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzICkKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgKz0gdWlTc3JjMkVuY29kZXJfTmJCeXRlczsKLQotICAgICAgICAgICAgLyogbWFyayB0aGUgZW5jb2RlciBidWZmZXIgcmVhZHkgKD0gZnVsbCkgKi8KLSAgICAgICAgICAgIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPQotICAgICAgICAgICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyICsgcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5OwotCi0gICAgICAgICAgICBpZiggbmVlZENoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY2hhbm5lbCBjb252ZXJ0b3Igd3JpdGVzIGRpcmVjdGx5IGludG8gZW5jb2RlciBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBwRW5jb2RlcklucHV0ID0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXI7Ci0KLSAgICAgICAgICAgICAgICBwQ2hhbm5lbENvbnZlcnRvcklucHV0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgICAgICAgICAgICAgIHBDaGFubmVsQ29udmVydG9yT3V0cHV0ID0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXI7Ci0gICAgICAgICAgICAgICAgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0KLSAgICAgICAgICAgICAgICAgICAgdWlTc3JjMkVuY29kZXJfTmJCeXRlcyAvIHNpemVvZihzaG9ydCk7Ci0KLSAgICAgICAgICAgICAgICBnb3RvIG00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfY2hhbm5lbF9jb252ZXJ0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogZW5jb2RlIGRpcmVjdGx5IGZyb20gc3NyYyBvdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgcEVuY29kZXJJbnB1dCA9IHBDLT5wU3NyY0J1ZmZlck91dDsKLQotICAgICAgICAgICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmNvZGVfYW5kX3dyaXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIHJlbWFpbmluZyBzcGFjZSBpbiBlbmNvZGVyIGJ1ZmZlciBpbiAqLwotICAgIGlmKCBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciA9IHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyOwotICAgIH0KLQotICAgIHVpRW5jb2RlckluUm9vbSA9ICggcEMtPnBBdWRpb0VuY29kZXJCdWZmZXIgKyBwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkpCi0gICAgICAgIC0gcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlcjsKLSAgICBwRW5jb2RlcklucHV0ID0gcEMtPnBBdWRpb0VuY29kZXJCdWZmZXI7Ci0KLSAgICAvKioKLSAgICAqIE5iIG9mIGJ5dGVzIGNvcGllZCBpcyB0aGUgbWluaW11bSBiZXR3ZWVuIG5iIG9mIGJ5dGVzIHJlbWFpbmluZyBpbgotICAgICogZGVjb2RlciBvdXQgYnVmZmVyIGFuZCBzcGFjZSByZW1haW5pbmcgaW4gc3NyYyBpbiBidWZmZXIgKi8KLSAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzID0KLSAgICAgICAgKCggdWlFbmNvZGVySW5Sb29tICogdWlDaGFubmVsQ29udmVydG9yQ29lZmYgLyAyKSA8IHVpQnl0ZXNTc3JjKQotICAgICAgICA/ICh1aUVuY29kZXJJblJvb20gKiB1aUNoYW5uZWxDb252ZXJ0b3JDb2VmZiAvIDIpIDogdWlCeXRlc1NzcmM7Ci0KLSAgICBpZiggbmVlZENoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgewotICAgICAgICAvKiBjaGFubmVsIGNvbnZlcnRvciB3cml0ZXMgZGlyZWN0bHkgaW50byBlbmNvZGVyIGJ1ZmZlciAqLwotICAgICAgICBwQ2hhbm5lbENvbnZlcnRvcklucHV0ID0gcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQ7Ci0gICAgICAgIHBDaGFubmVsQ29udmVydG9yT3V0cHV0ID0gcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlcjsKLSAgICAgICAgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0gdWlTc3JjMkVuY29kZXJfTmJCeXRlcyAvIHNpemVvZihzaG9ydCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIGNvcHkgZnJvbSB0aGUgc3NyYyBvdXQgYnVmZmVyIGludG8gdGhlIGVuY29kZXIgaW4gYnVmZmVyICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIsICh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzKTsKLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgcG9zaXRpb24gaW4gc3NyYyBvdXQgYnVmZmVyIGFmdGVyIGVuY29kaW5nICovCi0gICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgKz0gdWlTc3JjMkVuY29kZXJfTmJCeXRlczsKLQotICAgIC8qIFVwZGF0ZSB0aGUgcG9zaXRpb24gaW4gdGhlIGVuY29kZXIgaW4gYnVmZmVyICovCi0gICAgcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciArPQotICAgICAgICB1aVNzcmMyRW5jb2Rlcl9OYkJ5dGVzICogMiAvIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmOwotCi0gICAgLyogQ2hlY2sgaWYgdGhlIHNzcmMgYnVmZmVyIG91dCBpcyBlbXB0eSAqLwotICAgIGlmKCAoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gcEMtPnBTc3JjQnVmZmVyT3V0KQotICAgICAgICA9PSAoTTRPU0FfSW50MzIpdWlTc3JjT3V0U2l6ZSApCi0gICAgewotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogZ28gdG8gbmV4dCBzdGF0ZW1lbnQgKi8KLSAgICBpZiggbmVlZENoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19jaGFubmVsX2NvbnZlcnRvcjsKLSAgICBlbHNlCi0gICAgICAgIGdvdG8gbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmNvZGVfYW5kX3dyaXRlOwotCi0gICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCBTVEVSRU8gPC0+IE1PTk8gfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19jaGFubmVsX2NvbnZlcnRvcjoKLQotICAgIC8qIGNvbnZlcnQgdGhlIGlucHV0IHBjbSBzdHJlYW0gdG8gbW9ubyBvciB0byBzdGVyZW8gKi8KLSAgICBzd2l0Y2goIG5lZWRDaGFubmVsQ29udmVyc2lvbiApCi0gICAgewotICAgICAgICBjYXNlIDE6IC8qIHN0ZXJlbyB0byBtb25vICovCi0gICAgICAgICAgICBGcm9tMmlUb01vbm9fMTYoKHNob3J0ICopcENoYW5uZWxDb252ZXJ0b3JJbnB1dCwKLSAgICAgICAgICAgICAgICAoc2hvcnQgKilwQ2hhbm5lbENvbnZlcnRvck91dHB1dCwKLSAgICAgICAgICAgICAgICAoc2hvcnQpKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAvIDIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjogLyogbW9ubyB0byBzdGVyZW8gKi8KLSAgICAgICAgICAgIE1vbm9UbzJJXzE2KChzaG9ydCAqKXBDaGFubmVsQ29udmVydG9ySW5wdXQsCi0gICAgICAgICAgICAgICAgKHNob3J0ICopcENoYW5uZWxDb252ZXJ0b3JPdXRwdXQsCi0gICAgICAgICAgICAgICAgKHNob3J0KXVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgRU5DT0RFIEFORCBXUklURSB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX198Ki8KLQotbTRtY3NfaW50YXVkaW90cmFuc2NvZGluZ19lbmNvZGVfYW5kX3dyaXRlOgotCi0gICAgLyogQ2hlY2sgaWYgdGhlIGVuY29kZXIgaW4gYnVmZmVyIGlzIHJlYWR5ICg9IGZ1bGwpICovCi0gICAgaWYoICggcEMtPnBQb3NJbkF1ZGlvRW5jb2RlckJ1ZmZlciAtIHBDLT5wQXVkaW9FbmNvZGVyQnVmZmVyKQotICAgICAgICA8IChNNE9TQV9JbnQzMilwQy0+YXVkaW9FbmNvZGVyR3JhbnVsYXJpdHkgKQotICAgIHsKLSAgICAgICAgZ290byBtNG1jc19pbnRhdWRpb3RyYW5zY29kaW5nX2VuZDsKLSAgICB9Ci0KLSAgICAvKiBbTW9ub10gb3IgW1N0ZXJlbyBpbnRlcmxlYXZlZF0gOiBhbGwgaXMgaW4gb25lIGJ1ZmZlciAqLwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPSBwRW5jb2RlcklucHV0OwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5OwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgKCBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSAqIHVpQ2hhbm5lbENvbnZlcnRvckNvZWZmIC8gMikKLSAgICAgICAgLyBzaXplb2Yoc2hvcnQpIC8gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotCi0gICAgLyoqCi0gICAgKiBQcmVwYXJlIHRoZSB3cml0ZXIgQVUgKi8KLSAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+cFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRNQ1NfaW50QXVkaW9UcmFuc2NvZGluZygpOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKEF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKkZsQiAyMDA5LjAzLjA0OiBhcHBseSBhdWRpbyBlZmZlY3RzIGlmIGFuIGVmZmVjdCBpcyBhY3RpdmUqLwotICAgIGlmKCAqcEFjdGl2ZUVmZmVjdE51bWJlciA+PSAwICYmICpwQWN0aXZlRWZmZWN0TnVtYmVyIDwgcEMtPm5iRWZmZWN0cyApCi0gICAgewotICAgICAgICBpZiggcEMtPnBFZmZlY3RzWypwQWN0aXZlRWZmZWN0TnVtYmVyXS5FeHRBdWRpb0VmZmVjdEZjdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyBwUHJvZ3Jlc3M7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcFByb2dyZXNzID0gMDsKLSAgICAgICAgICAgIHBQcm9ncmVzcy51aUNsaXBUaW1lID0gKE00T1NBX1VJbnQzMilwQy0+UmVhZGVyQXVkaW9BVS5tX0NUUzsKLQotICAgICAgICAgICAgcFByb2dyZXNzLnVpT3V0cHV0VGltZSA9ICggcEMtPldyaXRlckF1ZGlvQVUuQ1RTICogMTAwMCkKLSAgICAgICAgICAgICAgICAvIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS50aW1lU2NhbGU7Ci0gICAgICAgICAgICB0ZW1wUHJvZ3Jlc3MgPSAoIChNNE9TQV9VSW50MzIpcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMKLSAgICAgICAgICAgICAgICAtIHBDLT5wRWZmZWN0c1sqcEFjdGl2ZUVmZmVjdE51bWJlcl0udWlTdGFydFRpbWUKLSAgICAgICAgICAgICAgICAtIHBDLT51aUJlZ2luQ3V0VGltZSkgKiAxMDAwOwotICAgICAgICAgICAgcFByb2dyZXNzLnVpUHJvZ3Jlc3MgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHRlbXBQcm9ncmVzcyAvIChNNE9TQV9VSW50MzIpcEMtPnBFZmZlY3RzWwotICAgICAgICAgICAgICAgICAgICAqcEFjdGl2ZUVmZmVjdE51bWJlcl0udWlEdXJhdGlvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBFZmZlY3RzWypwQWN0aXZlRWZmZWN0TnVtYmVyXS5FeHRBdWRpb0VmZmVjdEZjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wRWZmZWN0c1sqcEFjdGl2ZUVmZmVjdE51bWJlcl0ucEV4dEF1ZGlvRWZmZWN0RmN0Q3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQxNiAqKXBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSwgJnBQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogRXh0QXVkaW9FZmZlY3RGY3QoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzOwotICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0KLSNpZmRlZiBNQ1NfRFVNUF9QQ01fVE9fRklMRQotCi0gICAgZndyaXRlKHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0sIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdLCAxLAotICAgICAgICBmaWxlX3BjbV9lbmNvZGVyKTsKLQotI2VuZGlmCi0KLSAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPmJfaXNSYXdXcml0ZXIgKQotICAgIHsKLSAgICAgICAgLyogVGhpcyBhbGxvdyB0byB3cml0ZSBQQ00gZGF0YSB0byBmaWxlIGFuZCB0byBlbmNvZGUgQU1SIGRhdGEsCi0gICAgICAgICB3aGVuIG91dHB1dCBmaWxlIGlzIG5vdCBSQVcgKi8KLSAgICAgICAgaWYoIHBDLT5wT3V0cHV0UENNZmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5wT3V0cHV0UENNZmlsZSwKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdLCBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotICAgICAgICBlcnIgPSBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKHBDLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogdXBkYXRlIGRhdGEgY29uc3VtZWQgaW50byBlbmNvZGVyIGJ1ZmZlciBpbiBhZnRlciBlbmNvZGluZyAoZW1wdHkpICovCi0gICAgICAgIHBDLT5wUG9zSW5BdWRpb0VuY29kZXJCdWZmZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCBBVSBjdHMgYW5kIHNpemUgKi8KLSAgICAgICAgcEMtPldyaXRlckF1ZGlvQVUuc2l6ZSA9Ci0gICAgICAgICAgICBwRW5jT3V0QnVmZmVyLgotICAgICAgICAgICAgcFRhYmxlQnVmZmVyU2l6ZVswXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgIHBDLT5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgZHVyYXRpb24gb2YgdGhlIGVuY29kZWQgQVUgKi8KLSAgICAgICAgcEMtPm1fYXVkaW9BVUR1cmF0aW9uID0KLSAgICAgICAgICAgICggZnJhbWVUaW1lRGVsdGEgKiAxMDAwKSAvIHBDLT5Xcml0ZXJBdWRpb1N0cmVhbS50aW1lU2NhbGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogV3JpdGUgdGhlIGVuY29kZWQgQVUgdG8gdGhlIG91dHB1dCBmaWxlICovCi0gICAgICAgIHBDLT51aUF1ZGlvQVVDb3VudCsrOwotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKEF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIHVwZGF0ZSBkYXRhIGNvbnN1bWVkIGludG8gZW5jb2RlciBidWZmZXIgaW4gYWZ0ZXIgZW5jb2RpbmcgKGVtcHR5KSAqLwotICAgICAgICBwQy0+cFBvc0luQXVkaW9FbmNvZGVyQnVmZmVyID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKQotICAgICAgICAgICAgcEVuY29kZXJJbnB1dDsgLyogd2lsbCBiZSBjb252ZXJ0ZWQgYmFjayB0byB1OCogaW4gZmlsZSB3cml0ZSAqLwotICAgICAgICBwQy0+V3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmF1ZGlvRW5jb2RlckdyYW51bGFyaXR5OwotICAgICAgICBwQy0+dWlBdWRpb0FVQ291bnQrKzsKLQotICAgICAgICBlcnIgPSBwQy0+cFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00TUNTX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludEF1ZGlvVHJhbnNjb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKEF1ZGlvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgfCovCi0gICAgLyp8IE9ORSBQQVNTIERPTkUgfCovCi0gICAgLyp8X19fX19fX19fX19fX19ffCovCi0KLW00bWNzX2ludGF1ZGlvdHJhbnNjb2RpbmdfZW5kOgotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRBdWRpb1RyYW5zY29kaW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVShNNE9TQV9NZW1BZGRyOCogYWRkciwgTTRPU0FfVUludDMyIG5ld1NpemUpCi0gKiBVc2VkIG9ubHkgaW4gY2FzZSBvZiAzR1AgY29uc3RhbnQgbWVtb3J5IHJlYWRlciwgdG8gYmUgYWJsZSB0byByZWFsbG9jIHRlbXBvcmFyeSBBVQotICogYmVjYXVzZSBtYXggQVUgc2l6ZSBjYW4gYmUgcmVldmFsdWF0ZWQgZHVyaW5nIHJlYWRpbmcKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKCBNNE9TQV9NZW1BZGRyOCAqYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBuZXdTaXplICkKLXsKLSAgICBpZiggKmFkZHIgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKCphZGRyKTsKLSAgICAgICAgKmFkZHIgPSAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5ld1NpemUsIE00TUNTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUmVhbGxvY2F0aW9uIG9mIHRlbXBvcmFyeSBBVSBidWZmZXIiKTsKLQotICAgICAgICBpZiggKmFkZHIgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICogQGF1dGhvciAgIEFsZXhpcyBWYXBpbGxvbiAoTlhQIFNvZnR3YXJlIFZpc2lvbikKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIC8qIER1cmF0aW9uIG9mIHRoZSBBVSAoZmluZCB0aGUgbmV4dCBBVSBkdXJhdGlvbgotICAgICAqIHRvIG9idGFpbiBhIG1vcmUgcHJlY2lzZSB2aWRlbyBlbmQgY3V0KQotICAgICAqLwotICAgIE00T1NBX1VJbnQzMiB2aWRlb0FVRHVyYXRpb24gPSAwOwotCi0gICAgTTRPU0FfTWVtQWRkcjggV3JpdGVidWZmZXJBZGQgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDMyIGxhc3RkZWNvZGVkQ1RTID0gMDsKLSAgICBNNF9BY2Nlc3NVbml0IGxSZWFkZXJWaWRlb0FVOyAvKio8IFJlYWQgdmlkZW8gYWNjZXNzIHVuaXQgKi8KLQotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyogSC4yNjQgVHJpbW1pbmcgKi8KLSAgICBpZiggKCAoIHBDLT5iSDI2NFRyaW0gPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgJiYgKHBDLT51aVZpZGVvQVVDb3VudCA8IHBDLT5tX3BJbnN0YW5jZS0+Y2xpcF9zcHMubnVtX3JlZl9mcmFtZXMpCi0gICAgICAgICYmIChwQy0+dWlCZWdpbkN1dFRpbWUgPiAwKSkKLSAgICAgICAgfHwgKCggcEMtPnVpVmlkZW9BVUNvdW50ID09IDApICYmIChwQy0+dWlCZWdpbkN1dFRpbWUgPiAwKSkgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRNQ1NfaW50VmlkZW9UcmFuc2NvZGluZyhwQyk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0KLSAgICBpZigocEMtPmJMYXN0RGVjb2RlZEZyYW1lQ1RTID09IE00T1NBX0ZBTFNFKSAmJiAocEMtPnVpQmVnaW5DdXRUaW1lID4gMCkpCi0gICAgewotICAgICAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVyIGRvZXMgcHJlZmV0Y2gsIHRoZSBvbmUgZnJhbWUgd2UgcmVxdWVzdGVkIHdpbGwgbm90IGJlIHdyaXR0ZW4gdW50aWwKLSAgICAgICAgLy8gdGhlIGVuY29kZXIgaXMgY2xvc2VkLCBzbyBkbyBpdCBub3cgcmF0aGVyIHRoYW4gaW4gTUNTX2Nsb3NlCi0gICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgfHwgKE00TUNTX2tFbmNvZGVyUnVubmluZyAhPSBwQy0+ZW5jb2RlclN0YXRlKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICIhISEgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcgRVJST1IgOiBNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nICIKLSAgICAgICAgICAgICAgICAicmV0dXJucyAweCVYIHcvIGVuY1N0YXRlPSVkIiwgZXJyLCBwQy0+ZW5jb2RlclN0YXRlKTsKLQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFN0b3AgYW5kIGNsb3NlIHRoZSBlbmNvZGVyIG5vdyB0byBmbHVzaCB0aGUgZnJhbWUgKHByZWZldGNoKSAqLwotICAgICAgICBpZiggcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcChwQy0+cFZpRW5jQ3R4dCk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICIhISEgTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcgRVJST1IgOiBlbmNvZGVyIHN0b3AgcmV0dXJucyAweCVYIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlclN0b3BwZWQ7Ci0gICAgICAgIGVyciA9IHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKHBDLT5wVmlFbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiISEhIE00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nIEVSUk9SIDogZW5jb2RlciBjbG9zZSByZXR1cm5zIDB4JVgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5lbmNvZGVyU3RhdGUgPSBNNE1DU19rRW5jb2RlckNsb3NlZDsKLSAgICB9Ci0KLQotICAgIGlmICgocEMtPkVuY29kaW5nVmlkZW9Gb3JtYXQgPT0gTTRFTkNPREVSX2tOVUxMKQotICAgICAgICAmJiAocEMtPmJMYXN0RGVjb2RlZEZyYW1lQ1RTID09IE00T1NBX0ZBTFNFKQotICAgICAgICAmJiAocEMtPnVpQmVnaW5DdXRUaW1lID4gMCkpIHsKLQotICAgICAgICBwQy0+Ykxhc3REZWNvZGVkRnJhbWVDVFMgPSBNNE9TQV9UUlVFOwotICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb24ocEMtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0FWQ0xhc3REZWNvZGVkRnJhbWVDVFMsICZsYXN0ZGVjb2RlZENUUyk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2Rpbmc6IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIC8qIERvIG5vdCBuZWVkIHZpZGVvIGRlY29kZXIgYW55IG1vcmUsIG5lZWQgdG8gZGVzdHJveSBpdC4gT3RoZXJ3aXNlIGl0Ci0gICAgICAgICAqIHdpbGwgY2FsbCByZWFkZXIgZnVuY3Rpb24gd2hpY2ggd2lsbCBjYXVzZSBmcmFtZSBsb3N0IGR1cmluZyB0cmltaW5nLAotICAgICAgICAgKiBzaW5jZSB0aGUgM2dwIHJlYWRlciBpcyBzaGFyZWQgYmV0d2VlbiBNQ1MgYW5kIGRlY29kZXIuKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBWaURlY0N0eHQpIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlc3Ryb3kocEMtPnBWaURlY0N0eHQpOwotICAgICAgICAgICAgcEMtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nOiBkZWNvZGVyIHBGY3REZXN0cm95IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEp1bXAocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLCAmbGFzdGRlY29kZWRDVFMpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nOiBtX3BGY3RKdW1wKFYpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sICZsUmVhZGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2Rpbmc6bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pXAotICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwgJmxSZWFkZXJWaWRlb0FVKTsKLQotICAgICAgICBpZiAoTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgLyogVGhlIGF1ZGlvIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOlwKLSAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICIjIyMgW1RTX0NIRUNLXSBNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZyAgdmlkZW8gQVUgQ1RTOiAlZCAiLAotICAgICAgICAgICAgbFJlYWRlclZpZGVvQVUubV9DVFMpOwotCi0KLSAgICB9Ci0KLQotICAgIHBDLT5iTGFzdERlY29kZWRGcmFtZUNUUyA9IE00T1NBX1RSVUU7Ci0KLQotICAgIC8qIEZpbmQgdGhlIG5leHQgQVUgZHVyYXRpb24gdG8gb2J0YWluIGEgbW9yZSBwcmVjaXNlIHZpZGVvIGVuZCBjdXQqLwotICAgIC8qKgotICAgICogSW5pdGlhbGl6ZXMgYSBuZXcgQVUgaWYgbmVlZGVkICovCi0KLSAgICBpZiAocEMtPlJlYWRlclZpZGVvQVUxLm1fc3RydWN0U2l6ZSA9PSAwKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19vcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJUZW1wb3JhcnkgdmlkZW8gQVUxIGJ1ZmZlciIpOwotCi0gICAgICAgIGlmIChwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdShwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0sCi0gICAgICAgICAgICAmcEMtPlJlYWRlclZpZGVvQVUxKTsKLQotICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTpcCi0gICAgICAgICAgICAgICAgIG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHZpZGVvKSByZXR1cm5zIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgIC8qIFRoZSBhdWRpbyB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHZpZGVvKVwKLSAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZQotICAgICAgICAgICAgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvbnN0YW50IG1lbW9yeSByZWFkZXIgY2FzZSwgd2UgbmVlZCB0byByZWFsbG9jYXRlIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxKSwgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEKLSAgICAgICAgICAgIGFuZCBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBiZWNhdXNlIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplIHRha2UgbWF4aW11bSB2YWx1ZS4KLSAgICAgICAgICAgICBUaGVuIHRoZSB0ZXN0ICJpZihwQy0+UmVhZGVyVmlkZW9BVT8ubV9tYXhzaXplID4gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUpIiBpcyBuZXZlciB0cnVlICovCi0gICAgICAgICAgICAvKiBhbmQgdGhlIHNpemUgb2YgdGhlIHNlY29uZCBidWZmZXIgaXMgbmV2ZXIgY2hhbmdlZC4gKi8KLSAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiksIHBDLT5SZWFkZXJWaWRlb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgLyogcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxIGFuZAotICAgICAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgLyogVXBkYXRlIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEsCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJWaWRlb0FVMS5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUxLm1fc2l6ZSk7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVMi5tX3N0cnVjdFNpemUgPT0gMCApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBJbml0aWFsaXplcyBhbiBhY2Nlc3MgVW5pdCAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLAotICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVMik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX29wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocEMtPlJlYWRlclZpZGVvQVUyLm1fbWF4c2l6ZSwgTTRNQ1MsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJUZW1wb3JhcnkgdmlkZW8gQVUgYnVmZmVyIik7Ci0KLSAgICAgICAgaWYoIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIFJlYWQgdGhlIG5leHQgdmlkZW8gQVUgaW4gdGhlIGlucHV0IGZpbGUgKi8KLSAgICBpZiggcEMtPlJlYWRlclZpZGVvQVUyLm1fQ1RTID4gcEMtPlJlYWRlclZpZGVvQVUxLm1fQ1RTICkKLSAgICB7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKSAmcEMtPlJlYWRlclZpZGVvQVUsCi0gICAgICAgICAgICAodm9pZCAqKSAmcEMtPlJlYWRlclZpZGVvQVUyLCBzaXplb2YoTTRfQWNjZXNzVW5pdCkpOwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLAotICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVMSk7Ci0KLSAgICAgICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVMS5tX21heHNpemUKLSAgICAgICAgICAgID4gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb25zdGFudCBtZW1vcnkgcmVhZGVyIGNhc2UsIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KLSAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSksIHBDLT5SZWFkZXJWaWRlb0FVMS5tX21heHNpemUpOwotICAgICAgICAgICAgLyogcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxIGFuZAotICAgICAgICAgICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiBtdXN0IGJlIHJlYWxsb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgIC8qIGJlY2F1c2UgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUgdGFrZSBtYXhpbXVtIHZhbHVlLgotICAgICAgICAgICAgIFRoZW4gdGhlIHRlc3QgImlmKHBDLT5SZWFkZXJWaWRlb0FVPy5tX21heHNpemUgPiBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSkiIGlzIG5ldmVyIHRydWUgKi8KLSAgICAgICAgICAgIC8qIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc2Vjb25kIGJ1ZmZlciBpcyBuZXZlciBjaGFuZ2VkLiAqLwotICAgICAgICAgICAgTTRNQ1NfaW50UmVhbGxvY1RlbXBvcmFyeUFVKChNNE9TQV9NZW1BZGRyOAotICAgICAgICAgICAgICAgICopICYocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyKSwgcEMtPlJlYWRlclZpZGVvQVUxLm1fbWF4c2l6ZSk7Ci0gICAgICAgICAgICAvKiBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgYW5kCi0gICAgICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBVcGRhdGUgc3RyZWFtIHByb3BlcnRpZXMgKi8KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplID0KLSAgICAgICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9tYXhzaXplOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSwKLSAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlclZpZGVvQVUxLm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVTEubV9zaXplKTsKLSAgICAgICAgdmlkZW9BVUR1cmF0aW9uID0gcEMtPlJlYWRlclZpZGVvQVUxLm1fQ1RTIC0gcEMtPlJlYWRlclZpZGVvQVUyLm1fQ1RTOwotICAgICAgICBwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzID0gcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBtZW1jcHkoKHZvaWQgKikgJnBDLT5SZWFkZXJWaWRlb0FVLAotICAgICAgICAgICAgKHZvaWQgKikgJnBDLT5SZWFkZXJWaWRlb0FVMSwgc2l6ZW9mKE00X0FjY2Vzc1VuaXQpKTsKLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICZwQy0+UmVhZGVyVmlkZW9BVTIpOwotCi0gICAgICAgIGlmKCBwQy0+UmVhZGVyVmlkZW9BVTIubV9tYXhzaXplCi0gICAgICAgICAgICA+IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29uc3RhbnQgbWVtb3J5IHJlYWRlciBjYXNlLCB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgdGhlIHRlbXBvcmFyeSBidWZmZXJzICovCi0gICAgICAgICAgICBNNE1DU19pbnRSZWFsbG9jVGVtcG9yYXJ5QVUoKE00T1NBX01lbUFkZHI4Ci0gICAgICAgICAgICAgICAgKikgJihwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIpLCBwQy0+UmVhZGVyVmlkZW9BVTIubV9tYXhzaXplKTsKLSAgICAgICAgICAgIC8qIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSBhbmQKLSAgICAgICAgICAgICBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIgbXVzdCBiZSByZWFsbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAvKiBiZWNhdXNlIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplIHRha2UgbWF4aW11bSB2YWx1ZS4KLSAgICAgICAgICAgICBUaGVuIHRoZSB0ZXN0ICJpZihwQy0+UmVhZGVyVmlkZW9BVT8ubV9tYXhzaXplID4gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemUpIiBpcyBuZXZlciB0cnVlICovCi0gICAgICAgICAgICAvKiBhbmQgdGhlIHNpemUgb2YgdGhlIHNlY29uZCBidWZmZXIgaXMgbmV2ZXIgY2hhbmdlZC4gKi8KLSAgICAgICAgICAgIE00TUNTX2ludFJlYWxsb2NUZW1wb3JhcnlBVSgoTTRPU0FfTWVtQWRkcjgKLSAgICAgICAgICAgICAgICAqKSAmKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSksIHBDLT5SZWFkZXJWaWRlb0FVMi5tX21heHNpemUpOwotICAgICAgICAgICAgLyogcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MxIGFuZAotICAgICAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyIG11c3QgYmUgcmVhbGxvY2F0ZWQgYXQgdGhlIHNhbWUgdGltZSAqLwotICAgICAgICAgICAgLyogVXBkYXRlIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUyLm1fbWF4c2l6ZTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczIsCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5SZWFkZXJWaWRlb0FVMi5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUyLm1fc2l6ZSk7Ci0gICAgICAgIHZpZGVvQVVEdXJhdGlvbiA9IHBDLT5SZWFkZXJWaWRlb0FVMi5tX0NUUyAtIHBDLT5SZWFkZXJWaWRlb0FVMS5tX0NUUzsKLSAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcyA9IHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMTsKLSAgICB9Ci0KLSAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTpcCi0gICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAvKiBUaGUgdmlkZW8gdHJhbnNjb2RpbmcgaXMgZmluaXNoZWQgKi8KLSAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IG1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KFZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogUHJlcGFyZSB0aGUgd3JpdGVyIEFVICovCi0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5wV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00TUNTX1dSSVRFUl9WSURFT19TVFJFQU1fSUQsICZwQy0+V3JpdGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00TUNTX2ludFZpZGVvTnVsbEVuY29kaW5nKCk6IHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoVmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb3B5IHZpZGVvIGRhdGEgZnJvbSByZWFkZXIgQVUgdG8gd3JpdGVyIEFVICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogQ29weWluZyB2aWRlbyBBVTogc2l6ZT0lZCIsCi0gICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgIC8qICsgQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0gICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkgyNjRUcmltICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggcEMtPkgyNjRNQ1NUZW1wQnVmZmVyU2l6ZQotICAgICAgICAgICAgICAgICAgICA8IChwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUgKyAyMDQ4KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+UmVhZGVyVmlkZW9BVS5tX3NpemUgKyAyMDQ4KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPkgyNjRNQ1NUZW1wQnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+SDI2NE1DU1RlbXBCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopInBDLT5IMjY0TUNTVGVtcEJ1ZmZlciIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+SDI2NE1DU1RlbXBCdWZmZXIgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb051bGxFbmNvZGluZygpOiBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQy0+SDI2NE1DU1RlbXBCdWZmZXJEYXRhU2l6ZSA9IHBDLT5IMjY0TUNTVGVtcEJ1ZmZlclNpemU7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBIMjY0TUNTX1Byb2Nlc3NOQUxVKHBDLT5tX3BJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplLCBwQy0+SDI2NE1DU1RlbXBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMiAqKSZwQy0+SDI2NE1DU1RlbXBCdWZmZXJEYXRhU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggcEMtPm1fcEluc3RhbmNlLT5pc19kb25lID09IDEgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfY29udmV0RnJvbUJ5dGVTdHJlYW10b05BTFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKXBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MgLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5SZWFkZXJWaWRlb0FVLm1fZGF0YUFkZHJlc3MgKyA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5SZWFkZXJWaWRlb0FVLm1fc2l6ZSAtIDQpOwotICAgICAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5zaXplID0gcEMtPlJlYWRlclZpZGVvQVUubV9zaXplIC0gNDsKLSAgICAgICAgICAgICAgICAgICAgV3JpdGVidWZmZXJBZGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+V3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciArIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkgyNjRNQ1NUZW1wQnVmZmVyRGF0YVNpemUgLSA0KTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuc2l6ZSA9IHBDLT5IMjY0TUNTVGVtcEJ1ZmZlckRhdGFTaXplIC0gNDsKLSAgICAgICAgICAgICAgICAgICAgV3JpdGVidWZmZXJBZGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEguMjY0IFRyaW1taW5nICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPldyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgcEMtPlJlYWRlclZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5zaXplID0gcEMtPlJlYWRlclZpZGVvQVUubV9zaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENvbnZlcnQgQ1RTIHVuaXQgZnJvbSBtaWxsaXNlY29uZHMgdG8gdGltZXNjYWxlICovCi0gICAgICAgICAgICBwQy0+V3JpdGVyVmlkZW9BVS5DVFMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9UaW1lKSgoKCBwQy0+UmVhZGVyVmlkZW9BVS5tX0NUUyAtIHBDLT5kVmlEZWNTdGFydGluZ0N0cykKLSAgICAgICAgICAgICAgICAqIChwQy0+V3JpdGVyVmlkZW9TdHJlYW0udGltZVNjYWxlIC8gMTAwMC4wKSkpOwotICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvQVUubmJGcmFnID0gMDsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSA9IHBDLT5SZWFkZXJWaWRlb0FVLm1fYXR0cmlidXRlOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogdmlkZW8gQVU6IENUUz0lZCBtcyIsCi0gICAgICAgICAgICAgICAgcEMtPldyaXRlclZpZGVvQVUuQ1RTKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSBpdCB0byB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICAgICAgcEMtPnVpVmlkZW9BVUNvdW50Kys7Ci0gICAgICAgIGVyciA9IHBDLT5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRNQ1NfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgJnBDLT5Xcml0ZXJWaWRlb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKFZpZGVvKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIC8qICsgQ1JMVjY3NzUgLUguMjY0IFRyaW1taW5nICovCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iSDI2NFRyaW0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPm1fcEluc3RhbmNlLT5pc19kb25lID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKShXcml0ZWJ1ZmZlckFkZCAtIDQpLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKShwQy0+UmVhZGVyVmlkZW9BVS5tX2RhdGFBZGRyZXNzKSwgNCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKFdyaXRlYnVmZmVyQWRkIC0gNCksCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopKHBDLT5IMjY0TUNTVGVtcEJ1ZmZlciksIDQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IC8qIEguMjY0IFRyaW1taW5nICovCi0gICAgfQotICAgIC8qKgotICAgICogQ2hlY2sgZm9yIGVuZCBjdXQuICovCi0gICAgLyogQnVnIGZpeCAxMS8xMi8yMDA4OiBXZSBhYnNvbHV0ZWx5IHdhbnQgdG8gaGF2ZSBsZXNzIG9yIHNhbWUgdmlkZW8gZHVyYXRpb24gLT4KLSAgICAoMip2aWRlb0FVRHVyYXRpb24pIHRvIGhhdmUgYSBtb3JlIHByZWNpc2UgZW5kIGN1dCovCi0gICAgaWYoIHBDLT5SZWFkZXJWaWRlb0FVLm1fQ1RTICsgKDIgKnZpZGVvQVVEdXJhdGlvbikgPiBwQy0+dWlFbmRDdXRUaW1lICkKLSAgICB7Ci0gICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50VmlkZW9OdWxsRW5jb2RpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9UcmFuc2NvZGluZyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDKQotICogQGF1dGhvciAgIEFsZXhpcyBWYXBpbGxvbiAoTlhQIFNvZnR3YXJlIFZpc2lvbikKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50VmlkZW9UcmFuc2NvZGluZyggTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRfTWVkaWFUaW1lIG10VHJhbnNjb2RlZFRpbWUgPSAwLjA7Ci0gICAgTTRFTkNPREVSX0ZyYW1lTW9kZSBGcmFtZU1vZGU7Ci0gICAgTTRPU0FfSW50MzIgZGVyaXZlID0gMDsKLQotICAgIC8qKgotICAgICogR2V0IHZpZGVvIENUUyB0byBkZWNvZGUgKi8KLSAgICBtdFRyYW5zY29kZWRUaW1lID0gcEMtPmRWaURlY0N1cnJlbnRDdHM7Ci0gICAgRnJhbWVNb2RlID0gTTRFTkNPREVSX2tOb3JtYWxGcmFtZTsKLQotICAgIC8qKgotICAgICogRGVjb2RlIHZpZGVvICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCk6IENhbGxpbmcgbV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUoJS4yZikiLAotICAgICAgICBtdFRyYW5zY29kZWRUaW1lKTsKLSAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9GQUxTRTsKLSAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZWNvZGUocEMtPnBWaURlY0N0eHQsICZtdFRyYW5zY29kZWRUaW1lLAotICAgICAgICBNNE9TQV9GQUxTRSwgMCk7Ci0KLSAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgIHsKLSAgICAgICAgRnJhbWVNb2RlID0KLSAgICAgICAgICAgIE00RU5DT0RFUl9rTGFzdEZyYW1lOyAvKio8IFdlIHdpbGwgZ2l2ZSB0aGlzIHZhbHVlIHRvIHRoZSBlbmNvZGVyIHRvCi0gICAgICAgICAgICBhc2sgZm9yIHRoZSBlbmQgb2YgdGhlIGVuY29kaW5nICovCi0gICAgICAgIHBDLT5WaWRlb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX0ZJTklTSEVEOwotICAgIH0KLSAgICBlbHNlIGlmKCBlcnIgPT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkRlY29kaW5nIG91dHB1dCB0aGUgc2FtZSBmcmFtZSBhcyBiZWZvcmUgMyIpOwotICAgICAgICBwQy0+aXNSZW5kZXJEdXAgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCk6IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0RGVjb2RlIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGZvciBlbmQgY3V0LgotICAgICogV2UgbXVzdCBjaGVjayBoZXJlIGlmIHRoZSBlbmQgY3V0IGlzIHJlYWNoZWQsIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHdlIG11c3QKLSAgICAqIGNhbGwgdGhlIGxhc3QgZW5jb2RlIHN0ZXAgKC0+IGJMYXN0RnJhbWUgc2V0IHRvIHRydWUpICovCi0gICAgaWYoICggcEMtPmRWaURlY0N1cnJlbnRDdHMgKyBwQy0+ZEN0c0luY3JlbWVudCApID49IChwQy0+dWlFbmRDdXRUaW1lCi0gICAgICAgICsgTTRNQ1NfQUJTKHBDLT5kVmlEZWNTdGFydGluZ0N0cyAtIHBDLT51aUJlZ2luQ3V0VGltZSkpICkKLSAgICB7Ci0gICAgICAgIEZyYW1lTW9kZSA9Ci0gICAgICAgICAgICBNNEVOQ09ERVJfa0xhc3RGcmFtZTsgLyoqPCBXZSB3aWxsIGdpdmUgdGhpcyB2YWx1ZSB0byB0aGUgZW5jb2RlciB0bwotICAgICAgICAgICAgYXNrIGZvciB0aGUgZW5kIG9mIHRoZSBlbmNvZGluZyAqLwotICAgICAgICBwQy0+VmlkZW9TdGF0ZSA9IE00TUNTX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgZGVyaXZlID0gKE00T1NBX0ludDMyKSgoIHBDLT5kVmlEZWNDdXJyZW50Q3RzICsgcEMtPmRDdHNJbmNyZW1lbnQgKyAwLjUpCi0gICAgICAgICAgICAtIChwQy0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICArIE00TUNTX0FCUyhwQy0+ZFZpRGVjU3RhcnRpbmdDdHMgLSBwQy0+dWlCZWdpbkN1dFRpbWUpKSk7Ci0gICAgfQotCi0gICAgLyogVXBkYXRlIHN0YXJ0aW5nIENUUyB0byBoYXZlIGEgbW9yZSBwcmVjaXNlIHZhbHVlICgKLSAgICB0aGUgYmVnaW4gY3V0IGlzIG5vdCBhIHJlYWwgQ1RTKSovCi0gICAgaWYoIHBDLT51aVZpZGVvQVVDb3VudCA9PSAwICkKLSAgICB7Ci0gICAgICAgIHBDLT5kVmlEZWNTdGFydGluZ0N0cyA9IG10VHJhbnNjb2RlZFRpbWU7Ci0gICAgICAgIHBDLT5kVmlEZWNDdXJyZW50Q3RzID0gcEMtPmRWaURlY1N0YXJ0aW5nQ3RzOwotICAgIH0KLQotICAgIC8qKgotICAgICogRW5jb2RlIHZpZGVvICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNE1DU19pbnRWaWRlb1RyYW5zY29kaW5nKCk6IENhbGxpbmcgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUgd2l0aCB2aWRlb0N0c1wKLSAgICAgICAgID0gJS4yZiIscEMtPlJlYWRlclZpZGVvQVUubV9DVFMpOwotICAgIHBDLT51aVZpZGVvQVVDb3VudCsrOwotICAgIC8qIHVwZGF0ZSB0aGUgZ2l2ZW4gZHVyYXRpb24gKHRoZSBiZWdpbiBjdXQgaXMgbm90IGEgcmVhbCBDVFMpKi8KLSAgICBlcnIgPSBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUocEMtPnBWaUVuY0N0eHQsIE00T1NBX05VTEwsCi0gICAgICAgIChwQy0+ZFZpRGVjQ3VycmVudEN0cyAtIHBDLT5kVmlEZWNTdGFydGluZ0N0cyAtIChkZXJpdmUgPj4gMSkpLAotICAgICAgICBGcmFtZU1vZGUpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyhNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDb250ZXh0KQotICogQGF1dGhvciAgIERvdW55YSBNYW5haSAoTlhQIFNvZnR3YXJlIFZpc2lvbikKLSAqIEBicmllZiAgICBSZXRyaWV2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgZnJvbSB0aGUgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTUNTIGNvbnRleHQKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMoIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMgKQotewotICAgIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyBEZWNDb25mSW5mbzsKLSAgICBNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgSDI2M3Byb3A7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdmlkZW9CaXRyYXRlOwotICAgIE00REVDT0RFUl9WaWRlb1NpemUgdmlkZW9TaXplOwotICAgIE00X0FBQ1R5cGUgaUFhY1R5cGUgPSAwOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKE00T1NBX05VTEwgPT0gcEMsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXM6IHBDIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgY29tbW9uIGNoYXJhY3RlcmlzdGljcyAqLwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkZpbGVUeXBlID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WZXJzaW9uWzBdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUjsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WZXJzaW9uWzFdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NSU5PUjsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WZXJzaW9uWzJdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9SRVZJU0lPTjsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiA9IDA7Ci0KLSAgICBtZW1zZXQoKHZvaWQgKikgJnBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZ0eXAsCi0gICAgICAgIDAsIHNpemVvZihNNFZJREVPRURJVElOR19GdHlwQm94KSk7Ci0KLSAgICAvKioKLSAgICAqIFJlc2V0IHZpZGVvIGNoYXJhY3RlcmlzdGljcyAqLwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbiA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9NYXhBdVNpemUgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodCA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuZkF2ZXJhZ2VGcmFtZVJhdGUgPSAwLjA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0xldmVsID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iTVBFRzRkYXRhUGFydGl0aW9uID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYk1QRUc0cnZsYyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJNUEVHNHJlc3luY2hNYXJrZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgYXVkaW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbzsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb01heEF1U2l6ZSA9IDA7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUV4dGVuZGVkU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRGVjb2RlZFBjbVNpemUgPSAwOwotCi0gICAgLyogUmVzZXQgY29tcGF0aWJpbGl0eSBjaGFydCAobm90IHVzZWQgaW4gTUNTKSAqLwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJWaWRlb0lzRWRpdGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYlZpZGVvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBWaWRlbyBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa01QRUc0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjOgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVVua25vd246Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tVbnN1cHBvcnRlZFZpZGVvOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaWYgYml0cmF0ZSBub3QgYXZhaWxhYmxlIHJldHJpZXZlIGFuIGVzdGltYXRpb24gb2YgdGhlIG92ZXJhbGwgYml0cmF0ZSAqLwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotCi0gICAgICAgIGlmKCAwID09IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSwgJnZpZGVvQml0cmF0ZSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHdlIGdldCB0aGUgb3ZlcmFsbCBiaXRyYXRlLCBzdWJzdHJhY3QgdGhlIGF1ZGlvIGJpdHJhdGUgaWYgYW55ICovCi0gICAgICAgICAgICAgICAgdmlkZW9CaXRyYXRlIC09Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA9IHZpZGVvQml0cmF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFJldHJpZXZlIHRoZSBQcm9maWxlICYgTGV2ZWwgKi8KLSAgICAgICAgaWYoICggTTRWSURFT0VESVRJTkdfa0gyNjMgIT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlKQotICAgICAgICAgICAgJiYgKE00VklERU9FRElUSU5HX2tIMjY0Ci0gICAgICAgICAgICAhPSBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVXNlIHRoZSBEU0kgcGFyc2luZyBmdW5jdGlvbiBmcm9tIHRoZSBleHRlcm5hbCB2aWRlbyBzaGVsbCBkZWNvZGVyLgotICAgICAgICAgICAgU2VlIHRoZSBjb21tZW50cyBpbiBNNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMsIGl0J3MgcHJldHR5IG11Y2ggdGhlCi0gICAgICAgICAgICBzYW1lIGlzc3VlLiAqLwotCi0gICAgICAgICAgICBlcnIgPSBNNERFQ09ERVJfRVhURVJOQUxfUGFyc2VWaWRlb0RTSShwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgJkRlY0NvbmZJbmZvLCAmdmlkZW9TaXplKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXMoKTpcCi0gICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfRVhURVJOQUxfUGFyc2VWaWRlb0RTSSByZXR1cm5zIDB4JTA4WCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV92aWRlb1dpZHRoID0gdmlkZW9TaXplLm1fdWlXaWR0aDsKLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9IZWlnaHQgPSB2aWRlb1NpemUubV91aUhlaWdodDsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGUgPSBEZWNDb25mSW5mby51aVRpbWVTY2FsZTsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJNUEVHNGRhdGFQYXJ0aXRpb24gPQotICAgICAgICAgICAgICAgIERlY0NvbmZJbmZvLmJEYXRhUGFydGl0aW9uOwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuYk1QRUc0cnZsYyA9IERlY0NvbmZJbmZvLmJVc2VPZlJWTEM7Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5iTVBFRzRyZXN5bmNoTWFya2VyID0KLSAgICAgICAgICAgICAgICBEZWNDb25mSW5mby51aVVzZU9mUmVzeW5jaE1hcmtlcjsKLQotICAgICAgICAgICAgZXJyID0gZ2V0TVBFRzRQcm9maWxlQW5kTGV2ZWwoRGVjQ29uZkluZm8udWlQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgJihwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9MZXZlbCkpOwotICAgICAgICAgICAgaWYgKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcygpOlwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TVBFRzRQcm9maWxlQW5kTGV2ZWwgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRWSURFT0VESVRJTkdfa0gyNjMgPT0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSApIHsKLQotICAgICAgICAgICAgZXJyID0gZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbChwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgJihwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9MZXZlbCkpOwotICAgICAgICAgICAgaWYgKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcygpOlwKLSAgICAgICAgICAgICAgICAgICAgZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEZvciBoMjYzIHNldCBkZWZhdWx0IHRpbWVzY2FsZSA6IDMwMDAwOjEwMDEgKi8KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGUgPSAzMDAwMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggTTRWSURFT0VESVRJTkdfa0gyNjQgPT0KLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSApIHsKLQotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb1RpbWVTY2FsZSA9IDMwMDAwOwotICAgICAgICAgICAgZXJyID0gZ2V0QVZDUHJvZmlsZUFuZExldmVsKHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYocEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0xldmVsKSk7Ci0gICAgICAgICAgICBpZiAoIE00Tk9fRVJST1IgIT0gZXJyICkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzKCk6XAotICAgICAgICAgICAgICAgICAgICBnZXRBVkNQcm9maWxlQW5kTGV2ZWwgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBIZXJlIGJlY2F1c2Ugd2lkdGggeCBoZWlnaHQgaXMgY29ycmVjdCBvbmx5IGFmdGVyIGRzaSBwYXJzaW5nCi0gICAgICAgIChkb25lIGluIGNyZWF0ZSBkZWNvZGVyKSAqLwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fdmlkZW9IZWlnaHQ7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb24gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uOwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSA9Ci0gICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtLT5tX2F2ZXJhZ2VGcmFtZVJhdGU7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9tYXhBVVNpemU7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPnZpZGVvUm90YXRpb25EZWdyZWVzOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YlVuc3VwcG9ydGVkVmlkZW9Gb3VuZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkVmlkZW87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBzdHJlYW0gcHJvcGVydGllcyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDoKLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPQotICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rQU1SX05COwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOgotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tBQUM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9NcDM6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa01QMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0VWUkM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVW5rbm93bjoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW87Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggKCBNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXIpCi0gICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cEF1ZGlvRGVjQ3R4dCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczogY2FsbGluZyBDcmVhdGVBdWRpb0RlY29kZXIsIHVzZXJEYXRhPSAweCV4IiwKLSAgICAgICAgICAgICAgICBwQy0+bV9wQ3VycmVudEF1ZGlvRGVjb2RlclVzZXJEYXRhKTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5iRXh0T01YQXVkRGVjb2RlciApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcyhwQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICZwQy0+cEF1ZGlvRGVjQ3R4dCwgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogQUFDIHByb3BlcnRpZXMqLwotICAgICAgICAgICAgICAgICAgICAvL2dldCBmcm9tIFJlYWRlcjsgdGVtcG9yYXJ5LCB0aWxsIEF1ZGlvIGRlY29kZXIgc2hlbGwgQVBJIGF2YWlsYWJsZSB0bwotICAgICAgICAgICAgICAgICAgICAvL2dldCB0aGUgQUFDIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW4gPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQXVkaW9EZWNDdHh0LCBNNEFEX2tPcHRpb25JRF9TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZpQWFjVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00TUNTX2ludEdldElucHV0Q2xpcFByb3BlcnRpZXM6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjIHJldHVybnMgZXJyIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpQWFjVHlwZSA9IE00X2tBQUM7IC8vc2V0IHRvIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBzdHJlYW1UeXBlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQWFjVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIGlBYWNUeXBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rQUFDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFTQlJQcmVzZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hUFNQcmVzZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYUV4dGVuc2lvblNhbXBGcmVxID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3k7IC8vVE9ETwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYUV4dGVuc2lvblNhbXBGcmVxID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxpbmdGcmVxdWVuY3k7IC8vVE9ETwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tVbmtub3duOgotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllczogQUFDIE5CQ2hhbnM9JWQsIFNhbXBsRnJlcT0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOlwKLSAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9FVlJDCi0gICAgICAgIGlmKCBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUKLSAgICAgICAgICAgID09IE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGRlY29kZXIgbm90IGltcGxlbWVudGVkIHlldCwgcHJvdmlkZSBzb21lIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgbnVsbCBlbmNvZGluZyAqLwotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzID0gMTsKLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSA4MDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQnVnZml4IFA0TUUwMDAwMTEyODogV2l0aCBzb21lIElNVEMgZmlsZXMsIHRoZSBBTVIgYml0IHJhdGUgaXMgMCBrYnBzIGFjY29yZGluZwotICAgICAgICAgdGhlIEdldFByb3BlcnRpZXMgZnVuY3Rpb24gKi8KLSAgICAgICAgaWYoIDAgPT0gcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9hdmVyYWdlQml0UmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rQU1SX05CCi0gICAgICAgICAgICAgICAgPT0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEJldHRlciByZXR1cm5pbmcgYSBndWVzc2VkIDEyLjIga2JwcyB2YWx1ZSB0aGFuIGEgc3VyZS10by1iZS1mYWxzZQotICAgICAgICAgICAgICAgIDAga2JwcyB2YWx1ZSEgKi8KLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2sxMl8yX0tCUFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNFZJREVPRURJVElOR19rRVZSQwotICAgICAgICAgICAgICAgID09IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBCZXR0ZXIgcmV0dXJuaW5nIGEgZ3Vlc3NlZCA4LjUga2JwcyB2YWx1ZSB0aGFuIGEgc3VyZS10by1iZS1mYWxzZQotICAgICAgICAgICAgICAgIDAga2JwcyB2YWx1ZSEgKi8KLSAgICAgICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s5XzJfS0JQUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgRmlsZUJpdHJhdGU7Ci0KLSAgICAgICAgICAgICAgICAvKiBDYW4gaGFwcGVuIGFsc28gZm9yIGFhYywgaW4gdGhpcyBjYXNlIHdlIGNhbGN1bGF0ZSBhbiBhcHByb3hpbWF0aXZlICovCi0gICAgICAgICAgICAgICAgLyogdmFsdWUgZnJvbSBnbG9iYWwgYml0cmF0ZSBhbmQgdmlkZW8gYml0cmF0ZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbihwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJkZpbGVCaXRyYXRlKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzOiBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBGaWxlQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAtIHBDLT4KLSAgICAgICAgICAgICAgICAgICAgSW5wdXRGaWxlUHJvcGVydGllcy4KLSAgICAgICAgICAgICAgICAgICAgdWlWaWRlb0JpdHJhdGUgLyogbm9ybWFsbHkgc2V0dGVkIHRvIDAsIGlmIG5vIHZpZGVvICovOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPQotICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb24gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uOwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUF1ZGlvTWF4QXVTaXplID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplOwotCi0gICAgICAgIC8qIEJ1Zzogd2l0aCBhYWMsIHZhbHVlIGlzIDAgdW50aWwgZGVjb2RlciBzdGFydCgpIGlzIGNhbGxlZCAqLwotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aURlY29kZWRQY21TaXplID0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZUZyYW1lTGVuZ3RoCi0gICAgICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgICAgICogcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotCi0gICAgICAgIC8qIE5ldyBhYWMgcHJvcGVydGllcyAqLwotICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMKLSAgICAgICAgICAgID09IHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9IHBDLT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuOwotICAgICAgICAgICAgcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxOwotCi0gICAgICAgICAgICBpZiggcEMtPkFhY1Byb3BlcnRpZXMuYVNCUlByZXNlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tBQUNwbHVzOwotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5BYWNQcm9wZXJ0aWVzLmFFeHRlbnNpb25TYW1wRnJlcTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBDLT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tlQUFDcGx1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YlVuc3VwcG9ydGVkQXVkaW9Gb3VuZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1Vuc3VwcG9ydGVkQXVkaW87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogR2V0ICdmdHlwJyBhdG9tICovCi0gICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKHBDLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfa09wdGlvbklEXzNncEZ0eXBCb3gsICZwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mdHlwKTsKLQotICAgIC8qIEFuYWx5c2lzIGlzIHN1Y2Nlc3NmdWwgKi8KLSAgICBpZiggcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbgotICAgICAgICA+IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb24gKQotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiA9Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgZWxzZQotICAgICAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbiA9Ci0gICAgICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb247Ci0KLSAgICBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5GaWxlVHlwZSA9IHBDLT5JbnB1dEZpbGVUeXBlOwotICAgIHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmJBbmFseXNlZCA9IE00T1NBX1RSVUU7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0FNUk5CKE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lKQotICogQGJyaWVmICAgUmV0dXJuIHRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgQU1SIE5hcnJvdy1CYW5kIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENwQXVkaW9GcmFtZSAgIChJTikgQU1STkIgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0FNUk5CKCBNNE9TQV9NZW1BZGRyOCBwQXVkaW9GcmFtZSApCi17Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lVHlwZSA9ICggKCAqcEF1ZGlvRnJhbWUpICYoMHhGIDw8IDMpKSA+PiAzOwotCi0gICAgc3dpdGNoKCBmcmFtZVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZnJhbWVTaXplID0gOTU7Ci0gICAgICAgICAgICBicmVhazsgLyogIDQ3NTAgYnBzICovCi0KLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTAzOwotICAgICAgICAgICAgYnJlYWs7IC8qICA1MTUwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDExODsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNTkwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxMzQ7Ci0gICAgICAgICAgICBicmVhazsgLyogIDY3MDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTQ4OwotICAgICAgICAgICAgYnJlYWs7IC8qICA3NDAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE1OTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNzk1MCBicHMgKi8KLQotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAyMDQ7Ci0gICAgICAgICAgICBicmVhazsgLyogMTAyMDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMjQ0OwotICAgICAgICAgICAgYnJlYWs7IC8qIDEyMDAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDM5OwotICAgICAgICAgICAgYnJlYWs7IC8qIFNJRCAoU2lsZW5jZSkgKi8KLQotICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiBObyBkYXRhICovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRGcmFtZVNpemVfQU1STkIoKTogQ29ycnVwdGVkIEFNUiBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0VWUkMoTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBFVlJDIGZyYW1lIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gYnVmZmVyCi0gKiBAbm90ZQotICogICAgIDAgMSAyIDMKLSAqICAgICstKy0rLSstKwotICogICAgfGZyIHR5cGV8ICAgICAgICAgICAgICBSRkMgMzU1OAotICogICAgKy0rLSstKy0rCi0gKgotICogRnJhbWUgVHlwZTogNCBiaXRzCi0gKiAgICBUaGUgZnJhbWUgdHlwZSBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY29kZWMgZGF0YQotICogICAgZnJhbWUgaW4gdGhlIFJUUCBwYWNrZXQuCi0gKgotICogRm9yIEVWUkMgYW5kIFNNViBjb2RlY3MsIHRoZSBmcmFtZSB0eXBlIHZhbHVlcyBhbmQgc2l6ZSBvZiB0aGUKLSAqIGFzc29jaWF0ZWQgY29kZWMgZGF0YSBmcmFtZSBhcmUgZGVzY3JpYmVkIGluIHRoZSB0YWJsZSBiZWxvdzoKLSAqCi0gKiBWYWx1ZSAgIFJhdGUgICAgICBUb3RhbCBjb2RlYyBkYXRhIGZyYW1lIHNpemUgKGluIG9jdGV0cykKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogICAwICAgICBCbGFuayAgICAgIDAgICAgKDAgYml0KQotICogICAxICAgICAxLzggICAgICAgIDIgICAgKDE2IGJpdHMpCi0gKiAgIDIgICAgIDEvNCAgICAgICAgNSAgICAoNDAgYml0czsgbm90IHZhbGlkIGZvciBFVlJDKQotICogICAzICAgICAxLzIgICAgICAgMTAgICAgKDgwIGJpdHMpCi0gKiAgIDQgICAgIDEgICAgICAgICAyMiAgICAoMTcxIGJpdHM7IDUgcGFkZGVkIGF0IGVuZCB3aXRoIHplcm9zKQotICogICA1ICAgICBFcmFzdXJlICAgIDAgICAgKFNIT1VMRCBOT1QgYmUgdHJhbnNtaXR0ZWQgYnkgc2VuZGVyKQotICoKLSAqIEBwYXJhbSAgIHBDcEF1ZGlvRnJhbWUgICAoSU4pIEVWUkMgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9VSW50MzIgTTRNQ1NfaW50R2V0RnJhbWVTaXplX0VWUkMoIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICkKLXsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVUeXBlID0gKCAqcEF1ZGlvRnJhbWUpICYweDBGOwotCi0gICAgc3dpdGNoKCBmcmFtZVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgYmxhbmsgKi8KLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNjsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMS84ICovCi0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZnJhbWVTaXplID0gNDA7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEvNCAqLwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDgwOwotICAgICAgICAgICAgYnJlYWs7IC8qICAxLzIgKi8KLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNzE7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEgKi8KLQotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qICBlcmFzdXJlICovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRHZXRGcmFtZVNpemVfRVZSQygpOiBDb3JydXB0ZWQgRVZSQyBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tNYXhGaWxlU2l6ZShNNE1DU19Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIENoZWNrIGlmIG1heCBmaWxlIHNpemUgaXMgZ3JlYXRlciBlbm91Z2ggdG8gZW5jb2RlIGEgZmlsZSB3aXRoIHRoZQotICogICAgICAgICAgIGN1cnJlbnQgc2VsZWN0ZWQgYml0cmF0ZXMgYW5kIGR1cmF0aW9uLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNQ1MgY29udGV4dAotICogQHJldHVybiAgIE00Tk9fRVJST1IKLSAqIEByZXR1cm4gICBNNE1DU19FUlJfTUFYRklMRVNJWkVfVE9PX1NNQUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tNYXhGaWxlU2l6ZSggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQgKikocENvbnRleHQpOwotCi0gICAgTTRPU0FfVUludDMyIGR1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiBhdWRpb2JpdHJhdGU7Ci0gICAgTTRPU0FfVUludDMyIHZpZGVvYml0cmF0ZTsKLQotICAgIC8qIGZyZWUgZmlsZSBzaXplIDogT0sgKi8KLSAgICBpZiggcEMtPnVpTWF4RmlsZVNpemUgPT0gMCApCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotCi0gICAgLyogZHVyYXRpb24gKi8KLSAgICBpZiggcEMtPnVpRW5kQ3V0VGltZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIGR1cmF0aW9uID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gLSBwQy0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGR1cmF0aW9uID0gcEMtPnVpRW5kQ3V0VGltZSAtIHBDLT51aUJlZ2luQ3V0VGltZTsKLSAgICB9Ci0KLSAgICAvKiBhdWRpbyBiaXRyYXRlICovCi0gICAgaWYoIHBDLT5ub2F1ZGlvICkKLSAgICB7Ci0gICAgICAgIGF1ZGlvYml0cmF0ZSA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPT0gTTRFTkNPREVSX2tBdWRpb05VTEwgKQotICAgIHsKLSAgICAgICAgYXVkaW9iaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT51aUF1ZGlvQml0cmF0ZSA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgewotICAgICAgICBzd2l0Y2goIHBDLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00RU5DT0RFUl9rQU1STkI6Ci0gICAgICAgICAgICAgICAgYXVkaW9iaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAvL0VWUkMKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIGNhc2UgTTRFTkNPREVSX2tFVlJDOgotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGF1ZGlvYml0cmF0ZSA9IE00VklERU9FRElUSU5HX2s5XzJfS0JQUzsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDogLyogQUFDIGFuZCBNUDMqLwotICAgICAgICAgICAgICAgIGF1ZGlvYml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChwQy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9PSBNNEVOQ09ERVJfa01vbm8pCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfazE2X0tCUFMgOiBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBhdWRpb2JpdHJhdGUgPSBwQy0+dWlBdWRpb0JpdHJhdGU7Ci0gICAgfQotCi0gICAgLyogdmlkZW8gYml0cmF0ZSAqLwotICAgIGlmKCBwQy0+bm92aWRlbyApCi0gICAgewotICAgICAgICB2aWRlb2JpdHJhdGUgPSAwOwotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+RW5jb2RpbmdWaWRlb0Zvcm1hdCA9PSBNNEVOQ09ERVJfa05VTEwgKQotICAgIHsKLSAgICAgICAgdmlkZW9iaXRyYXRlID0gcEMtPklucHV0RmlsZVByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgfQotICAgIGVsc2UgaWYoIHBDLT51aVZpZGVvQml0cmF0ZSA9PSBNNFZJREVPRURJVElOR19rVW5kZWZpbmVkQml0cmF0ZSApCi0gICAgewotICAgICAgICB2aWRlb2JpdHJhdGUgPSBNNFZJREVPRURJVElOR19rMTZfS0JQUzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdmlkZW9iaXRyYXRlID0gcEMtPnVpVmlkZW9CaXRyYXRlOwotICAgIH0KLQotICAgIC8qIG1heCBmaWxlIHNpemUgKi8KLSAgICBpZiggKE00T1NBX1VJbnQzMilwQy0+dWlNYXhGaWxlU2l6ZQotICAgICAgICA8IChNNE9TQV9VSW50MzIpKE00TUNTX01PT1ZfT1ZFUl9GSUxFU0laRV9SQVRJTwotICAgICAgICAqIChhdWRpb2JpdHJhdGUgKyB2aWRlb2JpdHJhdGUpICogKGR1cmF0aW9uIC8gODAwMC4wKSkgKQotICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX01BWEZJTEVTSVpFX1RPT19TTUFMTDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklERU9FRElUSU5HX0JpdHJhdGUgTTRNQ1NfaW50R2V0TmVhcmVzdEJpdHJhdGUoTTRPU0FfVUludDMyIGZyZWViaXRyYXRlLCBNNE9TQV9JbnQ4IG1vZGUpCi0gKiBAYnJpZWYgICAgUmV0dXJucyB0aGUgY2xvc2VzdCBiaXRyYXRlIHZhbHVlIGZyb20gdGhlIGVudW0gbGlzdCBvZiB0eXBlIE00VklERU9FRElUSU5HX0JpdHJhdGUKLSAqIEBwYXJhbSAgICBmcmVlYml0cmF0ZTogdW5zaWduZWQgaW50IHZhbHVlCi0gKiBAcGFyYW0gICAgbW9kZTogLTE6cHJldmlvdXMsMDpjdXJyZW50LDE6bmV4dAotICogQHJldHVybiAgIGJpdHJhdGUgdmFsdWUgaW4gZW51bSBsaXN0IE00VklERU9FRElUSU5HX0JpdHJhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00VklERU9FRElUSU5HX0JpdHJhdGUKLU00TUNTX2ludEdldE5lYXJlc3RCaXRyYXRlKCBNNE9TQV9JbnQzMiBmcmVlYml0cmF0ZSwgTTRPU0FfSW50OCBtb2RlICkKLXsKLSAgICBNNE9TQV9JbnQzMiBiaXRhcnJheSBbXSA9Ci0gICAgewotICAgICAgICAwLCBNNFZJREVPRURJVElOR19rMTZfS0JQUywgTTRWSURFT0VESVRJTkdfazI0X0tCUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2szMl9LQlBTLCBNNFZJREVPRURJVElOR19rNDhfS0JQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFMsIE00VklERU9FRElUSU5HX2s5Nl9LQlBTLAotICAgICAgICBNNFZJREVPRURJVElOR19rMTI4X0tCUFMsIE00VklERU9FRElUSU5HX2sxOTJfS0JQUywKLSAgICAgICAgTTRWSURFT0VESVRJTkdfazI1Nl9LQlBTLCBNNFZJREVPRURJVElOR19rMjg4X0tCUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2szODRfS0JQUywgTTRWSURFT0VESVRJTkdfazUxMl9LQlBTLAotICAgICAgICBNNFZJREVPRURJVElOR19rODAwX0tCUFMsIE00VklERU9FRElUSU5HX2syX01CUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2s1X01CUFMsCi0gICAgICAgIE00VklERU9FRElUSU5HX2s4X01CUFMsIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICBNNE9TQV9JTlQzMl9NQVgKLSAgICB9OwotCi0gICAgY29uc3QgTTRPU0FfVUludDMyIG5iYml0cmF0ZXMgPSAxNDsKLSAgICBNNE9TQV9VSW50MzIgaTsKLQotICAgIGZvciAoIGkgPSAwOyBmcmVlYml0cmF0ZSA+PSBiaXRhcnJheVtpXTsgaSsrICk7Ci0KLSAgICBzd2l0Y2goIG1vZGUgKQotICAgIHsKLSAgICAgICAgY2FzZSAtMTogLyogcHJldmlvdXMgKi8KLSAgICAgICAgICAgIGlmKCBpIDw9IDIgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBiaXRhcnJheVtpIC0gMl07Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDA6IC8qIGN1cnJlbnQgKi8KLSAgICAgICAgICAgIGlmKCBpIDw9IDEgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBiaXRhcnJheVtpIC0gMV07Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE6IC8qIG5leHQgKi8KLSAgICAgICAgICAgIGlmKCBpID49IG5iYml0cmF0ZXMgKQotICAgICAgICAgICAgICAgIHJldHVybiBNNE9TQV9JTlQzMl9NQVg7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJpdGFycmF5W2ldOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpOwotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgTTRNQ1Nfb3BlbigpCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00TUNTX2ludENsZWFuVXBfUmVhZGVyc0RlY29kZXJzKCBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFMl8xKCJNNE1DU19pbnRDbGVhblVwX1JlYWRlcnNEZWNvZGVycyBjYWxsZWQgd2l0aCBwQz0weCV4IiwgcEMpOwotCi0gICAgLyoqLwotICAgIC8qIC0tLS0tIEZyZWUgdmlkZW8gZGVjb2RlciBzdHVmZiwgaWYgbmVlZGVkIC0tLS0tICovCi0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFZpRGVjQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZXN0cm95KHBDLT5wVmlEZWNDdHh0KTsKLSAgICAgICAgcEMtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBtX3BWaWRlb0RlY29kZXItPnBGY3REZXN0cm95IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIC0tLS0tIEZyZWUgdGhlIGF1ZGlvIGRlY29kZXIgc3R1ZmYgLS0tLS0gKi8KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9EZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCk7Ci0gICAgICAgIHBDLT5wQXVkaW9EZWNDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfY2xlYW5VcDogbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3REZXN0cm95QXVkaW9EZWMgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgIHBDLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiAtLS0tLSBGcmVlIHJlYWRlciBzdHVmZiwgaWYgbmVlZGVkIC0tLS0tICovCi0gICAgLy8gV2UgY2Fubm90IGZyZWUgdGhlIHJlYWRlciBiZWZvcmUgZGVjb2RlcnMgYmVjYXVzZSB0aGUgZGVjb2RlcnMgbWF5IHJlYWQKLSAgICAvLyBmcm9tIHRoZSByZWFkZXIgKGluIGFub3RoZXIgdGhyZWFkKSBiZWZvcmUgYmVpbmcgc3RvcHBlZC4KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT4KLSAgICAgICAgcFJlYWRlckNvbnRleHQgKSAvKio8IG1heSBiZSBNNE9TQV9OVUxMIGlmIE00TUNTX29wZW4gd2FzIG5vdCBjYWxsZWQgKi8KLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdENsb3NlKHBDLT5wUmVhZGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2NsZWFuVXA6IG1fcFJlYWRlci0+bV9wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RGVzdHJveShwQy0+cFJlYWRlckNvbnRleHQpOwotICAgICAgICBwQy0+cFJlYWRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19jbGVhblVwOiBtX3BSZWFkZXItPm1fcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBwQy0+bV9wRGF0YUFkZHJlc3MxICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wRGF0YUFkZHJlc3MxKTsKLSAgICAgICAgcEMtPm1fcERhdGFBZGRyZXNzMSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BEYXRhQWRkcmVzczIgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BEYXRhQWRkcmVzczIpOwotICAgICAgICBwQy0+bV9wRGF0YUFkZHJlc3MyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLypCdWcgZml4IDExLzEyLzIwMDggKHRvIG9idGFpbiBtb3JlIHByZWNpc2UgdmlkZW8gZW5kIGN1dCkqLwotICAgIGlmKCBwQy0+bV9wRGF0YVZpZGVvQWRkcmVzczEgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSk7Ci0gICAgICAgIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5tX3BEYXRhVmlkZW9BZGRyZXNzMiAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyKTsKLSAgICAgICAgcEMtPm1fcERhdGFWaWRlb0FkZHJlc3MyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX29wZW5fbm9ybWFsTW9kZShNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlT3V0LCBNNE9TQV9Wb2lkKiBwVGVtcEZpbGUpOwotICogQGJyaWVmICAgU2V0IHRoZSBNQ1MgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4gSXQgaXMgdGhlIHNhbWUgYXMgTTRNQ1Nfb3BlbiB3aXRob3V0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfV0lUSF9GQVNUX09QRU4gZmxhZwotSXQgaXMgdXNlZCBpbiBWaWRlb0FydGlzdAotICogQG5vdGUgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgaXMgbm90IGNyZWF0ZWQgeWV0LgotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIE1DUyBjb250ZXh0Ci0gKiBAcGFyYW0gICBwRmlsZUluICAgICAgICAgICAgIChJTikgSW5wdXQgZmlsZSB0byB0cmFuc2NvZGUgKFRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgbWVkaWFUeXBlICAgICAgICAgICAoSU4pIENvbnRhaW5lciB0eXBlICguM2dwLC5hbXIsIC4uLikgb2YgaW5wdXQgZmlsZS4KLSAqIEBwYXJhbSAgIHBGaWxlT3V0ICAgICAgICAgICAgKElOKSBPdXRwdXQgZmlsZSB0byBjcmVhdGUgIChUaGUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVUkwsIHBpcGUuLi4pIGRlcGVuZHMgb24gdGhlIE9TQUwgaW1wbGVtZW50YXRpb24pLgotICogQHBhcmFtICAgcFRlbXBGaWxlICAgICAgICAgICAoSU4pIFRlbXBvcmFyeSBmaWxlIGZvciB0aGUgY29uc3RhbnQgbWVtb3J5IHdyaXRlciB0byBzdG9yZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSAoIm1vb3YuYmluIikuCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICAgICAgTUNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICBNNEVSUl9GSUxFX05PVF9GT1VORDogICBUaGUgaW5wdXQgZmlsZSBoYXMgbm90IGJlZW4gZm91bmQKLSAqIEByZXR1cm4gIE00TUNTX0VSUl9JTlZBTElEX0lOUFVUX0ZJTEU6ICAgVGhlIGlucHV0IGZpbGUgaXMgbm90IGEgdmFsaWQgZmlsZSwgb3IgaXMgY29ycnVwdGVkCi0gKiBAcmV0dXJuICBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNOiAgVGhlIGlucHV0IGZpbGUgY29udGFpbnMgbm8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGF1ZGlvIG9yIHZpZGVvIHN0cmVhbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKE00TUNTX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBJbnB1dEZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBGaWxlT3V0LCBNNE9TQV9Wb2lkKiBwVGVtcEZpbGUpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00UkVBREVSX01lZGlhRmFtaWx5IG1lZGlhRmFtaWx5OwotICAgIE00X1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIk00TUNTX29wZW5fbm9ybWFsTW9kZSBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwRmlsZUluPTB4JXgsXAotICAgICBwRmlsZU91dD0weCV4IiwgcENvbnRleHQsIHBGaWxlSW4sIHBGaWxlT3V0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgIk00TUNTX29wZW5fbm9ybWFsTW9kZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZUluKSAsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgIk00TUNTX29wZW5fbm9ybWFsTW9kZTogcEZpbGVJbiBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiAoKElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0pQRykKLSAgICAgICAgfHwoSW5wdXRGaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUE5HKQotICAgICAgICB8fChJbnB1dEZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9HSUYpCi0gICAgICAgIHx8KElucHV0RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0JNUCkpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlOiBTdGlsbCBwaWN0dXJlIGlzIG5vdFwKLSAgICAgICAgICAgICBzdXBwb3J0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5QVVRfRklMRV9DT05UQUlOU19OT19TVVBQT1JURURfU1RSRUFNOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYgKE00TUNTX2tTdGF0ZV9DUkVBVEVEICE9IHBDLT5TdGF0ZSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwKLSAgICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ29weSBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzIGludG8gb3VyIGNvbnRleHQgKi8KLSAgICBwQy0+cElucHV0RmlsZSAgICAgPSBwRmlsZUluOwotICAgIHBDLT5JbnB1dEZpbGVUeXBlICA9IElucHV0RmlsZVR5cGU7Ci0gICAgcEMtPnBPdXRwdXRGaWxlICAgID0gcEZpbGVPdXQ7Ci0gICAgcEMtPnBUZW1wb3JhcnlGaWxlID0gcFRlbXBGaWxlOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIE9wZW4gaW5wdXQgZmlsZSB3aXRoIHRoZSByZWFkZXIgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50UmVhZGVyKHBDb250ZXh0LCBwQy0+SW5wdXRGaWxlVHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIFJlc2V0IHJlYWRlciByZWxhdGVkIHZhcmlhYmxlcyAqLwotICAgIHBDLT5WaWRlb1N0YXRlICAgICAgICAgID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNOwotICAgIHBDLT5BdWRpb1N0YXRlICAgICAgICAgID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX05PU1RSRUFNOwotICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0gID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtICA9IE00T1NBX05VTEw7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBJbml0aWFsaXplcyB0aGUgcmVhZGVyIHNoZWxsIGFuZCBvcGVuIHRoZSBkYXRhIGZpbGUgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUoJnBDLT5wUmVhZGVyQ29udGV4dCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBtX3BSZWFkZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogTGluayB0aGUgcmVhZGVyIGludGVyZmFjZSB0byB0aGUgcmVhZGVyIGNvbnRleHQgKi8KLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0LT5tX3JlYWRlckNvbnRleHQgPSBwQy0+cFJlYWRlckNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgcmVhZGVyIHNoZWxsIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucyAqLwotICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbihwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfU2V0T3NhRmlsZVJlYWRlckZjdHNQdHIsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDLT5wT3NhRmlsZVJlYWRQdHIpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE9wZW4gdGhlIGlucHV0IGZpbGUgKi8KLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RPcGVuKHBDLT5wUmVhZGVyQ29udGV4dCwgcEMtPnBJbnB1dEZpbGUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1aUR1bW15LCB1aUNvcmVJZDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBtX3BSZWFkZXItPm1fcEZjdE9wZW4gcmV0dXJucyAweCV4IiwgZXJyKTsKLQotICAgICAgICBpZiAoZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEUpKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IHJldHVybmluZyBNNE1DU19FUlJfRklMRV9EUk1fUFJPVEVDVEVEIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfRVJSX0ZJTEVfRFJNX1BST1RFQ1RFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBJZiB0aGUgZXJyb3IgaXMgZnJvbSB0aGUgY29yZSByZWFkZXIsIHdlIGNoYW5nZSBpdCB0byBhIHB1YmxpYyBWWFMgZXJyb3IgKi8KLSAgICAgICAgICAgIE00T1NBX0VSUl9TUExJVChlcnIsIHVpRHVtbXksIHVpQ29yZUlkLCB1aUR1bW15KTsKLSAgICAgICAgICAgIGlmIChNNE1QNF9SRUFERVIgPT0gdWlDb3JlSWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiByZXR1cm5pbmcgTTRNQ1NfRVJSX0lOVkFMSURfSU5QVVRfRklMRSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNE1DU19FUlJfSU5WQUxJRF9JTlBVVF9GSUxFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBHZXQgdGhlIHN0cmVhbXMgZnJvbSB0aGUgaW5wdXQgZmlsZSAqLwotICAgIHdoaWxlIChNNE5PX0VSUk9SID09IGVycikKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRTdHJlYW0ocEMtPnBSZWFkZXJDb250ZXh0LCAmbWVkaWFGYW1pbHksCi0gICAgICAgICAgICAmcFN0cmVhbUhhbmRsZXIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEluIGNhc2Ugd2UgZm91bmQgYSBCSUZTIHN0cmVhbSBvciBzb21ldGhpbmcgZWxzZS4uLiovCi0gICAgICAgIGlmKChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUpKQotICAgICAgICAgICAgfHwgKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNFdBUl9UT09fTVVDSF9TVFJFQU1TKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SID09IGVycikgLyoqPCBPbmUgc3RyZWFtIGZvdW5kICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGb3VuZCB0aGUgZmlyc3QgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICBpZiAoKE00UkVBREVSX2tNZWRpYUZhbWlseVZpZGVvID09IG1lZGlhRmFtaWx5KSBcCi0gICAgICAgICAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcEMtPnBSZWFkZXJWaWRlb1N0cmVhbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0PT1wU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERU9fQVZDCi0gICAgICAgICAgICAgICAgICAgIHx8KE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpKQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgfHwoKE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgICYmKHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW000REVDT0RFUl9rVmlkZW9UeXBlQVZDXSAhPSBNNE9TQV9OVUxMKSkpCi0jZW5kaWYKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICBGb3VuZCBhIEgyNjMgb3IgTVBFRy00IHZpZGVvIHN0cmVhbSBpbiBpbnB1dCAzZ3BwIGNsaXAiKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBLZWVwIHBvaW50ZXIgdG8gdGhlIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlclZpZGVvU3RyZWFtID0gKE00X1ZpZGVvU3RyZWFtSGFuZGxlciopcFN0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRWaWRlb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJbml0IG91ciB2aWRlbyBzdHJlYW0gc3RhdGUgdmFyaWFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlZpZGVvU3RhdGUgPSBNNE1DU19rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXNldCB0aGUgc3RyZWFtIHJlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5wUmVhZGVyVmlkZW9TdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0UmVzZXQodmlkZW8pIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYWNjZXNzIFVuaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0RmlsbEF1U3RydWN0KHBDLT5wUmVhZGVyQ29udGV4dCwgcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5SZWFkZXJWaWRlb0FVKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdCh2aWRlbykgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBIMjYzIG9yIE1QRUctNCAoSDI2NCwgZXRjLikgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgRm91bmQgYW4gdW5zdXBwb3J0ZWQgdmlkZW8gc3RyZWFtICgweCV4KSBpbiBpbnB1dCAzZ3BwIGNsaXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKTsKLQotICAgICAgICAgICAgICAgICAgICBwQy0+YlVuc3VwcG9ydGVkVmlkZW9Gb3VuZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIHRoZSBmaXJzdCBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKChNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbyA9PSBtZWRpYUZhbWlseSkKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZD09cFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjPT1wU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICAoTTREQV9TdHJlYW1UeXBlQXVkaW9NcDM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM9PXBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogRm91bmQgYW4gQU1SLU5CLCBBQUMgXAotICAgICAgICAgICAgICAgICAgICAgICAgb3IgTVAzIGF1ZGlvIHN0cmVhbSBpbiBpbnB1dCBjbGlwIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSW5pdCBvdXIgYXVkaW8gc3RyZWFtIHN0YXRlIHZhcmlhYmxlICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5BdWRpb1N0YXRlID0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlci0+bV9wRmN0UmVzZXQocEMtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKilwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXItPm1fcEZjdFJlc2V0KGF1ZGlvKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXItPm1fcEZjdEZpbGxBdVN0cnVjdChwQy0+cFJlYWRlckNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+UmVhZGVyQXVkaW9BVSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogT3V0cHV0IG1heCBBVSBzaXplIGlzIGVxdWFsIHRvIGlucHV0IG1heCBBVSBzaXplICh0aGlzIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICogd2lsbCBiZSBjaGFuZ2VkIGlmIHRoZXJlIGlzIGF1ZGlvIHRyYW5zY29kaW5nKSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+dWlBdWRpb01heEF1U2l6ZSA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKio8IE5vdCBBTVItTkIsIEFBQywgTVAzIG5vciBFVlJDIChBTVItV0IsIFdBVi4uLikgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOiBGb3VuZCBhbiB1bnN1cHBvcnRlZCBhdWRpbyBzdHJlYW1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgKDB4JXgpIGluIGlucHV0IDNncHAgY2xpcCIsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iVW5zdXBwb3J0ZWRBdWRpb0ZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IC8qKjwgZW5kIG9mIHdoaWxlIChNNE5PX0VSUk9SID09IGVycikgKi8KLQotICAgIC8qKgotICAgICogQ2hlY2sgd2UgZm91bmQgYXQgbGVhc3Qgb25lIHN1cHBvcnRlZCBzdHJlYW0gKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlclZpZGVvU3RyZWFtKSAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19vcGVuX25vcm1hbE1vZGUoKTogcmV0dXJuaW5nIFwKLSAgICAgICAgICAgIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU0iKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX0VSUl9JTlBVVF9GSUxFX0NPTlRBSU5TX05PX1NVUFBPUlRFRF9TVFJFQU07Ci0gICAgfQotCi0jaWZuZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIGlmKHBDLT5WaWRlb1N0YXRlID09IE00TUNTX2tTdHJlYW1TdGF0ZV9TVEFSVEVEKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRGVjb2RlcihwQ29udGV4dCwKLSAgICAgICAgICAgIHBDLT5wUmVhZGVyVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYocEMtPkF1ZGlvU3RhdGUgPT0gTTRNQ1Nfa1N0cmVhbVN0YXRlX1NUQVJURUQpCi0gICAgewotICAgICAgICAvL0VWUkMKLSAgICAgICAgaWYoTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjICE9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAvKiBkZWNvZGVyIG5vdCBzdXBwb3J0ZWQgeWV0LCBidXQgYWxsb3cgdG8gZG8gbnVsbCBlbmNvZGluZyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE1DU19zZXRDdXJyZW50QXVkaW9EZWNvZGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotICAgICAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgZXJyID0gTTRNQ1NfaW50R2V0SW5wdXRDbGlwUHJvcGVydGllcyhwQyk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX29wZW5fbm9ybWFsTW9kZSgpOlwKLSAgICAgICAgICAgICBNNE1DU19pbnRHZXRJbnB1dENsaXBQcm9wZXJ0aWVzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGJlZ2luIGN1dCBkZWNvZGluZyBpbmNyZW1lbnQgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBmcmFtZSByYXRlICovCi0gICAgaWYgKDAuICE9IHBDLT5JbnB1dEZpbGVQcm9wZXJ0aWVzLmZBdmVyYWdlRnJhbWVSYXRlKSAvKio8IHNhbml0eSBjaGVjayAqLwotICAgIHsKLSAgICAgICAgcEMtPmlWaWRlb0JlZ2luRGVjSW5jciA9IChNNE9TQV9JbnQzMikoMzAwMC4gXAotICAgICAgICAgICAgLyBwQy0+SW5wdXRGaWxlUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSk7IC8qKjwgYWJvdXQgMyBmcmFtZXMgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPmlWaWRlb0JlZ2luRGVjSW5jciA9IDIwMDsgLyoqPCBkZWZhdWx0IHZhbHVlOiAyMDAgbWlsbGlzZWNvbmRzICgzIGZyYW1lcyBAIDE1ZnBzKSovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgc3RhdGUgYXV0b21hdG9uICovCi0gICAgcEMtPlN0YXRlID0gTTRNQ1Nfa1N0YXRlX09QRU5FRDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1Nfb3Blbl9ub3JtYWxNb2RlKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0ludGVybmFsQ29udGV4dCAqcEMpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00QURfQnVmZmVyIG91dHB1dEJ1ZmZlcjsKLSAgICB1aW50MzJfdCBvcHRpb25WYWx1ZSA9MDsKLQotICAgIE00T1NBX1RSQUNFM18wKCJNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllcyA6c3RhcnQiKTsKLQotICAgIC8vIERlY29kZSBmaXJzdCBhdWRpbyBmcmFtZSBmcm9tIGNsaXAgdG8gZ2V0IHByb3BlcnRpZXMgZnJvbSBjb2RlYwotCi0gICAgaWYgKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09Ci0gICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpIHsKLQotICAgICAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLCAmKHBDLT5BYWNQcm9wZXJ0aWVzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICZwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YSk7Ci0gICAgfQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotCi0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzOiBtX3BGY3RDcmVhdGVBdWRpb0RlYyBcCi0gICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlLCAoTTRPU0FfRGF0YU9wdGlvbikgcEMtPm1fcFJlYWRlckRhdGFJdCk7Ci0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9BVSwgKE00T1NBX0RhdGFPcHRpb24pICZwQy0+UmVhZGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggcEMtPm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyAhPSBNNE9TQV9OVUxMICkgewotCi0gICAgICAgIGVyciA9IHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0YXJ0QXVkaW9EZWMocEMtPnBBdWRpb0RlY0N0eHQpOwotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNE1DU19pbnRDaGVja0FuZEdldENvZGVjUHJvcGVydGllczogbV9wRmN0U3RhcnRBdWRpb0RlYyBcCi0gICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIG91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUgPQotICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAqIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgKiBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0KLSAgICBpZiggb3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSA+IDAgKSB7Ci0KLSAgICAgICAgb3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplIFwKLSAgICAgICAgICAgICpzaXplb2Yoc2hvcnQpLCBNNE1DUywgKE00T1NBX0NoYXIgKikib3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzICkgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRNQ1NfaW50Q2hlY2tBbmRHZXRDb2RlY1Byb3BlcnRpZXMoKTpcCi0gICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcywgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnIgPSBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMocEMtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgIE00T1NBX05VTEwsICZvdXRwdXRCdWZmZXIsIE00T1NBX0ZBTFNFKTsKLQotICAgIGlmICggZXJyID09IE00V0FSX0lORk9fRk9STUFUX0NIQU5HRSApIHsKLQotICAgICAgICAvLyBHZXQgdGhlIHByb3BlcnRpZXMgZnJvbSBjb2RlYyBub2RlCi0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXItPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjKHBDLT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICBNNEFEX2tPcHRpb25JRF9BdWRpb05iQ2hhbm5lbHMsIChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotCi0gICAgICAgIC8vIFJlc2V0IFJlYWRlciBzdHJ1Y3R1cmUgdmFsdWUgYWxzbwotICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPSBvcHRpb25WYWx1ZTsKLQotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYyhwQy0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgIE00QURfa09wdGlvbklEX0F1ZGlvU2FtcEZyZXF1ZW5jeSwgKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0KLSAgICAgICAgLy8gUmVzZXQgUmVhZGVyIHN0cnVjdHVyZSB2YWx1ZSBhbHNvCi0gICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSBvcHRpb25WYWx1ZTsKLQotICAgICAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0KLSAgICAgICAgICAgIHBDLT5wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkgewotCi0gICAgICAgICAgICBwQy0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbiA9Ci0gICAgICAgICAgICAgICAgcEMtPnBSZWFkZXJBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgICAgICAgICAgcEMtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxID0KLSAgICAgICAgICAgICAgICBwQy0+cFJlYWRlckF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotCi0gICAgICAgIH0KLQotICAgIH0gZWxzZSBpZiggZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzOlwKLSAgICAgICAgICAgIG1fcEZjdFN0ZXBBdWRpb0RlYyByZXR1cm5zIGVyciA9IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIGZyZWUob3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MpOwotCi0gICAgLy8gUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIKLSAgICBlcnIgPSBwQy0+bV9wUmVhZGVyLT5tX3BGY3RSZXNldChwQy0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBSZWFkZXJBdWRpb1N0cmVhbSk7Ci0KLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludENoZWNrQW5kR2V0Q29kZWNQcm9wZXJ0aWVzXAotICAgICAgICAgICAgRXJyb3IgaW4gcmVzZXRpbmcgcmVhZGVyOiAweCV4IiwgZXJyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotCi19Ci0KLU00T1NBX0VSUiBNNE1DU19pbnRMaW1pdEJpdHJhdGVQZXJDb2RlY1Byb2ZpbGVMZXZlbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BZHZhbmNlZFBhcmFtcyogRW5jUGFyYW1zKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIHN3aXRjaCAoRW5jUGFyYW1zLT5Gb3JtYXQpIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0gyNjM6Ci0gICAgICAgICAgICBFbmNQYXJhbXMtPkJpdHJhdGUgPSBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JIMjYzRW5jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9MZXZlbCwgRW5jUGFyYW1zLT5CaXRyYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tNUEVHNDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy0+Qml0cmF0ZSA9IE00TUNTX2ludExpbWl0Qml0cmF0ZUZvck1wZWc0RW5jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY1BhcmFtcy0+dmlkZW9MZXZlbCwgRW5jUGFyYW1zLT5CaXRyYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tIMjY0OgotICAgICAgICAgICAgRW5jUGFyYW1zLT5CaXRyYXRlID0gTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9ySDI2NEVuYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNQYXJhbXMtPnZpZGVvUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNQYXJhbXMtPnZpZGVvTGV2ZWwsIEVuY1BhcmFtcy0+Qml0cmF0ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludExpbWl0Qml0cmF0ZVBlckNvZGVjUHJvZmlsZUxldmVsOiBcCi0gICAgICAgICAgICAgICAgV3JvbmcgZW5jIGZvcm1hdCAlZCIsIEVuY1BhcmFtcy0+Rm9ybWF0KTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci0KLX0KLQotTTRPU0FfSW50MzIgTTRNQ1NfaW50TGltaXRCaXRyYXRlRm9ySDI2NEVuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpIHsKLQotICAgIE00T1NBX0ludDMyIHZpZEJpdHJhdGUgPSAwOwotCi0gICAgc3dpdGNoIChwcm9maWxlKSB7Ci0gICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZToKLSAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDUHJvZmlsZU1haW46Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNjQwMDApID8gNjQwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMWI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyODAwMCkgPyAxMjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDE5MjAwMCkgPyAxOTIwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDM4NDAwMCkgPyAzODQwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTM6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDc2ODAwMCkgPyA3NjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjAwMDAwMCkgPyAyMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDIxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA0MDAwMDAwKSA/IDQwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMjI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDQwMDAwMDApID8gNDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwzOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxMDAwMDAwMCkgPyAxMDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwzMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTQwMDAwMDApID8gMTQwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMzI6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDIwMDAwMDAwKSA/IDIwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDQ6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDIwMDAwMDAwKSA/IDIwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDQxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA1MDAwMDAwMCkgPyA1MDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw0MjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNTAwMDAwMDApID8gNTAwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTM1MDAwMDAwKSA/IDEzNTAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw1MToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjQwMDAwMDAwKSA/IDI0MDAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g6Ci0gICAgICAgICAgICBzd2l0Y2ggKGxldmVsKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA4MDAwMCkgPyA4MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxYjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMTYwMDAwKSA/IDE2MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjQwMDAwKSA/IDI0MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNDgwMDAwKSA/IDQ4MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwxMzoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gOTYwMDAwKSA/IDk2MDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAyNTAwMDAwKSA/IDI1MDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMjE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDUwMDAwMDApID8gNTAwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNTAwMDAwMCkgPyA1MDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDM6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyNTAwMDAwKSA/IDEyNTAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDMxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxNzUwMDAwMCkgPyAxNzUwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwzMjoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjUwMDAwMDApID8gMjUwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMjUwMDAwMDApID8gMjUwMDAwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDYyNTAwMDAwKSA/IDYyNTAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDQyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2MjUwMDAwMCkgPyA2MjUwMDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw1OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxNjg3NTAwMDApID8gMTY4NzUwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDUxOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAzMDAwMDAwMDApID8gMzAwMDAwMDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhbmRsZSBhbnkgb3RoZXIgQVZDIHByb2ZpbGUgZm9yIG5vdy4KLSAgICAgICAgICAgIC8vIFJldHVybiBpbnB1dCBiaXRyYXRlCi0gICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiB2aWRCaXRyYXRlOwotfQotCi1NNE9TQV9JbnQzMiBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JNcGVnNEVuYyhNNE9TQV9JbnQzMiBwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgbGV2ZWwsIE00T1NBX0ludDMyIGJpdHJhdGUpIHsKLQotICAgIE00T1NBX0ludDMyIHZpZEJpdHJhdGUgPSAwOwotCi0gICAgc3dpdGNoIChwcm9maWxlKSB7Ci0gICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZToKLSAgICAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwwOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2NDAwMCkgPyA2NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDBiOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxMjgwMDApID8gMTI4MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMToKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gNjQwMDApID8gNjQwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwyOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAxMjgwMDApID8gMTI4MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMzoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IChiaXRyYXRlID4gMzg0MDAwKSA/IDM4NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdmlkQml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYW5kbGUgYW55IG90aGVyIE1QRUc0IHByb2ZpbGUgZm9yIG5vdy4KLSAgICAgICAgICAgIC8vIFJldHVybiBpbnB1dCBiaXRyYXRlCi0gICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiB2aWRCaXRyYXRlOwotfQotCi1NNE9TQV9JbnQzMiBNNE1DU19pbnRMaW1pdEJpdHJhdGVGb3JIMjYzRW5jKE00T1NBX0ludDMyIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBsZXZlbCwgTTRPU0FfSW50MzIgYml0cmF0ZSkgewotCi0gICAgTTRPU0FfSW50MzIgdmlkQml0cmF0ZSA9IDA7Ci0KLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZToKLSAgICAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0gyNjNMZXZlbDEwOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiA2NDAwMCkgPyA2NDAwMCA6IGJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M0xldmVsMjA6Ci0gICAgICAgICAgICAgICAgICAgIHZpZEJpdHJhdGUgPSAoYml0cmF0ZSA+IDEyODAwMCkgPyAxMjgwMDAgOiBiaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgT01YX1ZJREVPX0gyNjNMZXZlbDMwOgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gKGJpdHJhdGUgPiAzODQwMDApID8gMzg0MDAwIDogYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB2aWRCaXRyYXRlID0gYml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhbmRsZSBhbnkgb3RoZXIgSDI2MyBwcm9maWxlIGZvciBub3cuCi0gICAgICAgICAgICAvLyBSZXR1cm4gaW5wdXQgYml0cmF0ZQotICAgICAgICAgICAgdmlkQml0cmF0ZSA9IGJpdHJhdGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmlkQml0cmF0ZTsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0F1ZGlvRWZmZWN0cy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQXVkaW9FZmZlY3RzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ4OGRlNjguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQXVkaW9FZmZlY3RzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX0FQSS5jCi0gKiBAYnJpZWYgIE1DUyBpbXBsZW1lbnRhdGlvbiAoVmlkZW8gQ29tcHJlc3NvciBTZXJ2aWNlKQotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQVBJIGFuZCB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgTUNTCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqLwotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLS8qKgotICogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotLyogT3VyIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE1DU19BUEkuaCIKLSNpbmNsdWRlICJNNE1DU19FcnJvckNvZGVzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLQotLyogQ29tbW9uIGhlYWRlcnMgKGZvciBhYWMpICovCi0jaW5jbHVkZSAiTTRfQ29tbW9uLmgiCi0KLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50Q2hlY2tBdWRpb0VmZmVjdHMoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQ29udGV4dCkKLSAqIEBicmllZiAgICBDaGVjayBpZiBhbiBlZmZlY3QgaGFzIHRvIGJlIGFwcGxpZWQgY3VycmVudGx5Ci0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHN0ZXBFbmNvZGluZyBmdW5jdGlvbgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgTUNTIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX2ludENoZWNrQXVkaW9FZmZlY3RzKE00TUNTX0ludGVybmFsQ29udGV4dCogcEMpCi17Ci0gICAgTTRPU0FfSW50OCAqcEFjdGl2ZUVmZmVjdE51bWJlciA9ICYocEMtPnBBY3RpdmVFZmZlY3ROdW1iZXIpOwotCi0gICAgKnBBY3RpdmVFZmZlY3ROdW1iZXIgPSAtMTsKLQotICAgIGlmKHBDLT5SZWFkZXJBdWRpb0FVLm1fQ1RTID4gcEMtPnVpQmVnaW5DdXRUaW1lCi0gICAgJiYgcEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgPCBwQy0+dWlFbmRDdXRUaW1lKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIG91dHB1dFJlbGF0ZWRUaW1lID0gMDsKLSAgICAgICAgTTRPU0FfVUludDggdWlFZmZlY3RJbmRleCA9IDA7Ci0gICAgICAgIG91dHB1dFJlbGF0ZWRUaW1lID0KLSAgICAgICAgKE00T1NBX1VJbnQzMikocEMtPlJlYWRlckF1ZGlvQVUubV9DVFMgIC0gcEMtPnVpQmVnaW5DdXRUaW1lICsgMC41KTsKLQotICAgICAgICBmb3IodWlFZmZlY3RJbmRleD0wOyB1aUVmZmVjdEluZGV4PHBDLT5uYkVmZmVjdHM7IHVpRWZmZWN0SW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChvdXRwdXRSZWxhdGVkVGltZSA+PQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5wRWZmZWN0c1t1aUVmZmVjdEluZGV4XS51aVN0YXJ0VGltZSkpICYmCi0gICAgICAgICAgICAgICAgKG91dHB1dFJlbGF0ZWRUaW1lIDwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKShwQy0+cEVmZmVjdHNbdWlFZmZlY3RJbmRleF0udWlTdGFydFRpbWUgK1wKLSAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNbdWlFZmZlY3RJbmRleF0udWlEdXJhdGlvbikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwQWN0aXZlRWZmZWN0TnVtYmVyID0gdWlFZmZlY3RJbmRleDsKLSAgICAgICAgICAgICAgICB1aUVmZmVjdEluZGV4ID0gcEMtPm5iRWZmZWN0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdF9GYWRlSW4oKQotICogQGJyaWVmICAgIEFwcGx5IGF1ZGlvIGVmZmVjdCBGYWRlSW4gdG8gcFBDTWRhdGEKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBDTWRhdGEgICAgKElOL09VVCkgSW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pICAgICBTaXplIG9mIHBQQ01kYXRhCi0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgIChJTikgICAgIEVmZmVjdCBwcm9ncmVzcwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVJbiggIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzKQotewotICAgIC8qIHdlIHdpbGwgY2FzdCBlYWNoIEludDE2IHNhbXBsZSBpbnRvIHRoaXMgSW50MzIgdmFyaWFibGUgKi8KLSAgICBNNE9TQV9JbnQzMiBpMzJzYW1wbGU7Ci0KLSAgICAvKioKLSAgICAgKiBTYW5pdHkgY2hlY2sgKi8KLSAgICBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPiAxMDAwKQotICAgIHsKLSAgICAgICAgcFByb2dyZXNzLT51aVByb2dyZXNzID0gMTAwMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcm9tIGJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpOiBkaXZpZGUgYnkgdHdvICovCi0gICAgdWlQQ01zaXplID4+PSAxOwotCi0gICAgLyoqCi0gICAgICogTG9vcCBvbiBzYW1wbGVzICovCi0gICAgd2hpbGUgKHVpUENNc2l6ZS0tPjApIC8qKjwgZGVjcmVtZW50aW5nIHRvIG9wdGltaXplICovCi0gICAgewotICAgICAgICBpMzJzYW1wbGUgPSAqcFBDTWRhdGE7Ci0gICAgICAgIGkzMnNhbXBsZSAqPSBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3M7Ci0gICAgICAgIGkzMnNhbXBsZSAvPSAxMDAwOwotICAgICAgICAqcFBDTWRhdGErKyA9IChNNE9TQV9JbnQxNilpMzJzYW1wbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2VkaXRBdWRpb0VmZmVjdEZjdF9GYWRlSW46IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVPdXQoKQotICogQGJyaWVmICAgIEFwcGx5IGF1ZGlvIGVmZmVjdCBGYWRlSW4gdG8gcFBDTWRhdGEKLSAqIEBwYXJhbSAgICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBQQ01kYXRhICAgIChJTi9PVVQpIElucHV0IGFuZCBPdXRwdXQgUENNIGF1ZGlvIGRhdGEKLSAqIEBwYXJhbSAgICB1aVBDTXNpemUgICAgKElOKSAgICAgU2l6ZSBvZiBwUENNZGF0YQotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAoSU4pICAgICBFZmZlY3QgcHJvZ3Jlc3MKLSAqIEByZXR1cm4gICBNNE5PX0VSUk9SOiAgICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVPdXQoIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzKQotewotICAgIC8qIHdlIHdpbGwgY2FzdCBlYWNoIEludDE2IHNhbXBsZSBpbnRvIHRoaXMgSW50MzIgdmFyaWFibGUgKi8KLSAgICBNNE9TQV9JbnQzMiBpMzJzYW1wbGU7Ci0KLSAgICAvKioKLSAgICAgKiBTYW5pdHkgY2hlY2sgKi8KLSAgICBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPiAxMDAwKQotICAgIHsKLSAgICAgICAgcFByb2dyZXNzLT51aVByb2dyZXNzID0gMTAwMDsKLSAgICB9Ci0gICAgcFByb2dyZXNzLT51aVByb2dyZXNzID0gMTAwMCAtIHBQcm9ncmVzcy0+dWlQcm9ncmVzczsKLQotICAgIC8qKgotICAgICAqIEZyb20gYnVmZmVyIHNpemUgKGJ5dGVzKSB0byBudW1iZXIgb2Ygc2FtcGxlIChpbnQxNik6IGRpdmlkZSBieSB0d28gKi8KLSAgICB1aVBDTXNpemUgPj49IDE7Ci0KLSAgICAvKioKLSAgICAgKiBMb29wIG9uIHNhbXBsZXMgKi8KLSAgICB3aGlsZSAodWlQQ01zaXplLS0+MCkgLyoqPCBkZWNyZW1lbnRpbmcgdG8gb3B0aW1pemUgKi8KLSAgICB7Ci0gICAgICAgIGkzMnNhbXBsZSA9ICpwUENNZGF0YTsKLSAgICAgICAgaTMyc2FtcGxlICo9IHBQcm9ncmVzcy0+dWlQcm9ncmVzczsKLSAgICAgICAgaTMyc2FtcGxlIC89IDEwMDA7Ci0gICAgICAgICpwUENNZGF0YSsrID0gKE00T1NBX0ludDE2KWkzMnNhbXBsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfZWRpdEF1ZGlvRWZmZWN0RmN0X0ZhZGVPdXQ6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX0NvZGVjcy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQ29kZWNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1NDQ5MmIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfQ29kZWNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRNQ1NfQ29kZWNzLmMKLSAqIEBicmllZiAgTUNTIGltcGxlbWVudGF0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gYXVkaW8vdmlkZW8KLSAqICAgICAgICAgY29kZWMgbWFuaXB1bGF0aW9ucy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSW5jbHVkZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiICAgICAgICAgICAgLyogSW5jbHVkZSBmb3IgT1NBTCBkZWJ1ZyBzZXJ2aWNlcyAqLwotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsVHlwZXMuaCIgICAgLyogSW50ZXJuYWwgdHlwZXMgb2YgdGhlIE1DUyAqLwotCi0KLSNpZmRlZiBNNE1DU19TVVBQT1JUX1ZJREVDXzNHUAotI2luY2x1ZGUgIk00X01QRUc0VklfVmlkZW9IYW5kbGVyLmgiICAvKm5lZWRlZCBmb3IgcmVuZGVyZXIgZXJyb3IgY29kZXMqLwotI2VuZGlmCi0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19jbGVhckludGVyZmFjZVRhYmxlcygpCi0gKiBAYnJpZWYgICAgQ2xlYXIgZW5jb2RlcnMsIGRlY29kZXJzLCByZWFkZXIgYW5kIHdyaXRlcnMgaW50ZXJmYWNlcyB0YWJsZXMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgVGhlIGNvbnRleHQgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19jbGVhckludGVyZmFjZVRhYmxlcyhNNE1DU19Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50OCBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIC8qIEluaXRpYWxpc2F0aW9uIHRoYXQgd2lsbCBhbGxvdyB0byBjaGVjayBpZiByZWdpc3RlcmluZyB0d2ljZSAqLwotICAgIHBDLT5wV3JpdGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEkgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNFdSSVRFUl9rVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBEYXRhRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE00RU5DT0RFUl9rVmlkZW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE00RU5DT0RFUl9rQXVkaW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tpXSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpc2F0aW9uIHRoYXQgd2lsbCBhbGxvdyB0byBjaGVjayBpZiByZWdpc3RlcmluZyB0d2ljZSAqLwotICAgIHBDLT5tX3BSZWFkZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzICA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRSRUFERVJfa01lZGlhVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldICAgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAgIHBDLT5tX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotICAgIGZvciAoaSA9IDA7IGkgPCBNNEFEX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2ldID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlcldyaXRlcigpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHJlZ2lzdGVyIGEgc3BlY2lmaWMgZmlsZSBmb3JtYXQgd3JpdGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgdGhlIHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICAgIE00RVJSX1BBUkFNRVRFUiAgICAgcENvbnRleHQscFd0ckdsb2JhbEludGVyZmFjZSBvcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFd0ckRhdGFJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19yZWdpc3RlcldyaXRlcihNNE1DU19Db250ZXh0IHBDb250ZXh0LCBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqIHBXdHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3RyRGF0YUludGVyZmFjZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChwQyA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTUNTOiBjb250ZXh0IGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJXcml0ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBXdHJHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBXdHJHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckRhdGFJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBXdHJEYXRhSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJXcml0ZXIiKTsKLQotICAgIE00T1NBX1RSQUNFM18zKCJNQ1M6IE00TUNTX3JlZ2lzdGVyV3JpdGVyIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsXAotICAgICBwV3RyR2xvYmFsSW50ZXJmYWNlPTB4JXgsIHBXdHJEYXRhSW50ZXJmYWNlPTB4JXgiLCBwQyxwV3RyR2xvYmFsSW50ZXJmYWNlLAotICAgICBwV3RyRGF0YUludGVyZmFjZSk7Ci0KLSAgICBpZigoTWVkaWFUeXBlID09IE00V1JJVEVSX2tVbmtub3duKSB8fCAoTWVkaWFUeXBlID49IE00V1JJVEVSX2tUeXBlX05CKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIG1lZGlhIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBHbG9iYWxGY3RzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgLyogYSB3cml0ZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkICEqLwotICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIlRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQiKTsKLSAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTYXZlIHdyaXRlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbTWVkaWFUeXBlXS5wR2xvYmFsRmN0cyA9IHBXdHJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBEYXRhRmN0cyA9IHBXdHJEYXRhSW50ZXJmYWNlOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJFbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyB2aWRlbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgIHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICBwQ29udGV4dCBvciBwRW5jR2xvYmFsSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGludmFsaWQgTWVkaWFUeXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyICgKLSAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk1DUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwRW5jR2xvYmFsSW50ZXJmYWNlID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJwRW5jR2xvYmFsSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIiKTsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNQ1M6IE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsXAotICAgICAgICAgcEVuY0dsb2JhbEludGVyZmFjZT0weCV4IiwgcEMsIHBFbmNHbG9iYWxJbnRlcmZhY2UpOwotCi0gICAgaWYgKE1lZGlhVHlwZSA+PSBNNEVOQ09ERVJfa1ZpZGVvX05CKQotICAgIHsKLSAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIHZpZGVvIGVuY29kZXIgdHlwZSIpOwotICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgLyogY2FuIGJlIGxlZ2l0aW1hdGUsIGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgb25lIHZlcnNpb24gdGhhdCBjYW4gdXNlIGV4dGVybmFsIGVuY29kZXJzCi0gICAgICAgIGJ1dCB3aGljaCBzdGlsbCBoYXMgdGhlIGJ1aWx0LWluIG9uZSB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBhbiBleHRlcm5hbCBlbmNvZGVyOyBpbgotICAgICAgICB0aGlzIGNhc2UgdGhlIG5ldyBlbmNvZGVyIHNpbXBseSByZXBsYWNlcyB0aGUgb2xkIG9uZSAoaS5lLiB3ZSB1bnJlZ2lzdGVyIGl0IGZpcnN0KS4gKi8KLSAgICAgICAgZnJlZShwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTYXZlIGVuY29kZXIgaW50ZXJmYWNlIGluIGNvbnRleHQgKi8KLSAgICBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gcEVuY0dsb2JhbEludGVyZmFjZTsKLSAgICAvKiBUaGUgYWN0dWFsIHVzZXJEYXRhIGFuZCBleHRlcm5hbCBBUEkgd2lsbCBiZSBzZXQgYnkgdGhlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBpbiB0aGUgY2FzZQotICAgIG9mIGFuIGV4dGVybmFsIGVuY29kZXIgKGFkZCBpdCBhcyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBsb25nIHJ1bj8pICovCi0gICAgcEMtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBhdWRpbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwgY29udGV4dAotICogICAgICAgICAgIHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlOiAgICAgICAgICAgICAgICAoSU4pIFRoZSBtZWRpYSB0eXBlLgotICogQHBhcmFtICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U6ICAgIChPVVQpIHRoZSBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgIHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSAqcEVuY0dsb2JhbEludGVyZmFjZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChwQyA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTUNTOiBjb250ZXh0IGlzIE00T1NBX05VTEwgaW4gTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBFbmNHbG9iYWxJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCBpbiBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoIk1DUzogTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCxcCi0gICAgICAgICBwRW5jR2xvYmFsSW50ZXJmYWNlPTB4JXgiLCBwQywgcEVuY0dsb2JhbEludGVyZmFjZSk7Ci0KLSAgICBpZiAoTWVkaWFUeXBlID49IE00RU5DT0RFUl9rQXVkaW9fTkIpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBhdWRpbyBlbmNvZGVyIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNZWRpYVR5cGVdKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNZWRpYVR5cGVdKTsKLSAgICAgICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogU2F2ZSBlbmNvZGVyIGludGVyZmFjZSBpbiBjb250ZXh0ICovCi0gICAgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IHBFbmNHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJGbGFnW01lZGlhVHlwZV0gPSBNNE9TQV9GQUxTRTsgLyogaW50ZXJuYWwgZW5jb2RlciAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJSZWFkZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIHJlYWRlci4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJSZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfTWVkaWFUeXBlIG1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZHJEYXRhSW50ZXJmYWNlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZHJHbG9iYWxJbnRlcmZhY2UpLAotICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRNQ1NfcmVnaXN0ZXJSZWFkZXI6IGludmFsaWQgcG9pbnRlciBvbiBnbG9iYWwgaW50ZXJmYWNlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBSZHJEYXRhSW50ZXJmYWNlKSwKLSAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00TUNTX3JlZ2lzdGVyUmVhZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZGF0YSBpbnRlcmZhY2UiKTsKLQotICAgIGlmIChtZWRpYVR5cGUgPT0gTTRSRUFERVJfa01lZGlhVHlwZVVua25vd24gfHwgbWVkaWFUeXBlID49IE00UkVBREVSX2tNZWRpYVR5cGVfTkIpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBtZWRpYSB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW21lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qIGEgcmVhZGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJUaGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW21lZGlhVHlwZV0gPSBwUmRyR2xvYmFsSW50ZXJmYWNlOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVttZWRpYVR5cGVdICAgPSBwUmRyRGF0YUludGVyZmFjZTsKLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycysrOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcGFyYW0gICAgcERlY29kZXJJbnRlcmZhY2UgICAgKElOKSBEZWNvZGVyIGludGVyZmFjZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpLCBvciB0aGUgZGVjb2RlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYgKGRlY29kZXJUeXBlID49IE00REVDT0RFUl9rVmlkZW9UeXBlX05CKQotICAgIHsKLSAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIHZpZGVvIGRlY29kZXIgdHlwZSIpOwotICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdICE9IE00T1NBX05VTEwpCi0gICAgewotI2lmbmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICAgICAgLyogYSBkZWNvZGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkRlY29kZXIgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0jZWxzZSAvKiBleHRlcm5hbCBkZWNvZGVycyBhcmUgcG9zc2libGUgKi8KLSAgICAgICAgLyogY2FuIGJlIGxlZ2l0aW1hdGUsIGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgb25lIHZlcnNpb24gdGhhdCBjYW4gdXNlIGV4dGVybmFsIGRlY29kZXJzCi0gICAgICAgIGJ1dCB3aGljaCBzdGlsbCBoYXMgdGhlIGJ1aWx0LWluIG9uZSB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBhbiBleHRlcm5hbCBkZWNvZGVyOyBpbgotICAgICAgICB0aGlzIGNhc2UgdGhlIG5ldyBkZWNvZGVyIHNpbXBseSByZXBsYWNlcyB0aGUgb2xkIG9uZSAoaS5lLiB3ZSB1bnJlZ2lzdGVyIGl0IGZpcnN0KS4gKi8KLSAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAvKiBvaCwgYW5kIGRvbid0IGZvcmdldCB0aGUgdXNlciBkYXRhLCB0b28uICovCi0gICAgICAgIGlmIChwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotI2VuZGlmIC8qIGFyZSBleHRlcm5hbCBkZWNvZGVycyBwb3NzaWJsZT8gKi8KLSAgICB9Ci0KLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBwRGVjb2RlckludGVyZmFjZTsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgd2lsbCBiZSBzZXQgYnkgdGhlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBpbiB0aGUgY2FzZQotICAgIG9mIGFuIGV4dGVybmFsIGRlY29kZXIgKGFkZCBpdCBhcyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBsb25nIHJ1bj8pICovCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRWaWRlb0RlYysrOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFJlZ2lzdGVyIGF1ZGlvIGRlY29kZXIKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW50ZXJuYWx5IGJ5IHRoZSBNQ1MgdG8KLSAqICAgICAgICAgICAgICByZWdpc3RlciBhdWRpbyBkZWNvZGVycywKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBBdWRpbyBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIEF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9JbnRlcmZhY2UgKnBEZWNvZGVySW50ZXJmYWNlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBEZWNvZGVySW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00TUNTX3JlZ2lzdGVyQXVkaW9EZWNvZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZGVjb2RlciBpbnRlcmZhY2UiKTsKLQotICAgIGlmIChkZWNvZGVyVHlwZSA+PSBNNEFEX2tUeXBlX05CKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwgIkludmFsaWQgYXVkaW8gZGVjb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdKTsKLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gcERlY29kZXJJbnRlcmZhY2U7Ci0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9GQUxTRTsgLyogaW50ZXJuYWwgZGVjb2RlciAqLwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbFdyaXRlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0ludDMyIGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE00V1JJVEVSX2tUeXBlX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMgKTsKLSAgICAgICAgICAgIHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBEYXRhRmN0cyAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucERhdGFGY3RzICk7Ci0gICAgICAgICAgICBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBEYXRhRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+cFdyaXRlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbEVuY29kZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHRoZSBlbmNvZGVycwotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsRW5jb2RlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gKTsKLSAgICAgICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBNNEVOQ09ERVJfa0F1ZGlvX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgLypEb24ndCBmcmVlIGV4dGVybmFsIGF1ZGlvIGVuY29kZXJzIGludGVyZmFjZXMqLwotICAgICAgICAgICAgaWYgKE00T1NBX0ZBTFNFID09IHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tpXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+cFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU191blJlZ2lzdGVyQWxsUmVhZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbFJlYWRlcnMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTTRSRUFERVJfa01lZGlhVHlwZV9OQjsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbaV0gKTsKLSAgICAgICAgICAgIHBDLT5tX3BSZWFkZXJHbG9iYWxJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAocEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldICk7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzID0gMDsKLSAgICBwQy0+bV9wUmVhZGVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3VuUmVnaXN0ZXJBbGxEZWNvZGVycygpCi0gKiBAYnJpZWYgICAgVW5yZWdpc3RlciB0aGUgZGVjb2RlcnMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1NfdW5SZWdpc3RlckFsbERlY29kZXJzKE00TUNTX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0ludDMyIGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE00REVDT0RFUl9rVmlkZW9UeXBlX05COyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSApOwotICAgICAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE00QURfa1R5cGVfTkI7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZGVjb2RlcnMgaW50ZXJmYWNlcyovCi0gICAgICAgICAgICBpZiAoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtpXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+bV91aU5iUmVnaXN0ZXJlZFZpZGVvRGVjID0gMDsKLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyID0gTTRPU0FfTlVMTDsKLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFdyaXRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfTUNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFdyaXRlciggTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgd3JpdGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2ggKG1lZGlhVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTTRWOgotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2szR1BQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUjoKLSAgICAgICAgICAgIHdyaXRlclR5cGUgPSBNNFdSSVRFUl9rQU1SOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzoKLSAgICAgICAgICAgIHdyaXRlclR5cGUgPSBNNFdSSVRFUl9rTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1BDTToKLSAgICAgICAgICAgIHBDLT5iX2lzUmF3V3JpdGVyID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHdyaXRlclR5cGUgPSBNNFdSSVRFUl9rUENNOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiV3JpdGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+cFdyaXRlckdsb2JhbEZjdHMgPSBwQy0+V3JpdGVySW50ZXJmYWNlW3dyaXRlclR5cGVdLnBHbG9iYWxGY3RzOwotICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMgPSBwQy0+V3JpdGVySW50ZXJmYWNlW3dyaXRlclR5cGVdLnBEYXRhRmN0czsKLQotICAgIGlmIChwQy0+cFdyaXRlckdsb2JhbEZjdHMgPT0gTTRPU0FfTlVMTCB8fCBwQy0+cFdyaXRlckRhdGFGY3RzID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJXcml0ZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGEgdmlkZW8gZW5jb2RlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgTUNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX01DU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX1ZpZGVvRm9ybWF0IG1lZGlhVHlwZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCBlbmNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2ggKG1lZGlhVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tIMjY0OwotICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgIlZpZGVvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSA9IHBDLT5wVmlkZW9FbmNvZGVyRXh0ZXJuYWxBUElUYWJsZVtlbmNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEgPSBwQy0+cFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbZW5jb2RlclR5cGVdOwotCi0gICAgaWYgKHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAiVmlkZW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYW4gYXVkaW8gZW5jb2RlcgotICogQHBhcmFtICAgIGNvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBNZWRpYVR5cGUgICAgICAgIChJTikgRW5jb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50QXVkaW9FbmNvZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19BdWRpb0Zvcm1hdCBtZWRpYVR5cGUpCi17Ci0gICAgTTRNQ1NfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNE1DU19JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0OwotICAgIE00RU5DT0RFUl9BdWRpb0Zvcm1hdCBlbmNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2ggKG1lZGlhVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tBTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rQUFDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QMzoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tNUDM7Ci0gICAgICAgICAgICBicmVhazsKLS8vRVZSQwotLy8gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0vLyAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tFVlJDOwotLy8gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICJBdWRpbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMgPSBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtlbmNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEgPSBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbZW5jb2RlclR5cGVdOwotCi0gICAgaWYgKHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAiQXVkaW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50UmVhZGVyKCkKLSAqIEBicmllZiAgICBTZXQgY3VycmVudCByZWFkZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIG1lZGlhVHlwZSAgICAgICAgICAgIChJTikgTWVkaWEgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50UmVhZGVyKCBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNFJFQURFUl9NZWRpYVR5cGUgcmVhZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2ggKG1lZGlhVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QNDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTTRWOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGUzR1BQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUjoKLSAgICAgICAgICAgIHJlYWRlclR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlQU1SOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzoKLSAgICAgICAgICAgIHJlYWRlclR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBwQy0+bV9wUmVhZGVyICAgICAgID0gcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbcmVhZGVyVHlwZV07Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdCA9IHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtyZWFkZXJUeXBlXTsKLQotICAgIGlmIChwQy0+bV9wUmVhZGVyID09IE00T1NBX05VTEwgfHwgcEMtPm1fcFJlYWRlckRhdGFJdCA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBTZXQgYSB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBNQ1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBkZWNvZGVyVHlwZSAgICAgICAgKElOKSBEZWNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9NQ1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgICBNNE1DU19zZXRDdXJyZW50VmlkZW9EZWNvZGVyKCAgIE00TUNTX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbVR5cGUgbWVkaWFUeXBlKQotewotICAgIE00TUNTX0ludGVybmFsQ29udGV4dCogcEMgPSAoTTRNQ1NfSW50ZXJuYWxDb250ZXh0KilwQ29udGV4dDsKLSAgICBNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00REVDT0RFUl9rVmlkZW9UeXBlQVZDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAiVmlkZW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNE1DU19XQVJfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2RlciA9IHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXTsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSAgICBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhID0KLSAgICAgICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXTsKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIGlmIChwQy0+bV9wVmlkZW9EZWNvZGVyID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJWaWRlbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00TUNTX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhbiBhdWRpbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIE1DUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSICAgTTRNQ1Nfc2V0Q3VycmVudEF1ZGlvRGVjb2RlciggICBNNE1DU19Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSkKLXsKLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQqIHBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRBRF9UeXBlIGRlY29kZXJUeXBlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaCAobWVkaWFUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVBTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURUUzoKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0FhY0FESUY6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVBQUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb01wMzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZU1QMzsKLSAgICAgICAgICAgIGJyZWFrOwotLy9FVlJDCi0vLyAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmM6Ci0vLyAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZUVWUkM7Ci0vLyAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00TUNTX1dBUl9NRURJQVRZUEVfTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgIkF1ZGlvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV07Ci0gICAgcEMtPm1fcEN1cnJlbnRBdWRpb0RlY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXTsKLQotICAgIGlmIChwQy0+bV9wQXVkaW9EZWNvZGVyID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRNQ1NfV0FSX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NNE1DU19NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzMWNhODcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYwotICogQGJyaWVmICBNZWRpYSByZWFkZXJzIGFuZCBjb2RlY3Mgc3Vic2NyaXB0aW9uCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBzdWJzY3JpcHRpb24gb2Ygc3VwcG9ydGVkIG1lZGlhCi0gKiAgICAgICAgIHJlYWRlcnMgYW5kIGRlY29kZXJzIGZvciB0aGUgTUNTLiBQb3RlbnRpYWwgc3VwcG9ydCBjYW4KLSAqICAgICAgICAgYmUgYWN0aXZhdGVkIG9yIGRlLWFjdGl2YXRlZAotICogICAgICAgICB1c2luZyBjb21waWxhdGlvbiBmbGFncyBzZXQgaW4gdGhlIHByb2plY3RzIHNldHRpbmdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbmNsdWRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIiAgICAgICAgICAgICAgICAvKio8IEluY2x1ZGUgZm9yIE1DUyBzcGVjaWZpYyB0eXBlcyAqLwotI2luY2x1ZGUgIk00TUNTX0ludGVybmFsRnVuY3Rpb25zLmgiICAgICAgICAgICAgLyoqPCBSZWdpc3RyYXRpb24gbW9kdWxlICovCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICByZWFkZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLS8qIFJlYWRlciByZWdpc3RyYXRpb24gOiBhdCBsZWFzdCBvbmUgcmVhZGVyIG11c3QgYmUgZGVmaW5lZCAqLwotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotI2Vycm9yICJubyByZWFkZXIgcmVnaXN0ZXJlZCIKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIgKi8KLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AgKi8KLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCByZWFkZXIgdG8gc3Vic2NyaWJlICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3IzZ3BSZWFkZXIuaCIKLSNlbmRpZgotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0jaW5jbHVkZSAiTTRSRUFERVJfQW1yLmgiCi0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMKLSNpbmNsdWRlICJWaWRlb0VkaXRvck1wM1JlYWRlci5oIgotI2VuZGlmCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHZpZGVvIGRlY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oIgotCi0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHdyaXRlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotLyogV3JpdGVyIHJlZ2lzdHJhdGlvbiA6IGF0IGxlYXN0IG9uZSB3cml0ZXIgbXVzdCBiZSBkZWZpbmVkICovCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX0FNUgotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSX1BDTQotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9NUDMKLSNlcnJvciAibm8gd3JpdGVyIHJlZ2lzdGVyZWQiCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfTVAzICovCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfUENNICovCi0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUCAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfV1JJVEVSX0FNUiAqLwotCi0vKiBJbmNsdWRlIGZpbGVzIGZvciBlYWNoIHdyaXRlciB0byBzdWJzY3JpYmUgKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIKLWV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfQU1SX2dldEludGVyZmFjZXMoIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ci0jZW5kaWYKLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9QQ00KLWV4dGVybiBNNE9TQV9FUlIgTTRXUklURVJfUENNX2dldEludGVyZmFjZXMoIE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfTVAzCi1leHRlcm4gTTRPU0FfRVJSIE00V1JJVEVSX01QM19nZXRJbnRlcmZhY2VzKCBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSogVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqKiBTcmNEYXRhSW50ZXJmYWNlKTsKLSNlbmRpZgotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICB2aWRlbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyLmgiCi0KLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCB2aWRlbyBlbmNvZGVyIHRvIHN1YnNjcmliZSAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNAotLy8jaW5jbHVkZSAiTTRNUDRFX2ludGVyZmFjZS5oIgotI2VuZGlmCi0KLQotI2RlZmluZSBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShyZXR2YWwsIHBvaW50ZXIpIFwKLSAgICBpZiAoKHBvaW50ZXIpID09IE00T1NBX05VTEwpIHJldHVybiAoKE00T1NBX0VSUikocmV0dmFsKSk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00TUNTX1N1YnNjcmliZU1lZGlhQW5kQ29kZWMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJlYWRlciwgZGVjb2RlcnMsIHdyaXRlcnMgYW5kIGVuY29kZXJzCi0gKiAgICAgICAgICBpbiB0aGUgTUNTLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00UkVBREVSX01lZGlhVHlwZSAgICAgICAgICByZWFkZXJNZWRpYVR5cGU7Ci0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKiAgIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSogICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlOwotCi0gICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgICAgIHdyaXRlck1lZGlhVHlwZTsKLSAgICBNNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqICAgcFdyaXRlckdsb2JhbEludGVyZmFjZTsKLSAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiAgICAgcFdyaXRlckRhdGFJbnRlcmZhY2U7Ci0KLSAgICBNNEFEX1R5cGUgICAgICAgICAgICAgICAgICAgYXVkaW9EZWNvZGVyVHlwZTsKLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgICAgICAgYXVkaW9Db2RlY1R5cGU7Ci0gICAgTTRFTkNPREVSX0F1ZGlvR2xvYmFsSW50ZXJmYWNlKiBwQXVkaW9Db2RlY0ludGVyZmFjZTsKLSAgICBNNEFEX0ludGVyZmFjZSogICAgICAgICAgICAgcEF1ZGlvRGVjb2RlckludGVyZmFjZTsKLQotICAgIE00REVDT0RFUl9WaWRlb1R5cGUgICAgICAgICB2aWRlb0RlY29kZXJUeXBlOwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgICAgICB2aWRlb0NvZGVjVHlwZTsKLSAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiAgcFZpZGVvQ29kZWNJbnRlcmZhY2U7Ci0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKiAgIHBWaWRlb0RlY29kZXJJbnRlcmZhY2U7Ci0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KTsKLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIHJlYWRlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gM0dQIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQCi0gICAgZXJyID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlKCZyZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl8zR1AgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIDNHUCByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AgKi8KLQotICAgIC8qIC0tLSBBTVIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9BTVIKLSAgICBlcnIgPSBNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlcyggICAmcmVhZGVyTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUiBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclJlYWRlciggcENvbnRleHQsIHJlYWRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQU1SIHJlYWRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUiAqLwotCi0gICAgLyogLS0tIE1QMyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotCi0gICAgZXJyID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlKCZyZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9NUDMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIE1QMyByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0ICYgSDI2MyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERUNfM0dQCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoICZ2aWRlb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKSZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX01QRUc0IGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCAgIHBDb250ZXh0LCB2aWRlb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgTVBFRzQgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfVklERUNfM0dQICovCi0KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERU9fQVZDCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NCggJnZpZGVvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopJnBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00REVDT0RFUl9BVkMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJWaWRlb0RlY29kZXIoICAgcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBBVkMgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfVklERU9fQVZDICovCi0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgYXVkaW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIEFNUk5CIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19BTVJOQgotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BTVJOQigmYXVkaW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBRCBQSElMSVBTIEFNUk5CIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKCAgIHBDb250ZXh0LCBhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgUEhJTElQUyBBTVJOQiBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9BVURFQ19BTVJOQiAqLwotCi0gICAgLyogLS0tIEFBQyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfQUFDCi0KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKCZhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUQgUEhJTElQUyBBQUMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0RlY29kZXIoICAgcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBQSElMSVBTIEFBQyBkZWNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9BVURFQ19BQUMgKi8KLQotICAgIC8qIC0tLSBNUDMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX01QMwotCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QMygmYXVkaW9EZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEFEIFBISUxJUFMgTVAzIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKCAgIHBDb250ZXh0LCBhdWRpb0RlY29kZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgUEhJTElQUyBNUDMgZGVjb2RlciIpOwotI2VuZGlmICAvKiBNNFZTU19TVVBQT1JUX0FVREVDX01QMyAqLwotCi0gICAgLyogLS0tIEVWUkMgLS0tICovCi0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIHdyaXRlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gUENNIC0tLSAqLwotCi0KLSAgICAvKiAtLS0gM0dQUCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAKLSAgICAvKiByZXRyaWV2ZXMgdGhlIDNHUFAgd3JpdGVyIG1lZGlhIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyggICAmd3JpdGVyTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwV3JpdGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00V1JJVEVSXzNHUCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlcldyaXRlciggcENvbnRleHQsIHdyaXRlck1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICAiTTRNQ1Nfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgM0dQUCB3cml0ZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQICovCi0KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZW5jb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0IC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgICAgLyogcmV0cmlldmVzIHRoZSBNUEVHNCBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoJnZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNEVfTVBFRzQgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJWaWRlb0VuY29kZXIoICAgcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIHZpZGVvIE1QRUc0IGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgKi8KLQotICAgIC8qIC0tLSBIMjYzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgLyogcmV0cmlldmVzIHRoZSBIMjYzIGVuY29kZXIgdHlwZSBhbmQgcG9pbnRlciB0byBmdW5jdGlvbnMqLwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjYzKCZ2aWRlb0NvZGVjVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwVmlkZW9Db2RlY0ludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9PUEVOX0FEVkFOQ0VEKTsKLQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1QNEVfSDI2MyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlclZpZGVvRW5jb2RlciggcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciB2aWRlbyBIMjYzIGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoJnZpZGVvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBWaWRlb0NvZGVjSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEgyNjRFIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyVmlkZW9FbmNvZGVyKCBwQ29udGV4dCwgdmlkZW9Db2RlY1R5cGUsIHBWaWRlb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIHZpZGVvIEgyNjQgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMgKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgYXVkaW8gZW5jb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIEFNUiAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BTVIKLSAgICAgICAvKiByZXRyaWV2ZXMgdGhlIEFNUiBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQU1STkIoJmF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBTVIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRNQ1NfcmVnaXN0ZXJBdWRpb0VuY29kZXIoICAgcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAgIk00TUNTX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFNUiBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUiAqLwotCi0gICAgLyogLS0tIEFBQyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEFBQyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKCZhdWRpb0NvZGVjVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUFDIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00TUNTX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCAgIHBDb250ZXh0LCBhdWRpb0NvZGVjVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBhdWRpbyBBQUMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMgKi8KLQotCi0KLSAgICAvKiAtLS0gTVAzIC0tLSAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUDMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIE1QMyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVAzKCZhdWRpb0NvZGVjVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVAzRSBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNE1DU19yZWdpc3RlckF1ZGlvRW5jb2RlciggcENvbnRleHQsIGF1ZGlvQ29kZWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgICJNNE1DU19zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBhdWRpbyBNUDMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUDMgKi8KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL000TUNTX1ZpZGVvUHJlUHJvY2Vzc2luZy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0OWY2OGUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTTRNQ1NfVmlkZW9QcmVQcm9jZXNzaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00TUNTX1ZpZGVvUHJlUHJvY2Vzc2luZy5jCi0gKiBAYnJpZWYgIE1DUyBpbXBsZW1lbnRhdGlvbgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZW5jb2RlciBjYWxsYmFjayBvZiB0aGUgTUNTLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluY2x1ZGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotLyogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgICAgIC8qIE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgICAgICAgLyogT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLQotLyogQ29yZSBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00TUNTX0Vycm9yQ29kZXMuaCIKLQotLyoqCi0gKiBWaWRlbyBwcmVwcm9jZXNzaW5nIGludGVyZmFjZSBkZWZpbml0aW9uICovCi0jaW5jbHVkZSAiTTRWUFBfQVBJLmgiCi0KLS8qKgotICogVmlkZW8gZmlsdGVycyAqLwotI2luY2x1ZGUgIk00VklGSV9GaWx0ZXJzQVBJLmgiIC8qKjwgZm9yIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwKCkgKi8KLQotI2lmbmRlZiBNNE1DU19BVURJT09OTFkKLSNpbmNsdWRlICJNNEFJUl9BUEkuaCIKLSNlbmRpZiAvKk00TUNTX0FVRElPT05MWSovCi0vKiovCi0KLQotCi0KLS8qCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRNQ1NfaW50QXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZU91dCkKLSAqIEBicmllZiAgICBEbyB0aGUgdmlkZW8gcmVuZGVyaW5nIGFuZCB0aGUgcmVzaXplIChpZiBuZWVkZWQpCi0gKiBAbm90ZSAgICBJdCBpcyBjYWxsZWQgYnkgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFZQUCBjb250ZXh0LCB3aGljaCBhY3R1YWxseSBpcyB0aGUgTUNTIGludGVybmFsIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBwUGxhbmVJbiAgICAoSU4pIENvbnRhaW5zIHRoZSBpbWFnZQotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIDMgcGxhbmVzIHRoYXQgd2lsbCBjb250YWluIHRoZSBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNE1DU19FUlJfVklERU9fREVDT0RFX0VSUk9SOiB0aGUgdmlkZW8gZGVjb2RpbmcgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00TUNTX0VSUl9SRVNJWkVfRVJST1I6IHRoZSByZXNpemluZyBmYWlsZWQKLSAqIEByZXR1cm4gICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRNQ1NfaW50QXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KQotewotICAgIE00T1NBX0VSUiAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLQotLyogVGhpcyBwYXJ0IGlzIHVzZWQgb25seSBpZiB2aWRlbyBjb2RlY3MgYXJlIGNvbXBpbGVkKi8KLSNpZm5kZWYgTTRNQ1NfQVVESU9PTkxZCi0gICAgLyoqCi0gICAgICogVGhlIFZQUCBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBNQ1MgY29udGV4dCEgKi8KLSAgICBNNE1DU19JbnRlcm5hbENvbnRleHQgKnBDID0gKE00TUNTX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLQotICAgIE00X01lZGlhVGltZSBtdEN0cyA9IHBDLT5kVmlEZWNDdXJyZW50Q3RzOwotCi0gICAgLyoqCi0gICAgICogV2hlbiBDbG9zaW5nIGFmdGVyIGFuIGVycm9yIG9jY3VyZWQsIGl0IG1heSBoYXBwZW4gdGhhdCBwUmVhZGVyVmlkZW9BVS0+bV9kYXRhQWRkcmVzcyBoYXMKLSAgICAgKiBub3QgYmVlbiBhbGxvY2F0ZWQgeWV0LiBXaGVuIGNsb3NpbmcgaW4gcGF1c2UgbW9kZSwgdGhlIGRlY29kZXIgY2FuIGJlIG51bGwuCi0gICAgICogV2UgZG9uJ3Qgd2FudCBhbiBlcnJvciB0byBiZSByZXR1cm5lZCBiZWNhdXNlIGl0IHdvdWxkIGludGVycnVwdCB0aGUgY2xvc2UgcHJvY2VzcyBhbmQKLSAgICAgKiB0aHVzIHNvbWUgcmVzb3VyY2VzIHdvdWxkIGJlIGxvY2tlZC4gU28gd2UgcmV0dXJuIE00Tk9fRVJST1IuCi0gICAgICovCi0gICAgLyogSW5pdGlhbGl6ZSB0byBibGFjayBwbGFuZSB0aGUgb3V0cHV0IHBsYW5lIGlmIHRoZSBtZWRpYSByZW5kZXJpbmcKLSAgICAgaXMgYmxhY2sgYm9yZGVycyAqLwotICAgIGlmKHBDLT5NZWRpYVJlbmRlcmluZyA9PSBNNE1DU19rQmxhY2tCb3JkZXJzKQotICAgIHsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzBdLnBhY19kYXRhLFlfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCpwUGxhbmVPdXRbMF0udV9zdHJpZGUpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgKHBQbGFuZU91dFsxXS51X2hlaWdodCpwUGxhbmVPdXRbMV0udV9zdHJpZGUpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLFZfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgKHBQbGFuZU91dFsyXS51X2hlaWdodCpwUGxhbmVPdXRbMl0udV9zdHJpZGUpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKE00T1NBX05VTEwgPT0gcEMtPlJlYWRlclZpZGVvQVUubV9kYXRhQWRkcmVzcykgfHwKLSAgICAgICAgICAgICAoTTRPU0FfTlVMTCA9PSBwQy0+cFZpRGVjQ3R4dCkpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogV2UgbXVzdCBmaWxsIHRoZSBpbnB1dCBvZiB0aGUgZW5jb2RlciB3aXRoIGEgZHVtbXkgaW1hZ2UsIGJlY2F1c2UKLSAgICAgICAgICogZW5jb2Rpbmcgbm9pc2UgbGVhZHMgdG8gYSBodWdlIHZpZGVvIEFVLCBhbmQgdGh1cyBhIHdyaXRlciBidWZmZXIgb3ZlcmZsb3cuICovCi0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFswXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3N0cmlkZSAqIHBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsxXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgIHBQbGFuZU91dFsxXS51X3N0cmlkZSAqIHBQbGFuZU91dFsxXS51X2hlaWdodCk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsyXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgIHBQbGFuZU91dFsyXS51X3N0cmlkZSAqIHBQbGFuZU91dFsyXS51X2hlaWdodCk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludEFwcGx5VlBQOiBwUmVhZGVyVmlkZW9BVS0+bV9kYXRhQWRkcmVzcyBpcyBNNE9TQV9OVUxMLFwKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgaWYocEMtPmlzUmVuZGVyRHVwID09IE00T1NBX0ZBTFNFKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqICAgIG1fcFByZVJlc2l6ZUZyYW1lIGRpZmZlcmVudCB0aGFuIE00T1NBX05VTEwgbWVhbnMgdGhhdCByZXNpemluZyBpcyBuZWVkZWQgKi8KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBQcmVSZXNpemVGcmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqIEZCIDIwMDgvMTAvMjA6Ci0gICAgICAgICAgICBVc2VkIGZvciBjcm9wcGluZyBhbmQgYmxhY2sgYm9yZGVycyovCi0gICAgICAgICAgICBNNEFJUl9QYXJhbXMgUGFyYW1zOwotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRNQ1NfaW50QXBwbHlWUFA6IE5lZWQgdG8gcmVzaXplIik7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RSZW5kZXIocEMtPnBWaURlY0N0eHQsICZtdEN0cywKLSAgICAgICAgICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lLCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRNQ1NfaW50QXBwbHlWUFA6IG1fcEZjdFJlbmRlciByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihwQy0+TWVkaWFSZW5kZXJpbmcgPT0gTTRNQ1Nfa1Jlc2l6aW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogQ2FsbCB0aGUgcmVzaXplIGZpbHRlci4gRnJvbSB0aGUgaW50ZXJtZWRpYXRlIGZyYW1lIHRvIHRoZSBlbmNvZGVyCi0gICAgICAgICAgICAgICAgICogaW1hZ2UgcGxhbmUKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBwQy0+cFByZVJlc2l6ZUZyYW1lLCBwUGxhbmVPdXQpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNE1DU19pbnRBcHBseVZQUDogTTRWaUZpbFJlc2l6ZUJpbGluZWFyWVVWNDIwdG9ZVVY0MjBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXNUZW1wWzNdOwotICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVUZW1wOwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwT3V0UGxhbmVZID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVUgPSBwUGxhbmVPdXRbMV0ucGFjX2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCogcE91dFBsYW5lViA9IHBQbGFuZU91dFsyXS5wYWNfZGF0YSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVkgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBpID0gMDsKLQotICAgICAgICAgICAgICAgIC8qRkIgMjAwOC8xMC8yMDogdG8ga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8qLwotICAgICAgICAgICAgICAgIC8qSW5pdGlhbGl6ZSBBSVIgUGFyYW1zKi8KLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSAwOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IHBDLT5wUHJlUmVzaXplRnJhbWUtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcEMtPnBQcmVSZXNpemVGcmFtZS0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fYk91dHB1dFN0cmlwZSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgIE1lZGlhIHJlbmRlcmluZzogQmxhY2sgYm9yZGVycyovCi0gICAgICAgICAgICAgICAgaWYocEMtPk1lZGlhUmVuZGVyaW5nID09IE00TUNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IHBQbGFuZU91dFswXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gcFBsYW5lT3V0WzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPSBwUGxhbmVPdXRbMV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGUgPSBwUGxhbmVPdXRbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IHBQbGFuZU91dFsyXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0gcFBsYW5lT3V0WzJdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlID0gcFBsYW5lT3V0WzJdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZXMgcGxhbiBpbiBsb2NhbCBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzBdXAotICAgICAgICAgICAgICAgICAgICAgICAgLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0LCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogdGVtcG9yYXJ5IHBsYW5lIGJ1ZmZlclkiKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIGFsbG9jIGluIE00TUNTX2ludEFwcGx5VlBQIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzFdXAotICAgICAgICAgICAgICAgICAgICAgICAgLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0LCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogdGVtcG9yYXJ5IHBsYW5lIGJ1ZmZlclUiKSA7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkVycm9yIGFsbG9jIGluIE00TUNTX2ludEFwcGx5VlBQIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwSW1hZ2VQbGFuZXNUZW1wWzJdXAotICAgICAgICAgICAgICAgICAgICAgICAgLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywoTTRPU0FfQ2hhciAqKSJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiB0ZW1wb3JhcnkgcGxhbmUgYnVmZmVyViIpIDsKLSAgICAgICAgICAgICAgICAgICAgaWYocEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRXJyb3IgYWxsb2MgaW4gTTRNQ1NfaW50QXBwbHlWUFAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBJblBsYW5lWSA9IHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgOwotICAgICAgICAgICAgICAgICAgICBwSW5QbGFuZVUgPSBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhIDsKLSAgICAgICAgICAgICAgICAgICAgcEluUGxhbmVWID0gcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSxZX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSxVX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSxWX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZigoTTRPU0FfVUludDMyKSgocEMtPnBQcmVSZXNpemVGcmFtZS0+dV9oZWlnaHQgKiBwUGxhbmVPdXQtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+cFByZVJlc2l6ZUZyYW1lLT51X3dpZHRoKSA8PSBwUGxhbmVPdXQtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0IDwgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qaXQgaXMgaGVpZ2h0IHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBvbiB0aGUgYm90dG9tIHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocEMtPnBQcmVSZXNpemVGcmFtZS0+dV9oZWlnaHQgKiBwUGxhbmVPdXQtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPnBQcmVSZXNpemVGcmFtZS0+dV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKm51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCk+PjEpKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzVGVtcFsxXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRNQ1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKml0IGlzIHdpZHRoIHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+cFByZVJlc2l6ZUZyYW1lLT51X3dpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcFBsYW5lT3V0LT51X2hlaWdodClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+cFByZVJlc2l6ZUZyYW1lLT51X2hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aC1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00TUNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aC1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE1DU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGgtXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qV2lkdGggYW5kIGhlaWdodCBoYXZlIHRvIGJlIGV2ZW4qLwotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1RlbXBbMF0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCA9IChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSAocEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIHRoYXQgdmFsdWVzIGFyZSBjb2hlcmVudCovCi0gICAgICAgICAgICAgICAgICAgIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9PSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID09IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wID0gcEltYWdlUGxhbmVzVGVtcDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICBNZWRpYSByZW5kZXJpbmc6IENyb3BwaW5nKi8KLSAgICAgICAgICAgICAgICBpZihwQy0+TWVkaWFSZW5kZXJpbmcgPT0gTTRNQ1Nfa0Nyb3BwaW5nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBQbGFuZU91dC0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgaWYoKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgKiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDxQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qaGVpZ2h0IHdpbGwgYmUgY3JvcHBlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+cFByZVJlc2l6ZUZyYW1lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qd2lkdGggd2lsbCBiZSBjcm9wcGVkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBDLT5wUHJlUmVzaXplRnJhbWUtPnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wID0gcFBsYW5lT3V0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBDYWxsIEFJUiBmdW5jdGlvbnMgKi8KLSAgICAgICAgICAgICAgICBpZihNNE9TQV9OVUxMID09IHBDLT5tX2Fpcl9jb250ZXh0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfY3JlYXRlKCZwQy0+bV9haXJfY29udGV4dCwgTTRBSVJfa1lVVjQyMFApOwotICAgICAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6XAotICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gaW5pdGlhbGl6aW5nIEFJUjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKHBDLT5tX2Fpcl9jb250ZXh0LCAmUGFyYW1zKTsKLSAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OlwKLSAgICAgICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gY29uZmlndXJpbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRBSVJfZ2V0KHBDLT5tX2Fpcl9jb250ZXh0LCBwQy0+cFByZVJlc2l6ZUZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wKTsKLSAgICAgICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OlwKLSAgICAgICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gZ2V0dGluZyBBSVIgcGxhbmU6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICBNNEFJUl9jbGVhblVwKHBDLT5tX2Fpcl9jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihwQy0+TWVkaWFSZW5kZXJpbmcgPT0gTTRNQ1Nfa0JsYWNrQm9yZGVycykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8cFBsYW5lT3V0WzBdLnVfaGVpZ2h0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggICAodm9pZCAqKXBPdXRQbGFuZVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwSW5QbGFuZVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEluUGxhbmVZICs9IHBQbGFuZU91dFswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgcE91dFBsYW5lWSArPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxwUGxhbmVPdXRbMV0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCAgICh2b2lkICopcE91dFBsYW5lVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBJblBsYW5lVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbMV0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW5QbGFuZVUgKz0gcFBsYW5lT3V0WzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwT3V0UGxhbmVVICs9IHBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPHBQbGFuZU91dFsyXS51X2hlaWdodDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoICAgKHZvaWQgKilwT3V0UGxhbmVWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEluUGxhbmVWLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFsyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJblBsYW5lViArPSBwUGxhbmVPdXRbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQbGFuZVYgKz0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDsgaTwzOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludEFwcGx5VlBQOiBEb24ndCBuZWVkIHJlc2l6aW5nIik7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+bV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RSZW5kZXIocEMtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm10Q3RzLCBwUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00TUNTX2ludEFwcGx5VlBQOiBtX3BGY3RSZW5kZXIgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQy0+bGFzdERlY29kZWRQbGFuZSA9IHBQbGFuZU91dDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogQ29weSBsYXN0IGRlY29kZWQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAqIHBQbGFuZU91dFswXS51X3dpZHRoKSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChwUGxhbmVPdXRbMV0udV9oZWlnaHQgKiBwUGxhbmVPdXRbMV0udV93aWR0aCkpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGxhbmVPdXRbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5sYXN0RGVjb2RlZFBsYW5lWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0ICogcFBsYW5lT3V0WzJdLnVfd2lkdGgpKTsKLSAgICAgICAgcEMtPmxhc3REZWNvZGVkUGxhbmUgPSBwUGxhbmVPdXQ7Ci0gICAgfQotCi0KLSNlbmRpZiAvKk00TUNTX0FVRElPT05MWSovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00TUNTX2ludEFwcGx5VlBQOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTk9USUNFIGIvbGlidmlkZW9lZGl0b3IvdnNzL21jcy9zcmMvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3Mvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9BbmRyb2lkLm1rIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NzYyN2VjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIGxpYnZzcwotIwotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX2NvcmUKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgXAotICAgICAgTTRQVE8zR1BQX0FQSS5jIFwKLSAgICAgIE00UFRPM0dQUF9WaWRlb1ByZVByb2Nlc3NpbmcuYyBcCi0gICAgICBNNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jIFwKLSAgICAgIE00eFZTU19BUEkuYyBcCi0gICAgICBNNHhWU1NfaW50ZXJuYWwuYyBcCi0gICAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmcuYyBcCi0gICAgICBNNFZTUzNHUFBfQ2xpcC5jIFwKLSAgICAgIE00VlNTM0dQUF9DbGlwQW5hbHlzaXMuYyBcCi0gICAgICBNNFZTUzNHUFBfQ29kZWNzLmMgXAotICAgICAgTTRWU1MzR1BQX0VkaXQuYyBcCi0gICAgICBNNFZTUzNHUFBfRWRpdEF1ZGlvLmMgXAotICAgICAgTTRWU1MzR1BQX0VkaXRWaWRlby5jIFwKLSAgICAgIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjU3Vic2NyaXB0aW9uLmMgXAotICAgICAgTTRDaGFubmVsQ29udmVydGVyLmMgXAotICAgICAgTTRWRF9FWFRFUk5BTF9CaXRzdHJlYW1QYXJzZXIuYyBcCi0gICAgICBNNEFJUl9BUEkuYyBcCi0gICAgICBNNFJFQURFUl9QY20uYyBcCi0gICAgICBNNFBDTVJfQ29yZVJlYWRlci5jIFwKLSAgICAgIE00QURfTnVsbC5jIFwKLSAgICAgIE00QU1SUl9Db3JlUmVhZGVyLmMgXAotICAgICAgTTRSRUFERVJfQW1yLmMgXAotICAgICAgTTRWRF9Ub29scy5jIFwKLSAgICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcCBcCi0gICAgICBNNERFQ09ERVJfTnVsbC5jCi0KLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgICAgICBcCi0gICAgbGliYXVkaW9yZXNhbXBsZXIgICAgICAgICAgIFwKLSAgICBsaWJhdWRpb3V0aWxzICAgICAgICAgICAgICAgXAotICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliY3V0aWxzICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJsb2cgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHQgICAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uICAgXAotICAgIGxpYnN0YWdlZnJpZ2h0X29teCAgICAgICAgICBcCi0gICAgbGlidXRpbHMgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsICAgICAgICAgXAotICAgIGxpYnZpZGVvZWRpdG9yX3ZpZGVvZmlsdGVycyBcCi0gICAgbGlidmlkZW9lZGl0b3JwbGF5ZXIgICAgICAgIFwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbiBcCi0gICAgbGlidmlkZW9lZGl0b3JfbWNzIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9zdGFnZWZyaWdodHNoZWxscyBcCi0gICAgbGlidmlkZW9lZGl0b3JfM2dwd3JpdGVyIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9tY3MvaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvY29tbW9uL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKLSAgICAkKFRPUCkvc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZSBcCi0gICAgJChUT1ApL3N5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlCi0KLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciBcCi0gICAgLURNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFbm8gXAotICAgIC1EREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFEX051bGwuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBRF9OdWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkMWVjNzMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFEX051bGwuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRBRF9OdWxsLmMKLSAqIEBicmllZiAgIEltcGxlbWVudGF0aW9uIG9mIHRoZSBNUDMgZGVjb2RlciBwdWJsaWMgaW50ZXJmYWNlCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBhICJudWxsIiBhdWRpbyBkZWNvZGVyLCB0aGF0IGlzIGEgZGVjb2RlcgotICogICAgICAgICAgdGhhdCBkbyBub3RoaW5nIGV4Y2VwdCBnZXR0aW5nIEFVIGZyb20gdGhlIHJlYWRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNFRPT0xfVmVyc2lvbkluZm8uaCIKLSNpbmNsdWRlICJNNEFEX0NvbW1vbi5oIgotI2luY2x1ZGUgIk00QURfTnVsbC5oIgotCi0jZGVmaW5lIE00QURfRk9SQ0VfMTZCSVRTCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTlVMTCBBdWRpbyBEZWNvZGVyIHZlcnNpb24gaW5mb3JtYXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovCi0jZGVmaW5lIE00QURfTlVMTF9NQUpPUiAgICAxCi0jZGVmaW5lIE00QURfTlVMTF9NSU5PUiAgICAxCi0jZGVmaW5lIE00QURfTlVMTF9SRVZJU0lPTiA0Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00QURfTnVsbENvbnRleHQKLSAqIEBicmllZiAgICAgICAgSW50ZXJuYWwgbnVsbCBkZWNvZGVyIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qKjwgUG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgcHJvdmlkZWQgYnkgdGhlIHVzZXIgKi8KLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICAgIG1fcEF1ZGlvU3RyZWFtaGFuZGxlcjsKLX0gTTRBRF9OdWxsQ29udGV4dDsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE5YUCBNUDMgZGVjb2RlciBmdW5jdGlvbnMgZGVmaW5pdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBudWxsIGRlY29kZXIKLSAqIEBub3RlICAgIEFsbG9jYXRlcyB0aGUgY29udGV4dAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChPVVQpICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKElOKSAgICBQb2ludGVyIHRvIGFuIGF1ZGlvIHN0cmVhbSBkZXNjcmlwdGlvbgotICogQHBhcmFtICAgIHBVc2VyRGF0YTogICAgICAgIChJTikgICAgUG9pbnRlciB0byBVc2VyIGRhdGEKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgICBNNEVSUl9BTExPQyAgICAgICAgICAgICBhIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgICBNNEFEX05VTExfY3JlYXRlKCAgTTRBRF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhKQotewotICAgIE00QURfTnVsbENvbnRleHQqIHBDOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQ29udGV4dCA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNEFEX05VTExfY3JlYXRlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAiTTRBRF9OVUxMX2NyZWF0ZTogaW52YWxpZCBwb2ludGVyIHBTdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBwQyA9IChNNEFEX051bGxDb250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00QURfTnVsbENvbnRleHQpLAotICAgICAgICAgICAgICAgICBNNERFQ09ERVJfQVVESU8sIChNNE9TQV9DaGFyICopIk00QURfTnVsbENvbnRleHQiKTsKLSAgICBpZiAocEMgPT0gKE00QURfTnVsbENvbnRleHQqKTApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQ2FuIG5vdCBhbGxvY2F0ZSBudWxsIGRlY29kZXIgY29udGV4dCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgKnBDb250ZXh0ID0gcEM7Ci0KLSAgICBwQy0+bV9wQXVkaW9TdHJlYW1oYW5kbGVyID0gcFN0cmVhbUhhbmRsZXI7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgRGVzdHJveXMgdGhlIGluc3RhbmNlIG9mIHRoZSBudWxsIGRlY29kZXIKLSAqIEBub3RlICAgICBBZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXIKLSAqCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICBUaGUgY29udGV4dCBpcyBpbnZhbGlkIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgICBNNEFEX05VTExfZGVzdHJveShNNEFEX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNEFEX051bGxDb250ZXh0KiBwQyA9IChNNEFEX051bGxDb250ZXh0Kiljb250ZXh0OwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChjb250ZXh0ID09IE00T1NBX05VTEwpLCBNNEVSUl9QQVJBTUVURVIsICJNNEFEX05VTExfZGVzdHJveTogaW52YWxpZCBjb250ZXh0Iik7Ci0KLSAgICBmcmVlKHBDKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFNpbXBseSBvdXRwdXQgdGhlIGdpdmVuIGF1ZGlvIGRhdGEKLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgY29udGV4dDogICAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICBwSW5wdXRCdWZmZXI6ICAgICAoSU4vT1VUKUlucHV0IERhdGEgYnVmZmVyLiBJdCBjb250YWlucyBhdCBsZWFzdCBvbmUgYXVkaW8gZnJhbWUuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgbXVzdCBiZSB1cGRhdGVkIGluc2lkZSB0aGUgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVmbGVjdCB0aGUgc2l6ZSBvZiB0aGUgYWN0dWFsbHkgZGVjb2RlZCBkYXRhLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiB0aGUgZmlyc3QgZnJhbWUgaW4gcElucHV0QnVmZmVyKQotICogQHBhcmFtICAgcERlY29kZWRQQ01CdWZmZXI6IChPVVQpICBPdXRwdXQgUENNIGJ1ZmZlciAoZGVjb2RlZCBkYXRhKS4KLSAqIEBwYXJhbSAgIGp1bXBpbmc6ICAgICAgICAgICAoSU4pICAgTTRPU0FfVFJVRSBpZiBhIGp1bXAgd2FzIGp1c3QgZG9uZSwgTTRPU0FfRkFMU0Ugb3RoZXJ3aXNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgICAgTTRBRF9OVUxMX3N0ZXAoTTRBRF9Db250ZXh0IGNvbnRleHQsIE00QURfQnVmZmVyICpwSW5wdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9CdWZmZXIgKnBEZWNvZGVkUENNQnVmZmVyLCBNNE9TQV9Cb29sIGp1bXBpbmcpCi17Ci0gICAgTTRBRF9OdWxsQ29udGV4dCogcEMgPSAoTTRBRF9OdWxsQ29udGV4dCopY29udGV4dDsKLQotICAgIC8qVGhlIFZQUyBzZW5kcyBhIHplcm8gYnVmZmVyIGF0IHRoZSBlbmQqLwotICAgIGlmICgwID09IHBJbnB1dEJ1ZmZlci0+bV9idWZmZXJTaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgfQotCi0gICAgaWYgKHBJbnB1dEJ1ZmZlci0+bV9idWZmZXJTaXplID4gcERlY29kZWRQQ01CdWZmZXItPm1fYnVmZmVyU2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotI2lmZGVmIE00QURfRk9SQ0VfMTZCSVRTCi0gICAgLyppZiByZWFkIHNhbXBsZXMgYXJlIDggYml0cywgY29tcGxldGUgdGhlbSB0byAxNiBiaXRzKi8KLSAgICBpZiAocEMtPm1fcEF1ZGlvU3RyZWFtaGFuZGxlci0+bV9ieXRlU2FtcGxlU2l6ZSA9PSAxKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgIE00T1NBX0ludDE2ICB2YWw7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBJbnB1dEJ1ZmZlci0+bV9idWZmZXJTaXplOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbCA9IChNNE9TQV9JbnQxNikoKE00T1NBX1VJbnQ4KShwSW5wdXRCdWZmZXItPm1fZGF0YUFkZHJlc3NbaV0pIC0gMTI4KTsKLQotICAgICAgICAgICAgcERlY29kZWRQQ01CdWZmZXItPm1fZGF0YUFkZHJlc3NbaSoyXSAgID0gKE00T1NBX0ludDgpKHZhbD4+OCk7Ci0gICAgICAgICAgICBwRGVjb2RlZFBDTUJ1ZmZlci0+bV9kYXRhQWRkcmVzc1tpKjIrMV0gPSAoTTRPU0FfSW50OCkodmFsJjB4MDBmZik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcERlY29kZWRQQ01CdWZmZXItPm1fZGF0YUFkZHJlc3MsICh2b2lkICopcElucHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSApOwotICAgIH0KLSNlbHNlIC8qTTRBRF9GT1JDRV8xNkJJVFMqLwotICAgIG1lbWNweSgodm9pZCAqKXBEZWNvZGVkUENNQnVmZmVyLT5tX2RhdGFBZGRyZXNzLCAodm9pZCAqKXBJbnB1dEJ1ZmZlci0+bV9kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgcElucHV0QnVmZmVyLT5tX2J1ZmZlclNpemUgKTsKLSNlbmRpZiAvKk00QURfRk9SQ0VfMTZCSVRTKi8KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEdldHMgdGhlIGRlY29kZXIgdmVyc2lvbgotICogQG5vdGUgICAgVGhlIHZlcnNpb24gaXMgZ2l2ZW4gaW4gYSBNNF9WZXJzaW9uSW5mbyBzdHJ1Y3R1cmUKLSAqCi0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoT1VUKSAgICAgICBQb2ludGVyIHRvIHRoZSB2ZXJzaW9uIHN0cnVjdHVyZQotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBwVmVyc2lvbkluZm8gcG9pbnRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiAgICBNNEFEX05VTExfZ2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFZlcnNpb25JbmZvID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNEFEX05VTExfZ2V0VmVyc2lvbjogaW52YWxpZCBwb2ludGVyIHBWZXJzaW9uSW5mbyIpOwotCi0gICAgLyogVXAgdW50aWwgbm93LCB0aGUgbnVsbCBkZWNvZGVyIHZlcnNpb24gaXMgbm90IGF2YWlsYWJsZSAqLwotCi0gICAgLyogQ0hBTkdFX1ZFUlNJT05fSEVSRSAqLwotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciAgICAgICAgPSBNNEFEX05VTExfTUFKT1I7ICAgICAgLyptYWpvciB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQqLwotICAgIHBWZXJzaW9uSW5mby0+bV9taW5vciAgICAgICAgPSBNNEFEX05VTExfTUlOT1I7ICAgICAgLyptaW5vciB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQqLwotICAgIHBWZXJzaW9uSW5mby0+bV9yZXZpc2lvbiAgICA9IE00QURfTlVMTF9SRVZJU0lPTjsgICAgLypyZXZpc2lvbiB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnQqLwotICAgIHBWZXJzaW9uSW5mby0+bV9zdHJ1Y3RTaXplPXNpemVvZihNNF9WZXJzaW9uSW5mbyk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZ2V0SW50ZXJmYWNlIGZ1bmN0aW9uIGRlZmluaXRpb25zIG9mIE5YUCBNUDMgZGVjb2RlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIGRlY29kZXIKLSAqIEBwYXJhbSBwRGVjb2RlclR5cGUgICAgICAgIDogcG9pbnRlciBvbiBhbiBNNEFEX1R5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGRlY29kZXIgdHlwZSBzdXBwb3J0ZWQgYnkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBkZWNvZGVyCi0gKiBAcGFyYW0gcERlY29kZXJJbnRlcmZhY2UgICA6IGFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGludGVyZmFjZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCBieSB0aGlzIGRlY29kZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlci4KLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgIGlmIE9LCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DIGlmIGFsbG9jYXRpb24gZmFpbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00QURfTlVMTF9nZXRJbnRlcmZhY2UoIE00QURfVHlwZSAqcERlY29kZXJUeXBlLCBNNEFEX0ludGVyZmFjZSAqKnBEZWNvZGVySW50ZXJmYWNlKQotewotICAgICpwRGVjb2RlckludGVyZmFjZSA9ICggIE00QURfSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoIHNpemVvZihNNEFEX0ludGVyZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX0FVRElPLCAoTTRPU0FfQ2hhciAqKSJNNEFEX0ludGVyZmFjZSIgKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcERlY29kZXJJbnRlcmZhY2UpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgKnBEZWNvZGVyVHlwZSA9IE00QURfa1R5cGVQQ007Ci0KLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgICAgICAgPSBNNEFEX05VTExfY3JlYXRlOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3REZXN0cm95QXVkaW9EZWMgICAgICA9IE00QURfTlVMTF9kZXN0cm95OwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTdGVwQXVkaW9EZWMgICAgICAgICA9IE00QURfTlVMTF9zdGVwOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RHZXRWZXJzaW9uQXVkaW9EZWMgICA9IE00QURfTlVMTF9nZXRWZXJzaW9uOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTdGFydEF1ZGlvRGVjICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFJlc2V0QXVkaW9EZWMgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYyAgICA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFJUl9BUEkuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRBSVJfQVBJLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyODk3YjAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFJUl9BUEkuYworKysgL2Rldi9udWxsCkBAIC0xLDk2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgTTRBSVJfQVBJLmMKLSAqIEBicmllZiAgQXJlYSBvZiBJbnRlcmVzdCBSZXNpemVyICBBUEkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2RlZmluZSBNNEFJUl9ZVVY0MjBfRk9STUFUX1NVUFBPUlRFRAotI2RlZmluZSBNNEFJUl9ZVVY0MjBBX0ZPUk1BVF9TVVBQT1JURUQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ09NUElMQVRJT04gQ0hFQ0tTICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgTTRBSVJfWVVWNDIwX0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfQkdSNTY1X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfUkdCNTY1X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfQkdSODg4X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfUkdCODg4X0ZPUk1BVF9TVVBQT1JURUQKLSNpZm5kZWYgTTRBSVJfSlBHX0ZPUk1BVF9TVVBQT1JURUQKLQotI2Vycm9yICJQbGVhc2UgZGVmaW5lIGF0IGxlYXN0IG9uZSBpbnB1dCBmb3JtYXQgZm9yIHRoZSBBSVIgY29tcG9uZW50IgotCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElOQ0xVREVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX011dGV4LmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLSNpbmNsdWRlICJNNEFJUl9BUEkuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKiBNNEFJUiBJTlRFUk5BTCBUWVBFUyBERUZJTklUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBlbnVtICAgICAgICAgTTRBSVJfU3RhdGVzCi0gKiBAYnJpZWYgICAgICAgVGhlIGZvbGxvd2luZyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBpbnRlcm5hbCBzdGF0ZXMgb2YgdGhlIEFJUi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTTRBSVJfa0NyZWF0ZWQsICAgICAgICAvKio8IFN0YXRlIGFmdGVyIE00QUlSX2NyZWF0ZSBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgICBNNEFJUl9rQ29uZmlndXJlZCAgICAgIC8qKjwgU3RhdGUgYWZ0ZXIgTTRBSVJfY29uZmlndXJlIGhhcyBiZWVuIGNhbGxlZCAqLwotfU00QUlSX1N0YXRlczsKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdCAgICAgICAgIE00QUlSX0ludGVybmFsQ29udGV4dAotICogQGJyaWVmICAgICAgICAgVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgdGhlIGludGVybmFsIGNvbnRleHQgb2YgdGhlIEFJUi4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNEFJUl9TdGF0ZXMgICAgICAgICAgICBtX3N0YXRlOyAgICAgICAgLyoqPCBJbnRlcm5hbCBzdGF0ZSAqLwotICAgIE00QUlSX0lucHV0Rm9ybWF0VHlwZSAgIG1faW5wdXRGb3JtYXQ7ICAvKio8IElucHV0IGZvcm1hdCBsaWtlIFlVVjQyMFBsYW5hciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSR0I1NjUsIEpQRywgZXRjIC4uLiAqLwotICAgIE00QUlSX1BhcmFtcyAgICAgICAgICAgIG1fcGFyYW1zOyAgICAgICAvKio8IEN1cnJlbnQgaW5wdXQgUGFyYW1ldGVyIG9mICB0aGUgcHJvY2Vzc2luZyAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl94X2luY1s0XTsgICAvKio8IHJhdGlvIGJldHdlZW4gaW5wdXQgYW5kIG91cHV0IHdpZHRoIGZvciBZVVYgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeV9pbmNbNF07ICAgLyoqPCByYXRpbyBiZXR3ZWVuIGlucHV0IGFuZCBvdXB1dCBoZWlnaHQgZm9yIFlVViAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0WzRdOyAgICAvKio8IGhvcml6b250YWwgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0WzRdOyAgICAvKio8IFZlcnRpY2FsIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeF9hY2N1bVs0XTsgLyoqPCBzYXZlIG9mIGhvcml6b250YWwgYWNjdW11bGF0b3IgdmFsdWUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICB1MzJfeV9hY2N1bVs0XTsgLyoqPCBzYXZlIG9mIHZlcnRpY2FsIGFjY3VtdWxhdG9yIHZhbHVlICovCi0gICAgTTRPU0FfVUludDgqICAgICAgICAgICAgcHU4X2RhdGFfaW5bNF07IC8qKjwgU2F2ZSBvZiBpbnB1dCBwbGFuZSBwb2ludGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUgKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtX3Byb2NSb3dzOyAgICAgLyoqPCBOdW1iZXIgb2YgcHJvY2Vzc2VkIHJvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gc3RyaXBlIG1vZGUgb25seSAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgbV9iT25seUNvcHk7ICAvKio8IEZsYWcgdG8ga25vdyBpZiB3ZSBqdXN0IHBlcmZvcm0gYSBjb3B5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiAqLwotICAgIE00T1NBX0Jvb2wgICAgICAgICAgICAgICAgbV9iRmxpcFg7ICAgICAvKio8IERlcGVuZCBvbiBvdXRwdXQgb3JpZW50YXRpb24sIHVzZWQgZHVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHRvIHJldmVydCBwcm9jZXNzaW5nIG9yZGVyIGluIFgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzICovCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICBtX2JGbGlwWTsgICAgIC8qKjwgRGVwZW5kIG9uIG91dHB1dCBvcmllbnRhdGlvbiwgdXNlZCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgdG8gcmV2ZXJ0IHByb2Nlc3Npbmcgb3JkZXIgaW4gWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgKi8KLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgIG1fYlJldmVydFhZOyAgLyoqPCBEZXBlbmQgb24gb3V0cHV0IG9yaWVudGF0aW9uLCB1c2VkIGR1cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyB0byByZXZlcnQgWCBhbmQgWSBwcm9jZXNzaW5nIG9yZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCstOTCwIHJvdGF0aW9uKSAqLwotfU00QUlSX0ludGVybmFsQ29udGV4dDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNQUNST1MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUocmV0dmFsLCBwb2ludGVyKVwKLSAgICAgaWYgKChwb2ludGVyKSA9PSBNNE9TQV9OVUxMKSByZXR1cm4gKChNNE9TQV9FUlIpKHJldHZhbCkpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIE00QUlSIFBVQkxJQyBBUEkgSU1QTEVNRU5UQVRJT04gKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jcmVhdGUoTTRPU0FfQ29udGV4dCogcENvbnRleHQsTTRBSVJfSW5wdXRGb3JtYXRUeXBlIGlucHV0Rm9ybWF0KQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgQUlSLgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAgIChJTi9PVVQpIEFkZHJlc3Mgb2YgdGhlIGNvbnRleHQgdG8gY3JlYXRlCi0gKiBAcGFyYW0gICAgaW5wdXRGb3JtYXQ6ICAgKElOKSBpbnB1dCBmb3JtYXQgdHlwZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4gSW52YWxpZCBmb3JtYXRUeXBlCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBObyBtb3JlIG1lbW9yeSBpcyBhdmFpbGFibGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00QUlSX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCxNNEFJUl9JbnB1dEZvcm1hdFR5cGUgaW5wdXRGb3JtYXQpCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1IgOwotICAgIE00QUlSX0ludGVybmFsQ29udGV4dCogcEMgPSBNNE9TQV9OVUxMIDsKLQotICAgIC8qIENoZWNrIHRoYXQgdGhlIGFkZHJlc3Mgb24gdGhlIGNvbnRleHQgaXMgbm90IE5VTEwgKi8KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7Ci0KLSAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMIDsKLQotICAgIC8qIEludGVybmFsIENvbnRleHQgY3JlYXRpb24gKi8KLSAgICBwQyA9IChNNEFJUl9JbnRlcm5hbENvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRBSVJfSW50ZXJuYWxDb250ZXh0KSwKLSAgICAgICAgIE00QUlSLChNNE9TQV9DaGFyICopIkFJUiBpbnRlcm5hbCBjb250ZXh0IikgOwotICAgIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKE00RVJSX0FMTE9DLCBwQykgOwotCi0KLSAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgZm9ybWF0IGlzIHN1cHBvcnRlZCAqLwotICAgIHN3aXRjaChpbnB1dEZvcm1hdCkKLSAgICB7Ci0jaWZkZWYgTTRBSVJfWVVWNDIwX0ZPUk1BVF9TVVBQT1JURUQKLSAgICAgICAgY2FzZSBNNEFJUl9rWVVWNDIwUDoKLSAgICAgICAgYnJlYWsgOwotI2VuZGlmCi0jaWZkZWYgTTRBSVJfWVVWNDIwQV9GT1JNQVRfU1VQUE9SVEVECi0gICAgICAgIGNhc2UgTTRBSVJfa1lVVjQyMEFQOgotICAgICAgICBicmVhayA7Ci0jZW5kaWYKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVyciA9IE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRDsKLSAgICAgICAgICAgIGdvdG8gTTRBSVJfY3JlYXRlX2NsZWFudXAgOwotICAgIH0KLQotICAgIC8qKjwgU2F2ZSBpbnB1dCBmb3JtYXQgYW5kIHVwZGF0ZSBzdGF0ZSAqLwotICAgIHBDLT5tX2lucHV0Rm9ybWF0ID0gaW5wdXRGb3JtYXQ7Ci0gICAgcEMtPm1fc3RhdGUgPSBNNEFJUl9rQ3JlYXRlZDsKLQotICAgIC8qIFJldHVybiB0aGUgY29udGV4dCB0byB0aGUgY2FsbGVyICovCi0gICAgKnBDb250ZXh0ID0gcEMgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotCi1NNEFJUl9jcmVhdGVfY2xlYW51cDoKLSAgICAvKiBFcnJvciBtYW5hZ2VtZW50IDogd2UgZGVzdHJveSB0aGUgY29udGV4dCBpZiBuZWVkZWQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDKQotICAgIHsKLSAgICAgICAgZnJlZShwQykgOwotICAgIH0KLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotCi0gICAgcmV0dXJuIGVyciA7Ci19Ci0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNEFJUl9jbGVhblVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBkZXN0cm95cyBhbiBpbnN0YW5jZSBvZiB0aGUgQUlSIGNvbXBvbmVudAotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIENvbnRleHQgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlIHRvIGRlc3Ryb3kKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KS4KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6IEludGVybmFsIHN0YXRlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgZnVuY3Rpb24gY2FsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00QUlSX2NsZWFuVXAoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNEFJUl9JbnRlcm5hbENvbnRleHQqIHBDID0gKE00QUlSX0ludGVybmFsQ29udGV4dCopcENvbnRleHQgOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCkgOwotCi0gICAgLyoqPCBDaGVjayBzdGF0ZSAqLwotICAgIGlmKChNNEFJUl9rQ3JlYXRlZCAhPSBwQy0+bV9zdGF0ZSkmJihNNEFJUl9rQ29uZmlndXJlZCAhPSBwQy0+bV9zdGF0ZSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotICAgIGZyZWUocEMpIDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLQotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHdpbGwgY29uZmlndXJlIHRoZSBBSVIuCi0gKiBAbm90ZSAgICBJdCB3aWxsIHNldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBjb29yZGluYXRlcyBhbmQgc2l6ZXMsCi0gKiAgICAgICAgICBhbmQgaW5kaWNhdGVzIGlmIHdlIHdpbGwgcHJvY2VlZCBpbiBzdHJpcGUgb3Igbm90LgotICogICAgICAgICAgSW4gY2FzZSBhIE00QUlSX2dldCBpbiBzdHJpcGUgbW9kZSB3YXMgb24gZ29pbmcsIGl0IHdpbGwgY2FuY2VsIHRoaXMgcHJldmlvdXMKLSAqICAgICAgICAgIHByb2Nlc3NpbmcgYW5kIHJlc2V0IHRoZSBnZXQgcHJvY2Vzcy4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgICAgICAgICAgKElOKSBDb250ZXh0IGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZQotICogQHBhcmFtICAgIHBQYXJhbXMtPm1fYk91dHB1dFN0cmlwZTooSU4pIFN0cmlwZSBtb2RlLgotICogQHBhcmFtICAgIHBQYXJhbXMtPm1faW5wdXRDb29yZDogICAgKElOKSBYLFkgY29vcmRpbmF0ZXMgb2YgdGhlIGZpcnN0IHZhbGlkIHBpeGVsIGluIGlucHV0LgotICogQHBhcmFtICAgIHBQYXJhbXMtPm1faW5wdXRTaXplOiAgICAoSU4pIGlucHV0IFJPSSBzaXplLgotICogQHBhcmFtICAgIHBQYXJhbXMtPm1fb3V0cHV0U2l6ZTogICAgKElOKSBvdXRwdXQgc2l6ZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IHNwYWNlIHRvIGFkZCBhIG5ldyBlZmZlY3QuCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKiBAcmV0dXJuICAgIE00RVJSX0FJUl9GT1JNQVRfTk9UX1NVUFBPUlRFRDogdGhlIHJlcXVlc3RlZCBpbnB1dCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00QUlSX2NvbmZpZ3VyZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNEFJUl9QYXJhbXMqIHBQYXJhbXMpCi17Ci0gICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNEFJUl9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0IDsKLSAgICBNNE9TQV9VSW50MzIgICAgaSx1MzJfd2lkdGhfaW4sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW4sIHUzMl9oZWlnaHRfb3V0OwotICAgIE00T1NBX1VJbnQzMiAgICBuYl9wbGFuZXM7Ci0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7Ci0KLSAgICBpZihNNEFJUl9rWVVWNDIwQVAgPT0gcEMtPm1faW5wdXRGb3JtYXQpCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSA0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBuYl9wbGFuZXMgPSAzOwotICAgIH0KLQotICAgIC8qKjwgQ2hlY2sgc3RhdGUgKi8KLSAgICBpZigoTTRBSVJfa0NyZWF0ZWQgIT0gcEMtPm1fc3RhdGUpJiYoTTRBSVJfa0NvbmZpZ3VyZWQgIT0gcEMtPm1fc3RhdGUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKiBTYXZlIHBhcmFtZXRlcnMgKi8KLSAgICBwQy0+bV9wYXJhbXMgPSAqcFBhcmFtczsKLQotICAgIC8qIENoZWNrIGZvciB0aGUgaW5wdXQmb3V0cHV0IHdpZHRoIGFuZCBoZWlnaHQgYXJlIGV2ZW4gKi8KLSAgICAgICAgaWYoICgocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSYweDEpICAgIHx8Ci0gICAgICAgICAgICAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkmMHgxKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FJUl9JTExFR0FMX0ZSQU1FX1NJWkU7Ci0gICAgICAgIH0KLQotICAgICBpZiggKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkmMHgxKSAgICB8fAotICAgICAgICAgICAgKChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkmMHgxKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FJUl9JTExFR0FMX0ZSQU1FX1NJWkU7Ci0gICAgICAgIH0KLSAgICBpZigoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSA9PSAocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKSkKLSAgICAgICAgJiYoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkgPT0gKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpKSkKLSAgICB7Ci0gICAgICAgIC8qKjwgTm8gcmVzaXplIGluIHRoaXMgY2FzZSwgd2Ugd2lsbCBqdXN0IGNvcHkgaW5wdXQgaW4gb3V0cHV0ICovCi0gICAgICAgIHBDLT5tX2JPbmx5Q29weSA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDLT5tX2JPbmx5Q29weSA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgIC8qKjwgSW5pdGlhbGl6ZSBpbnRlcm5hbCB2YXJpYWJsZXMgdXNlZCBmb3IgcmVzaXplIGZpbHRlciAqLwotICAgICAgICBmb3IoaT0wO2k8bmJfcGxhbmVzO2krKykKLSAgICAgICAgewotCi0gICAgICAgICAgICB1MzJfd2lkdGhfaW4gPSAoKGk9PTApfHwoaT09MykpP3BDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoOlwKLSAgICAgICAgICAgICAgICAocEMtPm1fcGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgrMSk+PjE7Ci0gICAgICAgICAgICB1MzJfaGVpZ2h0X2luID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ6XAotICAgICAgICAgICAgICAgIChwQy0+bV9wYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQrMSk+PjE7Ci0gICAgICAgICAgICB1MzJfd2lkdGhfb3V0ID0gKChpPT0wKXx8KGk9PTMpKT9wQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg6XAotICAgICAgICAgICAgICAgIChwQy0+bV9wYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgrMSk+PjE7Ci0gICAgICAgICAgICB1MzJfaGVpZ2h0X291dCA9ICgoaT09MCl8fChpPT0zKSk/cEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodDpcCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQrMSk+PjE7Ci0KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIGhvcml6b250YWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIHdpZHRoLiovCi0gICAgICAgICAgICAgICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2luY1tpXSAgID0gKCh1MzJfd2lkdGhfaW4tMSkgKiAweDEwMDAwKSAvICh1MzJfd2lkdGhfb3V0LTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3hfaW5jW2ldICAgPSAodTMyX3dpZHRoX2luICogMHgxMDAwMCkgLyAodTMyX3dpZHRoX291dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0LiovCi0gICAgICAgICAgICAgICAgaWYgKHUzMl9oZWlnaHRfb3V0ID49IHUzMl9oZWlnaHRfaW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfaW5jW2ldICAgPSAoKHUzMl9oZWlnaHRfaW4gLSAxKSAqIDB4MTAwMDApIC8gKHUzMl9oZWlnaHRfb3V0LTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfaW5jW2ldID0gKHUzMl9oZWlnaHRfaW4gKiAweDEwMDAwKSAvICh1MzJfaGVpZ2h0X291dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl95X2FjY3VtX3N0YXJ0LgotICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfaW5jW2ldID49IDB4MTAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgMTYgaGlnaCBiaXRzIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IHBDLT51MzJfeV9pbmNbaV0gJiAweGZmZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IDB4MTAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV0gPj49IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKjwgVGFrZSBpbnRvIGFjY291bnQgdGhhdCBZIGNvb3JkaW5hdGUgY2FuIGJlIG9kZAotICAgICAgICAgICAgICAgICAgICBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBwdXQgYSAwLjUgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgIGZvciBVIGFuZCBWIHBsYW5lIGFzIHRoZXJlIGEgMiB0aW1lcyBzdWItc2FtcGxlZCB2cyBZKi8KLSAgICAgICAgICAgICAgICBpZigocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3kmMHgxKSYmKChpPT0xKXx8KGk9PTIpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXSArPSAweDgwMDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeF9hY2N1bV9zdGFydC4KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuCi0gICAgICAgICAgICAgICAgICAgIDAgYW5kIDAuNQotICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICBpZiAocEMtPnUzMl94X2luY1tpXSA+PSAweDEwMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gcEMtPnUzMl94X2luY1tpXSAmIDB4ZmZmZjsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gMHgxMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bV9zdGFydFtpXSA+Pj0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqPCBUYWtlIGludG8gYWNjb3VudCB0aGF0IFggY29vcmRpbmF0ZSBjYW4gYmUgb2RkCi0gICAgICAgICAgICAgICAgICAgIGluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHB1dCBhIDAuNSBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgZm9yIFUgYW5kIFYgcGxhbmUgYXMgdGhlcmUgYSAyIHRpbWVzIHN1Yi1zYW1wbGVkIHZzIFkqLwotICAgICAgICAgICAgICAgIGlmKChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feCYweDEpJiYoKGk9PTEpfHwoaT09MikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldICs9IDB4ODAwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKio8IFJlc2V0IHZhcmlhYmxlIHVzZWQgZm9yIHN0cmlwZSBtb2RlICovCi0gICAgcEMtPm1fcHJvY1Jvd3MgPSAwOwotCi0gICAgLyoqPCBJbml0aWFsaXplIHZhciBmb3IgWC9ZIHByb2Nlc3Npbmcgb3JkZXIgYWNjb3JkaW5nIHRvIG9yaWVudGF0aW9uICovCi0gICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfRkFMU0U7Ci0gICAgc3dpdGNoKHBQYXJhbXMtPm1fb3V0cHV0T3JpZW50YXRpb24pCi0gICAgewotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BSaWdodDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tTGVmdDoKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25MZWZ0VG9wOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0VG9wOgotICAgICAgICAgICAgcEMtPm1fYlJldmVydFhZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIHBDLT5tX2JGbGlwWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodEJvdHRvbToKLSAgICAgICAgICAgIHBDLT5tX2JSZXZlcnRYWSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBwQy0+bV9iRmxpcFggPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcEMtPm1fYkZsaXBZID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICBwQy0+bV9iUmV2ZXJ0WFkgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgcEMtPm1fYkZsaXBYID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICAvKio8IFVwZGF0ZSBzdGF0ZSAqLwotICAgIHBDLT5tX3N0YXRlID0gTTRBSVJfa0NvbmZpZ3VyZWQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRBSVJfZ2V0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00VklGSV9JbWFnZVBsYW5lKiBwSW4sIE00VklGSV9JbWFnZVBsYW5lKiBwT3V0KQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiB3aWxsIHByb3ZpZGUgdGhlIHJlcXVlc3RlZCByZXNpemVkIGFyZWEgb2YgaW50ZXJlc3QgYWNjb3JkaW5nIHRvCi0gKiAgICAgICAgICBzZXR0aW5ncyAgcHJvdmlkZWQgaW4gTTRBSVJfY29uZmlndXJlLgotICogQG5vdGUgICAgSW4gY2FzZSB0aGUgaW5wdXQgZm9ybWF0IHR5cGUgaXMgSlBFRywgaW5wdXQgcGxhbmUocykKLSAqICAgICAgICAgIGluIHBJbiBpcyBub3QgdXNlZC4gSW4gbm9ybWFsIG1vZGUsIGRpbWVuc2lvbiBzcGVjaWZpZWQgaW4gb3V0cHV0IHBsYW5lKHMpIHN0cnVjdHVyZQotICogICAgICAgICAgbXVzdCBiZSB0aGUgc2FtZSB0aGFuIHRoZSBvbmUgc3BlY2lmaWVkIGluIE00QUlSX2NvbmZpZ3VyZS4gSW4gc3RyaXBlIG1vZGUsIG9ubHkgdGhlCi0gKiAgICAgICAgICB3aWR0aCB3aWxsIGJlIHRoZSBzYW1lLCBoZWlnaHQgd2lsbCBiZSB0YWtlbiBhcyB0aGUgc3RyaXBlIGhlaWdodCAodHlwaWNhbGx5IDE2KS4KLSAqICAgICAgICAgIEluIG5vcm1hbCBtb2RlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGwgb25jZSB0byBnZXQgdGhlIGZ1bGwgb3V0cHV0IHBpY3R1cmUuCi0gKiAgICAgICAgICBJbiBzdHJpcGUgbW9kZSwgaXQgaXMgY2FsbGVkIGZvciBlYWNoIHN0cmlwZSB0aWxsIHRoZSB3aG9sZSBwaWN0dXJlIGhhcyBiZWVuCi0gKiAgICAgICAgICByZXRyaWV2ZWQsYW5kICB0aGUgcG9zaXRpb24gb2YgdGhlIG91dHB1dCBzdHJpcGUgaW4gdGhlIG91dHB1dCBwaWN0dXJlCi0gKiAgICAgICAgICBpcyBpbnRlcm5hbGx5IGluY3JlbWVudGVkIGF0IGVhY2ggc3RlcC4KLSAqICAgICAgICAgIEFueSBjYWxsIHRvIE00QUlSX2NvbmZpZ3VyZSBkdXJpbmcgc3RyaXBlIHByb2Nlc3Mgd2lsbCByZXNldCB0aGlzIG9uZSB0byB0aGUKLSAqICAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgb3V0cHV0IHBpY3R1cmUuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgIChJTikgQ29udGV4dCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UKLSAqIEBwYXJhbSAgICBwSW46ICAgICAgICAgICAgKElOKSBQbGFuZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbnB1dCBQbGFuZShzKS4KLSAqIEBwYXJhbSAgICBwT3V0OiAgICAgICAgKElOL09VVCkgIFBsYW5lIHN0cnVjdHVyZSBjb250YWluaW5nIG91dHB1dCBQbGFuZShzKS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IE5vIG1vcmUgbWVtb3J5IHNwYWNlIHRvIGFkZCBhIG5ldyBlZmZlY3QuCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNEFJUl9nZXQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbiwgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXQpCi17Ci0gICAgTTRBSVJfSW50ZXJuYWxDb250ZXh0KiBwQyA9IChNNEFJUl9JbnRlcm5hbENvbnRleHQqKXBDb250ZXh0IDsKLSAgICBNNE9TQV9VSW50MzIgaSxqLGssdTMyX3hfZnJhYyx1MzJfeV9mcmFjLHUzMl94X2FjY3VtLHUzMl95X2FjY3VtLHUzMl9zaGlmdDsKLSAgICAgICAgTTRPU0FfVUludDggICAgKnB1OF9kYXRhX2luLCAqcHU4X2RhdGFfaW5fb3JnLCAqcHU4X2RhdGFfaW5fdG1wLCAqcHU4X2RhdGFfb3V0OwotICAgICAgICBNNE9TQV9VSW50OCAgICAqcHU4X3NyY190b3A7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICAgICpwdThfc3JjX2JvdHRvbTsKLSAgICBNNE9TQV9VSW50MzIgICAgdTMyX3RlbXBfdmFsdWU7Ci0gICAgTTRPU0FfSW50MzIgICAgaTMyX3RtcF9vZmZzZXQ7Ci0gICAgTTRPU0FfVUludDMyICAgIG5iX3BsYW5lczsKLQotCi0KLSAgICBNNEVSUl9DSEVDS19OVUxMX1JFVFVSTl9WQUxVRShNNEVSUl9QQVJBTUVURVIsIHBDb250ZXh0KSA7Ci0KLSAgICAvKio8IENoZWNrIHN0YXRlICovCi0gICAgaWYoTTRBSVJfa0NvbmZpZ3VyZWQgIT0gcEMtPm1fc3RhdGUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgaWYoTTRBSVJfa1lVVjQyMEFQID09IHBDLT5tX2lucHV0Rm9ybWF0KQotICAgIHsKLSAgICAgICAgbmJfcGxhbmVzID0gNDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbmJfcGxhbmVzID0gMzsKLSAgICB9Ci0KLSAgICAvKio8IExvb3Agb24gZWFjaCBQbGFuZSAqLwotICAgIGZvcihpPTA7aTxuYl9wbGFuZXM7aSsrKQotICAgIHsKLQotICAgICAgICAgLyogU2V0IHRoZSB3b3JraW5nIHBvaW50ZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0L291dHB1dCBkYXRhIGZpZWxkICovCi0KLSAgICAgICAgdTMyX3NoaWZ0ID0gKChpPT0wKXx8KGk9PTMpKT8wOjE7IC8qKjwgRGVwZW5kIG9uIEx1bWEgb3IgQ2hyb21hICovCi0KLSAgICAgICAgaWYoKE00T1NBX0ZBTFNFID09IHBDLT5tX3BhcmFtcy5tX2JPdXRwdXRTdHJpcGUpXAotICAgICAgICAgICAgfHwoKE00T1NBX1RSVUUgPT0gcEMtPm1fcGFyYW1zLm1fYk91dHB1dFN0cmlwZSkmJigwID09IHBDLT5tX3Byb2NSb3dzKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKjwgRm9yIGlucHV0LCB0YWtlIGNhcmUgYWJvdXQgUk9JICovCi0gICAgICAgICAgICBwdThfZGF0YV9pbiAgICAgPSBwSW5baV0ucGFjX2RhdGEgKyBwSW5baV0udV90b3BsZWZ0IFwKLSAgICAgICAgICAgICAgICArIChwQy0+bV9wYXJhbXMubV9pbnB1dENvb3JkLm1feD4+dTMyX3NoaWZ0KQotICAgICAgICAgICAgICAgICAgICAgICAgKyAocEMtPm1fcGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPj4gdTMyX3NoaWZ0KSAqIHBJbltpXS51X3N0cmlkZTsKLQotICAgICAgICAgICAgLyoqIEdvIGF0IGVuZCBvZiBsaW5lL2NvbHVtbiBpbiBjYXNlIFgvWSBzY2FubmluZyBpcyBmbGlwcGVkICovCi0gICAgICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+dTMyX3NoaWZ0KSAtMSA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX2JGbGlwWSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSAoKHBDLT5tX3BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+dTMyX3NoaWZ0KSAtMSlcCi0gICAgICAgICAgICAgICAgICAgICAqIHBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqPCBJbml0aWFsaXplIGFjY3VtdWxhdG9ycyBpbiBjYXNlIHdlIGFyZSB1c2luZyBpdCAoYmlsaW5lYXIgaW50ZXJwb2xhdGlvbikgKi8KLSAgICAgICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+bV9iT25seUNvcHkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldID0gcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldOwotICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSA9IHBDLT51MzJfeV9hY2N1bV9zdGFydFtpXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoqPCBJbiBjYXNlIG9mIHN0cmlwZSBtb2RlIGZvciBvdGhlciB0aGFuIGZpcnN0IHN0cmlwZSwgd2UgbmVlZCB0byByZWNvdmVyIGlucHV0Ci0gICAgICAgICAgICAgICAgIHBvaW50ZXIgZnJvbSBpbnRlcm5hbCBjb250ZXh0ICovCi0gICAgICAgICAgICBwdThfZGF0YV9pbiA9IHBDLT5wdThfZGF0YV9pbltpXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgSW4gZXZlcnkgbW9kZSwgb3V0cHV0IGRhdGEgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBwbGFuZSAqLwotICAgICAgICBwdThfZGF0YV9vdXQgICAgPSBwT3V0W2ldLnBhY19kYXRhICsgcE91dFtpXS51X3RvcGxlZnQ7Ci0KLSAgICAgICAgLyoqPCBJbml0aWFsaXplIGlucHV0IG9mZnNldCBhcHBsaWVkIGFmdGVyIGVhY2ggcGl4ZWwgKi8KLSAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fYkZsaXBZKQotICAgICAgICB7Ci0gICAgICAgICAgICBpMzJfdG1wX29mZnNldCA9IHBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkzMl90bXBfb2Zmc2V0ID0gLXBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgSW4gdGhpcyBjYXNlLCBubyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGlzIG5lZWRlZCBhcyBpbnB1dCBhbmQgb3V0cHV0IGRpbWVuc2lvbnMKLSAgICAgICAgICAgIGFyZSB0aGUgc2FtZSAqLwotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+bV9iT25seUNvcHkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKjwgTm8gKy05MLAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKio8IE5vIGZsaXAgb24gWCBhYnNjaXNzYSAqLwotICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29weSBvbmUgd2hvbGUgbGluZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcHU4X2RhdGFfb3V0LCAodm9pZCAqKXB1OF9kYXRhX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0W2ldLnVfd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9iRmxpcFkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKz0gcEluW2ldLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luIC09IHBJbltpXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBwaXhlbCBvZiAxIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKnB1OF9kYXRhX2luLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gKHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiArPSBwT3V0W2ldLnVfd2lkdGggKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqPCBIZXJlIHdlIGhhdmUgYSArLTkwsCByb3RhdGlvbiAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fdG1wID0gcHU4X2RhdGFfaW47Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggcGl4ZWwgb2YgMSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9ICpwdThfZGF0YV9pbl90bXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIGlucHV0IHBvaW50ZXIgaW4gb3JkZXIgdG8gZ28gdG8gbmV4dC9wYXN0IGxpbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luX3RtcCArPSBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSAocE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiAtLTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKio8IEJpbGluZWFyIGludGVycG9sYXRpb24gKi8KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0KLSAgICAgICAgaWYoMyAhPSBpKSAgICAvKio8IG90aGVyIHRoYW4gYWxwaGEgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqTm8gKy05MLAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9IChwQy0+dTMyX3lfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgaG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtID0gcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldOwotCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAodTMyX3hfYWNjdW0gPj4gMTYpKSAtMSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMF0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHBDLT51MzJfeF9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9mcmFjID0gKHUzMl94X2FjY3VtID4+IDEyKSYxNTsgLyogRnJhY3Rpb24gb2YgSG9yaXpvbnRhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAodTMyX3hfYWNjdW0gPj4gMTYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gcEMtPnUzMl94X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9vdXQgKz0gcE91dFtpXS51X3N0cmlkZSAtIHBPdXRbaV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT51MzJfeV9hY2N1bVtpXT4+MTYpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl95X2FjY3VtW2ldID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+dTMyX3lfYWNjdW1baV0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAvKiogKy05MLAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdThfZGF0YV9pbl9vcmcgPSBwdThfZGF0YV9pbjsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3Ioaj0wO2o8cE91dFtpXS51X2hlaWdodDtqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBob3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9IChwQy0+dTMyX3hfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSBwQy0+dTMyX3lfYWNjdW1fc3RhcnRbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9mcmFjID0gKHUzMl95X2FjY3VtID4+IDEyKSYxNTsgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IChwdThfZGF0YV9pbiAtIChwQy0+dTMyX3hfYWNjdW1baV0gPj4gMTYpKSAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVswXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bSA+PiAxMikmMTU7IC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gcHU4X2RhdGFfaW4gKyAocEMtPnUzMl94X2FjY3VtW2ldID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3BbMV0qdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tWzFdKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gKz0gcEMtPnUzMl95X2luY1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MzJfeV9hY2N1bT4+MTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqIGkzMl90bXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl94X2FjY3VtW2ldICs9IHBDLT51MzJfeF9pbmNbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbl9vcmc7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LyoqIDMgIT0gaSAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgLyoqTm8gKy05MLAgcm90YXRpb24gKi8KLSAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIHJvdyAqLwotICAgICAgICAgICAgICAgIGZvcihqPTA7ajxwT3V0W2ldLnVfaGVpZ2h0O2orKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9IChwQy0+dTMyX3lfYWNjdW1baV0+PjEyKSYxNTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBSZWluaXQgaG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtID0gcEMtPnUzMl94X2FjY3VtX3N0YXJ0W2ldOwotCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSAgcEMtPm1fYkZsaXBYKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGs9MDtrPHBPdXRbaV0udV93aWR0aDtrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBGcmFjdGlvbiBvZiBIb3Jpem9udGFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wID0gKHB1OF9kYXRhX2luIC0gKHUzMl94X2FjY3VtID4+IDE2KSkgLTEgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyBpMzJfdG1wX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzBdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdThfc3JjX2JvdHRvbVsxXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZT0gKHUzMl90ZW1wX3ZhbHVlID4+IDcpKjB4ZmY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSBwQy0+dTMyX3hfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9vcCBvbiBlYWNoIG91dHB1dCBwaXhlbCBpbiBhIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEZyYWN0aW9uIG9mIEhvcml6b250YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKHB1OF9zcmNfdG9wWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFsxXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzBdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlPSAodTMyX3RlbXBfdmFsdWUgPj4gNykqMHhmZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSAoTTRWSUZJX1VJbnQ4KXUzMl90ZW1wX3ZhbHVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtICs9IHBDLT51MzJfeF9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfb3V0ICs9IHBPdXRbaV0udV9zdHJpZGUgLSBwT3V0W2ldLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeV9hY2N1bVtpXSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgIGlmIChwQy0+dTMyX3lfYWNjdW1baV0+PjE2KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdThfZGF0YV9pbiA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeV9hY2N1bVtpXSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnUzMl95X2FjY3VtW2ldICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSAvKio8IE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSAqLwotICAgICAgICAgICAgLyoqICstOTCwIHJvdGF0aW9uICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHU4X2RhdGFfaW5fb3JnID0gcHU4X2RhdGFfaW47Ci0KLSAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcm93ICovCi0gICAgICAgICAgICAgICAgZm9yKGo9MDtqPHBPdXRbaV0udV9oZWlnaHQ7aisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogaG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAocEMtPnUzMl94X2FjY3VtW2ldPj4xMikmMTU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtID0gcEMtPnUzMl95X2FjY3VtX3N0YXJ0W2ldOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX1RSVUUgPT0gIHBDLT5tX2JGbGlwWCkKLSAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb3Agb24gZWFjaCBvdXRwdXQgcGl4ZWwgaW4gYSByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrPTA7azxwT3V0W2ldLnVfd2lkdGg7aysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfZnJhYyA9ICh1MzJfeV9hY2N1bSA+PiAxMikmMTU7IC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY190b3AgPSAocHU4X2RhdGFfaW4gLSAocEMtPnUzMl94X2FjY3VtW2ldID4+IDE2KSkgLSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b20gPSBwdThfc3JjX3RvcCArIGkzMl90bXBfb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgocHU4X3NyY190b3BbMV0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcFswXSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1OF9zcmNfYm90dG9tWzFdKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X3NyY19ib3R0b21bMF0qdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlPSAodTMyX3RlbXBfdmFsdWUgPj4gNykqMHhmZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IChNNFZJRklfVUludDgpdTMyX3RlbXBfdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdmVydGljYWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSArPSBwQy0+dTMyX3lfaW5jW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogaTMyX3RtcF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gJj0gMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMb29wIG9uIGVhY2ggb3V0cHV0IHBpeGVsIGluIGEgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaz0wO2s8cE91dFtpXS51X3dpZHRoO2srKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0gPj4gMTIpJjE1OyAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHBDLT51MzJfeF9hY2N1bVtpXSA+PiAxNik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbSA9IHB1OF9zcmNfdG9wICsgaTMyX3RtcF9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl90ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChwdThfc3JjX3RvcFswXSooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1OF9zcmNfdG9wWzFdKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHU4X3NyY19ib3R0b21bMF0qKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdThfc3JjX2JvdHRvbVsxXSp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyX3RlbXBfdmFsdWU9ICh1MzJfdGVtcF92YWx1ZSA+PiA3KSoweGZmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gKE00VklGSV9VSW50OCl1MzJfdGVtcF92YWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB2ZXJ0aWNhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMl95X2FjY3VtICs9IHBDLT51MzJfeV9pbmNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHU4X2RhdGFfaW4gPSBwdThfZGF0YV9pbiArICh1MzJfeV9hY2N1bSA+PiAxNikgKiBpMzJfdG1wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX291dCArPSBwT3V0W2ldLnVfc3RyaWRlIC0gcE91dFtpXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBob3Jpem9udGFsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT51MzJfeF9hY2N1bVtpXSArPSBwQy0+dTMyX3hfaW5jW2ldOwotCi0gICAgICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW5fb3JnOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gLyoqPCBNNE9TQV9UUlVFID09IHBDLT5tX2JSZXZlcnRYWSAqLwotICAgICAgICB9LyoqIDMgPT0gaSAqLwotICAgICAgICAgICAgfQotICAgICAgICAvKio8IEluIGNhc2Ugb2Ygc3RyaXBlIG1vZGUsIHNhdmUgY3VycmVudCBpbnB1dCBwb2ludGVyICovCi0gICAgICAgIGlmKE00T1NBX1RSVUUgPT0gcEMtPm1fcGFyYW1zLm1fYk91dHB1dFN0cmlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnB1OF9kYXRhX2luW2ldID0gcHU4X2RhdGFfaW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKio8IFVwZGF0ZSBudW1iZXIgb2YgcHJvY2Vzc2VkIHJvd3MsIHJlc2V0IGl0IGlmIHdlIGhhdmUgZmluaXNoZWQKLSAgICAgICAgIHdpdGggdGhlIHdob2xlIHByb2Nlc3NpbmcgKi8KLSAgICBwQy0+bV9wcm9jUm93cyArPSBwT3V0WzBdLnVfaGVpZ2h0OwotICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX2JSZXZlcnRYWSkKLSAgICB7Ci0gICAgICAgIGlmKHBDLT5tX3BhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPD0gcEMtPm1fcHJvY1Jvd3MpICAgIHBDLT5tX3Byb2NSb3dzID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYocEMtPm1fcGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoIDw9IHBDLT5tX3Byb2NSb3dzKSAgICBwQy0+bV9wcm9jUm93cyA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotCi19Ci0KLQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QU1SUl9Db3JlUmVhZGVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000QU1SUl9Db3JlUmVhZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzMGY5ZGMuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNEFNUlJfQ29yZVJlYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNEFNUlJfQ29yZVJlYWRlci5jCi0gKiBAYnJpZWYgICAgICAgSW1wbGVtZW50YXRpb24gb2YgQU1SIHBhcnNlcgotICogQG5vdGUgICAgICAgIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQVBJIEltcGxlbWVudGF0aW9uIGZvcgotICogICAgICAgICAgICAgIEFNUiBQYXJzZXIuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2luY2x1ZGUgIk00QU1SUl9Db3JlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNYXhpbXVtIGJpdHJhdGUgcGVyIGFtciB0eXBlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNEFNUlJfTkJfTUFYX0JJVF9SQVRFICAgIDEyMjAwCi0jZGVmaW5lIE00QU1SUl9XQl9NQVhfQklUX1JBVEUgICAgMjM4NTAKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBBTVIgcmVhZGVyIGNvbnRleHQgSUQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00QU1SUl9DT05URVhUSUQgICAgMHg0MTRkNTI1MgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEFuIEFNUiBmcmFtZSBpcyAyMG1zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2RlZmluZSBNNEFNUlJfRlJBTUVfTEVOR1RIICAgICAyMAotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEZvciB0aGUgc2VlaywgdGhlIGZpbGUgaXMgc3BsaXR0ZWQgaW4gNDAgc2VnbWVudHMgZm9yIGZhc3RlciBzZWFyY2gKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lICAgIE00QU1SUl9OVU1fU0VFS19FTlRSSUVTIDQwCi0KLSNkZWZpbmUgTTRBTVJSX05CX1NBTVBMRV9GUkVRVUVOQ1kgODAwMCAgICAgICAgLyoqPCBOYXJyb3cgYmFuZCBzYW1wbGluZyByYXRlICovCi0jZGVmaW5lIE00QU1SUl9XQl9TQU1QTEVfRlJFUVVFTkNZIDE2MDAwICAgIC8qKjwgV2lkZSBiYW5kIHNhbXBsaW5nIHJhdGUgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBBTVIgcmVhZGVyIHZlcnNpb24gbnVtYmVycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSNkZWZpbmUgTTRBTVJSX1ZFUlNJT05fTUFKT1IgMQotI2RlZmluZSBNNEFNUlJfVkVSU0lPTl9NSU5PUiAxMQotI2RlZmluZSBNNEFNUlJfVkVSU0lPTl9SRVZJU0lPTiAzCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00X0FNUlJfQ29udGV4dAotICogQGJyaWVmICAgICAgICBJbnRlcm5hbCBBTVIgcmVhZGVyIGNvbnRleHQgc3RydWN0dXJlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgbV9jb250ZXh0SWQgOyAgICAgIC8qIEZpeGVkIElkLiB0byBjaGVjayBmb3IgdmFsaWQgQ29udGV4dCovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgIG1fcE9zYUZpbGVQdHJGY3Q7ICAvKiBGaWxlIGZ1bmN0aW9uIHBvaW50ZXIgKi8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogbV9wU3RyZWFtSGFuZGxlcjsgIC8qIFN0cmVhbSBEZXNjcmlwdGlvbiAqLwotICAgIE00T1NBX1VJbnQzMiogICAgICAgICAgICBtX3BTZWVrSW5kZXg7ICAgICAgLyogU2VlayBJbmRleCBUYWJsZSAqLwotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgICBtX3NlZWtJbnRlcnZhbDsgICAgLyogU3RvcmVzIHRoZSBzZWVrIEludGVydmFsIHN0b3JlZCBpbiB0aGUgSW5kZXggKi8KLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgbV9tYXhBdVNpemU7ICAgICAgIC8qIFN0b3JlcyB0aGUgbWF4IEF1IFNpemUgKi8KLSAgICBNNE9TQV9NZW1BZGRyMzIgICAgICAgICAgbV9wZGF0YUFkZHJlc3M7ICAgIC8qIFBvaW50ZXIgdG8gc3RvcmUgQVUgZGF0YSAqLwotICAgIE00U1lTX1N0cmVhbVR5cGUgICAgICAgICBtX3N0cmVhbVR5cGU7ICAgICAgLyogU3RvcmVzIHRoZSBzdHJlYW0gdHlwZSBBTVIgTkIgb3IgV0IgKi8KLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICAgbV9wQU1SRmlsZTsgICAgICAgIC8qIERhdGEgc3RvcmFnZSAqLwotICAgIE00QU1SUl9TdGF0ZSAgICAgICAgICAgICBtX3N0YXR1czsgICAgICAgICAgLyogQU1SIFJlYWRlciBTdGF0dXMgKi8KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgbV9zdHJ1Y3RTaXplOyAgICAgIC8qIHNpemUgb2Ygc3RydWN0dXJlKi8KLX0gTTRfQU1SUl9Db250ZXh0OwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFBhcnNlciBpbnRlcm5hbCBmdW5jdGlvbnMsIG5vdCB1c2FibGUgZnJvbSBvdXRzaWRlIHRoZSByZWFkZXIgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX1VJbnQzMiAgICBNNEFNUlJfZ2V0QXVTaXplKE00T1NBX1VJbnQzMiBmcmFtZVR5cGUsICBNNFNZU19TdHJlYW1UeXBlIHN0cmVhbVR5cGUpOwotTTRPU0FfVUludDMyICAgIE00QU1SUl9nZXRCaXRyYXRlKE00T1NBX1VJbnQzMiBmcmFtZVR5cGUsICBNNFNZU19TdHJlYW1UeXBlIHN0cmVhbVR5cGUpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1VJbnQzMiAgICBNNEFNUlJfZ2V0QXVTaXplKE00T1NBX1VJbnQzMiBmcmFtZVR5cGUsICBNNFNZU19TdHJlYW1UeXBlIHN0cmVhbVR5cGUpCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgZnVuY3Rpb24gdG8gdGhlIEFNUiBQYXJzZXIsIHJldHVybnMgdGhlIEFVIHNpemUgb2YgdGhlIEZyYW1lCi0gKiBAbm90ZSAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgc3RyZWFtIHR5cGUgYW5kIHRoZSBmcmFtZXR5cGUgYW5kIHJldHVybnMgdGhlCi0gKiAgICAgICAgICAgZnJhbWUgbGVuZ2h0Ci0gKiBAcGFyYW0gICAgZnJhbWVUeXBlKElOKSAgICA6IEFNUiBmcmFtZSB0eXBlCi0gKiBAcGFyYW0gICAgc3RyZWFtVHlwZShJTikgICAgOiBBTVIgc3RyZWFtIHR5cGUgTkIgb3IgV0IKLSAqIEByZXR1cm5zICBUaGUgZnJhbWUgc2l6ZSBiYXNlZCBvbiB0aGUgZnJhbWUgdHlwZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfVUludDMyICAgIE00QU1SUl9nZXRBdVNpemUoTTRPU0FfVUludDMyIGZyYW1lVHlwZSwgIE00U1lTX1N0cmVhbVR5cGUgc3RyZWFtVHlwZSkKLXsKLSAgICBjb25zdCBNNE9TQV9VSW50MzIgICAgTTRBTVJSX05CX0FVU0laRVtdPXsxMywxNCwxNiwxOCwyMCwyMSwyNywzMiw2LDYsNn07Ci0gICAgY29uc3QgTTRPU0FfVUludDMyICAgIE00QU1SUl9XQl9BVVNJWkVbXT17MTgsMjQsMzMsMzcsNDEsNDcsNTEsNTksNjEsNn07Ci0KLSAgICBpZiAoIHN0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00QU1SUl9OQl9BVVNJWkVbZnJhbWVUeXBlXTsKLSAgICB9Ci0gICAgZWxzZSAvKiBNNFNZU19rQU1SX1dCICovCi0gICAgewotICAgICAgICAgICAgcmV0dXJuIE00QU1SUl9XQl9BVVNJWkVbZnJhbWVUeXBlXTsKLSAgICB9Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVUludDMyICAgIE00QU1SUl9nZXRCaXRyYXRlKE00T1NBX1VJbnQzMiBmcmFtZVR5cGUsICBNNFNZU19TdHJlYW1UeXBlIHN0cmVhbVR5cGUpCi0gKiBAYnJpZWYgICAgSW50ZXJuYWwgZnVuY3Rpb24gdG8gdGhlIEFNUiBQYXJzZXIsIHJldHVybnMgdGhlIEJpdCByYXRlIG9mIHRoZSBGcmFtZQotICogQG5vdGUgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHN0cmVhbSB0eXBlIGFuZCB0aGUgZnJhbWV0eXBlIGFuZCByZXR1cm5zIHRoZQotICogICAgICAgICAgIGJpdCByYXRlIGZvciB0aGUgZ2l2ZW4gZnJhbWUuCi0gKiBAcGFyYW0gICAgZnJhbWVUeXBlKElOKSAgICA6IEFNUiBmcmFtZSB0eXBlCi0gKiBAcGFyYW0gICAgc3RyZWFtVHlwZShJTikgICAgOiBBTVIgc3RyZWFtIHR5cGUgTkIgb3IgV0IKLSAqIEByZXR1cm5zICBUaGUgZnJhbWUncyBiaXQgcmF0ZSBiYXNlZCBvbiB0aGUgZnJhbWUgdHlwZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfVUludDMyICAgIE00QU1SUl9nZXRCaXRyYXRlKE00T1NBX1VJbnQzMiBmcmFtZVR5cGUsICBNNFNZU19TdHJlYW1UeXBlIHN0cmVhbVR5cGUpCi17Ci0gICAgY29uc3QgTTRPU0FfVUludDMyICAgIE00QU1SUl9OQl9CSVRSQVRFW109Ci0gICAgICAgIHs0NzUwLDUxNTAsNTkwMCw2NzAwLDc0MDAsNzk1MCwxMDIwMCwxMjIwMCwxMjIwMCwxMjIwMCwxMjIwMH07Ci0gICAgY29uc3QgTTRPU0FfVUludDMyICAgIE00QU1SUl9XQl9CSVRSQVRFW109Ci0gICAgICAgIHs2NjAwLDg4NTAsMTI2NTAsMTQyNTAsMTU4NTAsMTgyNTAsMTk4NTAsMjMwNTAsMjM4NTAsMTIyMDB9OwotCi0gICAgaWYgKCBzdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKQotICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEFNUlJfTkJfQklUUkFURVtmcmFtZVR5cGVdOwotICAgIH0KLSAgICBlbHNlIC8qIE00U1lTX2tBTVJfV0IgKi8KLSAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRBTVJSX1dCX0JJVFJBVEVbZnJhbWVUeXBlXTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX29wZW5SZWFkKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlRnVuY3Rpb24pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogICAgcFN0cmVhbUNvbnRleHQ7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBmaWxlUG9zOwotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00RVJSX0ZJTEVfTk9UX0ZPVU5EIDsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZSA7Ci0gICAgTTRPU0FfVUludDMyIGRhdGEgOwotICAgIE00T1NBX0NoYXIgKk00X1Rva2VuOwotICAgIE00T1NBX1VJbnQzMiAqdG9rZW5QdHI7Ci0KLSAgICAvKiBIZWFkZXIgZm9yIEFNUiBOQiAqLwotICAgIE00T1NBX1VJbnQzMiBNNF9BTVJfMSAgICAgICA9IDB4NGQ0MTIxMjM7Ci0gICAgTTRPU0FfVUludDMyIE00X0FNUl9OQl8yICAgID0gMHgwMDAwMGE1MjsKLQotICAgIC8qIEhlYWRlciBmb3IgQU1SIFdCICovCi0gICAgTTRPU0FfVUludDMyIE00X0FNUl9XQl8yICAgID0gMHg0MjU3MmQ1MjsKLSAgICBNNE9TQV9VSW50MzIgTTRfQU1SX1dCXzMgICAgPSAweDAwMDAwMDBhOwotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZURlc2NyaXB0b3IpLE00RVJSX1BBUkFNRVRFUiwiRmlsZSBEZXNjLiBNNE9TQV9OVUxMIik7Ci0KLSAgICBNNF9Ub2tlbiA9IChNNE9TQV9DaGFyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX01lbUFkZHIzMikqMywgTTRBTVJfUkVBREVSLAotICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSgiTTRfVG9rZW4iKSk7Ci0gICAgaWYoTTRPU0FfTlVMTCA9PSBNNF9Ub2tlbikKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMygoTTRPU0FfTlVMTCA9PSBNNF9Ub2tlbiksTTRFUlJfQUxMT0MsIk1lbSBBbGxvYyBmYWlsZWQgLSBNNF9Ub2tlbiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0MgOwotICAgIH0KLQotICAgIHBTdHJlYW1Db250ZXh0PSAoTTRfQU1SUl9Db250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00X0FNUlJfQ29udGV4dCksIE00QU1SX1JFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopKCJwU3RyZWFtQ29udGV4dCIpKTsKLSAgICBpZihNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0KQotICAgIHsKLSAgICAgICAgZnJlZShNNF9Ub2tlbik7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0MgOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgdGhlIGNvbnRleHQgKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgPSBNNEFNUlJfQ09OVEVYVElEOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0cnVjdFNpemU9c2l6ZW9mKE00X0FNUlJfQ29udGV4dCk7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3Q9cEZpbGVGdW5jdGlvbiA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIgPSBNNE9TQV9OVUxMIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSA9IE00T1NBX05VTEwgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rT3BlbmluZyA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleCA9IE00T1NBX05VTEwgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCA9IDA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplID0gMCA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBlcnI9cFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPm9wZW5SZWFkKCZwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgKE00T1NBX0NoYXIqKXBGaWxlRGVzY3JpcHRvcixNNE9TQV9rRmlsZVJlYWQgKTsKLSAgICBpZiAoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICB7Ci0gICAgICAgIC8qIE00T1NBX0RFQlVHX0lGMygoZXJyICE9IE00Tk9fRVJST1IpLGVyciwiRmlsZSBvcGVuIGZhaWxlZCIpOyAqLwotICAgICAgICBmcmVlKHBTdHJlYW1Db250ZXh0KTsKLSAgICAgICAgZnJlZShNNF9Ub2tlbik7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotICAgICAgICByZXR1cm4gZXJyIDsKLSAgICB9Ci0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgPSBNNEFNUlJfa09wZW5pbmcgOwotCi0gICAgc2l6ZSA9IDY7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnJlYWREYXRhKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClNNF9Ub2tlbiwgJnNpemUpOwotICAgIGlmKHNpemUgIT0gNikKLSAgICB7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICB0b2tlblB0ciA9IChNNE9TQV9VSW50MzIqKU00X1Rva2VuIDsKLSAgICAvKiBDaGVjayBmb3IgdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIGhlYWRlciBjb21tb24gdG8gV0IgYW5kIE5CKi8KLSAgICBpZiAoKnRva2VuUHRyICE9IE00X0FNUl8xKQotICAgIHsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIHRva2VuUHRyKys7Ci0gICAgZGF0YSA9ICp0b2tlblB0ciAmIDB4MDAwMEZGRkYgOwotICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IHBhcnQgaXMgTmFycm93IGJhbmQgaGVhZGVyICovCi0gICAgaWYgKGRhdGEhPSBNNF9BTVJfTkJfMikKLSAgICB7Ci0gICAgICAgIC8qIFN0cmVhbSBpcyBBTVIgV2lkZSBCYW5kICovCi0gICAgICAgIGZpbGVQb3MgPSA0OwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtCZWdpbm5pbmcsICZmaWxlUG9zKTsKLSAgICAgICAgc2l6ZSA9IDU7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRfVG9rZW4sICZzaXplKTsKLSAgICAgICAgaWYoc2l6ZSAhPSA1KQotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB0b2tlblB0cj0oTTRPU0FfVUludDMyKilNNF9Ub2tlbjsKLSAgICAgICAgLyogQ2hlY2sgZm9yIHRoZSBXaWRlIGJhbmQgaGFkZXIgKi8KLSAgICAgICAgaWYoKnRva2VuUHRyIT0gTTRfQU1SX1dCXzIpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIHRva2VuUHRyKys7Ci0gICAgICAgIGRhdGEgPSAqdG9rZW5QdHIgJiAweDAwMDAwMEZGIDsKLSAgICAgICAgaWYoZGF0YSE9IE00X0FNUl9XQl8zKQotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID0gTTRTWVNfa0FNUl9XQiA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFN0cmVhbSBpcyBhIE5hcnJvdyBiYW5kIHN0cmVhbSAqLwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID0gTTRTWVNfa0FNUiA7Ci0gICAgfQotICAgIC8qICBObyBQcm9maWxlIGxldmVsIGRlZmluZWQgKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgPSBNNEFNUlJfa09wZW5lZDsKLQotICAgIGZyZWUoTTRfVG9rZW4pOwotICAgICpwQ29udGV4dCA9IHBTdHJlYW1Db250ZXh0IDsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLQotY2xlYW51cDoKLQotICAgIGlmKE00T1NBX05VTEwgIT0gcFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUpCi0gICAgewotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+Y2xvc2VSZWFkKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlKTsKLSAgICB9Ci0KLSAgICBmcmVlKE00X1Rva2VuKTsKLSAgICBmcmVlKHBTdHJlYW1Db250ZXh0KTsKLQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEwgOwotCi0gICAgcmV0dXJuIChNNE9TQV9FUlIpTTRFUlJfQU1SX05PVF9DT01QTElBTlQ7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKiBwU3RyZWFtRGVzYyApCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogICAgcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9DaGFyICAgICAgICAgICAgZnJhbWVIZWFkZXIsIGZyYW1lVHlwZSA7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICBzaXplLCBhdUNvdW50PTA7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBmaWxlUG9zOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTdHJlYW1EZXNjKSxNNEVSUl9QQVJBTUVURVIsIlN0cmVhbSBEZXNjLiBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKCBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgIT0gTTRBTVJSX2tPcGVuZWQpLCBNNEVSUl9TVEFURSwgIkludmFsaWQgU3RhdGUiKTsKLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNIDsKLSAgICB9Ci0KLSAgICBzaXplID0gMTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+cmVhZERhdGEocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAoTTRPU0FfTWVtQWRkcjgpJmZyYW1lSGVhZGVyLCAmc2l6ZSk7Ci0KLSAgICAvKiBYRkZGIEZYWFggLT4gRiBpcyB0aGUgRnJhbWUgdHlwZSAqLwotICAgIGZyYW1lVHlwZSA9ICggZnJhbWVIZWFkZXIgJiAweDc4ICkgPj4gMyA7Ci0KLSAgICBpZiAoIGZyYW1lVHlwZSA9PSAxNSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfTk9fREFUQV9ZRVQgOwotICAgIH0KLQotICAgIGlmICgoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApICYmICggZnJhbWVUeXBlID4gMTEgKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FNUl9JTlZBTElEX0ZSQU1FX1RZUEU7Ci0gICAgfQotCi0gICAgaWYgKCggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SX1dCICkgJiYgKCBmcmFtZVR5cGUgPiA5ICkpCi0gICAgewotICAgICAgICByZXR1cm4gKE00T1NBX0VSUilNNEVSUl9BTVJfSU5WQUxJRF9GUkFNRV9UWVBFOwotICAgIH0KLQotICAgIC8qIEF2ZXJhZ2UgYml0IHJhdGUgaXMgYXNzaWduZWQgdGhlIGJpdHJhdGUgb2YgdGhlIGZpcnN0IGZyYW1lICovCi0gICAgcFN0cmVhbURlc2MtPmF2ZXJhZ2VCaXRyYXRlID0gTTRBTVJSX2dldEJpdHJhdGUoZnJhbWVUeXBlLHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUpOwotCi0gICAgZmlsZVBvcyA9IC0xOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLCBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LAotICAgICAgICAgJmZpbGVQb3MpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwU3RyZWFtRGVzYyAqLwotICAgIHBTdHJlYW1EZXNjLT5wcm9maWxlTGV2ZWwgPSAweEZGIDsKLSAgICBwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwIDsKLSAgICBwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEwgOwotICAgIHBTdHJlYW1EZXNjLT5tYXhCaXRyYXRlID0gKHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0KLSAgICAgICAgTTRTWVNfa0FNUiApP000QU1SUl9OQl9NQVhfQklUX1JBVEU6TTRBTVJSX1dCX01BWF9CSVRfUkFURTsKLSAgICBwU3RyZWFtRGVzYy0+cHJvZmlsZUxldmVsID0gMHhGRiA7Ci0gICAgcFN0cmVhbURlc2MtPnN0cmVhbUlEID0gMTsKLSAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGU7Ci0KLSAgICAvKiBUaW1lc2NhbGUgZXF1YWxzIFNhbXBsaW5nIEZyZXF1ZW5jeTogTkItODAwMCBIeiwgV0ItMTYwMDAgSHogKi8KLSAgICBwU3RyZWFtRGVzYy0+dGltZVNjYWxlID0gKHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUiApPzgwMDA6MTYwMDA7Ci0gICAgcFN0cmVhbURlc2MtPmR1cmF0aW9uID0gTTRPU0FfVElNRV9VTktOT1dOOwotCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIgPQotICAgICAgICAgKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00U1lTX1N0cmVhbURlc2NyaXB0aW9uKSwKLSAgICAgICAgICAgICBNNEFNUl9SRUFERVIsIChNNE9TQV9DaGFyICopKCJwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlciIpKTsKLSAgICBpZihNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIENvcHkgdGhlIFN0cmVhbSBEZXNjLiBpbnRvIHRoZSBDb250ZXh0ICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmF2ZXJhZ2VCaXRyYXRlID0gcFN0cmVhbURlc2MtPmF2ZXJhZ2VCaXRyYXRlOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5kZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTCA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMCA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmR1cmF0aW9uID0gTTRPU0FfVElNRV9VTktOT1dOOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5wcm9maWxlTGV2ZWwgPSAweEZGIDsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+c3RyZWFtSUQgPSAxOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5zdHJlYW1UeXBlID0gcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgOwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT50aW1lU2NhbGUgPSBwU3RyZWFtRGVzYy0+dGltZVNjYWxlIDsKLQotICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgQWNjZXNzIFVuaXQgaW4gdGhlIEZpbGUgdG8gZ2V0IHRoZSAqLwotICAgIC8qIGR1cmF0aW9uIG9mIHRoZSBzdHJlYW0gPSAyMCBtcyAqIG51bWJlciBvZiBhY2Nlc3MgdW5pdCAqLwotICAgIHdoaWxlKDEpCi0gICAgewotICAgICAgICBzaXplID0gMTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnJlYWREYXRhKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkmZnJhbWVIZWFkZXIsICZzaXplKTsKLSAgICAgICAgaWYgKCBzaXplID09IDApCi0gICAgICAgICAgICBicmVhayA7Ci0gICAgICAgIGZyYW1lVHlwZSA9IChmcmFtZUhlYWRlciAmIDB4NzgpID4+IDMgOwotICAgICAgICAvKiBHZXQgdGhlIGZyYW1lIHNpemUgYW5kIHNraXAgc28gbWFueSBieXRlcyAqLwotICAgICAgICBpZihmcmFtZVR5cGUgIT0gMTUpewotICAgICAgICAgICAgLyogR0xBIDIwMDUwNjI4IHdoZW4gZnJhbWV0eXBlIGlzID4xMCB3ZSByZWFkIG92ZXIgYSB0YWJsZSAqLwotICAgICAgICAgICAgaWYoZnJhbWVUeXBlID4gMTApCi0gICAgICAgICAgICAgICAgY29udGludWUgOwotCi0gICAgICAgICAgICBzaXplID0gTTRBTVJSX2dldEF1U2l6ZShmcmFtZVR5cGUsIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUpOwotICAgICAgICAgICAgaWYoc2l6ZSA+IHBTdHJlYW1Db250ZXh0LT5tX21heEF1U2l6ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplID0gc2l6ZSA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaWxlUG9zID0gc2l6ZS0xOwotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsICZmaWxlUG9zKTsKLSAgICAgICAgICAgIGF1Q291bnQrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEVhY2ggRnJhbWUgaXMgMjAgbSBTZWMuICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXItPmR1cmF0aW9uID0gYXVDb3VudCAqIE00QU1SUl9GUkFNRV9MRU5HVEggOwotICAgIHBTdHJlYW1EZXNjLT5kdXJhdGlvbiA9IHBTdHJlYW1Db250ZXh0LT5tX3BTdHJlYW1IYW5kbGVyLT5kdXJhdGlvbiA7Ci0KLSAgICAvKiBQdXQgdGhlIGZpbGUgcG9pbnRlciBiYWNrIGF0IHRoZSBmaXJzdCBBY2Nlc3MgdW5pdCAqLwotICAgIGlmKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKQotICAgIHsKLSAgICAgICAgZmlsZVBvcyA9IDY7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJmZpbGVQb3MpOwotICAgIH0KLSAgICBpZiAoIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUgPT0gTTRTWVNfa0FNUl9XQiApCi0gICAgewotICAgICAgICBmaWxlUG9zID0gOTsKLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyk7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SIDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfc3RhcnRSZWFkaW5nKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRHMgKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgc2l6ZSA9IDAgOwotCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTdHJlYW1JRHMpLE00RVJSX1BBUkFNRVRFUiwiU3RyZWFtIElkcy4gTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFN0cmVhbUNvbnRleHQtPm1fY29udGV4dElkICE9IE00QU1SUl9DT05URVhUSUQpLE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgIkJhZCBDb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKCggcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzICE9IE00QU1SUl9rT3BlbmVkKSwgTTRFUlJfU1RBVEUsICJJbnZhbGlkIFN0YXRlIik7Ci0KLSAgICB3aGlsZSggcFN0cmVhbUlEc1tzaXplXSAhPSAwICkKLSAgICB7Ci0gICAgICAgIGlmKCBwU3RyZWFtSURzW3NpemUrK10gIT0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEIDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZGF0YSBBZGRyZXNzIGZvciB1c2UgaW4gTmV4dEFVKCkgKi8KLSAgICBpZihNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcykKLSAgICB7Ci0gICAgICAgIHNpemUgPSBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemUgOwotICAgICAgICAvKiBkYXRhQWRkcmVzcyBpcyBvd25lZCBieSBQYXJzZXIsIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgZGVsZXRlIG9yIGZyZWUgaXQgKi8KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzID0oTTRPU0FfTWVtQWRkcjMyKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplICsgKDQgLSBzaXplICUgNCksCi0gICAgICAgICAgICBNNEFNUl9SRUFERVIsIChNNE9TQV9DaGFyICopKCJwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MiKSk7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYzKChNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BkYXRhQWRkcmVzcyksTTRFUlJfQUxMT0MsCi0gICAgICAgICAgICAgICAgICAgICJNZW0gQWxsb2MgZmFpbGVkIC0gZGF0YUFkZHJlc3MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBTZXQgdGhlIHN0YXRlIG9mIGNvbnRleHQgdG8gUmVhZGluZyAqLwotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyA9IE00QU1SUl9rUmVhZGluZyA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfbmV4dEFVKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQgU3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBdSkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dD0oTTRfQU1SUl9Db250ZXh0KilDb250ZXh0OwotICAgIE00T1NBX0NoYXIgICAgICAgIGZyYW1lSGVhZGVyIDsKLSAgICBNNE9TQV9DaGFyICAgICAgICBmcmFtZVR5cGUgOwotICAgIE00T1NBX0ludDMyICAgICAgICBhdVNpemU7Ci0gICAgTTRPU0FfVUludDMyICAgIHNpemUgOwotICAgIE00T1NBX0ZpbGVQb3NpdGlvbiAgZmlsZVBvczsKLQotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQXUpLE00RVJSX1BBUkFNRVRFUiwiQWNjZXNzIFVuaXQgLiBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKCBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgIT0gTTRBTVJSX2tSZWFkaW5nKSwgTTRFUlJfU1RBVEUsICJJbnZhbGlkIFN0YXRlIik7Ci0KLSAgICBpZiAoIFN0cmVhbUlEICE9IDEgKQotICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgIH0KLQotICAgIC8qIFJlYWQgdGhlIGZyYW1lIGhlYWRlciBieXRlICovCi0gICAgc2l6ZSA9IHBTdHJlYW1Db250ZXh0LT5tX21heEF1U2l6ZTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+cmVhZERhdGEocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzLCAmc2l6ZSk7Ci0gICAgaWYoc2l6ZSAhPSBwU3RyZWFtQ29udGV4dC0+bV9tYXhBdVNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICB9Ci0KLSAgICBmcmFtZUhlYWRlciA9ICgoTTRPU0FfTWVtQWRkcjgpcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzKVswXTsKLQotICAgIGZyYW1lVHlwZSA9ICggZnJhbWVIZWFkZXIgJiAweDc4ICkgPj4gMyA7Ci0KLSAgICBpZiAoKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKSAmJgotICAgICAgICAoIGZyYW1lVHlwZSA+IDExICkgJiYgKCBmcmFtZVR5cGUgIT0gMTUgKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FNUl9JTlZBTElEX0ZSQU1FX1RZUEU7Ci0gICAgfQotCi0gICAgaWYgKCggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SX1dCICkgJiYKLSAgICAgICAgKCBmcmFtZVR5cGUgPiA5ICkgJiYgKCBmcmFtZVR5cGUgIT0gMTUgKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTTRPU0FfRVJSKU00RVJSX0FNUl9JTlZBTElEX0ZSQU1FX1RZUEU7Ci0gICAgfQotCi0gICAgLyogR2V0IHRoZSBmcmFtZSBzaXplICovCi0gICAgaWYoZnJhbWVUeXBlID09IDE1KQotICAgIHsKLSAgICAgICAgYXVTaXplID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgYXVTaXplID0gTTRBTVJSX2dldEF1U2l6ZShmcmFtZVR5cGUsIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUpOwotICAgIH0KLQotICAgIHNpemUgLT0gYXVTaXplIDsKLSAgICBpZihzaXplICE9IDApCi0gICAgewotICAgICAgICBmaWxlUG9zID0gLSgoTTRPU0FfRmlsZVBvc2l0aW9uKXNpemUpOwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICBNNE9TQV9rRmlsZVNlZWtDdXJyZW50LCAmZmlsZVBvcyk7Ci0gICAgfQotCi0gICAgcEF1LT5zaXplID0gYXVTaXplIDsKLQotICAgIC8qIGV2ZW4gd2hlbiBmcmFtZVR5cGUgPT0gMTUgKG5vIGRhdGEgZnJhbWUpLCBBUk0gY29yZSBkZWNvZGVyIG91dHB1dHMgZnVsbCBQQ00gYnVmZmVyICovCi0gICAgLyppZihmcmFtZVR5cGUgPT0gMTUgKQotICAgIHsKLSAgICAgICAgcEF1LT5DVFMgKz0gMDsKLSAgICB9Ki8KLSAgICAvKmVsc2UqLwotICAgIHsKLSAgICAgICAgcEF1LT5DVFMgKz0gTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgfQotCi0KLSAgICBwQXUtPkRUUyA9IHBBdS0+Q1RTIDsKLSAgICBwQXUtPmF0dHJpYnV0ZSA9IE00U1lTX2tGcmFnQXR0ck9rOwotCi0gICAgcEF1LT5zdHJlYW0gPSBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlcjsKLSAgICBwQXUtPmRhdGFBZGRyZXNzID0gcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzIDsKLQotICAgIGlmKGZyYW1lSGVhZGVyICYgMHg4MCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLQotICAgIC8qIENoYW5nZSB0aGUgc3RhdGUgdG8gaW1wbGVtZW50IE5leHRBdS0+ZnJlZUF1LT5OZXh0QXUgRlNNICovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzID0gTTRBTVJSX2tSZWFkaW5nX25leHRBVSA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX2ZyZWVBVShNNE9TQV9Db250ZXh0IENvbnRleHQsIE00U1lTX1N0cmVhbUlEIFN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQXUpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00X0FNUlJfQ29udGV4dCogcFN0cmVhbUNvbnRleHQ9KE00X0FNUlJfQ29udGV4dCopQ29udGV4dDsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCJDb250ZXh0IE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcEF1KSxNNEVSUl9QQVJBTUVURVIsIkFjY2VzcyBVbml0IC4gTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFN0cmVhbUNvbnRleHQtPm1fY29udGV4dElkICE9IE00QU1SUl9DT05URVhUSUQpLE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgIkJhZCBDb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKCggcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzICE9IE00QU1SUl9rUmVhZGluZ19uZXh0QVUpLCBNNEVSUl9TVEFURSwKLSAgICAgICAgICJJbnZhbGlkIFN0YXRlIik7Ci0KLSAgICBpZiAoKCBTdHJlYW1JRCAhPSAxICkgJiYgKCBTdHJlYW1JRCAhPSAwKSkKLSAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICB9Ci0KLSAgICAvKiBDaGFuZ2UgdGhlIHN0YXRlIHRvIFJlYWRpbmcgc28gYXMgdG8gYWxsb3cgYWNjZXNzIHRvIG5leHQgQVUgKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgPSBNNEFNUlJfa1JlYWRpbmcgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00QU1SUl9zZWVrKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRCwgTTRPU0FfVGltZSB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1NlZWtBY2Nlc3NNb2RlIHNlZWtNb2RlLCBNNE9TQV9UaW1lKiBwT2J0YWluQ1RTKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0gICAgTTRPU0FfVUludDMyIGNvdW50LCBwcmV2QVUsIG5leHRBVSA7Ci0gICAgTTRPU0FfVUludDMyIHNpemUgOwotICAgIE00T1NBX1VJbnQzMiBhdVNpemUgOwotICAgIE00T1NBX1VJbnQzMiBwb3NpdGlvbiwgcGFydFNlZWtUaW1lOwotICAgIE00T1NBX1VJbnQzMiBhdUNvdW50ID0gMCwgc2tpcEF1Q291bnQgPSAwIDsKLSAgICBNNE9TQV9DaGFyICAgIGZyYW1lSGVhZGVyIDsKLSAgICBNNE9TQV9DaGFyICAgIGZyYW1lVHlwZSA7Ci0gICAgTTRPU0FfRmlsZVBvc2l0aW9uICBmaWxlUG9zOwotICAgIE00T1NBX0RvdWJsZSB0aW1lX2RvdWJsZTsKLQotICAgIC8qTWFrZSBleHBsaWNpdCB0aW1lIGNhc3QsIGJ1dCB0YWtlIGNhcmUgdGhhdCB0aW1lc2NhbGUgaXMgbm90IHVzZWQgISEhKi8KLSAgICBNNE9TQV9USU1FX1RPX01TKHRpbWVfZG91YmxlLCB0aW1lLCAxMDAwKTsKLQotICAgICpwT2J0YWluQ1RTID0gMDsKLQotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFN0cmVhbUNvbnRleHQtPm1fY29udGV4dElkICE9IE00QU1SUl9DT05URVhUSUQpLE00RVJSX0JBRF9DT05URVhULAotICAgICAgICAgIkJhZCBDb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKCggcFN0cmVhbUNvbnRleHQtPm1fc3RhdHVzICE9IE00QU1SUl9rUmVhZGluZykgJiYgXAotICAgICAgICAoIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cyAhPSBNNEFNUlJfa09wZW5lZCksIE00RVJSX1NUQVRFLCAiSW52YWxpZCBTdGF0ZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgodGltZV9kb3VibGUgPCAwKSxNNEVSUl9QQVJBTUVURVIsIm5lZ2F0aXZlIHRpbWUiKTsKLQotICAgIC8qIENvbWluZyB0byBzZWVrIGZvciB0aGUgZmlyc3QgdGltZSwgbmVlZCB0byBidWlsZCB0aGUgc2Vla0luZGV4IFRhYmxlICovCi0gICAgaWYoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4KQotICAgIHsKLSAgICAgICAgTTRPU0FfRG91YmxlIGR1cmF0aW9uX2RvdWJsZTsKLQotICAgICAgICBjb3VudCA9IDAgOwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4ID0KLSAgICAgICAgICAgICAoTTRPU0FfVUludDMyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoTTRBTVJSX05VTV9TRUVLX0VOVFJJRVMgKiBzaXplb2YoTTRPU0FfVUludDMyKSwKLSAgICAgICAgICAgICAgICAgTTRBTVJfUkVBREVSLCAoTTRPU0FfQ2hhciAqKSgicFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleCIpKTsKLQotICAgICAgICBpZihNNE9TQV9OVUxMID09IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMygoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4KSxNNEVSUl9BTExPQywKLSAgICAgICAgICAgICAgICAiTWVtIEFsbG9jIEZhaWxlZCAtIFNlZWtJbmRleCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DIDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHBvaW50IHRvIHRoZSBmaXJzdCBBVSAqLwotICAgICAgICBpZiggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SICkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsZVBvcyA9IDY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKmlmICggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SX1dCICkqLwotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlUG9zID0gOTsKLSAgICAgICAgfQotCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJmZpbGVQb3MpOwotCi0gICAgICAgIC8qIFNldCB0aGUgcG9zdGlvbiB0byBiZWdpbmluZyBvZiBmaXJzdCBBVSAqLwotICAgICAgICBwb3NpdGlvbiA9IChwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlICE9IE00U1lTX2tBTVIpPzk6NjsKLQotICAgICAgICAvKk1ha2UgZXhwbGljaXQgdGltZSBjYXN0LCBidXQgdGFrZSBjYXJlIHRoYXQgdGltZXNjYWxlIGlzIG5vdCB1c2VkICEhISovCi0gICAgICAgIE00T1NBX1RJTUVfVE9fTVMoZHVyYXRpb25fZG91YmxlLCBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlci0+ZHVyYXRpb24sIDEwMDApOwotCi0gICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgc2VlayBJbnRlcnZhbCBkdXJhdGlvbiBiYXNlZCBvbiB0b3RhbCBkdXRhdGlvbiAqLwotICAgICAgICAvKiBJbnRlcnZhbCA9IChkdXJhdGlvbiAvIEVOVFJJRVMpIGluIG11bHRpcGxlcyBvZiBBVSBmcmFtZSBsZW5ndGggKi8KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsID0KLSAgICAgICAgICAgICAoTTRPU0FfVUludDMyKShkdXJhdGlvbl9kb3VibGUgLyBNNEFNUlJfTlVNX1NFRUtfRU5UUklFUykgOwotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWwgLz0gTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbCAqPSBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgc2tpcEF1Q291bnQgPSBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWwgLyBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLQotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4W2NvdW50KytdPXBvc2l0aW9uOwotICAgICAgICB3aGlsZShjb3VudCA8IE00QU1SUl9OVU1fU0VFS19FTlRSSUVTICkKLSAgICAgICAgewotICAgICAgICAgICAgc2l6ZSA9IDE7Ci0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+cmVhZERhdGEocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsCi0gICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkmZnJhbWVIZWFkZXIsICZzaXplKTsKLSAgICAgICAgICAgIGlmICggc2l6ZSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyYW1lVHlwZSA9IChmcmFtZUhlYWRlciAmIDB4NzgpID4+IDMgOwotICAgICAgICAgICAgaWYoZnJhbWVUeXBlICE9IDE1KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKjwgYnVnZml4IFJvbmFuIENvdXN5biAwNS8wNC8yMDA2OiBJbiB0aGUgY29yZSByZWFkZXIgQU1SLCB0aGUKLSAgICAgICAgICAgICAgICAgKiBmdW5jdGlvbiBNNEFNUlJfc2VlayBkb2Vzbid0IGNoZWNrIHRoZSBmcmFtZVR5cGUgKi8KLSAgICAgICAgICAgICAgICBpZiAoKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKSAmJiAoIGZyYW1lVHlwZSA+IDEwICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCggcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSA9PSBNNFNZU19rQU1SX1dCICkgJiYgKCBmcmFtZVR5cGUgPiA5ICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQU1SX0lOVkFMSURfRlJBTUVfVFlQRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXVTaXplID0gTTRBTVJSX2dldEF1U2l6ZShmcmFtZVR5cGUsIHBTdHJlYW1Db250ZXh0LT5tX3N0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IGF1U2l6ZSA7Ci0gICAgICAgICAgICAgICAgZmlsZVBvcyA9IGF1U2l6ZS0xOwotICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQ3VycmVudCwgJmZpbGVQb3MpOwotICAgICAgICAgICAgICAgIGF1Q291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3NpdGlvbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFNraXAgdGhlIG51bWJlciBvZiBBVSdzIGFzIHBlciBpbnRlcnZhbCBhbmQgc3RvcmUgaW4gdGhlIEluZGV4IHRhYmxlICovCi0gICAgICAgICAgICBpZiAoIChza2lwQXVDb3VudCAhPSAwKSAmJiAhKGF1Q291bnQgJSBza2lwQXVDb3VudCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleFtjb3VudCsrXSA9IHBvc2l0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfS8qIEVuZCBvZiBCdWlsZGluZyB0aGUgc2VlayB0YWJsZSAqLwotCi0gICAgLyogVXNlIHRoZSBzZWVrIHRhYmxlIHRvIHNlZWsgdGhlIHJlcXVpcmVkIHRpbWUgaW4gdGhlIHN0cmVhbSAqLwotCi0gICAgLyogSWYgd2UgYXJlIHNlZWtpbmcgdGhlIGJlZ2luaW5nIG9mIHRoZSBmaWxlIHBvaW50IHRvIGZpcnN0IEFVICovCi0gICAgaWYgKCBzZWVrTW9kZSA9PSBNNFNZU19rQmVnaW5uaW5nICkKLSAgICB7Ci0gICAgICAgIGlmKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlUG9zID0gNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qaWYgKCBwU3RyZWFtQ29udGV4dC0+bV9zdHJlYW1UeXBlID09IE00U1lTX2tBTVJfV0IgKSovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVQb3MgPSA5OwotICAgICAgICB9Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywgJmZpbGVQb3MgKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1IgOwotICAgIH0KLQotICAgIC8qIEdldCB0aGUgTmVhcmVzdCBTZWNvbmQgKi8KLSAgICBpZiAoMCAhPSBwU3RyZWFtQ29udGV4dC0+bV9zZWVrSW50ZXJ2YWwpCi0gICAgewotICAgICAgICBwb3NpdGlvbiA9IChNNE9TQV9VSW50MzIpKHRpbWVfZG91YmxlIC8gcFN0cmVhbUNvbnRleHQtPm1fc2Vla0ludGVydmFsKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyphdm9pZCBkaXZpc2lvbiBieSAwKi8KLSAgICAgICAgcG9zaXRpb24gPSAwOwotICAgIH0KLQotICAgIC8qIFdlIGhhdmUgb25seSA0MCBzZWVrIEluZGV4LiAqLwotICAgIHBvc2l0aW9uPShwb3NpdGlvbiA+PSBNNEFNUlJfTlVNX1NFRUtfRU5UUklFUyk/TTRBTVJSX05VTV9TRUVLX0VOVFJJRVMtMTpwb3NpdGlvbjsKLQotICAgIC8qIFNlZWtJbmRleCB3aWxsIHBvaW50IHRvIG5lYXJlc3QgQXUsIHdlIG5lZWQgdG8gc2VhcmNoIGZvciB0aGUKLSAgICByZXF1aXJlZCB0aW1lIGZvcm0gdGhhdCBwb3NpdGlvbiAqLwotICAgIHBhcnRTZWVrVGltZSA9IChNNE9TQV9VSW50MzIpdGltZV9kb3VibGUgLSBwb3NpdGlvbiAqIHBTdHJlYW1Db250ZXh0LT5tX3NlZWtJbnRlcnZhbDsKLQotICAgIHBvc2l0aW9uID0gcFN0cmVhbUNvbnRleHQtPm1fcFNlZWtJbmRleFtwb3NpdGlvbl07Ci0KLSAgICBpZighcG9zaXRpb24pCi0gICAgewotICAgICAgICByZXR1cm4gTTRXQVJfSU5WQUxJRF9USU1FIDsKLSAgICB9Ci0KLSAgICAvKiBwb2ludCB0aGUgZmlsZSBwb2ludGVyIHRvIG5lYXJlc3QgQVUgKi8KLSAgICBmaWxlUG9zID0gcG9zaXRpb247Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1fcE9zYUZpbGVQdHJGY3QtPnNlZWsocFN0cmVhbUNvbnRleHQtPm1fcEFNUkZpbGUsIE00T1NBX2tGaWxlU2Vla0JlZ2lubmluZywKLSAgICAgICAgICZmaWxlUG9zICk7Ci0KLSAgICBpZiAoIHBhcnRTZWVrVGltZSA9PSAwKQotICAgIHsKLSAgICAgICAgKnBPYnRhaW5DVFMgPSB0aW1lOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAqcE9idGFpbkNUUyA9IChNNE9TQV9UaW1lKSh0aW1lX2RvdWJsZSAtIChNNE9TQV9Eb3VibGUpcGFydFNlZWtUaW1lKTsKLQotICAgIHN3aXRjaChzZWVrTW9kZSkKLSAgICB7Ci0gICAgICAgIC8qIEdldCB0aGUgQVUgYmVmb3JlIHRoZSB0YXJnZXQgdGltZSAqLwotICAgICAgICBjYXNlIE00U1lTX2tQcmV2aW91c1JBUDoKLSAgICAgICAgY2FzZSBNNFNZU19rTm9SQVBwcmV2aW91czoKLSAgICAgICAgICAgIHBvc2l0aW9uID0gcGFydFNlZWtUaW1lIC8gTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgICAgICAgICBpZiAoICEocGFydFNlZWtUaW1lICUgTTRBTVJSX0ZSQU1FX0xFTkdUSCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvc2l0aW9uIC0tIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qIEdldCB0aGUgQ2xvc2VzdCBBVSBmb2xsb3dpbmcgdGhlIHRhcmdldCB0aW1lICovCi0gICAgICAgIGNhc2UgTTRTWVNfa05leHRSQVA6Ci0gICAgICAgIGNhc2UgTTRTWVNfa05vUkFQbmV4dDoKLSAgICAgICAgICAgIHBvc2l0aW9uID0gKHBhcnRTZWVrVGltZSArIE00QU1SUl9GUkFNRV9MRU5HVEggKS8gTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAvKiAgR2V0IHRoZSBjbG9zZXN0IEFVIHRvIHRhcmdldCB0aW1lICovCi0gICAgICAgIGNhc2UgTTRTWVNfa0Nsb3Nlc3RSQVA6Ci0gICAgICAgIGNhc2UgTTRTWVNfa05vUkFQY2xvc2VzdDoKLSAgICAgICAgICAgIHByZXZBVSA9IHBhcnRTZWVrVGltZS0ocGFydFNlZWtUaW1lL000QU1SUl9GUkFNRV9MRU5HVEgpKk00QU1SUl9GUkFNRV9MRU5HVEg7Ci0gICAgICAgICAgICBuZXh0QVUgPQotICAgICAgICAgICAgICAgICAoKHBhcnRTZWVrVGltZStNNEFNUlJfRlJBTUVfTEVOR1RIKS9NNEFNUlJfRlJBTUVfTEVOR1RIKSpNNEFNUlJfRlJBTUVfTEVOR1RIIC1cCi0gICAgICAgICAgICAgICAgICAgICBwYXJ0U2Vla1RpbWUgOwotICAgICAgICAgICAgaWYocHJldkFVIDwgbmV4dEFVKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcGFydFNlZWtUaW1lIC8gTTRBTVJSX0ZSQU1FX0xFTkdUSCA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gPSAocGFydFNlZWtUaW1lICsgTTRBTVJSX0ZSQU1FX0xFTkdUSCApLyBNNEFNUlJfRlJBTUVfTEVOR1RIIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0JlZ2lubmluZzoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY291bnQgPSAwIDsKLSAgICAvKiBTa2lwIHRoZSBBY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtIHRvIHNraXAgdGhlIHBhcnQgc2VlayB0aW1lLAotICAgICAgIHRvIHJlYWNoIHRoZSByZXF1aXJlZCB0YXJnZXQgdGltZSAqLwotICAgIHdoaWxlKGNvdW50IDwgcG9zaXRpb24gKQotICAgIHsKLSAgICAgICAgc2l6ZSA9IDE7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5yZWFkRGF0YShwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpJmZyYW1lSGVhZGVyLCAmc2l6ZSk7Ci0gICAgICAgIGlmICggc2l6ZSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJZiB0aGUgdGFyZ2V0IHRpbWUgaXMgaW52YWxpZCwgcG9pbnQgdG8gYmVnaW5pbmcgYW5kIHJldHVybiAqLwotICAgICAgICAgICAgKnBPYnRhaW5DVFMgPSAwOwotICAgICAgICAgICAgZmlsZVBvcyA9IHBTdHJlYW1Db250ZXh0LT5tX3BTZWVrSW5kZXhbMF07Ci0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+c2VlayhwU3RyZWFtQ29udGV4dC0+bV9wQU1SRmlsZSwKLSAgICAgICAgICAgICAgICAgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLCAmZmlsZVBvcyk7Ci0gICAgICAgICAgICByZXR1cm4gTTRXQVJfSU5WQUxJRF9USU1FIDsKLSAgICAgICAgfQotICAgICAgICAqcE9idGFpbkNUUyArPSBNNEFNUlJfRlJBTUVfTEVOR1RIOyAvKlNob3VsZCB1c2UgTTRPU0FfSU5UNjRfQUREICEhKi8KLSAgICAgICAgY291bnQrKzsKLSAgICAgICAgZnJhbWVUeXBlID0gKGZyYW1lSGVhZGVyICYgMHg3OCkgPj4gMyA7Ci0gICAgICAgIGlmKGZyYW1lVHlwZSA9PSAxNSkKLSAgICAgICAgewotICAgICAgICAgICAgYXVTaXplID0gMSA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBhdVNpemUgPSBNNEFNUlJfZ2V0QXVTaXplKGZyYW1lVHlwZSwgcFN0cmVhbUNvbnRleHQtPm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaWxlUG9zID0gYXVTaXplLTE7Ci0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tX3BPc2FGaWxlUHRyRmN0LT5zZWVrKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlLAotICAgICAgICAgICAgIE00T1NBX2tGaWxlU2Vla0N1cnJlbnQsICZmaWxlUG9zKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfY2xvc2VSZWFkKE00T1NBX0NvbnRleHQgQ29udGV4dCkKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRfQU1SUl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dD0oTTRfQU1SUl9Db250ZXh0KilDb250ZXh0OwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBDb250ZXh0KSxNNEVSUl9QQVJBTUVURVIsIkNvbnRleHQgTTRPU0FfTlVMTCIpOwotCi0gICAgLyogQ2xvc2UgdGhlIEFNUiBzdHJlYW0gKi8KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wT3NhRmlsZVB0ckZjdC0+Y2xvc2VSZWFkKHBTdHJlYW1Db250ZXh0LT5tX3BBTVJGaWxlKTsKLQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0YXR1cz1NNEFNUlJfa0Nsb3NlZCA7Ci0KLSAgICAvKiBDaGVjayBpZiBBVSBkYXRhIEFkZHJlc3MgaXMgYWxsb2NhdGVkIG1lbW9yeSBhbmQgZnJlZSBpdCAqLwotICAgIGlmKE00T1NBX05VTEwgIT0gcFN0cmVhbUNvbnRleHQtPm1fcGRhdGFBZGRyZXNzKQotICAgIHsKLSAgICAgICAgZnJlZShwU3RyZWFtQ29udGV4dC0+bV9wZGF0YUFkZHJlc3MpOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIHRoZSBzdHJlYW0gaGFuZGxlciBpcyBhbGxvY2F0ZWQgbWVtb3J5ICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9wU3RyZWFtSGFuZGxlcikKLSAgICB7Ci0gICAgICAgIGZyZWUocFN0cmVhbUNvbnRleHQtPm1fcFN0cmVhbUhhbmRsZXIpOwotICAgIH0KLQotICAgIC8qIFNlZWsgdGFibGUgaXMgY3JlYXRlZCBvbmx5IHdoZW4gc2VlayBpcyB1c2VkLCBzbyBjaGVjayBpZiBtZW1vcnkgaXMgYWxsb2NhdGVkICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSBwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4KQotICAgIHsKLSAgICAgICAgZnJlZShwU3RyZWFtQ29udGV4dC0+bV9wU2Vla0luZGV4KTsKLSAgICB9Ci0KLSAgICAvKiBGcmVlIHRoZSBjb250ZXh0ICovCi0gICAgZnJlZShwU3RyZWFtQ29udGV4dCk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUiA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX2dldFN0YXRlKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRBTVJSX1N0YXRlKiBwU3RhdGUsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlkKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IENvbnRleHQpLE00RVJSX1BBUkFNRVRFUiwiQ29udGV4dCBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChwU3RyZWFtQ29udGV4dC0+bV9jb250ZXh0SWQgIT0gTTRBTVJSX0NPTlRFWFRJRCksTTRFUlJfQkFEX0NPTlRFWFQsCi0gICAgICAgICAiQmFkIENvbnRleHQiKTsKLQotICAgIGlmICgoIHN0cmVhbUlkICE9IDEgKSAmJiAoIHN0cmVhbUlkICE9IDApKQotICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfU1RSRUFNX0lEOwotICAgIH0KLQotICAgICpwU3RhdGUgPSBwU3RyZWFtQ29udGV4dC0+bV9zdGF0dXMgOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1IgOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRBTVJSX2dldFZlcnNpb24gICAgKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi17Ci0gICAgTTRPU0FfVFJBQ0UxXzEoIk00QU1SUl9nZXRWZXJzaW9uIGNhbGxlZCB3aXRoIHBWZXJzaW9uOiAweCV4XG4iLCBwVmVyc2lvbik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKCgoTTRPU0FfVUludDMyKSBwVmVyc2lvbiA9PSAwKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAicFZlcnNpb24gaXMgTlVMTCBpbiBNNEFNUlJfZ2V0VmVyc2lvbiIpOwotCi0gICAgcFZlcnNpb24tPm1fbWFqb3IgPSBNNEFNUlJfVkVSU0lPTl9NQUpPUjsKLSAgICBwVmVyc2lvbi0+bV9taW5vciA9IE00QU1SUl9WRVJTSU9OX01JTk9SOwotICAgIHBWZXJzaW9uLT5tX3JldmlzaW9uID0gTTRBTVJSX1ZFUlNJT05fUkVWSVNJT047Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNEFNUlJfZ2V0bWF4QVVzaXplKE00T1NBX0NvbnRleHQgQ29udGV4dCwgTTRPU0FfVUludDMyICpwTWF4QXVTaXplKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNF9BTVJSX0NvbnRleHQqIHBTdHJlYW1Db250ZXh0PShNNF9BTVJSX0NvbnRleHQqKUNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IENvbnRleHQpLCAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNEFNUlJfZ2V0bWF4QVVzaXplOiBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcE1heEF1U2l6ZSksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNEFNUlJfZ2V0bWF4QVVzaXplOiBwTWF4QXVTaXplIGlzIE00T1NBX05VTEwiKTsKLQotICAgICpwTWF4QXVTaXplID0gcFN0cmVhbUNvbnRleHQtPm1fbWF4QXVTaXplOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRDaGFubmVsQ29udmVydGVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000Q2hhbm5lbENvbnZlcnRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmY2E1NTUwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRDaGFubmVsQ29udmVydGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRDaGFubmVsQ292ZXJ0ZXIuYwotICogQGJyaWVmCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLXZvaWQgTW9ub1RvMklfMTYoIGNvbnN0IHNob3J0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgbikKLXsKLSAgICBzaG9ydCBpaTsKLSAgICBzcmMgKz0gbi0xOwotICAgIGRzdCArPSAobioyKS0xOwotCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pewotICAgICAgICAqZHN0LS0gPSAqc3JjOwotICAgICAgICAqZHN0LS0gPSAqc3JjLS07Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi12b2lkIEZyb20yaVRvTW9ub18xNiggY29uc3Qgc2hvcnQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IG4pCi17Ci0gICAgc2hvcnQgaWk7Ci0gICAgbG9uZyBUZW1wOwotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKLSAgICAgICAgVGVtcCA9IChsb25nKSooc3JjKyspOwotICAgICAgICBUZW1wICs9IChsb25nKSooc3JjKyspOwotICAgICAgICAqKGRzdCsrKSA9IChzaG9ydCkoVGVtcCA+PjEpOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNERFQ09ERVJfTnVsbC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNERFQ09ERVJfTnVsbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZTI2MGU1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRERUNPREVSX051bGwuYworKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKg0KLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQotICoNCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLS8qKg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAZmlsZSAgICBNNERFQ09ERVJfTnVsbC5jDQotICogQGJyaWVmICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIE51bGwgZGVjb2RlciBwdWJsaWMgaW50ZXJmYWNlDQotICogQG5vdGUgICAgVGhpcyBmaWxlIGltcGxlbWVudHMgYSAibnVsbCIgdmlkZW8gZGVjb2RlciwgaS5lLiBhIGRlY29kZXINCi0gKiAgICAgICAgICB0aGF0IGRvZXMgbm90aGluZw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiDQotDQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiDQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiDQotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIg0KLSNpbmNsdWRlICJNNERBX1R5cGVzLmgiDQotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCINCi0jaW5jbHVkZSAiTTRERUNPREVSX051bGwuaCINCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogTlVMTCBWaWRlbyBEZWNvZGVyIHZlcnNpb24gaW5mb3JtYXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi0vKiBDSEFOR0VfVkVSU0lPTl9IRVJFICovDQotI2RlZmluZSBNNERFQ09ERVJfTlVMTF9NQUpPUiAgICAxDQotI2RlZmluZSBNNERFQ09ERVJfTlVMTF9NSU5PUiAgICAwDQotI2RlZmluZSBNNERFQ09ERVJfTlVMTF9SRVZJU0lPTiAwDQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIHN0cnVjdHVyZSAgICBNNF9WaWRlb0hhbmRsZXJfQ29udGV4dA0KLSAqIEBicmllZiAgICAgICBEZWZpbmVzIHRoZSBpbnRlcm5hbCBjb250ZXh0IG9mIGEgdmlkZW8gZGVjb2RlciBpbnN0YW5jZQ0KLSAqIEBub3RlICAgICAgICBUaGUgY29udGV4dCBpcyBhbGxvY2F0ZWQgYW5kIGZyZWVkIGJ5IHRoZSB2aWRlbyBkZWNvZGVyDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgbV9wTGlicmFyeTsgICAgICAgICAgICAvLyBDb3JlIGxpYnJhcnkgaWRlbnRpZmllcg0KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgbV9EZWNvZGVySWQ7ICAgICAgICAgICAvLyBDb3JlIGRlY29kZXIgaWRlbnRpZmllcg0KLSAgICBNNE9TQV9JbnQzMiAgICAgICAgICAgICAgbV9SZW5kZXJlcklkOyAgICAgICAgICAvLyBDb3JlIHJlbmRlcmVyIGlkZW50aWZpZXINCi0gICAgTTRfVmlkZW9TdHJlYW1IYW5kbGVyKiAgIG1fcFZpZGVvU3RyZWFtaGFuZGxlcjsgLy8gVmlkZW8gc3RyZWFtIGRlc2NyaXB0aW9uDQotICAgIE00X0FjY2Vzc1VuaXQqICAgICAgICAgICBtX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlOyAvLyBBY2Nlc3MgdW5pdCB1c2VkIHRvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkIGFuZCBkZWNvZGUgb25lIGZyYW1lDQotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICBtX3BVc2VyRGF0YTsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gYW55IHVzZXIgZGF0YQ0KLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlKiAgbV9wUmVhZGVyOyAgICAgICAgICAgICAvLyBSZWFkZXIgZGF0YSBpbnRlcmZhY2UNCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIG1fYkRvUmVuZGVyaW5nOyAgICAgICAgLy8gRGVjaWRlcyBpZiByZW5kZXIgcmVxdWlyZWQNCi0gICAgTTRPU0FfSW50MzIgICAgICAgICAgICAgIG1fc3RydWN0U2l6ZTsgICAgICAgICAgLy8gU2l6ZSBvZiB0aGUgc3RydWN0dXJlDQotDQotICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIqIG1fcFZpZGVvRmlsdGVyOyAgICAgICAgIC8vIENvbG9yIGNvbnZlcnNpb24gZmlsdGVyDQotICAgIE00VklGSV9JbWFnZVBsYW5lICAgICAgICpwRGVjWXV2RGF0YTsgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gWXV2IGRhdGEgcGxhbmUNCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgICAgICAgKnBEZWNZdXZXaXRoRWZmZWN0OyAgICAgLy8gUG9pbnRlciB0byBZdXYgcGxhbmUgd2l0aCBjb2xvciBlZmZlY3QNCi0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgIGJZdXZXaXRoRWZmZWN0U2V0OyAgICAgLy8gT3JpZ2luYWwgWXV2IGRhdGEgT1IgWXV2IHdpdGggY29sb3IgZWZmZWN0DQotDQotfSBNNF9WaWRlb0hhbmRsZXJfQ29udGV4dDsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmICAgQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBub3RlICAgIEFsbG9jYXRlcyB0aGUgY29udGV4dA0KLSAqDQotICogQHBhcmFtICAgcENvbnRleHQ6ICAgICAgIChPVVQpICAgQ29udGV4dCBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyOiAoSU4pICAgIFBvaW50ZXIgdG8gYSB2aWRlbyBzdHJlYW0gZGVzY3JpcHRpb24NCi0gKiBAcGFyYW0gICBwU3JjSW50ZXJmYWNlOiAgKElOKSAgICBQb2ludGVyIHRvIHRoZSBNNFJFQURFUl9EYXRhSW50ZXJmYWNlDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIHRoYXQgbXVzdCBiZSB1c2VkIGJ5IHRoZQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHN0cmVhbQ0KLSAqIEBwYXJhbSAgIHBBY2Nlc3NVbml0ICAgICAoSU4pICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpIHdoZXJlIGRlY29kZWQgZGF0YQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBzdG9yZWQNCi0gKg0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgU3RhdGUgYXV0b21hdG9uIGlzIG5vdCBhcHBsaWVkDQotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgQSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkDQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgQXQgbGVhc3Qgb25lIGlucHV0IHBhcmFtZXRlciBpcyBub3QgcHJvcGVyDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICpwUmVhZGVyRGF0YUludGVyZmFjZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQqIHBBY2Nlc3NVbml0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7DQotDQotICAgIE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dCA9IE00T1NBX05VTEw7DQotDQotICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7DQotICAgIHBTdHJlYW1Db250ZXh0ID0gKE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCksIE00REVDT0RFUl9NUEVHNCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCIpOw0KLSAgICBpZiAocFN0cmVhbUNvbnRleHQgPT0gMCkgew0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOw0KLSAgICB9DQotDQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQpOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZSA9IE00T1NBX05VTEw7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BMaWJyYXJ5ICAgICAgICAgICAgICA9IE00T1NBX05VTEw7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXIgICA9IE00T1NBX05VTEw7DQotICAgIHBTdHJlYW1Db250ZXh0LT5tX0RlY29kZXJJZCAgICAgICAgICAgICA9IC0xOw0KLSAgICBwU3RyZWFtQ29udGV4dC0+bV9SZW5kZXJlcklkICAgICAgICAgICAgPSAtMTsNCi0NCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFVzZXJEYXRhID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fYkRvUmVuZGVyaW5nID0gTTRPU0FfVFJVRTsNCi0gICAgcFN0cmVhbUNvbnRleHQtPm1fcFZpZGVvRmlsdGVyID0gTTRPU0FfTlVMTDsNCi0gICAgcFN0cmVhbUNvbnRleHQtPmJZdXZXaXRoRWZmZWN0U2V0ID0gTTRPU0FfRkFMU0U7DQotDQotICAgICpwQ29udGV4dD1wU3RyZWFtQ29udGV4dDsNCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7DQotfQ0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYnJpZWYgICBEZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBub3RlICAgIEFmdGVyIHRoaXMgY2FsbCB0aGUgY29udGV4dCBpcyBpbnZhbGlkDQotICoNCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKg0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKi8NCi1NNE9TQV9FUlIgTTRERUNPREVSX05VTExfZGVzdHJveShNNE9TQV9Db250ZXh0IHBDb250ZXh0KSB7DQotDQotICAgIE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KiBwU3RyZWFtQ29udGV4dCA9IChNNF9WaWRlb0hhbmRsZXJfQ29udGV4dCopcENvbnRleHQ7DQotDQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwU3RyZWFtQ29udGV4dCksDQotICAgICAgICBNNEVSUl9QQVJBTUVURVIsICJNNERFQ09ERVJfTlVMTF9kZXN0cm95OiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOw0KLQ0KLSAgICBmcmVlKHBTdHJlYW1Db250ZXh0KTsNCi0NCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7DQotfQ0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYnJpZWYgICBHZXQgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIGRlY29kZXINCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgY2FsbGVyIHRvIHJldHJpZXZlIGEgcHJvcGVydHkgdmFsdWU6DQotICoNCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyDQotICogQHBhcmFtICAgb3B0aW9uSWQ6ICAgKElOKSAgICAgICAgSW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gZ2V0DQotICogQHBhcmFtICAgcFZhbHVlOiAgICAgKElOL09VVCkgICAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgd2hlcmUNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gaXMgc3RvcmVkDQotICoNCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcg0KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBjb250ZXh0IGlzIGludmFsaWQgKGluIERFQlVHIG9ubHkpDQotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgV2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQ0KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZA0KLSAqIEByZXR1cm4gIE00RVJSX05PVF9JTVBMRU1FTlRFRCAgIEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uICBwVmFsdWUpIHsNCi0NCi0gICAgcmV0dXJuIE00RVJSX05PVF9JTVBMRU1FTlRFRDsNCi19DQotDQotLyoqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEBicmllZiAgIFNldCBhbiBvcHRpb24gdmFsdWUgb2YgdGhlIGRlY29kZXINCi0gKiBAbm90ZSAgICBBbGxvd3MgdGhlIGNhbGxlciB0byBzZXQgYSBwcm9wZXJ0eSB2YWx1ZToNCi0gKg0KLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIGRlY29kZXINCi0gKiBAcGFyYW0gICBvcHRpb25JZDogICAoSU4pICAgICAgICBJZGVudGlmaWVyIGluZGljYXRpbmcgdGhlIG9wdGlvbiB0byBzZXQNCi0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoSU4pICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQNCi0gKg0KLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIGVycm9yDQotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgVGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUNCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQNCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBUaGUgb3B0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7DQotDQotICAgIE00REVDT0RFUl9PdXRwdXRGaWx0ZXIgKnBGaWx0ZXJPcHRpb247DQotDQotICAgIE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0ICpwU3RyZWFtQ29udGV4dCA9DQotICAgICAgICAoTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqKWNvbnRleHQ7DQotDQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOw0KLSAgICBNNE9TQV9VSW50MzIgaGVpZ2h0ID0gMDsNCi0gICAgTTRPU0FfVUludDggKnBfc3JjLCpwX2RlczsNCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBUZW1wRGVjWXV2RGF0YSA9IE00T1NBX05VTEw7DQotDQotICAgIHN3aXRjaCAob3B0aW9uSWQpIHsNCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9EZWNZdXZEYXRhOg0KLSAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YSA9IChNNFZJRklfSW1hZ2VQbGFuZSAqKXBWYWx1ZTsNCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Q29udGlndW91czoNCi0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3QgPSAoTTRWSUZJX0ltYWdlUGxhbmUgKilwVmFsdWU7DQotICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfRW5hYmxlWXV2V2l0aEVmZmVjdDoNCi0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+Yll1dldpdGhFZmZlY3RTZXQgPSAoTTRPU0FfQm9vbCkoaW50cHRyX3QpcFZhbHVlOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3ROb25Db250aWd1b3VzOg0KLSAgICAgICAgICAgIHBUZW1wRGVjWXV2RGF0YSA9ICAoTTRWSUZJX0ltYWdlUGxhbmUgKilwVmFsdWU7DQotDQotICAgICAgICAgICAgcF9kZXMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnVfdG9wbGVmdDsNCi0gICAgICAgICAgICBwX3NyYyA9IHBUZW1wRGVjWXV2RGF0YVswXS5wYWNfZGF0YSArDQotICAgICAgICAgICAgICAgICBwVGVtcERlY1l1dkRhdGFbMF0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgICAgIGZvciAoaGVpZ2h0ID0gMDsgaGVpZ2h0PHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodDsNCi0gICAgICAgICAgICAgaGVpZ2h0KyspIHsNCi0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsDQotICAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0udV93aWR0aCk7DQotDQotICAgICAgICAgICAgICAgIHBfZGVzICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X3N0cmlkZTsNCi0gICAgICAgICAgICAgICAgcF9zcmMgKz0gcFRlbXBEZWNZdXZEYXRhWzBdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwX2RlcyA9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS5wYWNfZGF0YSArDQotICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS51X3RvcGxlZnQ7DQotICAgICAgICAgICAgcF9zcmMgPSBwVGVtcERlY1l1dkRhdGFbMV0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICBwVGVtcERlY1l1dkRhdGFbMV0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgICAgIGZvciAoaGVpZ2h0ID0gMDsgaGVpZ2h0PHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS51X2hlaWdodDsNCi0gICAgICAgICAgICAgaGVpZ2h0KyspIHsNCi0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsDQotICAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0udV93aWR0aCk7DQotDQotICAgICAgICAgICAgICAgIHBfZGVzICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS51X3N0cmlkZTsNCi0gICAgICAgICAgICAgICAgcF9zcmMgKz0gcFRlbXBEZWNZdXZEYXRhWzFdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwX2RlcyA9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS5wYWNfZGF0YSArDQotICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS51X3RvcGxlZnQ7DQotICAgICAgICAgICAgcF9zcmMgPSBwVGVtcERlY1l1dkRhdGFbMl0ucGFjX2RhdGEgKw0KLSAgICAgICAgICAgICBwVGVtcERlY1l1dkRhdGFbMl0udV90b3BsZWZ0Ow0KLQ0KLSAgICAgICAgICAgIGZvciAoaGVpZ2h0ID0gMDsgaGVpZ2h0PHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS51X2hlaWdodDsNCi0gICAgICAgICAgICAgaGVpZ2h0KyspIHsNCi0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsDQotICAgICAgICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0udV93aWR0aCk7DQotDQotICAgICAgICAgICAgICAgIHBfZGVzICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS51X3N0cmlkZTsNCi0gICAgICAgICAgICAgICAgcF9zcmMgKz0gcFRlbXBEZWNZdXZEYXRhWzJdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXI6DQotICAgICAgICAgICAgcEZpbHRlck9wdGlvbiA9IChNNERFQ09ERVJfT3V0cHV0RmlsdGVyKilwVmFsdWU7DQotICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBjYXNlIE00REVDT0RFUl9rT3B0aW9uSURfRGVibG9ja2luZ0ZpbHRlcjoNCi0gICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBlcnI7DQotfQ0KLQ0KLS8qKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBAYnJpZWYgICBEZWNvZGUgdmlkZW8gQWNjZXNzIFVuaXRzIHVwIHRvIGEgdGFyZ2V0IHRpbWUNCi0gKiBAbm90ZSAgICBQYXJzZSBhbmQgZGVjb2RlIHRoZSB2aWRlbyB1bnRpbCBpdCBjYW4gb3V0cHV0IGEgZGVjb2RlZCBpbWFnZQ0KLSAqICAgICAgICAgIGZvciB3aGljaCB0aGUgY29tcG9zaXRpb24gdGltZSBpcyBlcXVhbCBvciBncmVhdGVyIHRvIHRoZQ0KLSAqICAgICAgICAgIHBhc3NlZCB0YXJnZXRlZCB0aW1lLg0KLSAqICAgICAgICAgIFRoZSBkYXRhIGFyZSByZWFkIGZyb20gdGhlIHJlYWRlciBkYXRhIGludGVyZmFjZSBwYXNzZWQgdG8NCi0gKiAgICAgICAgICBNNERFQ09ERVJfTVBFRzRfY3JlYXRlLg0KLSAqDQotICogQHBhcmFtICAgY29udGV4dDogICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSAgIHBUaW1lOiAgICAgIChJTi9PVVQpICAgIElOOiBUaW1lIHRvIGRlY29kZSB1cCB0byAoaW4gbXNlYykNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6VGltZSBvZiB0aGUgbGFzdCBkZWNvZGVkIGZyYW1lIChpbiBtc2VjKQ0KLSAqIEBwYXJhbSAgIGJKdW1wOiAgICAgIChJTikgICAgICAgIDAgaWYgbm8ganVtcCBvY2N1cmVkIGp1c3QgYmVmb3JlIHRoaXMgY2FsbA0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgaWYgYSBhIGp1bXAgaGFzIGp1c3QgYmVlbiBtYWRlDQotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3INCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQNCi0gKiBAcmV0dXJuICBNNFdBUl9OT19NT1JFX0FVICAgICAgICB0aGVyZSBpcyBubyBtb3JlIGFjY2VzcyB1bml0IHRvIGRlY29kZSAoRU9TKQ0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9kZWNvZGUoTTRPU0FfQ29udGV4dCBjb250ZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfTWVkaWFUaW1lKiBwVGltZSwgTTRPU0FfQm9vbCBiSnVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRvbGVyYW5jZSkgewotDQotICAgIC8vIERvIG5vdGhpbmc7IGlucHV0IHRpbWUgc3RhbXAgaXRzZWxmIHJldHVybmVkDQotICAgIHJldHVybiBNNE5PX0VSUk9SOw0KLX0NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmICAgUmVuZGVycyB0aGUgdmlkZW8gYXQgdGhlIHNwZWNpZmllZCB0aW1lLg0KLSAqIEBub3RlDQotICogQHBhcmFtICAgY29udGV4dDogICAgIChJTikgICAgICAgQ29udGV4dCBvZiB0aGUgZGVjb2Rlcg0KLSAqIEBwYXJhbSAgIHBUaW1lOiAgICAgICAoSU4vT1VUKSAgIElOOiBUaW1lIHRvIHJlbmRlciB0byAoaW4gbXNlY3MpDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUOlRpbWUgb2YgdGhlIHJlbmRlcmVkIGZyYW1lIChpbiBtcykNCi0gKiBAcGFyYW0gICBwT3V0cHV0UGxhbmU6KE9VVCkgICAgICBPdXRwdXQgcGxhbmUgZmlsbGVkIHdpdGggZGVjb2RlZCBkYXRhDQotICogQHBhcmFtICAgYkZvcmNlUmVuZGVyOihJTikgICAgICAgMSBpZiB0aGUgaW1hZ2UgbXVzdCBiZSByZW5kZXJlZCBldmVuIGl0DQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gcmVuZGVyZWQgYWxyZWFkeQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgaWYgbm90DQotICoNCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcg0KLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldA0KLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZA0KLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQ0KLSAqIEByZXR1cm4gIE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICAgIElmIHRoZSBmcmFtZSBoYXMgYWxyZWFkeSBiZWVuIHJlbmRlcmVkDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSovDQotTTRPU0FfRVJSIE00REVDT0RFUl9OVUxMX3JlbmRlcihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X01lZGlhVGltZSogcFRpbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcE91dHB1dFBsYW5lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiRm9yY2VSZW5kZXIpIHsNCi0NCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7DQotICAgIE00T1NBX1VJbnQzMiBoZWlnaHQ7DQotICAgIE00T1NBX1VJbnQ4ICpwX3NyYywqcF9kZXM7DQotICAgIE00X1ZpZGVvSGFuZGxlcl9Db250ZXh0KiAgICBwU3RyZWFtQ29udGV4dCA9DQotICAgICAgICAoTTRfVmlkZW9IYW5kbGVyX0NvbnRleHQqKWNvbnRleHQ7DQotDQotICAgIGlmIChwU3RyZWFtQ29udGV4dC0+Yll1dldpdGhFZmZlY3RTZXQgPT0gTTRPU0FfVFJVRSkgew0KLQ0KLSAgICAgICAgcF9kZXMgPSBwT3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEgKyBwT3V0cHV0UGxhbmVbMF0udV90b3BsZWZ0Ow0KLSAgICAgICAgcF9zcmMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMF0ucGFjX2RhdGEgKw0KLSAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFswXS51X3RvcGxlZnQ7DQotDQotICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwT3V0cHV0UGxhbmVbMF0udV9oZWlnaHQ7IGhlaWdodCsrKSB7DQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsIHBPdXRwdXRQbGFuZVswXS51X3dpZHRoKTsNCi0gICAgICAgICAgICBwX2RlcyArPSBwT3V0cHV0UGxhbmVbMF0udV9zdHJpZGU7DQotICAgICAgICAgICAgcF9zcmMgKz0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzBdLnVfc3RyaWRlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcF9kZXMgPSBwT3V0cHV0UGxhbmVbMV0ucGFjX2RhdGEgKyBwT3V0cHV0UGxhbmVbMV0udV90b3BsZWZ0Ow0KLSAgICAgICAgcF9zcmMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMV0ucGFjX2RhdGEgKw0KLSAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsxXS51X3RvcGxlZnQ7DQotDQotICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwT3V0cHV0UGxhbmVbMV0udV9oZWlnaHQ7IGhlaWdodCsrKSB7DQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsIHBPdXRwdXRQbGFuZVsxXS51X3dpZHRoKTsNCi0gICAgICAgICAgICBwX2RlcyArPSBwT3V0cHV0UGxhbmVbMV0udV9zdHJpZGU7DQotICAgICAgICAgICAgcF9zcmMgKz0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzFdLnVfc3RyaWRlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcF9kZXMgPSBwT3V0cHV0UGxhbmVbMl0ucGFjX2RhdGEgKyBwT3V0cHV0UGxhbmVbMl0udV90b3BsZWZ0Ow0KLSAgICAgICAgcF9zcmMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dldpdGhFZmZlY3RbMl0ucGFjX2RhdGEgKw0KLSAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2V2l0aEVmZmVjdFsyXS51X3RvcGxlZnQ7DQotDQotICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwT3V0cHV0UGxhbmVbMl0udV9oZWlnaHQ7IGhlaWdodCsrKSB7DQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsIHBPdXRwdXRQbGFuZVsyXS51X3dpZHRoKTsNCi0gICAgICAgICAgICBwX2RlcyArPSBwT3V0cHV0UGxhbmVbMl0udV9zdHJpZGU7DQotICAgICAgICAgICAgcF9zcmMgKz0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZXaXRoRWZmZWN0WzJdLnVfc3RyaWRlOw0KLSAgICAgICAgfQ0KLSAgICB9IGVsc2Ugew0KLQ0KLSAgICAgICAgcF9kZXMgPSBwT3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEgKyBwT3V0cHV0UGxhbmVbMF0udV90b3BsZWZ0Ow0KLSAgICAgICAgcF9zcmMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMF0ucGFjX2RhdGEgKw0KLSAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVswXS51X3RvcGxlZnQ7DQotDQotICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwT3V0cHV0UGxhbmVbMF0udV9oZWlnaHQ7IGhlaWdodCsrKSB7DQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsIHBPdXRwdXRQbGFuZVswXS51X3dpZHRoKTsNCi0gICAgICAgICAgICBwX2RlcyArPSBwT3V0cHV0UGxhbmVbMF0udV9zdHJpZGU7DQotICAgICAgICAgICAgcF9zcmMgKz0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzBdLnVfc3RyaWRlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcF9kZXMgPSBwT3V0cHV0UGxhbmVbMV0ucGFjX2RhdGEgKyBwT3V0cHV0UGxhbmVbMV0udV90b3BsZWZ0Ow0KLSAgICAgICAgcF9zcmMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMV0ucGFjX2RhdGEgKw0KLSAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVsxXS51X3RvcGxlZnQ7DQotDQotICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwT3V0cHV0UGxhbmVbMV0udV9oZWlnaHQ7IGhlaWdodCsrKSB7DQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsICh2b2lkICopcF9zcmMsIHBPdXRwdXRQbGFuZVsxXS51X3dpZHRoKTsNCi0gICAgICAgICAgICBwX2RlcyArPSBwT3V0cHV0UGxhbmVbMV0udV9zdHJpZGU7DQotICAgICAgICAgICAgcF9zcmMgKz0gcFN0cmVhbUNvbnRleHQtPnBEZWNZdXZEYXRhWzFdLnVfc3RyaWRlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcF9kZXMgPSBwT3V0cHV0UGxhbmVbMl0ucGFjX2RhdGEgKyBwT3V0cHV0UGxhbmVbMl0udV90b3BsZWZ0Ow0KLSAgICAgICAgcF9zcmMgPSBwU3RyZWFtQ29udGV4dC0+cERlY1l1dkRhdGFbMl0ucGFjX2RhdGEgKw0KLSAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVsyXS51X3RvcGxlZnQ7DQotDQotICAgICAgICBmb3IgKGhlaWdodCA9IDA7IGhlaWdodDxwT3V0cHV0UGxhbmVbMl0udV9oZWlnaHQ7IGhlaWdodCsrKSB7DQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9kZXMsKHZvaWQgKilwX3NyYyxwT3V0cHV0UGxhbmVbMl0udV93aWR0aCk7DQotICAgICAgICAgICAgcF9kZXMgKz0gcE91dHB1dFBsYW5lWzJdLnVfc3RyaWRlOw0KLSAgICAgICAgICAgIHBfc3JjICs9IHBTdHJlYW1Db250ZXh0LT5wRGVjWXV2RGF0YVsyXS51X3N0cmlkZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gZXJyOw0KLX0NCi0NCi0vKioNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQGJyaWVmIFJldHJpZXZlcyB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoZSBkZWNvZGVyDQotICogQHBhcmFtIHBEZWNvZGVyVHlwZSAgICAgICAgOiBQb2ludGVyIHRvIGEgTTRERUNPREVSX1ZpZGVvVHlwZQ0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgZGVjb2RlciB0eXBlDQotICogQHBhcmFtIHBEZWNvZGVySW50ZXJmYWNlICAgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZGVjb2Rlci4NCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5DQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuDQotICoNCi0gKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgIGlmIE9LDQotICogICAgICAgICAgICBNNEVSUl9BTExPQyBpZiBhbGxvY2F0aW9uIGZhaWxlZA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qLw0KLU00T1NBX0VSUiBNNERFQ09ERVJfTlVMTF9nZXRJbnRlcmZhY2UgKE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICoqcERlY29kZXJJbnRlcmZhY2UpIHsNCi0NCi0gICAgKnBEZWNvZGVySW50ZXJmYWNlID0NCi0gICAgICAgIChNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygNCi0gICAgICAgICBzaXplb2YoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKSwNCi0gICAgICAgICBNNERFQ09ERVJfTVBFRzQsIChNNE9TQV9DaGFyICopIk00REVDT0RFUl9WaWRlb0ludGVyZmFjZSIpOw0KLQ0KLSAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcERlY29kZXJJbnRlcmZhY2UpIHsNCi0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsNCi0gICAgfQ0KLQ0KLSAgICAqcERlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVZVVY0MjBQOw0KLQ0KLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlICAgID0gTTRERUNPREVSX05VTExfY3JlYXRlOw0KLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0RGVzdHJveSAgID0gTTRERUNPREVSX05VTExfZGVzdHJveTsNCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdEdldE9wdGlvbiA9IE00REVDT0RFUl9OVUxMX2dldE9wdGlvbjsNCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFNldE9wdGlvbiA9IE00REVDT0RFUl9OVUxMX3NldE9wdGlvbjsNCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdERlY29kZSAgICA9IE00REVDT0RFUl9OVUxMX2RlY29kZTsNCi0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFJlbmRlciAgICA9IE00REVDT0RFUl9OVUxMX3JlbmRlcjsNCi0NCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7DQotfQ0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQQ01SX0NvcmVSZWFkZXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQQ01SX0NvcmVSZWFkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTlmMDdkZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UENNUl9Db3JlUmVhZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UENNX1BDTVJlYWRlci5jCi0gKiBAYnJpZWYgICBQQ00gcmVhZGVyIGltcGxlbWVudGF0aW9uCi0gKiBAbm90ZSAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgb2YgdGhlIFBDTSByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0jaW5jbHVkZSAiTTRQQ01SX0NvcmVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFBDTSByZWFkZXIgdmVyc2lvbiBudW1iZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLS8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSNkZWZpbmUgTTRQQ01SX1ZFUlNJT05fTUFKT1IgMQotI2RlZmluZSBNNFBDTVJfVkVSU0lPTl9NSU5PUiAwCi0jZGVmaW5lIE00UENNUl9WRVJTSU9OX1JFVklTSU9OIDAKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX29wZW5SZWFkKE00T1NBX0NvbnRleHQqIHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwVXJsLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkZXJQb2ludGVyKiBwRmlsZUZ1bmN0aW9uKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBvcGVucyBhIFBDTSBmaWxlCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gb3BlbnMgYSBQQ00gZmlsZQotICogICAgICAgICAgLSBpbml0aWFsaXplcyBQQ00gY29udGV4dCwKLSAqICAgICAgICAgIC0gdmVyaWZpZXMgUENNIGZpbGUgZm9ybWF0Ci0gKiAgICAgICAgICAtIEZpbGwgZGVjb2RlciBjb25maWcgc3RydWN0dXJlCi0gKiAgICAgICAgICAtIENoYW5nZXMgc3RhdGUgb2YgdGhlIHJlYWRlciBpbiAnT3BlbmluZycKLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAoT1VUKSBQb2ludGVyIG9uIHRoZSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBVcmw6IChJTikgTmFtZSBvZiB0aGUgUENNIGZpbGUKLSAqIEBwYXJhbSAgIHBGaWxlRnVuY3Rpb25zOiAoSU4pIFBvaW50ZXIgb24gdGhlIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucwotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvciBkdXJpbmcgdGhlIG9wZW5pbmcKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICAgcENvbnRleHQgYW5kL29yIHBVcmwgYW5kL29yIHBGaWxlRnVuY3Rpb24gaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gIE00RVJSX0ZJTEVfTk9UX0ZPVU5EICAgICAgICAgICAgdGhlIGZpbGUgY2Fubm90IGJlIGZvdW5kCi0gKiBAcmV0dXJuICBNNFBDTUNfRVJSX1BDTV9OT1RfQ09NUExJQU5UICAgIHRoZSBmaWxlIGRvZXMgbm90IHNlZW0gdG8gYmUgY29tcGxpYW50LCBubyBSSUZGLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBsYWNrIG9mIGFueSBtYW5kYXRvcnkgY2h1bmsuCi0gKiBAcmV0dXJuICBNNFBDTUNfRVJSX1BDTV9OT1RfU1VQUE9SVEVEICAgIHRoZSBQQ00gZm9ybWF0IG9mIHRoaXMgZmlsZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyCi0gKiBAcmV0dXJuICBBbnkgTTRPU0FfRklMRSBlcnJvcnMgICAgICAgICAgIHNlZSBPU0FMIEZpbGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlsZWQgZXJyb3JzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfb3BlblJlYWQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBVcmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVGdW5jdGlvbikKLXsKLSAgICBNNE9TQV9FUlIgICAgICAgZXJyOwotICAgIE00UENNUl9Db250ZXh0ICpjb250ZXh0OwotICAgIE00T1NBX0NoYXIqICAgICAgICBwVGVtcFVSTDsKLSAgICBNNE9TQV9DaGFyICAgICAgICB2YWx1ZVs2XTsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCl8fCAoTTRPU0FfTlVMTCA9PSBwVXJsKSB8fChNNE9TQV9OVUxMID09IHBGaWxlRnVuY3Rpb24pKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBBbGxvY2F0ZXMgdGhlIGNvbnRleHQgKi8KLSAgICBjb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBjb250ZXh0ID0gKE00UENNUl9Db250ZXh0ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFBDTVJfQ29udGV4dCksIE00V0FWX1JFQURFUiwKLSAgICAgICAgIChNNE9TQV9DaGFyICopIk00UENNUl9vcGVuUmVhZCIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IGNvbnRleHQpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgICpwQ29udGV4dCA9IChNNE9TQV9Db250ZXh0KWNvbnRleHQ7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBjb250ZXh0ICovCi0gICAgY29udGV4dC0+bV9vZmZzZXQgPSAwOwotCi0gICAgY29udGV4dC0+bV9zdGF0ZSAgICAgICAgICAgID0gTTRQQ01SX2tJbml0OwotICAgIGNvbnRleHQtPm1fbWljcm9TdGF0ZSAgICAgICA9IE00UENNUl9rSW5pdDsKLSAgICBjb250ZXh0LT5tX3BGaWxlUmVhZEZ1bmMgICAgPSBNNE9TQV9OVUxMOwotICAgIGNvbnRleHQtPm1fZmlsZUNvbnRleHQgICAgICA9IE00T1NBX05VTEw7Ci0gICAgY29udGV4dC0+bV9wQXVCdWZmZXIgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBjb250ZXh0LT5tX3BEZWNvZGVyU3BlY0luZm8gPSBNNE9TQV9OVUxMOwotCi0gICAgLyogU2V0IHNhbXBsZSBmcmVxdWVuY3kgKi8KLSAgICBwVGVtcFVSTCA9IChNNE9TQV9DaGFyKilwVXJsICsgKHN0cmxlbigoY29uc3QgY2hhciAqKXBVcmwpLTExKTsKLSAgICBNNE9TQV9jaHJOQ29weSh2YWx1ZSwgcFRlbXBVUkwsIDUpOwotICAgIE00T1NBX2NockdldFVJbnQzMihwVGVtcFVSTCwgJihjb250ZXh0LT5tX2RlY29kZXJDb25maWcuU2FtcGxlRnJlcXVlbmN5KSwKLSAgICAgICAgIE00T1NBX05VTEwsIE00T1NBX2tjaHJEZWMpOwotCi0gICAgLyogU2V0IG51bWJlciBvZiBjaGFubmVscyAqLwotICAgIHBUZW1wVVJMICs9IDY7Ci0gICAgTTRPU0FfY2hyTkNvcHkodmFsdWUsIHBUZW1wVVJMLCAxKTsKLSAgICBNNE9TQV9jaHJHZXRVSW50MTYocFRlbXBVUkwsICYoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHMpLAotICAgICAgICAgTTRPU0FfTlVMTCwgTTRPU0Ffa2NockRlYyk7Ci0KLSAgICBNNE9TQV9jaHJOQ29weShwVXJsLHBVcmwsIChzdHJsZW4oKGNvbnN0IGNoYXIgKilwVXJsKS0xMikpOwotICAgIC8qIE9wZW4gdGhlIGZpbGUgKi8KLSAgICBjb250ZXh0LT5tX2ZpbGVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBlcnIgPSBwRmlsZUZ1bmN0aW9uLT5vcGVuUmVhZCgmKGNvbnRleHQtPm1fZmlsZUNvbnRleHQpLCBwVXJsLCBNNE9TQV9rRmlsZVJlYWQpOwotICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLkJpdHNQZXJTYW1wbGUgPSAxNjsKLSAgICBjb250ZXh0LT5tX2RlY29kZXJDb25maWcuQXZnQnl0ZXNQZXJTZWMgPSBjb250ZXh0LT5tX2RlY29kZXJDb25maWcuU2FtcGxlRnJlcXVlbmN5ICogMiBcCi0gICAgICAgICogY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHM7Ci0gICAgZXJyID0gcEZpbGVGdW5jdGlvbi0+Z2V0T3B0aW9uKGNvbnRleHQtPm1fZmlsZUNvbnRleHQsIE00T1NBX2tGaWxlUmVhZEdldEZpbGVTaXplLAotICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24qKSYoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLkRhdGFMZW5ndGgpKTsKLSAgICBpZihNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGNvbnRleHQtPm1fYmxvY2tTaXplID0gMjA0OCAqIGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzOyAgLy8gUmF3IFBDTS4gIEhlbmNlLCBnZXQgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2h1bmsgb2YgZGF0YQotCi0gICAgaWYoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLlNhbXBsZUZyZXF1ZW5jeSA9PSA4MDAwKQotICAgIHsKLSAgICAgICAgLyogQU1SIGNhc2UsIG5vIHBiICovCi0gICAgICAgIGNvbnRleHQtPm1fYmxvY2tTaXplID0gY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHMgKlwKLSAgICAgICAgICAgICAoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLlNhbXBsZUZyZXF1ZW5jeSAvIDUwKSAqIFwKLSAgICAgICAgICAgICAgICAoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLkJpdHNQZXJTYW1wbGUgLyA4KTsKLSAgICB9Ci0gICAgaWYoY29udGV4dC0+bV9kZWNvZGVyQ29uZmlnLlNhbXBsZUZyZXF1ZW5jeSA9PSAxNjAwMCkKLSAgICB7Ci0gICAgICAgIC8qIEFBQyBjYXNlLCB3ZSBjYW4ndCByZWFkIG9ubHkgMjAgbXMgYmxvY2tzICovCi0gICAgICAgIGNvbnRleHQtPm1fYmxvY2tTaXplID0gMjA0OCAqIGNvbnRleHQtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzOwotICAgIH0KLSAgICBjb250ZXh0LT5tX2RhdGFTdGFydE9mZnNldCA9IDA7Ci0gICAgY29udGV4dC0+bV9wRmlsZVJlYWRGdW5jID0gcEZpbGVGdW5jdGlvbjsKLQotICAgIGNvbnRleHQtPm1fcEF1QnVmZmVyID0gKE00T1NBX01lbUFkZHIzMilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoY29udGV4dC0+bV9ibG9ja1NpemUsIE00V0FWX1JFQURFUiwKLSAgICAgICAgIChNNE9TQV9DaGFyICopIkNvcmUgUENNIHJlYWRlciBBY2Nlc3MgVW5pdCIpOwotICAgIGlmIChNNE9TQV9OVUxMID09IGNvbnRleHQtPm1fcEF1QnVmZmVyKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRFUlJfQUxMT0M7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICAvKiBDaGFuZ2Ugc3RhdGUgKi8KLSAgICBjb250ZXh0LT5tX3N0YXRlID0gTTRQQ01SX2tPcGVuaW5nOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLWNsZWFudXA6Ci0KLSAgICAvKiBDbG9zZSB0aGUgZmlsZSAqLwotICAgIGlmKGNvbnRleHQtPm1fcEZpbGVSZWFkRnVuYyAhPSBNNE9TQV9OVUxMKQotICAgICAgICBjb250ZXh0LT5tX3BGaWxlUmVhZEZ1bmMtPmNsb3NlUmVhZChjb250ZXh0LT5tX2ZpbGVDb250ZXh0KTsKLQotICAgIC8qIEZyZWUgaW50ZXJuYWwgY29udGV4dCAqLwotICAgIGZyZWUoY29udGV4dCk7Ci0gICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qIHBTdHJlYW1EZXNjKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBnZXQgdGhlICh1bmlxdWUpIHN0cmVhbSBvZiBhIFBDTSBmaWxlCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gQWxsb2NhdGVzIGFuZCBmaWxscyB0aGUgZGVjb2RlciBzcGVjaWZpYyBpbmZvIHN0cnVjdHVyZQotICogICAgICAgICAgLSBGaWxscyBkZWNvZGVyIHNwZWNpZmljIGluZm9zIHN0cnVjdHVyZQotICogICAgICAgICAgLSBGaWxscyBwU3RyZWFtRGVzYyBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgcFN0cmVhbURlc2M6IChJTikgU3RyZWFtIERlc2NyaXB0aW9uIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICBBbnkgTTRPU0FfRklMRSAgICAgIGVycm9ycyBzZWUgT1NBTCBGaWxlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbGVkIGVycm9ycwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX2dldE5leHRTdHJlYW0oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiogcFN0cmVhbURlc2MpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPSAoTTRQQ01SX0NvbnRleHQgKiljb250ZXh0OwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKChNNE9TQV9OVUxMID09IGNvbnRleHQpfHwgKE00T1NBX05VTEwgPT0gcFN0cmVhbURlc2MpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAoYy0+bV9zdGF0ZSA9PSBNNFBDTVJfa09wZW5pbmdfc3RyZWFtUmV0cmlldmVkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNOwotICAgIH0KLSAgICAvKiBDaGVjayBSZWFkZXIncyBtX3N0YXRlICovCi0gICAgaWYoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa09wZW5pbmcpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogT25seSBvbmUgc3RyZWFtIGlzIGNvbnRhaW5lZCBpbiBQQ00gZmlsZSAqLwotICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1JRCA9IDE7Ci0gICAgLyogTm90IHVzZWQgKi8KLSAgICBwU3RyZWFtRGVzYy0+cHJvZmlsZUxldmVsID0gMDsKLSAgICBwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBzaXplb2YoTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8pOwotCi0gICAgLyogQWxsb2NhdGVzIGRlY29kZXIgc3BlY2lmaWMgaW5mbyBzdHJ1Y3R1cmUgKi8KLSAgICBwU3RyZWFtRGVzYy0+ZGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAoTTRPU0FfTWVtQWRkcjMyKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UENNQ19EZWNvZGVyU3BlY2lmaWNJbmZvKSwgTTRXQVZfUkVBREVSLAotICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00UENNUl9nZXROZXh0U3RyZWFtIik7Ci0gICAgaWYocFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm8gPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgLyogRmlsbCBkZWNvZGVyU3BlY2lmaWNJbmZvIHN0cnVjdHVyZSwgd2l0aCBkZWNvZGVyIGNvbmZpZyBzdHJ1Y3R1cmUgZmlsbGVkIGluICdvcGVucmVhZCcKLSAgICAgICAgIGZ1bmN0aW9uICovCi0gICAgbWVtY3B5KCh2b2lkICopcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAodm9pZCAqKSZjLT5tX2RlY29kZXJDb25maWcsIHNpemVvZihNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbykpOwotCi0gICAgLyogRmlsbCBvdGhlciBmaWVsZHMgb2YgcFN0cmVhbURlc2Mgc3RydWN0dXJlICovCi0gICAgcFN0cmVhbURlc2MtPnRpbWVTY2FsZSA9IDEwMDA7Ci0gICAgcFN0cmVhbURlc2MtPmR1cmF0aW9uID0gKE00T1NBX1RpbWUpKCgoTTRPU0FfRG91YmxlKShjLT5tX2RlY29kZXJDb25maWcuRGF0YUxlbmd0aClcCi0gICAgICAgICAvIChNNE9TQV9Eb3VibGUpKGMtPm1fZGVjb2RlckNvbmZpZy5BdmdCeXRlc1BlclNlYykpKnBTdHJlYW1EZXNjLT50aW1lU2NhbGUpOwotICAgIHBTdHJlYW1EZXNjLT5hdmVyYWdlQml0cmF0ZSA9IGMtPm1fZGVjb2RlckNvbmZpZy5BdmdCeXRlc1BlclNlYyAqIDg7LyogaW4gYml0cywgbXVsdGlwbHkgYnkgOCovCi0gICAgcFN0cmVhbURlc2MtPm1heEJpdHJhdGUgPSBwU3RyZWFtRGVzYy0+YXZlcmFnZUJpdHJhdGU7IC8qIFBDTSBzdHJlYW0gaGFzIGNvbnN0YW50IGJpdHJhdGUgKi8KLQotICAgIC8qIERldGVybWluZXMgU3RyZWFtIHR5cGUgKi8KLSAgICBzd2l0Y2goYy0+bV9kZWNvZGVyQ29uZmlnLkJpdHNQZXJTYW1wbGUpCi0gICAgewotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICBzd2l0Y2goYy0+bV9kZWNvZGVyQ29uZmlnLm5iQ2hhbm5lbHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IE00U1lTX2tQQ01fOGJpdHNVOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgICAgICAgIGNhc2UgMjoKLS8vICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IE00U1lTX2tQQ01fOGJpdHNTOyAvKiA/Pz8gOGJpdHMgc3RlcmVvIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBkZWZpbmVkID8gKi8KLS8vICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgc3dpdGNoKGMtPm1fZGVjb2RlckNvbmZpZy5uYkNoYW5uZWxzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rUENNXzE2Yml0c1U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURlc2MtPnN0cmVhbVR5cGUgPSBNNFNZU19rUENNXzE2Yml0c1M7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EZXNjLT5zdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwU3RyZWFtRGVzYy0+c3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgfQotCi0gICAgYy0+bV9wRGVjb2RlclNwZWNJbmZvID0gcFN0cmVhbURlc2MtPmRlY29kZXJTcGVjaWZpY0luZm87Ci0KLSAgICBjLT5tX3N0YXRlID0gTTRQQ01SX2tPcGVuaW5nX3N0cmVhbVJldHJpZXZlZDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfc3RhcnRSZWFkaW5nKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRHMpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyByZWFkaW5nIHRoZSB1bmlxdWUgc3RyZWFtIG9mIGEgUENNIGZpbGUKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyB0byBzdGFydCByZWFkaW5nIGEgc3RyZWFtCi0gKiAgICAgICAgICAtIENoZWNrIHRoYXQgcHJvdmlkZWQgU3RyZWFtSWQgaXMgY29ycmVjdCAoYWx3YXlzIHRydWUsIG9ubHkgb25lIHN0cmVhbS4uLikKLSAqICAgICAgICAgICAgSW4gdGhlIHBsYXllciBhcHBsaWNhdGlvbiwgYSBTdHJlYW1JZCB0YWJsZSBpcyBpbml0aWFsaXplZCBhcyBmb2xsb3c6Ci0gKiAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtSUQgcFN0cmVhbUlEWzJdPXsxLDB9OwotICogICAgICAgICAgLSBDaGFuZ2Ugc3RhdGUgb2YgdGhlIHJlYWRlciBpbiAnUmVhZGluZycKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgc3RyZWFtSUQ6IChJTikgU3RyZWFtIHNlbGVjdGlvbgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgTTRFUlJfQkFEX1NUUkVBTV9JRCBhdCBsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbUlEIGRvZXMgbm90IGV4aXN0Ci0gKiAgICAgICAgICAoc2hvdWxkIG5ldmVyIGhhcHBlbiBpZiB0YWJsZSBwU3RyZWFtSUQgaXMgY29ycmVjdGx5IGluaXRpYWxpemVkIGFzIGFib3ZlKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRQQ01SX3N0YXJ0UmVhZGluZyhNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEKiBwU3RyZWFtSURzKQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0gKE00UENNUl9Db250ZXh0ICopY29udGV4dDsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBjb250ZXh0KSB8fCAoTTRPU0FfTlVMTCA9PSBwU3RyZWFtSURzKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgUmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZihjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZ19zdHJlYW1SZXRyaWV2ZWQpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgcFN0cmVhbUlEIGFuZCBpZiB0aGV5J3JlIE9LLCBjaGFuZ2UgcmVhZGVyJ3Mgc3RhdGUgKi8KLSAgICBpZihwU3RyZWFtSURzWzBdID09IDEgfHwgcFN0cmVhbUlEc1swXSA9PSAwKQotICAgIC8qIEZpcnN0IGFuZCB1bmlxdWUgc3RyZWFtIGNvbnRhaW5lZCBpbiBQQ00gZmlsZSAqLwotICAgIHsKLSAgICAgICAgYy0+bV9zdGF0ZSA9IE00UENNUl9rUmVhZGluZzsKLSAgICAgICAgYy0+bV9taWNyb1N0YXRlID0gTTRQQ01SX2tSZWFkaW5nOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQkFEX1NUUkVBTV9JRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX25leHRBVShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0KiBwQVUpCi0gKiBAYnJpZWYgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBuZXh0IEFVIGNvbnRhaW5lZCBpbiB0aGUgUENNIGZpbGUKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gOgotICogICAgICAgICAgLSBWZXJpZmllcyB0aGF0IHRoZSBjdXJyZW50IHJlYWRlcidzIHN0YXRlIGFsbG93cyB0byByZWFkIGFuIEFVCi0gKiAgICAgICAgICAtIEFsbG9jYXRlcyBtZW1vcnkgdG8gc3RvcmUgcmVhZCBBVQotICogICAgICAgICAgLSBSZWFkIGRhdGEgZnJvbSBmaWxlIGFuZCBzdG9yZSB0aGVtIGludG8gcHJldmlvdXNseSBhbGxvY2F0ZWQgbWVtb3J5Ci0gKiAgICAgICAgICAtIEZpbGwgQVUgc3RydWN0dXJlIGZpbGVkcyAoQ1RTLi4uKQotICogICAgICAgICAgLSBDaGFuZ2Ugc3RhdGUgb2YgdGhlIHJlYWRlciBpbiAnUmVhZGluZycgKG5vdCB1c2VmdWwuLi4pCi0gKiAgICAgICAgICAtIENoYW5nZSBNaWNybyBzdGF0ZSAnUmVhZGluZycgaW4gTTRQQ01SX2tSZWFkaW5nX25leHRBVQotICogICAgICAgICAgICAoQVUgaXMgcmVhZCBhbmQgY2FuIGJlIGRlbGV0ZWQpCi0gKiAgICAgICAgICAtIENoZWNrIGlmIHRoZSBsYXN0IEFVIGhhcyBiZWVuIHJlYWQgb3IgaWYgd2UncmUgYWJvdXQgdG8gcmVhZCBpdAotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBzdHJlYW1JRDogKElOKSBTdHJlYW0gc2VsZWN0aW9uCi0gKiBAcGFyYW0gICBwQVU6IChJTi9PVVQpIEFjY2VzIFVuaXQgU3RydWN0dXJlCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTlVMTAotICogQHJldHVybiAgTTRFUlJfQUxMT0MgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIG5vdwotICogQHJldHVybiAgTTRNNFdBUl9OT19EQVRBX1lFVCB0aGVyZSBpcyBubyBlbm91Z2ggZGF0YSBpbiB0aGUgZmlsZSB0byBwcm92aWRlIGEgbmV3IGFjY2VzcyB1bml0LgotICogQHJldHVybiAgTTRXQVJfRU5EX09GX1NUUkVBTSBUaGVyZSBpcyBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRoZSBzYW1wbGUgbnVtYmVyIGlzIGJpZ2dlciB0aGUgbWF4aW11bSBvbmUuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfbmV4dEFVKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9IChNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIHNpemVfcmVhZDsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBjb250ZXh0KSB8fCAoTTRPU0FfTlVMTCA9PSBwQVUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBSZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tSZWFkaW5nICYmIGMtPm1fbWljcm9TdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGVzIEFVIGRhdGFBZHJlc3MgKi8KLSAgICBwQVUtPmRhdGFBZGRyZXNzID0gYy0+bV9wQXVCdWZmZXI7Ci0gICAgc2l6ZV9yZWFkICAgICAgICA9IGMtPm1fYmxvY2tTaXplOwotCi0gICAgaWYoKGMtPm1fb2Zmc2V0ICsgc2l6ZV9yZWFkKSA+PSBjLT5tX2RlY29kZXJDb25maWcuRGF0YUxlbmd0aCkKLSAgICB7Ci0gICAgICAgIHNpemVfcmVhZCA9IGMtPm1fZGVjb2RlckNvbmZpZy5EYXRhTGVuZ3RoIC0gYy0+bV9vZmZzZXQ7Ci0gICAgfQotCi0gICAgLyogUmVhZCBkYXRhIGluIGZpbGUsIGFuZCBjb3B5IGl0IHRvIEFVIFN0cnVjdHVyZSAqLwotICAgIGVyciA9IGMtPm1fcEZpbGVSZWFkRnVuYy0+cmVhZERhdGEoYy0+bV9maWxlQ29udGV4dCwgKE00T1NBX01lbUFkZHI4KXBBVS0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAoTTRPU0FfVUludDMyICopJnNpemVfcmVhZCk7Ci0gICAgaWYoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIENhbGN1bGF0ZXMgdGhlIG5ldyBtX29mZnNldCwgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSdyZSBhdCBlbmQgb2YgcmVhZGluZyBvciBub3QgKi8KLSAgICBjLT5tX29mZnNldCA9IGMtPm1fb2Zmc2V0ICsgc2l6ZV9yZWFkOwotCi0gICAgLyogRmlsbCBvdGhlcnMgcGFyYW1ldGVycyBvZiBBVSBzdHJ1Y3R1cmUgKi8KLSAgICBwQVUtPkNUUyA9Ci0gICAgICAgICAoTTRPU0FfVGltZSkoKChNNE9TQV9Eb3VibGUpYy0+bV9vZmZzZXQvKE00T1NBX0RvdWJsZSljLT5tX2RlY29kZXJDb25maWcuQXZnQnl0ZXNQZXJTZWMpXAotICAgICAgICAgICAgKjEwMDApOwotICAgIHBBVS0+RFRTID0gcEFVLT5DVFM7Ci0KLSAgICBwQVUtPmF0dHJpYnV0ZSAgPSAwOwotICAgIHBBVS0+ZnJhZyAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgcEFVLT5uYkZyYWcgICAgID0gMDsKLSAgICBwQVUtPnN0cmVhbSAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBBVS0+c2l6ZSAgICAgICA9IHNpemVfcmVhZDsKLQotICAgIC8qIENoYW5nZSBzdGF0ZXMgKi8KLSAgICBjLT5tX3N0YXRlID0gTTRQQ01SX2tSZWFkaW5nOyAvKiBOb3QgY2hhbmdlZCAuLi4gKi8KLSAgICBjLT5tX21pY3JvU3RhdGUgPSBNNFBDTVJfa1JlYWRpbmdfbmV4dEFVOyAvKiBBVSBpcyByZWFkIGFuZCBjYW4gYmUgZGVsZXRlZCAqLwotCi0gICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW5vdGhlciBBVSB0byByZWFkICovCi0gICAgLyogaWU6IGlmIGRlY29kZWQgbmIgb2YgYnl0ZXMgPSBuYiBvZiBieXRlcyB0byBkZWNvZGUsCi0gICAgICAgICBpdCBtZWFucyB0aGVyZSBpcyBubyBtb3JlIEFVIHRvIGRlY29kZSAqLwotICAgIGlmKGMtPm1fb2Zmc2V0ID49IGMtPm1fZGVjb2RlckNvbmZpZy5EYXRhTGVuZ3RoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9mcmVlQVUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCBzdHJlYW1JRCwgTTRTWVNfQWNjZXNzVW5pdCogcEFVKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgQVUgcHJvdmlkZWQgaW4gcGFyYW1ldGVyCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCByZWFkZXIncyBzdGF0ZSBhbGxvd3MgdG8gZnJlZSBhbiBBVQotICogICAgICAgICAgLSBGcmVlIGRhdGFBZGRyZXNzIGZpZWxkIG9mIEFVIHN0cnVjdHVyZQotICogICAgICAgICAgLSBDaGFuZ2Ugc3RhdGUgb2YgdGhlIHJlYWRlciBpbiAnUmVhZGluZycgKG5vdCB1c2VmdWwuLi4pCi0gKiAgICAgICAgICAtIENoYW5nZSBNaWNybyBzdGF0ZSAnUmVhZGluZycgaW4gTTRQQ01SX2tSZWFkaW5nIChhbm90aGVyIEFVIGNhbiBiZSByZWFkKQotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBzdHJlYW1JRDogKElOKSBTdHJlYW0gc2VsZWN0aW9uCi0gKiBAcGFyYW0gICBwQVU6IChJTikgQWNjZXMgVW5pdCBTdHJ1Y3R1cmUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFBDTVJfZnJlZUFVKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSUQsIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSkKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9IChNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKE00T1NBX05VTEwgPT0gY29udGV4dCApIHx8IChNNE9TQV9OVUxMID09IHBBVSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIFJlYWRlcidzIHN0YXRlICovCi0gICAgaWYoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcgJiYgYy0+bV9taWNyb1N0YXRlICE9IE00UENNUl9rUmVhZGluZ19uZXh0QVUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgcEFVLT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBDaGFuZ2Ugc3RhdGVzICovCi0gICAgYy0+bV9zdGF0ZSA9IE00UENNUl9rUmVhZGluZzsgLyogTm90IGNoYW5nZWQgLi4uICovCi0gICAgYy0+bV9taWNyb1N0YXRlID0gTTRQQ01SX2tSZWFkaW5nOyAvKiBBVSBpcyBkZWxldGVkLCBhbm90aGVyIEFVIGNhbiBiZSByZWFkICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX3NlZWsoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFNZU19TdHJlYW1JRCogcFN0cmVhbUlELAotICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUgdGltZSwgTTRTWVNfc2Vla0FjY2Vzc01vZGUgc2Vla0FjY2Vzc01vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVGltZSogcE9idGFpbkNUU1tdKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBzZWVrcyBpbnRvIHRoZSBQQ00gZmlsZSBhdCB0aGUgcHJvdmlkZWQgdGltZQotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgcmVhZGVyJ3Mgc3RhdGUgYWxsb3dzIHRvIHNlZWsKLSAqICAgICAgICAgIC0gRGV0ZXJtaW5lcyBmcm9tIHByb3ZpZGVkIHRpbWUgbV9vZmZzZXQgdG8gc2VlayBpbiBmaWxlCi0gKiAgICAgICAgICAtIElmIG1fb2Zmc2V0IGlzIGNvcnJlY3QsIHNlZWsgaW4gZmlsZQotICogICAgICAgICAgLSBVcGRhdGUgbmV3IG1fb2Zmc2V0IGluIFBDTSByZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgY29udGV4dDogKElOL09VVCkgUENNIFJlYWRlciBjb250ZXh0Ci0gKiBAcGFyYW0gICBwU3RyZWFtSUQ6IChJTikgU3RyZWFtIHNlbGVjdGlvbiAobm90IHVzZWQsIG9ubHkgMSBzdHJlYW0pCi0gKiBAcGFyYW0gICB0aW1lOiAoSU4pIFRhcmdldGVkIHRpbWUKLSAqIEBwYXJhbSAgIHNlZWtNb2RlOiAoSU4pIFNlbGVjdHMgdGhlIHNlZWsgYWNjZXNzIG1vZGUKLSAqIEBwYXJhbSAgIHBPYnRhaW5DVFNbXTogKE9VVCkgUmV0dXJuZWQgVGltZSAobm90IHVzZWQpCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBOVUxMCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqIEByZXR1cm4gIE00V0FSX0lOVkFMSURfVElNRSAgICAgIFNwZWNpZmllZCB0aW1lIGlzIG5vdCByZWFjaGFibGUKLSAqIEBwYXJhbSAgIE00RVJSX05PVF9JTVBMRU1FTlRFRCAgIFRoaXMgc2VlayBtb2RlIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9zZWVrKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRTWVNfU3RyZWFtSUQqIHBTdHJlYW1JRCwgTTRPU0FfVGltZSB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1NlZWtBY2Nlc3NNb2RlIHNlZWtBY2Nlc3NNb2RlLCBNNE9TQV9UaW1lKiBwT2J0YWluQ1RTKQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0gKE00UENNUl9Db250ZXh0ICopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgb2Zmc2V0OwotICAgIE00T1NBX1VJbnQzMiBhbGlnbm1lbnQ7Ci0gICAgTTRPU0FfVUludDMyIHNpemVfcmVhZDsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZigoTTRPU0FfTlVMTCA9PSBjb250ZXh0KSB8fCAoTTRPU0FfTlVMTCA9PSBwU3RyZWFtSUQpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBSZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tPcGVuaW5nX3N0cmVhbVJldHJpZXZlZCAmJiBjLT5tX3N0YXRlICE9IE00UENNUl9rUmVhZGluZykKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICBzd2l0Y2goc2Vla0FjY2Vzc01vZGUpCi0gICAgewotICAgICAgICBjYXNlIE00U1lTX2tCZWdpbm5pbmc6Ci0gICAgICAgICAgICAvKiBEZXRlcm1pbmUgbV9vZmZzZXQgZnJvbSB0aW1lKi8KLSAgICAgICAgICAgIG9mZnNldCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikodGltZSAqICgoTTRPU0FfRG91YmxlKShjLT5tX2RlY29kZXJDb25maWcuQXZnQnl0ZXNQZXJTZWMpIC8gMTAwMCkpOwotICAgICAgICAgICAgLyoqIGNoZWNrIHRoZSBhbGlnbm1lbnQgb24gc2FtcGxlIGJvdW5kYXJ5ICovCi0gICAgICAgICAgICBhbGlnbm1lbnQgPSBjLT5tX2RlY29kZXJDb25maWcubmJDaGFubmVscypjLT5tX2RlY29kZXJDb25maWcuQml0c1BlclNhbXBsZS84OwotICAgICAgICAgICAgaWYgKG9mZnNldCVhbGlnbm1lbnQgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvZmZzZXQgLT0gb2Zmc2V0JWFsaWdubWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qYWRkIHRoZSBoZWFkZXIgb2Zmc2V0Ki8KLSAgICAgICAgICAgIG9mZnNldCArPSBjLT5tX2RhdGFTdGFydE9mZnNldDsKLSAgICAgICAgICAgIC8qIElmIG1fb2Zmc2V0IGlzIG92ZXIgZmlsZSBzaXplIC0+IEludmFsaWQgdGltZSAqLwotICAgICAgICAgICAgaWYgKG9mZnNldCA+IChjLT5tX2RhdGFTdGFydE9mZnNldCArIGMtPm1fZGVjb2RlckNvbmZpZy5EYXRhTGVuZ3RoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfSU5WQUxJRF9USU1FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFNlZWsgZmlsZSAqLwotICAgICAgICAgICAgICAgIHNpemVfcmVhZCA9IG9mZnNldDsKLSAgICAgICAgICAgICAgICBlcnIgPSBjLT5tX3BGaWxlUmVhZEZ1bmMtPnNlZWsoYy0+bV9maWxlQ29udGV4dCwgTTRPU0Ffa0ZpbGVTZWVrQmVnaW5uaW5nLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRmlsZVBvc2l0aW9uICopICZzaXplX3JlYWQpOwotICAgICAgICAgICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIG1fb2Zmc2V0IGluIE00UENNUl9jb250ZXh0ICovCi0gICAgICAgICAgICAgICAgYy0+bV9vZmZzZXQgPSBvZmZzZXQgLSBjLT5tX2RhdGFTdGFydE9mZnNldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBDTVJfY2xvc2VSZWFkKE00T1NBX0NvbnRleHQgY29udGV4dCkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gY2xvc2VzIFBDTSBmaWxlLCBhbmQgZnJlZXMgY29udGV4dAotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgcmVhZGVyJ3Mgc3RhdGUgYWxsb3dzIGNsb3NlIHRoZSBQQ00gZmlsZQotICogICAgICAgICAgLSBDbG9zZXMgdGhlIGZpbGUKLSAqICAgICAgICAgIC0gRnJlZSBzdHJ1Y3R1cmVzCi0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBub3cKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9jbG9zZVJlYWQoTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00UENNUl9Db250ZXh0ICpjID0gKE00UENNUl9Db250ZXh0ICopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZihNNE9TQV9OVUxMID09IGNvbnRleHQpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKGMtPm1fcERlY29kZXJTcGVjSW5mbyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZShjLT5tX3BEZWNvZGVyU3BlY0luZm8pOwotICAgIH0KLQotICAgIC8qIENoZWNrIFJlYWRlcidzIHN0YXRlICovCi0gICAgaWYoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotICAgIGVsc2UgaWYoYy0+bV9taWNyb1N0YXRlID09IE00UENNUl9rUmVhZGluZ19uZXh0QVUpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gYy0+bV9wQXVCdWZmZXIpCi0gICAgewotICAgICAgICBmcmVlKGMtPm1fcEF1QnVmZmVyKTsKLSAgICB9Ci0KLSAgICAvKiBDbG9zZSB0aGUgZmlsZSAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IGMtPm1fcEZpbGVSZWFkRnVuYykKLSAgICB7Ci0gICAgICAgIGVyciA9IGMtPm1fcEZpbGVSZWFkRnVuYy0+Y2xvc2VSZWFkKGMtPm1fZmlsZUNvbnRleHQpOwotICAgIH0KLQotICAgIC8qIEZyZWUgaW50ZXJuYWwgY29udGV4dCAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IGMpCi0gICAgewotICAgICAgICBmcmVlKGMpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UENNUl9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFBDTVJfT3B0aW9uSUQgb3B0aW9uSUQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiogcFZhbHVlKQotICogQGJyaWVmICAgVGhpcyBmdW5jdGlvbiBnZXQgb3B0aW9uIG9mIHRoZSBQQ00gUmVhZGVyCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIDoKLSAqICAgICAgICAgIC0gVmVyaWZpZXMgdGhhdCB0aGUgY3VycmVudCByZWFkZXIncyBzdGF0ZSBhbGxvd3MgdG8gZ2V0IGFuIG9wdGlvbgotICogICAgICAgICAgLSBSZXR1cm4gY29ycmVzcG9uZGluZyBvcHRpb24gdmFsdWUKLSAqIEBwYXJhbSAgIGNvbnRleHQ6IChJTi9PVVQpIFBDTSBSZWFkZXIgY29udGV4dAotICogQHBhcmFtICAgb3B0aW9uSUQ6IChJTikgSUQgb2YgdGhlIG9wdGlvbiB0byBnZXQKLSAqIEBwYXJhbSAgIHBWYWx1ZTogKE9VVCkgVmFyaWFibGUgd2hlcmUgdGhlIG9wdGlvbiB2YWx1ZSBpcyByZXR1cm5lZAotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwuCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lLgotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgdGhpcyBvcHRpb24gaXMgbm90IGF2YWlsYWJsZSBub3cuCi0gKiBAcmV0dXJuICBNNEVSUl9OT1RfSU1QTEVNRU5URUQgICB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFBDTVJfT3B0aW9uSUQgb3B0aW9uSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24qIHBWYWx1ZSkKLXsKLSAgICBNNFBDTVJfQ29udGV4dCAqYyA9KE00UENNUl9Db250ZXh0ICopY29udGV4dDsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZihNNE9TQV9OVUxMID09IGNvbnRleHQpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIHJlYWRlcidzIHN0YXRlICovCi0gICAgaWYoKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tPcGVuaW5nKSAmJiAoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa09wZW5pbmdfc3RyZWFtUmV0cmlldmVkKVwKLSAgICAgICAgICYmIChjLT5tX3N0YXRlICE9IE00UENNUl9rUmVhZGluZykpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogRGVwZW5kIG9mIHRoZSBPcHRpb25JRCwgdGhlIHZhbHVlIHRvIHJldHVybiBpcyBkaWZmZXJlbnQgKi8KLSAgICBzd2l0Y2gob3B0aW9uSUQpCi0gICAgewotICAgICAgICBjYXNlIE00UENNUl9rUENNYmxvY2tTaXplOgotICAgICAgICAgICAgKnBWYWx1ZSA9ICZjLT5tX2Jsb2NrU2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQQ01SX3NldE9wdGlvbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UENNUl9PcHRpb25JRCBvcHRpb25JRCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRGF0YU9wdGlvbiBWYWx1ZSkKLSAqIEBicmllZiAgIFRoaXMgZnVuY3Rpb24gc2V0IG9wdGlvbiBvZiB0aGUgUENNIFJlYWRlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiA6Ci0gKiAgICAgICAgICAtIFZlcmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgcmVhZGVyJ3Mgc3RhdGUgYWxsb3dzIHRvIHNldCBhbiBvcHRpb24KLSAqICAgICAgICAgIC0gU2V0IGNvcnJlc3BvbmRpbmcgb3B0aW9uIHZhbHVlCi0gKiBAcGFyYW0gICBjb250ZXh0OiAoSU4vT1VUKSBQQ00gUmVhZGVyIGNvbnRleHQKLSAqIEBwYXJhbSAgIG9wdGlvbklEOiAoSU4pIElEIG9mIHRoZSBvcHRpb24gdG8gZ2V0Ci0gKiBAcGFyYW0gICBWYWx1ZTogKElOKSBWYXJpYWJsZSB3aGVyZSB0aGUgb3B0aW9uIHZhbHVlIGlzIHN0b3JlZAotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IuCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVIgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE5VTEwuCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICB0aGUgb3B0aW9uSUQgaXMgbm90IGEgdmFsaWQgb25lLgotICogQHJldHVybiAgTTRFUlJfU1RBVEUgICAgICAgICAgICAgdGhpcyBvcHRpb24gaXMgbm90IGF2YWlsYWJsZSBub3cuCi0gKiBAcmV0dXJuICBNNEVSUl9OT1RfSU1QTEVNRU5URUQgICB0aGlzIG9wdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UENNUl9zZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNFBDTVJfT3B0aW9uSUQgb3B0aW9uSUQsIE00T1NBX0RhdGFPcHRpb24gVmFsdWUpCi17Ci0gICAgTTRQQ01SX0NvbnRleHQgKmMgPShNNFBDTVJfQ29udGV4dCAqKWNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoY29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayByZWFkZXIncyBzdGF0ZSAqLwotICAgIGlmKChjLT5tX3N0YXRlICE9IE00UENNUl9rT3BlbmluZykgJiYgKGMtPm1fc3RhdGUgIT0gTTRQQ01SX2tPcGVuaW5nX3N0cmVhbVJldHJpZXZlZClcCi0gICAgICAgICAmJiAoYy0+bV9zdGF0ZSAhPSBNNFBDTVJfa1JlYWRpbmcpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIERlcGVuZCBvZiB0aGUgT3B0aW9uSUQsIHRoZSB2YWx1ZSB0byBzZXQgaXMgZGlmZmVyZW50ICovCi0gICAgc3dpdGNoKG9wdGlvbklEKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFBDTVJfa1BDTWJsb2NrU2l6ZToKLSAgICAgICAgICAgIGMtPm1fYmxvY2tTaXplID0gKE00T1NBX1VJbnQzMikodWludHB0cl90KVZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UENNUl9nZXRWZXJzaW9uIChNNF9WZXJzaW9uSW5mbyAqcFZlcnNpb24pCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX1RSQUNFMV8xKCJNNFBDTVJfZ2V0VmVyc2lvbiBjYWxsZWQgd2l0aCBwVmVyc2lvbjogMHgleCIsIHBWZXJzaW9uKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKChNNE9TQV9VSW50MzIpIHBWZXJzaW9uID09IDApLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJwVmVyc2lvbiBpcyBOVUxMIGluIE00UENNUl9nZXRWZXJzaW9uIik7Ci0KLSAgICBwVmVyc2lvbi0+bV9tYWpvciA9IE00UENNUl9WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uLT5tX21pbm9yID0gTTRQQ01SX1ZFUlNJT05fTUlOT1I7Ci0gICAgcFZlcnNpb24tPm1fcmV2aXNpb24gPSBNNFBDTVJfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBUTzNHUFBfQVBJLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9BUEkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDQyZmZiNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000UFRPM0dQUF9BUEkuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UFRPM0dQUF9BUEkuYwotICogQGJyaWVmICAgUGljdHVyZSB0byAzZ3BwIFNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoxNiBieXRlcyBzaWduYXR1cmUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgZ2VuZXJhdGVkIDNncCBmaWxlcyAqLwotI2RlZmluZSBNNFBUTzNHUFBfU0lHTkFUVVJFICAgICAiTlhQLVNXIDogUFRPM0dQUCIKLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0vKioKLSAqICBPdXIgaGVhZGVyICovCi0jaW5jbHVkZSAiTTRQVE8zR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFBUTzNHUFBfQVBJLmgiCi0KLS8qKgotICogIE91ciBlcnJvcnMgKi8KLSNpbmNsdWRlICJNNFBUTzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0jaW5jbHVkZSAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaCIKLSNlbmRpZgotCi0KLS8qKgotICogIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAgICAgICAvKiBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgICAgIC8qIE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqIFZhcmlvdXMgTWFnaWNhbHMgKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIE00UFRPM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTTRQVE8zR1BQX1FVQU5USVpFUl9TVEVQICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAvKio8IFF1YW50aXplciBzdGVwICovCi0jZGVmaW5lIE00UFRPM0dQUF9XUklURVJfQVVESU9fUFJPRklMRV9MRVZFTCAgICAgICAgICAgIDB4RkYgICAgLyoqPCBObyBzcGVjaWZpYyBwcm9maWxlIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgKi8KLSNkZWZpbmUgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19BTVJfVElNRV9TQ0FMRSAgICAgICAgICAgODAwMCAgICAvKio8IEFNUiAqLwotI2RlZmluZSBNNFBUTzNHUFBfQklUUkFURV9SRUdVTEFUSU9OX0NUU19QRVJJT0RfSU5fTVMgICA1MDAgICAgIC8qKjwgTUFHSUNBTCAqLwotI2RlZmluZSBNNFBUTzNHUFBfTUFSR0VfT0ZfRklMRV9TSVpFICAgICAgICAgICAgICAgICAgICAyNTAwMCAgIC8qKjwgTUFHSUNBTCAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBkZWZpbmUgICBBTVIgMTIuMiBrYnBzIHNpbGVuY2UgZnJhbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jZGVmaW5lIE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8xMjJfU0laRSAgICAgMzIKLSNkZWZpbmUgTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzEyMl9EVVJBVElPTiAyMAotY29uc3QgTTRPU0FfVUludDggTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFXzEyMl9GUkFNRVtNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMTIyX1NJWkVdPQoteyAweDNDLCAweDkxLCAweDE3LCAweDE2LCAweEJFLCAweDY2LCAweDc4LCAweDAwLCAweDAwLCAweDAxLCAweEU3LCAweEFGLAotICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07Ci0KLSNkZWZpbmUgTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFICAgICAxMwotI2RlZmluZSBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OIDIwCi1jb25zdCBNNE9TQV9VSW50OCBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfMDQ4X0ZSQU1FW000UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRV0gPQoteyAweDA0LCAweEZGLCAweDE4LCAweEM3LCAweEYwLCAweDBELCAweDA0LCAweDMzLCAweEZGLCAweEUwLCAweDAwLCAweDAwLCAweDAwIH07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqICJQcml2YXRlIiBmdW5jdGlvbnMgKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCogcEMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKiogIkV4dGVybmFsIiBmdW5jdGlvbnMgKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gTTRPU0FfRVJSIE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzKE00V1JJVEVSX091dHB1dEZpbGVUeXBlKiBwVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiogU3JjR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ci1leHRlcm4gTTRPU0FfRVJSIE00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzKE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKTsKLWV4dGVybiBNNE9TQV9FUlIgTTRSRUFERVJfM0dQX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKiogIlN0YXRpYyIgZnVuY3Rpb25zICoqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIE00T1NBX0VSUiBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMTIyRnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0NvbnRleHQqIHBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfQWNjZXNzVW5pdCogcFdyaXRlckF1ZGlvQVUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaW1lIG10SW5jQ3RzKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTA0OEZyYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBXcml0ZXJBdWRpb0FVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UaW1lIG10SW5jQ3RzKTsKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvKiBwVmVyc2lvbkluZm8pOwotICogQGJyaWVmICAgR2V0IHRoZSBNNFBUTzNHUFAgdmVyc2lvbi4KLSAqIEBub3RlICAgIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICBwVmVyc2lvbkluZm8gICAgICAgIChPVVQpIFBvaW50ZXIgdG8gYSB2ZXJzaW9uIGluZm8gc3RydWN0dXJlCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBWZXJzaW9uSW5mbyBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfR2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX0dldFZlcnNpb24gY2FsbGVkIHdpdGggcFZlcnNpb25JbmZvPTB4JXgiLCBwVmVyc2lvbkluZm8pOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBWZXJzaW9uSW5mbyksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIk00UFRPM0dQUF9HZXRWZXJzaW9uOiBwVmVyc2lvbkluZm8gaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgcFZlcnNpb25JbmZvLT5tX21ham9yICAgICAgID0gTTRQVE8zR1BQX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX21pbm9yICAgICAgID0gTTRQVE8zR1BQX1ZFUlNJT05fTUlOT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX3JldmlzaW9uICAgID0gTTRQVE8zR1BQX1ZFUlNJT05fUkVWSVNJT047Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRQVE8zR1BQX0luaXQoTTRQVE8zR1BQX0NvbnRleHQqIHBDb250ZXh0KTsKLSAqIEBicmllZiAgIEluaXRpYWxpemVzIHRoZSBNNFBUTzNHUFAgKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENvbnRleHQgICAgICAgICAgICAoT1VUKSBQb2ludGVyIG9uIHRoZSBNNFBUTzNHUFAgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgcEZpbGVSZWFkUHRyRmN0ICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00T1NBX0VSUiBNNFBUTzNHUFBfSW5pdCggICBNNFBUTzNHUFBfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHJGY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIqIHBGaWxlV3JpdGVQdHJGY3QpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgKnBDOwotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00UFRPM0dQUF9Jbml0IGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJNNFBUTzNHUFBfSW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogIEFsbG9jYXRlIHRoZSBNNFBUTzNHUFAgY29udGV4dCBhbmQgcmV0dXJuIGl0IHRvIHRoZSB1c2VyICovCi0gICAgcEMgPSAoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KSwgTTRQVE8zR1BQLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0Iik7Ci0gICAgKnBDb250ZXh0ID0gcEM7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcEMpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1N0ZXAoKTogdW5hYmxlIHRvIGFsbG9jYXRlIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQsXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBJbml0IHRoZSBjb250ZXh0LiBBbGwgcG9pbnRlcnMgbXVzdCBiZSBpbml0aWFsaXplZCB0byBNNE9TQV9OVUxMIGJlY2F1c2UgQ2xlYW5VcCgpCi0gICAgICAgIGNhbiBiZSBjYWxsZWQganVzdCBhZnRlciBJbml0KCkuICovCi0gICAgcEMtPm1fU3RhdGUgPSBNNFBUTzNHUFBfa1N0YXRlX0NSRUFURUQ7Ci0gICAgcEMtPm1fVmlkZW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0gICAgcEMtPm1fQXVkaW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfTk9TVFJFQU07Ci0KLSAgICAvKioKLSAgICAgKiAgUmVhZGVyIHN0dWZmICovCi0gICAgcEMtPm1fcFJlYWRlckF1ZGlvQVUgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0gICAgPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgICogIFdyaXRlciBzdHVmZiAqLwotICAgIHBDLT5tX3BFbmNvZGVySGVhZGVyICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0gICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm89IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mbz0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICAqICBDb250ZXh0cyBvZiB0aGUgdXNlZCBtb2R1bGVzICAqLwotICAgIHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0ICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcE1wNEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9lRW5jb2RlclN0YXRlID0gTTRQVE8zR1BQX2tOb0VuY29kZXI7Ci0KLSAgICAvKioKLSAgICAgKiAgSW50ZXJmYWNlcyBvZiB0aGUgdXNlZCBtb2R1bGVzICovCi0gICAgcEMtPm1fcFJlYWRlckdsb2JJbnQgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSW50ICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wV3JpdGVyR2xvYkludCAgICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1fcFdyaXRlckRhdGFJbnQgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BFbmNvZGVySW50ICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wRW5jb2RlckV4dGVybmFsQVBJID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wRW5jb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICAqIEZpbGwgdGhlIE9TQUwgZmlsZSBmdW5jdGlvbiBzZXQgKi8KLSAgICBwQy0+cE9zYWxGaWxlUmVhZCA9IHBGaWxlUmVhZFB0ckZjdDsKLSAgICBwQy0+cE9zYWxGaWxlV3JpdGUgPSBwRmlsZVdyaXRlUHRyRmN0OwotCi0gICAgLyoqCi0gICAgICogIFZpZGVvIHJhdGUgY29udHJvbCBzdHVmZiAqLwotICAgIHBDLT5tX210Q3RzICAgICAgICAgICAgID0gMC4wRjsKLSAgICBwQy0+bV9tdE5leHRDdHMgICAgICAgICA9IDAuMEY7Ci0gICAgcEMtPm1fbXRBdWRpb0N0cyAgICAgICAgPSAwLjBGOwotICAgIHBDLT5tX0F1ZGlvT2ZmU2V0ICAgICAgID0gMC4wRjsKLSAgICBwQy0+bV9kTGFzdFZpZGVvUmVndWxDdHM9IDAuMEY7Ci0gICAgcEMtPm1fUHJldkF1ZGlvQ3RzICAgICAgPSAwLjBGOwotICAgIHBDLT5tX0RlbHRhQXVkaW9DdHMgICAgID0gMC4wRjsKLQotICAgIHBDLT5tX01heEZpbGVTaXplICAgICAgID0gMDsKLSAgICBwQy0+bV9DdXJyZW50RmlsZVNpemUgICA9IDA7Ci0KLSAgICBwQy0+bV9Jc0xhc3RQaWN0dXJlICAgICAgICAgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bV9iQXVkaW9QYWRkaW5nU2lsZW5jZSAgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bV9iTGFzdEludGVybmFsQ2FsbEJhY2sgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+bV9OYkN1cnJlbnRGcmFtZSAgICAgICAgPSAwOwotCi0gICAgcEMtPnBTYXZlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+dWlTYXZlZER1cmF0aW9uID0gMDsKLQotICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfSW5pdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfT3BlbihNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCwgTTRQVE8zR1BQX1BhcmFtcyogcFBhcmFtcyk7Ci0gKiBAYnJpZWYgICBTZXQgdGhlIE00UFRPM0dQUCBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLgotICogQG5vdGUgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgbWF5IG5vdCBiZSBjcmVhdGVkIHlldC4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHBhcmFtICAgcFBhcmFtcyAgICAgICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBQVE8zR1BQLgotICogQG5vdGUgICAgVGhlIHBvaW50ZWQgc3RydWN0dXJlIGNhbiBiZSBkZS1hbGxvY2F0ZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGJlY2F1c2UKLSAqICAgICAgICAgIGl0IGlzIGludGVybmFsbHkgY29waWVkIGJ5IHRoZSBQVE8zR1BQCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgICAgICBNNFBUTzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMgVGhlIG91dHB1dCB2aWRlbyBmcmFtZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIHBhcmFtZXRlciBpcyBpbmNvbXBhdGlibGUgd2l0aCBIMjYzIGVuY29kaW5nCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCAgICAgICBUaGUgb3V0cHV0IHZpZGVvIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFICAgICAgVGhlIG91dHB1dCB2aWRlbyBiaXQtcmF0ZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GUkFNRV9TSVpFICAgVGhlIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX0ZJTEVfU0laRSAgICAgICAgICBUaGUgb3V0cHV0IGZpbGUgc2l6ZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVuZGVmaW5lZAotICogQHJldHVybiAgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX0FVRElPX1BBRERJTkcgICAgICAgICAgICAgVGhlIG91dHB1dCBhdWRpbyBwYWRkaW5nIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdW5kZWZpbmVkCi0gKiBAcmV0dXJuICBFUlJfUFRPM0dQUF9VTkhBTkRMRURfQVVESU9fVFJBQ0tfSU5QVVRfRklMRSAgICBUaGUgaW5wdXQgYXVkaW8gZmlsZSBjb250YWlucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSB0cmFjayBmb3JtYXQgbm90IGhhbmRsZWQgYnkgUFRPM0dQUAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX09wZW4oTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQsIE00UFRPM0dQUF9QYXJhbXMqIHBQYXJhbXMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgICAqcEMgPSAoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCopKHBDb250ZXh0KTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00UkVBREVSX01lZGlhRmFtaWx5ICAgIG1lZGlhRmFtaWx5OwotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgIHBTdHJlYW1IYW5kbGVyOwotICAgIE00UkVBREVSX01lZGlhVHlwZSAgICAgIHJlYWRlck1lZGlhVHlwZTsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJNNFBUTzNHUFBfT3BlbiBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwUGFyYW1zPTB4JXgiLCBwQ29udGV4dCwgcFBhcmFtcyk7Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwgXAotICAgICAgICAgICAgICAgICAgICAiTTRQVE8zR1BQX09wZW46IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFBhcmFtcyksICBNNEVSUl9QQVJBTUVURVIsIFwKLSAgICAgICAgICAgICAgICAgICAgIk00UFRPM0dQUF9PcGVuOiBwUGFyYW1zIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICBDaGVjayBwYXJhbWV0ZXJzIGNvcnJlY3RuZXNzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBQYXJhbXMtPnBQaWN0dXJlQ2FsbGJhY2tGY3QpLAotICAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLCAiTTRQVE8zR1BQX09wZW46IHBDLT5tX1BhcmFtcy5wUGljdHVyZUNhbGxiYWNrRmN0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFBhcmFtcy0+cFBpY3R1cmVDYWxsYmFja0N0eHQpLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgIk00UFRPM0dQUF9PcGVuOiBwQy0+bV9QYXJhbXMucFBpY3R1cmVDYWxsYmFja0N0eHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwUGFyYW1zLT5wT3V0cHV0M2dwcEZpbGUpLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00UFRPM0dQUF9PcGVuOiBwQy0+bV9QYXJhbXMucE91dHB1dDNncHBGaWxlIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFBhcmFtcy0+cFRlbXBvcmFyeUZpbGUpLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwgIk00UFRPM0dQUF9PcGVuOiBwQy0+bV9QYXJhbXMucFRlbXBvcmFyeUZpbGUgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gRm9ybWF0ICovCi0gICAgaWYoIChNNFZJREVPRURJVElOR19rSDI2MyAhPSBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCkgJiYKLSAgICAgICAgKE00VklERU9FRElUSU5HX2tNUEVHNCAhPSBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCkgJiYKLSAgICAgICAgKE00VklERU9FRElUSU5HX2tIMjY0ICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0KSkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW46IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gZm9ybWF0Iik7Ci0gICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICAgfQotCi0gICAgIC8qKgotICAgICAqIFZpZGVvIEJpdHJhdGUgKi8KLSAgICBpZighKChNNFZJREVPRURJVElOR19rMTZfS0JQUyAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazI0X0tCUFMgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2szMl9LQlBTICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rNDhfS0JQUyAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazY0X0tCUFMgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2s5Nl9LQlBTICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMTI4X0tCUFMgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2syNTZfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMjg4X0tCUFMgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazM4NF9LQlBTICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2s1MTJfS0JQUyAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rODAwX0tCUFMgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAvKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgIChNNFZJREVPRURJVElOR19rMl9NQlBTICAgICAgICA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpIHx8Ci0gICAgICAgICAoTTRWSURFT0VESVRJTkdfazVfTUJQUyAgICAgICAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlKSB8fAotICAgICAgICAgKE00VklERU9FRElUSU5HX2s4X01CUFMgICAgICAgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSkgfHwKLSAgICAgICAgIChNNFZJREVPRURJVElOR19rVkFSSUFCTEVfS0JQUyA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUpKSkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW46IFVuZGVmaW5lZCBvdXRwdXQgdmlkZW8gYml0cmF0ZSIpOwotICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZpZGVvIGZyYW1lIHNpemUgKi8KLSAgICBpZiAoISgoTTRWSURFT0VESVRJTkdfa1NRQ0lGID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rUVFWR0EgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tRQ0lGID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rUVZHQSA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfa0NJRiAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tWR0EgID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotCi0gICAgICAgICAgKE00VklERU9FRElUSU5HX2tOVFNDID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rV1ZHQSA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLQotICAgICAgICAgIChNNFZJREVPRURJVElOR19rNjQwXzM2MCA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfazg1NF80ODAgPT0gcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUpIHx8Ci0gICAgICAgICAgKE00VklERU9FRElUSU5HX2sxMjgwXzcyMCA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfazEwODBfNzIwID09IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSB8fAotICAgICAgICAgIChNNFZJREVPRURJVElOR19rOTYwXzcyMCA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgfHwKLSAgICAgICAgICAoTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MCA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkpKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFBUTzNHUFBfT3BlbjogVW5kZWZpbmVkIG91dHB1dCB2aWRlbyBmcmFtZSBzaXplIik7Ci0gICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWF4aW11bSBzaXplIG9mIHRoZSBvdXRwdXQgM0dQUCBmaWxlICovCi0gICAgaWYgKCEoKE00UFRPM0dQUF9rNTBfS0IgICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfazc1X0tCICAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2sxMDBfS0IgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rMTUwX0tCICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfazIwMF9LQiAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2szMDBfS0IgICAgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpIHx8Ci0gICAgICAgICAgKE00UFRPM0dQUF9rNDAwX0tCICAgID09IHBQYXJhbXMtPk91dHB1dEZpbGVNYXhTaXplKSB8fAotICAgICAgICAgIChNNFBUTzNHUFBfazUwMF9LQiAgICA9PSBwUGFyYW1zLT5PdXRwdXRGaWxlTWF4U2l6ZSkgfHwKLSAgICAgICAgICAoTTRQVE8zR1BQX2tVTkxJTUlURUQgPT0gcFBhcmFtcy0+T3V0cHV0RmlsZU1heFNpemUpKSkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW46IFVuZGVmaW5lZCBvdXRwdXQgM0dQUCBmaWxlIHNpemUiKTsKLSAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfRklMRV9TSVpFOwotICAgIH0KLQotICAgIC8qIEF1ZGlvIHBhZGRpbmcgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwUGFyYW1zLT5wSW5wdXRBdWRpb1RyYWNrRmlsZSkgewotICAgICAgICBpZiAoKCEoIChNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfTm9uZSAgID09IHBQYXJhbXMtPkF1ZGlvUGFkZGluZ01vZGUpIHx8Ci0gICAgICAgICAgICAgICAgKE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9TaWxlbmNlPT0gcFBhcmFtcy0+QXVkaW9QYWRkaW5nTW9kZSkgfHwKLSAgICAgICAgICAgICAgICAoTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX0xvb3AgICA9PSBwUGFyYW1zLT5BdWRpb1BhZGRpbmdNb2RlKSkpKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX09wZW46IFVuZGVmaW5lZCBhdWRpbyBwYWRkaW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX0FVRElPX1BBRERJTkc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKio8IFNpemUgY2hlY2sgZm9yIEgyNjMgKG9ubHkgdmFsaWQgc2l6ZXMgYXJlIENJRiwgUUNJRiBhbmQgU1FDSUYpICovCi0gICAgaWYgKChNNFZJREVPRURJVElOR19rSDI2MyA9PSBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCkgJiYKLSAgICAgICAgKE00VklERU9FRElUSU5HX2tTUUNJRiAhPSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkgJiYKLSAgICAgICAgKE00VklERU9FRElUSU5HX2tRQ0lGICE9IHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplKSAmJgotICAgICAgICAoTTRWSURFT0VESVRJTkdfa0NJRiAhPSBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9PcGVuKCk6XAotICAgICAgICAgICAgIHJldHVybmluZyBFUlJfUFRPM0dQUF9JTlZBTElEX1ZJREVPX0ZSQU1FX1NJWkVfRk9SX0gyNjMiKTsKLSAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX0lOVkFMSURfVklERU9fRlJBTUVfU0laRV9GT1JfSDI2MzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgQ2hlY2sgc3RhdGUgYXV0b21hdG9uICovCi0gICAgaWYgKE00UFRPM0dQUF9rU3RhdGVfQ1JFQVRFRCAhPSBwQy0+bV9TdGF0ZSkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTogV3JvbmcgU3RhdGUgKCVkKSwgcmV0dXJuaW5nIE00RVJSX1NUQVRFIiwgcEMtPm1fU3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29weSB0aGUgTTRQVE8zR1BQX1BhcmFtcyBzdHJ1Y3R1cmUgKi8KLSAgICBtZW1jcHkoKHZvaWQgKikoJnBDLT5tX1BhcmFtcyksCi0gICAgICAgICAgICAgICAgKHZvaWQgKilwUGFyYW1zLCBzaXplb2YoTTRQVE8zR1BQX1BhcmFtcykpOwotICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3Blbjogb3V0cHV0VmlkZW9CaXRyYXRlID0gJWQiLCBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlKTsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBPcGVuIGlucHV0IGZpbGUgd2l0aCB0aGUgcmVhZGVyICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX1BhcmFtcy5wSW5wdXRBdWRpb1RyYWNrRmlsZSkgewotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSByZWFkZXIgaW50ZXJmYWNlIGFjY29yZGluZyB0byB0aGUgaW5wdXQgYXVkaW8gZmlsZSB0eXBlICovCi0gICAgICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuQXVkaW9GaWxlRm9ybWF0KQotICAgICAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUjoKLSAgICAgICAgZXJyID0gTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoICZyZWFkZXJNZWRpYVR5cGUsICZwQy0+bV9wUmVhZGVyR2xvYkludCwKLSAgICAgICAgICAgICAgICAmcEMtPm1fcFJlYWRlckRhdGFJbnQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOiBNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlcyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIEFBQ19TVVBQT1JURUQKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgICAgIGVyciA9IE00UkVBREVSXzNHUF9nZXRJbnRlcmZhY2VzKCAmcmVhZGVyTWVkaWFUeXBlLCAmcEMtPm1fcFJlYWRlckdsb2JJbnQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+bV9wUmVhZGVyRGF0YUludCk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IE00UkVBREVSXzNHUF9nZXRJbnRlcmZhY2VzIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkhBTkRMRURfQVVESU9fVFJBQ0tfSU5QVVRfRklMRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAgSW5pdGlhbGl6ZXMgdGhlIHJlYWRlciBzaGVsbCAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0Q3JlYXRlKCZwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4oKTogcFJlYWRlckdsb2JJbnQtPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSW50LT5tX3JlYWRlckNvbnRleHQgPSBwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0OwotICAgICAgICAvKio8IExpbmsgdGhlIHJlYWRlciBpbnRlcmZhY2UgdG8gdGhlIHJlYWRlciBjb250ZXh0ICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBTZXQgdGhlIHJlYWRlciBzaGVsbCBmaWxlIGFjY2VzcyBmdW5jdGlvbnMgKi8KLSAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdFNldE9wdGlvbihwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyLCAgKE00T1NBX0RhdGFPcHRpb24pcEMtPnBPc2FsRmlsZVJlYWQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOiBwUmVhZGVyR2xvYkludC0+bV9wRmN0U2V0T3B0aW9uIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBPcGVuIHRoZSBpbnB1dCBhdWRpbyBmaWxlICovCi0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RPcGVuKHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICBwQy0+bV9QYXJhbXMucElucHV0QXVkaW9UcmFja0ZpbGUpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOiBwUmVhZGVyR2xvYkludC0+bV9wRmN0T3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdERlc3Ryb3kocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCk7Ci0gICAgICAgICAgICBwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogIEdldCB0aGUgYXVkaW8gc3RyZWFtcyBmcm9tIHRoZSBpbnB1dCBmaWxlICovCi0gICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgIHdoaWxlIChNNE5PX0VSUk9SID09IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPm1fcFJlYWRlckdsb2JJbnQtPm1fcEZjdEdldE5leHRTdHJlYW0ocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAmbWVkaWFGYW1pbHksICZwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgICAgIGlmKChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUpKSB8fAotICAgICAgICAgICAgICAgICAgIChlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRXQVJfVE9PX01VQ0hfU1RSRUFNUykpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SID09IGVycikgLyoqPCBPbmUgc3RyZWFtIGZvdW5kICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBGb3VuZCBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICBpZiAoKE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvID09IG1lZGlhRmFtaWx5KQotICAgICAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopcFN0cmVhbUhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgICAgIC8qKjwgS2VlcCBwb2ludGVyIHRvIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9PcGVuKCk6IEZvdW5kIGFuIGF1ZGlvIHN0cmVhbSBpbiBpbnB1dCIpOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqICBBbGxvY2F0ZSBhdWRpbyBBVSB1c2VkIGZvciByZWFkIG9wZXJhdGlvbnMgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvQVUgPSAoTTRfQWNjZXNzVW5pdCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNF9BY2Nlc3NVbml0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00UFRPM0dQUCwoTTRPU0FfQ2hhciAqKSJwUmVhZGVyQXVkaW9BVSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wUmVhZGVyQXVkaW9BVSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9PcGVuKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBwUmVhZGVyQXVkaW9BVSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RGaWxsQXVTdHJ1Y3QocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlciwgcEMtPm1fcFJlYWRlckF1ZGlvQVUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwUmVhZGVyR2xvYkludC0+bV9wRmN0RmlsbEF1U3RydWN0KGF1ZGlvKXJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoTTRXQVJfTk9fTU9SRV9TVFJFQU0gIT0gZXJyKSAvKio8IFVuZXhwZWN0ZWQgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJHbG9iSW50LT5tX3BGY3RHZXROZXh0U3RyZWFtIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvKiB3aGlsZSovCi0gICAgfSAvKmlmIChNNE9TQV9OVUxMICE9IHBDLT5tX1BhcmFtcy5wSW5wdXRBdWRpb1RyYWNrRmlsZSkqLwotCi0gICAgcEMtPm1fVmlkZW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfU1RBUlRFRDsKLQotICAgIC8qKgotICAgICAqIEluaXQgdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBDLT5tX0F1ZGlvU3RhdGUgPSBNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX1NUQVJURUQ7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RSZXNldChwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9PcGVuKCk6IHBSZWFkZXJEYXRhSW50LT5tX3BGY3RSZXNldChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqICBVcGRhdGUgc3RhdGUgYXV0b21hdG9uICovCi0gICAgcEMtPm1fU3RhdGUgPSBNNFBUTzNHUFBfa1N0YXRlX09QRU5FRDsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbWF4IEZpbGUgc2l6ZSAqLwotICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuT3V0cHV0RmlsZU1heFNpemUpCi0gICAgewotICAgIGNhc2UgTTRQVE8zR1BQX2s1MF9LQjogIHBDLT5tX01heEZpbGVTaXplID0gNTAwMDA7ICBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rNzVfS0I6ICBwQy0+bV9NYXhGaWxlU2l6ZSA9IDc1MDAwOyAgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazEwMF9LQjogcEMtPm1fTWF4RmlsZVNpemUgPSAxMDAwMDA7IGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2sxNTBfS0I6IHBDLT5tX01heEZpbGVTaXplID0gMTUwMDAwOyBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rMjAwX0tCOiBwQy0+bV9NYXhGaWxlU2l6ZSA9IDIwMDAwMDsgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfazMwMF9LQjogcEMtPm1fTWF4RmlsZVNpemUgPSAzMDAwMDA7IGJyZWFrOwotICAgIGNhc2UgTTRQVE8zR1BQX2s0MDBfS0I6IHBDLT5tX01heEZpbGVTaXplID0gNDAwMDAwOyBicmVhazsKLSAgICBjYXNlIE00UFRPM0dQUF9rNTAwX0tCOiBwQy0+bV9NYXhGaWxlU2l6ZSA9IDUwMDAwMDsgYnJlYWs7Ci0gICAgY2FzZSBNNFBUTzNHUFBfa1VOTElNSVRFRDoKLSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9PcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9TdGVwKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KTsKLSAqIEBicmllZiAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgdHJhbmNvZGluZy4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgTTRFUlJfU1RBVEU6ICAgIE00UFRPM0dQUCBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICBNNFBUTzNHUFBfV0FSX0VORF9PRl9QUk9DRVNTSU5HIEVuY29kaW5nIGNvbXBsZXRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX1N0ZXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgKnBDID0gKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyIGxfdWlBdWRpb1N0ZXBDb3VudCA9IDA7Ci0gICAgTTRPU0FfSW50MzIgIEp1bXBUb1RpbWUgPSAwOwotICAgIE00T1NBX1RpbWUgIG10SW5jQ3RzOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNFBUTzNHUFBfU3RlcDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIGlmICggISgoTTRQVE8zR1BQX2tTdGF0ZV9PUEVORUQgPT0gcEMtPm1fU3RhdGUpIHx8IChNNFBUTzNHUFBfa1N0YXRlX1JFQURZID09IHBDLT5tX1N0YXRlKSkgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IFdyb25nIFN0YXRlICglZCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsIHBDLT5tX1N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqCi0gICAgICogIEluIGNhc2UgdGhpcyBpcyB0aGUgZmlyc3Qgc3RlcCwgd2UgcHJlcGFyZSB0aGUgZGVjb2RlciwgdGhlIGVuY29kZXIgYW5kIHRoZSB3cml0ZXIgKi8KLSAgICBpZiAoTTRQVE8zR1BQX2tTdGF0ZV9PUEVORUQgPT0gcEMtPm1fU3RhdGUpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRQVE8zR1BQX1N0ZXAoKTogVGhpcyBpcyB0aGUgZmlyc3Qgc3RlcCwgXAotICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIE00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nIik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBQcmVwYXJlIHRoZSByZWFkZXIsIHRoZSBkZWNvZGVyLCB0aGUgZW5jb2RlciwgdGhlIHdyaXRlci4uLiAqLwotICAgICAgICBlcnIgPSBNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZyhwQyk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9TdGVwKCk6IE00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKCkgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogIFVwZGF0ZSBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICAgICAgcEMtPm1fU3RhdGUgPSBNNFBUTzNHUFBfa1N0YXRlX1JFQURZOwotCi0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfU3RlcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiAoYSkiKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7IC8qKjwgd2Ugb25seSBkbyB0aGF0IGluIHRoZSBmaXJzdCBzdGVwLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBSRUFMIHN0ZXAgd2lsbCBiZSB0aGUgbmV4dCBvbmUgKi8KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgdGFyZ2V0ZWQgZmlsZSBzaXplLgotICAgICAqIFdlIGRvIHRoYXQgYmVmb3JlIHRoZSBlbmNvZGluZywgYmVjYXVzZSB0aGUgY29yZSBlbmNvZGVyIGhhcyB0byBrbm93IGlmIHRoaXMgaXMKLSAgICAgKiB0aGUgbGFzdCBmcmFtZSB0byBlbmNvZGUgKi8KLSAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdEdldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfa0ZpbGVTaXplQXVkaW9Fc3RpbWF0ZWQsIChNNE9TQV9EYXRhT3B0aW9uKSAmcEMtPm1fQ3VycmVudEZpbGVTaXplKTsKLSAgICBpZiAoKDAgIT0gcEMtPm1fTWF4RmlsZVNpemUpICYmCi0gICAgICAgIC8qKjwgQWRkIGEgbWFyZ2UgdG8gdGhlIGZpbGUgc2l6ZSBpbiBvcmRlciB0byBuZXZlciBleGNlZWQgdGhlIG1heCBmaWxlIHNpemUgKi8KLSAgICAgICAoKHBDLT5tX0N1cnJlbnRGaWxlU2l6ZSArIE00UFRPM0dQUF9NQVJHRV9PRl9GSUxFX1NJWkUpID49IHBDLT5tX01heEZpbGVTaXplKSkKLSAgICB7Ci0gICAgICAgIHBDLT5tX0lzTGFzdFBpY3R1cmUgPSBNNE9TQV9UUlVFOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAqICBBdCB0aGF0IHBvaW50IHdlIGFyZSBpbiBNNFBUTzNHUFBfa1N0YXRlX1JFQURZIHN0YXRlCi0gICAgKiAgV2UgcGVyZm9ybSBvbmUgc3RlcCBvZiB2aWRlbyBlbmNvZGluZwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qKioqKioqKioqKioqIFZJREVPIEVOQ09ESU5HICoqKioqKioqKioqKioqKi8KLSAgICBpZiAoTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9TVEFSVEVEID09IHBDLT5tX1ZpZGVvU3RhdGUpIC8qKjxJZiB0aGUgdmlkZW8gZW5jb2RpbmcgaXMgZ29pbmcgb24qLwotICAgIHsgICAvKioKLSAgICAgICAgICogQ2FsbCB0aGUgZW5jb2RlciAgKi8KLSAgICAgICAgcEMtPm1fTmJDdXJyZW50RnJhbWUrKzsKLQotICAgICAgICAvKiBDaGVjayBpZiBpdCBpcyB0aGUgbGFzdCBmcmFtZSB0aGUgdG8gZW5jb2RlICovCi0gICAgICAgIGlmKChwQy0+bV9QYXJhbXMuTmJWaWRlb0ZyYW1lcyA+IDApIFwKLSAgICAgICAgICAgICYmIChwQy0+bV9OYkN1cnJlbnRGcmFtZSA+PSBwQy0+bV9QYXJhbXMuTmJWaWRlb0ZyYW1lcykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5tX0lzTGFzdFBpY3R1cmUgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIk00UFRPM0dQUF9TdGVwKCk6IENhbGxpbmcgcEVuY29kZXJJbnQtPnBGY3RFbmNvZGUgd2l0aCB2aWRlb0N0cyA9ICUuMmZcCi0gICAgICAgICAgICAgICAgICAgICAgIG5iID0gJWx1IiwgcEMtPm1fbXRDdHMsIHBDLT5tX05iQ3VycmVudEZyYW1lKTsKLQotICAgICAgICBlcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdEVuY29kZShwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQsIE00T1NBX05VTEwsCi0gICAgICAgICAgICAvKio8IFRoZSBpbnB1dCBwbGFuZSBpcyBudWxsIGJlY2F1c2UgdGhlIGlucHV0IFBpY3R1cmUgd2lsbCBiZSBvYnRhaW5lZCBieSB0aGVcCi0gICAgICAgICAgICBWUFAgZmlsdGVyIGZyb20gdGhlIGNvbnRleHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9tdEN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEMtPm1fSXNMYXN0UGljdHVyZSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX2tMYXN0RnJhbWUgOiBNNEVOQ09ERVJfa05vcm1hbEZyYW1lKSApOwotICAgICAgICAvKio8IExhc3QgcGFyYW0gc2V0IHRvIE00T1NBX1RSVUUgc2lnbmFscyB0aGF0IHRoaXMgaXMgdGhlIGxhc3QgZnJhbWUgdG8gYmUgZW5jb2RlZCxcCi0gICAgICAgIE00T1NBX0ZBTFNFIGVsc2UgKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMigiTTRQVE8zR1BQX1N0ZXAoKTogcEVuY29kZXJJbnQtPnBGY3RFbmNvZGUgcmV0dXJucyAweCV4LCB2aWRGb3JtYXQgPTB4JXgiLAotICAgICAgICAgICAgZXJyLCBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpOwotICAgICAgICBpZigoTTROT19FUlJPUiA9PSBlcnIpICYmIChNNFZJREVPRURJVElOR19rSDI2NCA9PSBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiBsYXN0IGZyYW1lLioKLSAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9Jc0xhc3RQaWN0dXJlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfU3RlcCgpOiBMYXN0IHBpY3R1cmUiKTsKLSAgICAgICAgICAgICAgICBwQy0+bV9WaWRlb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKE00V0FSX05PX01PUkVfQVUgPT0gZXJyKSAvKio8IFRoZSB2aWRlbyBlbmNvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRQVE8zR1BQX1N0ZXAoKTogcEVuY29kZXJJbnQtPnBGY3RFbmNvZGUgcmV0dXJucyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICBwQy0+bV9WaWRlb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChNNE5PX0VSUk9SICE9IGVycikgICAgIC8qKjwgVW5leHBlY3RlZCBlcnJvciBjb2RlICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCAoKChNNE9TQV9VSW50MzIpTTRXQVJfV1JJVEVSX1NUT1BfUkVRKSA9PSBlcnIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICgoKE00T1NBX1VJbnQzMilNNEVSUl9BTExPQykgPT0gZXJyKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9TdGVwOiByZXR1cm5pbmcgRVJSX1BUTzNHUFBfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1N0ZXAoKTogcEVuY29kZXJJbnQtPnBGY3RFbmNvZGUobGFzdCkgKGEpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gLyoqPCBFbmQgb2YgdmlkZW8gZW5jb2RpbmcgKi8KLQotCi0gICAgLyoqKioqKiBBVURJTyBUUkFOU0NPRElORyAocmVhZCArIG51bGwgZW5jb2RpbmcgKyB3cml0ZSkgKioqKioqLwotICAgIGlmIChNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX1NUQVJURUQgPT0gcEMtPm1fQXVkaW9TdGF0ZSkKLSAgICB7Ci0gICAgICAgIHdoaWxlICggKE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfU1RBUlRFRCA9PSBwQy0+bV9BdWRpb1N0YXRlKSAmJgotICAgICAgICAgICAgICAgIChwQy0+bV9tdEF1ZGlvQ3RzIDwgcEMtPm1fbXROZXh0Q3RzKSkKLQotICAgICAgICB7Ci0gICAgICAgICAgICBsX3VpQXVkaW9TdGVwQ291bnQrKzsKLSAgICAgICAgICAgIGlmIChNNE9TQV9GQUxTRSA9PSBwQy0+bV9iQXVkaW9QYWRkaW5nU2lsZW5jZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKio8IFJlYWQgdGhlIG5leHQgYXVkaW8gQVUgaW4gdGhlIGlucHV0IEF1ZGlvIGZpbGUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyRGF0YUludC0+bV9wRmN0R2V0TmV4dEF1KHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0sIHBDLT5tX3BSZWFkZXJBdWRpb0FVKTsKLSAgICAgICAgICAgICAgICBwQy0+bV9tdEF1ZGlvQ3RzID0gcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fQ1RTICsgcEMtPm1fQXVkaW9PZmZTZXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpICAgIC8qIFRoZSBhdWRpbyB0cmFuc2NvZGluZyBpcyBmaW5pc2hlZCAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UFRPM0dQUF9TdGVwKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWFkZXJEYXRhSW50LT5tX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLkF1ZGlvUGFkZGluZ01vZGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX05vbmU6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9BdWRpb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFBUTzNHUFBfa0F1ZGlvUGFkZGluZ01vZGVfU2lsZW5jZToKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRG8gbm90aGluZyBpZiB0aGUgaW5wdXQgYXVkaW8gZmlsZSBmb3JtYXQgaXMgbm90IEFNUiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fQXVkaW9TdGF0ZSA9IE00UFRPM0dQUF9rU3RyZWFtU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX2JBdWRpb1BhZGRpbmdTaWxlbmNlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRQVE8zR1BQX2tBdWRpb1BhZGRpbmdNb2RlX0xvb3A6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEp1bXAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXVkaW8gZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3RKdW1wKHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0sICZKdW1wVG9UaW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJlYWRlckRhdGFJbnQtPm1fcEZjdFJlc2V0KGF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX210QXVkaW9DdHMgKz0gMjA7IC8qPCBTRU1DIGJ1ZyBmaXhlZCBhdCBMdW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX0F1ZGlvT2ZmU2V0ID0gcEMtPm1fbXRBdWRpb0N0czsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogJ0JaWlonIGJ1ZyBmaXg6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFkZCBhIHNpbGVuY2UgZnJhbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRJbmNDdHMgPSAoTTRPU0FfVGltZSkoKHBDLT5tX210QXVkaW9DdHMpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnRpbWVTY2FsZSAvIDEwMDAuMCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMTIyRnJhbWUocEMtPm1fcFdyaXRlckRhdGFJbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgJnBDLT5tX1dyaXRlckF1ZGlvQVUsIG10SW5jQ3RzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFBUTzNHUFBfQWRkQW1yU2lsZW5jZVNpZCByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS8qKjwgQWRkID0+IG5vIGF1ZGlvIGN0cyBpbmNyZW1lbnQuLi4qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9BdWRpb09mZlNldCA9IHBDLT5tX210QXVkaW9DdHMgKyBwQy0+bV9EZWx0YUF1ZGlvQ3RzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSAvKiBlbmQgb2Y6IHN3aXRjaCAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBwUmVhZGVyRGF0YUludC0+bV9wRmN0R2V0TmV4dEF1KEF1ZGlvKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFNhdmUgdGhlIGRlbHRhIEN0cyAoQUFDIG9ubHkpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX0RlbHRhQXVkaW9DdHMgPSBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9DVFMgLSBwQy0+bV9QcmV2QXVkaW9DdHM7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX1ByZXZBdWRpb0N0cyAgPSBwQy0+bV9wUmVhZGVyQXVkaW9BVS0+bV9DVFM7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqICBQcmVwYXJlIHRoZSB3cml0ZXIgQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPm1fcFdyaXRlckRhdGFJbnQtPnBTdGFydEFVKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5tX1dyaXRlckF1ZGlvQVUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBwV3JpdGVyRGF0YUludC0+cFN0YXJ0QVUoQXVkaW8pXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIENvcHkgYXVkaW8gZGF0YSBmcm9tIHJlYWRlciBBVSB0byB3cml0ZXIgQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00UFRPM0dQUF9TdGVwKCk6IENvcHlpbmcgYXVkaW8gQVU6IHNpemU9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5tX1dyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFJlYWRlckF1ZGlvQVUtPm1fc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuc2l6ZSA9IHBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX3NpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqICBDb252ZXJ0IENUUyB1bml0IGZyb20gbWlsbGlzZWNvbmRzIHRvIHRpbWVzY2FsZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5DVFMgID0gKE00T1NBX1RpbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+bV9BdWRpb09mZlNldCArIHBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX0NUUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+dGltZVNjYWxlIC8gMTAwMC4wKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuQ1RTID0gKE00T1NBX1RpbWUpKHBDLT5tX210QXVkaW9DdHMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnRpbWVTY2FsZSAvIDEwMDAuMCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUubmJGcmFnID0gMDsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzEoIk00UFRPM0dQUF9TdGVwKCk6IGF1ZGlvIEFVOiBDVFM9JWQgbXMiLCBwQy0+bV9tdEF1ZGlvQ3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAvKnBDLT5tX3BSZWFkZXJBdWRpb0FVLT5tX0NUUyovKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogIFdyaXRlIGl0IHRvIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+bV9wV3JpdGVyRGF0YUludC0+cFByb2Nlc3NBVShwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+bV9Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBwV3JpdGVyRGF0YUludC0+cFByb2Nlc3NBVShBdWRpbylcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyoqPCBNNE9TQV9UUlVFID09IHBDLT5tX2JBdWRpb1BhZGRpbmdTaWxlbmNlICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZCA9PQotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBGaWxsIGluIGF1ZGlvIGF1IHdpdGggc2lsZW5jZSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9tdEF1ZGlvQ3RzICs9IDIwOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBQYWRkIHdpdGggc2lsZW5jZSAqLwotICAgICAgICAgICAgICAgICAgICBtdEluY0N0cyA9IChNNE9TQV9UaW1lKShwQy0+bV9tdEF1ZGlvQ3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAqIChwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnRpbWVTY2FsZSAvIDEwMDAuMCkpOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWUocEMtPm1fcFdyaXRlckRhdGFJbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgJnBDLT5tX1dyaXRlckF1ZGlvQVUsIG10SW5jQ3RzKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfU3RlcCgpOiBNNFBUTzNHUFBfQWRkQW1yU2lsZW5jZVNpZCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgLyoqPCBEbyBub3RoaW5nIGlmIHRoZSBpbnB1dCBhdWRpbyBmaWxlIGZvcm1hdCBpcyBub3QgQU1SICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+bV9BdWRpb1N0YXRlID0gTTRQVE8zR1BQX2tTdHJlYW1TdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvKio8IHdoaWxlICovCi0gICAgfSAvKio8IEVuZCBvZiBhdWRpbyBlbmNvZGluZyAqLwotCi0gICAgcEMtPm1fbXRDdHMgPSBwQy0+bV9tdE5leHRDdHM7Ci0KLSAgICAvKioKLSAgICAgKiAgVGhlIHRyYW5zY29kaW5nIGlzIGZpbmlzaGVkIHdoZW4gbm8gc3RyZWFtIGlzIGJlaW5nIGVuY29kZWQgYW55bW9yZSAqLwotICAgIGlmIChNNFBUTzNHUFBfa1N0cmVhbVN0YXRlX0ZJTklTSEVEID09IHBDLT5tX1ZpZGVvU3RhdGUpCi0gICAgewotICAgICAgICBwQy0+bV9TdGF0ZSA9IE00UFRPM0dQUF9rU3RhdGVfRklOSVNIRUQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNFBUTzNHUFBfU3RlcCgpOiB0cmFuc2NvZGluZyBmaW5pc2hlZCwgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgcmV0dXJuIE00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkc7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9TdGVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIChiKSIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfQ2xvc2UoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpOwotICogQGJyaWVmICAgRmluaXNoIHRoZSBNNFBUTzNHUFAgdHJhbnNjb2RpbmcuCi0gKiBAbm90ZSAgICBUaGUgb3V0cHV0IDNHUFAgZmlsZSBpcyByZWFkeSB0byBiZSBwbGF5ZWQgYWZ0ZXIgdGhpcyBjYWxsCi0gKiBAcGFyYW0gICBwQ29udGV4dCAgICAgICAgICAgIChJTikgTTRQVE8zR1BQIGNvbnRleHQKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUjogICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoSWYgRGVidWcgTGV2ZWwgPj0gMikKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFOiAgICBNNFBUTzNHUFAgaXMgbm90IGluIGFuIGFwcHJvcHJpYXRlIHN0YXRlIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX0Nsb3NlKE00UFRPM0dQUF9Db250ZXh0IHBDb250ZXh0KQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXsKLSAgICBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KikocENvbnRleHQpOwotICAgIE00T1NBX0VSUiAgICBvc2FFcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBsYXN0Q1RTOwotICAgIE00RU5DT0RFUl9IZWFkZXIqIGVuY0hlYWRlcjsKLSAgICBNNFNZU19TdHJlYW1JRG1lbUFkZHIgc3RyZWFtSGVhZGVyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00UFRPM0dQUF9DbG9zZSBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRQVE8zR1BQX0Nsb3NlOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiAoKHBDLT5tX1N0YXRlICE9IE00UFRPM0dQUF9rU3RhdGVfT1BFTkVEKSAmJgotICAgICAgICAocEMtPm1fU3RhdGUgIT0gTTRQVE8zR1BQX2tTdGF0ZV9SRUFEWSkgJiYKLSAgICAgICAgKHBDLT5tX1N0YXRlICE9IE00UFRPM0dQUF9rU3RhdGVfRklOSVNIRUQpKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9DbG9zZSgpOiBXcm9uZyBTdGF0ZSAoJWQpLCByZXR1cm5pbmcgTTRFUlJfU1RBVEUiLCBwQy0+bV9TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogRmluaXNoIHRoZSBlbmNvZGluZyAqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAoTTRQVE8zR1BQX2tTdGF0ZV9SRUFEWSA9PSBwQy0+bV9TdGF0ZSkKLSAgICB7Ci0gICAgICAgIHBDLT5tX1N0YXRlID0gTTRQVE8zR1BQX2tTdGF0ZV9GSU5JU0hFRDsKLSAgICB9Ci0KLSAgICBpZiAoTTRQVE8zR1BQX2tFbmNvZGVyUnVubmluZyA9PSBwQy0+bV9lRW5jb2RlclN0YXRlKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5tX3BFbmNvZGVySW50LT5wRmN0U3RvcCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBvc2FFcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdFN0b3AocEMtPm1fcE1wNEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IG9zYUVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX2Nsb3NlOiBtX3BFbmNvZGVySW50LT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLCBvc2FFcnIpOwotICAgICAgICAgICAgICAgIC8qIFdlbGwuLi4gaG93IHRoZSBoZWNrIGRvIHlvdSBoYW5kbGUgYSBmYWlsZWQgY2xlYW51cD8gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5tX2VFbmNvZGVyU3RhdGUgPSBNNFBUTzNHUFBfa0VuY29kZXJTdG9wcGVkOwotICAgIH0KLQotICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIG9wZW5lZD8gRG9uJ3QgY2xvc2UgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICBpZiAoTTRQVE8zR1BQX2tFbmNvZGVyU3RvcHBlZCA9PSBwQy0+bV9lRW5jb2RlclN0YXRlKQotICAgIHsKLSAgICAgICAgb3NhRXJyID0gcEMtPm1fcEVuY29kZXJJbnQtPnBGY3RDbG9zZShwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBvc2FFcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfY2xvc2U6IG1fcEVuY29kZXJJbnQtPnBGY3RDbG9zZSByZXR1cm5zIDB4JXgiLCBvc2FFcnIpOwotICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fZUVuY29kZXJTdGF0ZSA9IE00UFRPM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogQ2xvc2UgM0dQIG91dCAqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0KSAgLyogaGFwcGVucyBpbiBzdGF0ZSBfU0VUICovCi0gICAgewotICAgICAgICAvKiBIVyBlbmNvZGVyOiBmZXRjaCB0aGUgRFNJIGZyb20gdGhlIHNoZWxsIHZpZGVvIGVuY29kZXIsIGFuZCBmZWVkIGl0IHRvIHRoZSB3cml0ZXIgYmVmb3JlCi0gICAgICAgIGNsb3NpbmcgaXQuICovCi0gICAgICAgIGlmICgoTTRWSURFT0VESVRJTkdfa01QRUc0ID09IHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCkKLSAgICAgICAgICAgIHx8IChNNFZJREVPRURJVElOR19rSDI2NCA9PSBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBvc2FFcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdEdldE9wdGlvbihwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgTTRFTkNPREVSX2tPcHRpb25JRF9FbmNvZGVySGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pJmVuY0hlYWRlcik7Ci0gICAgICAgICAgICBpZiAoIChNNE5PX0VSUk9SICE9IG9zYUVycikgfHwgKE00T1NBX05VTEwgPT0gZW5jSGVhZGVyLT5wQnVmKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9jbG9zZTogZmFpbGVkIHRvIGdldCB0aGUgZW5jb2RlciBoZWFkZXIgKGVyciAweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgIG9zYUVycik7Ci0gICAgICAgICAgICAgICAgLyoqPCBubyByZXR1cm4gaGVyZSwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBkZWFsbG9jYXRlIGFmdGVyIGNsb3NlLCBldmVuIGlmIFwKLSAgICAgICAgICAgICAgICBpdCBmYWlscy4gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBzZXQgdGhpcyBoZWFkZXIgaW4gdGhlIHdyaXRlciAqLwotICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5zdHJlYW1JRCA9IE00UFRPM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5zaXplID0gZW5jSGVhZGVyLT5TaXplOwotICAgICAgICAgICAgICAgIHN0cmVhbUhlYWRlci5hZGRyID0gKE00T1NBX01lbUFkZHIzMillbmNIZWFkZXItPnBCdWY7Ci0gICAgICAgICAgICAgICAgb3NhRXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tEU0ksICZzdHJlYW1IZWFkZXIpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IG9zYUVycikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfY2xvc2U6IGZhaWxlZCB0byBzZXQgdGhlIERTSSBpbiB0aGUgd3JpdGVyIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVyciAweCV4KSAgICIsIG9zYUVycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogVXBkYXRlIGxhc3QgVmlkZW8gQ1RTICovCi0gICAgICAgIGxhc3RDVFMgPSAoTTRPU0FfVUludDMyKXBDLT5tX210Q3RzOwotCi0gICAgICAgIG9zYUVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uLCAmbGFzdENUUyk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IG9zYUVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9DbG9zZTogU2V0T3B0aW9uKE00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb24pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgb3NhRXJyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFdyaXRlIGFuZCBjbG9zZSB0aGUgM0dQIG91dHB1dCBmaWxlICovCi0gICAgICAgIG9zYUVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0Q2xvc2VXcml0ZShwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IG9zYUVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9DbG9zZTogcFdyaXRlckdsb2JJbnQtPnBGY3RDbG9zZVdyaXRlIHJldHVybnMgMHgleCIsIG9zYUVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiB5ZXQsIHdlIGhhdmUgdG8gY2xvc2Ugb3RoZXIgdGhpbmdzICovCi0gICAgICAgIH0KLSAgICAgICAgcEMtPm1fcDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXRlIHRyYW5zaXRpb24gKi8KLSAgICBwQy0+bV9TdGF0ZSA9IE00UFRPM0dQUF9rU3RhdGVfQ0xPU0VEOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00UFRPM0dQUF9DbG9zZSgpOiByZXR1cm5pbmcgMHgleCIsIG9zYUVycik7Ci0gICAgcmV0dXJuIG9zYUVycjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfQ2xlYW5VcChNNFBUTzNHUFBfQ29udGV4dCBwQ29udGV4dCk7Ci0gKiBAYnJpZWYgICBGcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGUgTTRQVE8zR1BQLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBNNFBUTzNHUFAgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChJZiBEZWJ1ZyBMZXZlbCA+PSAyKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX0NsZWFuVXAoTTRQVE8zR1BQX0NvbnRleHQgcENvbnRleHQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQgKnBDID0gKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqKShwQ29udGV4dCk7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX0NsZWFuVXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMPT1wQ29udGV4dCksTTRFUlJfUEFSQU1FVEVSLCAiTTRQVE8zR1BQX0NsZWFuVXA6IHBDb250ZXh0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICAqICBGaXJzdCBjYWxsIENsb3NlLCBpZiBuZWVkZWQsIHRvIGNsZWFuIHRoZSB2aWRlbyBlbmNvZGVyICovCi0KLSAgICBpZiAoKE00UFRPM0dQUF9rU3RhdGVfT1BFTkVEID09IHBDLT5tX1N0YXRlKSB8fCAoTTRQVE8zR1BQX2tTdGF0ZV9SRUFEWSA9PSBwQy0+bV9TdGF0ZSkKLSAgICAgICAgfHwgKE00UFRPM0dQUF9rU3RhdGVfRklOSVNIRUQgPT0gcEMtPm1fU3RhdGUpKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRQVE8zR1BQX0Nsb3NlKHBDb250ZXh0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0NsZWFuVXA6IE00UFRPM0dQUF9DbG9zZSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIGhhdmUgdG8gZnJlZSBvdGhlciBjb21wb25lbnRzICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRnJlZSBBdWRpbyByZWFkZXIgc3R1ZmYsIGlmIG5lZWRlZCAqLwotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCkgLyoqPCBtYXkgYmUgTTRPU0FfTlVMTCBpZiBNNFBUTzNHUFBfT3BlbiB3YXMgbm90XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCAqLwotICAgIHsKLQotICAgICAgICBlcnIgPSBwQy0+bV9wUmVhZGVyR2xvYkludC0+bV9wRmN0Q2xvc2UocEMtPm1fcEF1ZGlvUmVhZGVyQ29udGV4dCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9DbGVhblVwOiBwUmVhZGVyR2xvYkludC0+bV9wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBoYXZlIHRvIGZyZWUgb3RoZXIgY29tcG9uZW50cyAqLwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IHBDLT5tX3BSZWFkZXJHbG9iSW50LT5tX3BGY3REZXN0cm95KHBDLT5tX3BBdWRpb1JlYWRlckNvbnRleHQpOwotICAgICAgICBwQy0+bV9wQXVkaW9SZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0NsZWFuVXA6IHBSZWFkZXJHbG9iSW50LT5tX3BGY3REZXN0cm95IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2UgaGF2ZSB0byBmcmVlIG90aGVyIGNvbXBvbmVudHMgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJBdWRpb0FVKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyQXVkaW9BVSk7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJBdWRpb0FVID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgRnJlZSB2aWRlbyBlbmNvZGVyIHN0dWZmLCBpZiBuZWVkZWQgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wTXA0RW5jb2RlckNvbnRleHQpCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdENsZWFudXAocEMtPm1fcE1wNEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgcEMtPm1fcE1wNEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0NsZWFuVXA6IHBFbmNvZGVySW50LT5wRmN0RGVzdHJveSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIGhhdmUgdG8gZnJlZSBvdGhlciBjb21wb25lbnRzICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0pCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSk7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbykKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbyk7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8gPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvKTsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiAgRnJlZSB0aGUgc2hlbGxzIGludGVyZmFjZXMgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyR2xvYkludCkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFJlYWRlckdsb2JJbnQpOwotICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYkludCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJEYXRhSW50KQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyRGF0YUludCk7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSW50ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BFbmNvZGVySW50KQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+bV9wRW5jb2RlckludCk7Ci0gICAgICAgIHBDLT5tX3BFbmNvZGVySW50ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoTTRPU0FfTlVMTCAhPSBwQy0+bV9wV3JpdGVyR2xvYkludCkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcFdyaXRlckdsb2JJbnQpOwotICAgICAgICBwQy0+bV9wV3JpdGVyR2xvYkludCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcFdyaXRlckRhdGFJbnQpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5tX3BXcml0ZXJEYXRhSW50KTsKLSAgICAgICAgcEMtPm1fcFdyaXRlckRhdGFJbnQgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICAvKio8IERvIG5vdCBmcmVlIHBDLT5wT3NhTWVtb3J5UHRyRmN0IGFuZCBwQy0+cE9zYU1lbW9yeVB0ckZjdCwgYmVjYXVzZSBpdCdzIG93bmVkIGJ5IHRoZSBcCi0gICAgYXBwbGljYXRpb24gKi8KLQotICAgIC8qKgotICAgICAqICBGcmVlIHRoZSBjb250ZXh0IGl0c2VsZiAqLwotICAgIGZyZWUocEMpOwotICAgIHBDID0gTTRPU0FfTlVMTDsKLQotICAgIE00T1NBX1RSQUNFM18wKCJNNFBUTzNHUFBfQ2xlYW5VcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqIElOVEVSTkFMIEZVTkNUSU9OUyAqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKE00UFRPM0dQUF9JbnRlcm5hbENvbnRleHQqIHBDKTsKLSAqIEBicmllZiAgIFByZXBhcmUgYWxsIHJlc291cmNlcyBhbmQgaW50ZXJmYWNlcyBmb3IgdGhlIHRyYW5zY29kaW5nLgotICogQG5vdGUgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSBmaXJzdCBNNE9TQV9TdGVwKCkgY2FsbAotICogQHBhcmFtICAgcEMgICAgICAgICAgKElOKSBNNFBUTzNHUFAgcHJpdmF0ZSBjb250ZXh0Ci0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICogQHJldHVybiAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NNE9TQV9FUlIgTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoTTRQVE8zR1BQX0ludGVybmFsQ29udGV4dCogcEMpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgb3V0cHV0RmlsZVR5cGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgdWlWZXJzaW9uOwotICAgIE00RU5DT0RFUl9Gb3JtYXQgICAgICAgIGVuY0Zvcm1hdDsKLSAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMgICBFbmNQYXJhbXM7ICAgIC8qKjwgRW5jb2RlciBhZHZhbmNlZCBwYXJhbWV0ZXJzICovCi0gICAgTTRTWVNfU3RyZWFtSURWYWx1ZSAgICAgb3B0aW9uVmFsdWU7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcgY2FsbGVkIHdpdGggcEM9MHgleCIsIHBDKTsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKiovCi0gICAgLyoqKioqKioqIFZpZGVvIEVuY29kZXIgUGFyYW1lcyBpbml0ICoqKioqKioqLwotICAgIC8qKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKioKLSAgICAgKiAgR2V0IHRoZSBjb3JyZWN0IGVuY29kZXIgaW50ZXJmYWNlICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNAotICAgICAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9NUEVHNCgmZW5jRm9ybWF0LCAmcEMtPm1fcEVuY29kZXJJbnQsCi0gICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9PUEVOX0FEVkFOQ0VEKTsKLSNlbHNlIC8qIHNvZnR3YXJlIE1QRUc0IGVuY29kZXIgbm90IGF2YWlsYWJsZSEgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gTVBFRzQgZW5jb2RlciBhdmFpbGFibGUhIERpZCB5b3UgZm9yZ2V0IHRvIHJlZ2lzdGVyIG9uZT8iKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9TVEFURTsKLSNlbmRpZiAvKiBzb2Z0d2FyZSBNUEVHNCBlbmNvZGVyIGF2YWlsYWJsZT8gKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNAotICAgICAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjYzKCZlbmNGb3JtYXQsICZwQy0+bV9wRW5jb2RlckludCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotI2Vsc2UgLyogc29mdHdhcmUgSDI2MyBlbmNvZGVyIG5vdCBhdmFpbGFibGUhICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk5vIEgyNjMgZW5jb2RlciBhdmFpbGFibGUhIERpZCB5b3UgZm9yZ2V0IHRvIHJlZ2lzdGVyIG9uZT8iKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9TVEFURTsKLSNlbmRpZiAvKiBzb2Z0d2FyZSBIMjYzIGVuY29kZXIgYXZhaWxhYmxlPyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FWQwotICAgICAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjY0KCZlbmNGb3JtYXQsICZwQy0+bV9wRW5jb2RlckludCwKLSAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX09QRU5fQURWQU5DRUQpOwotI2Vsc2UgLyogc29mdHdhcmUgSDI2NCBlbmNvZGVyIG5vdCBhdmFpbGFibGUhICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBObyBIMjY0IGVuY29kZXIgYXZhaWxhYmxlIVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWQgeW91IGZvcmdldCB0byByZWdpc3RlciBvbmU/Iik7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfU1RBVEU7Ci0jZW5kaWYgLyogc29mdHdhcmUgSDI2NCBlbmNvZGVyIGF2YWlsYWJsZT8gKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfTTRQVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQ7Ci0gICAgfQotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0KTogZ2V0SW50ZXJmYWNlcyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBGaWxsIGVuY29kZXIgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gTTRQVE8zR1BQIHNldHRpbmdzICovCi0KLSAgICAvKioKLSAgICAgKiBWaWRlbyBmcmFtZSBzaXplICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0ZyYW1lU2l6ZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGIDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl9TUUNJRl9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfU1FDSUZfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0EgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX1FRVkdBX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9RUVZHQV9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGIDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl9RQ0lGX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9RQ0lGX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0EgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX1FWR0FfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX1FWR0FfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQ0lGIDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl9DSUZfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX0NJRl9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0EgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX1ZHQV9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfVkdBX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0vKiArUFIgTFY1ODA3ICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0EgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSX1dWR0FfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSX1dWR0FfV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl9OVFNDX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl9OVFNDX1dpZHRoOwotICAgICAgICAgICAgYnJlYWs7Ci0vKiAtUFIgTFY1ODA3ICovCi0vKiArQ1IgR29vZ2xlICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfNjQwXzM2MF9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfNjQwXzM2MF9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfODU0XzQ4MF9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfODU0XzQ4MF9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyODBfNzIwOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSXzEyODBfNzIwX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl8xMjgwXzcyMF9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwODBfNzIwOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gTTRFTkNPREVSXzEwODBfNzIwX0hlaWdodDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoICA9IE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2MF83MjA6Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBNNEVOQ09ERVJfOTYwXzcyMF9IZWlnaHQ7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuRnJhbWVXaWR0aCAgPSBNNEVOQ09ERVJfOTYwXzcyMF9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5GcmFtZUhlaWdodCA9IE00RU5DT0RFUl8xOTIwXzEwODBfSGVpZ2h0OwotICAgICAgICAgICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggID0gTTRFTkNPREVSXzE5MjBfMTA4MF9XaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotLyogLUNSIEdvb2dsZSAqLwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogdW5rbm93biBmb3JtYXQgMHgleCByZXR1cm5pbmcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX000UFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvRnJhbWVTaXplKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZSQU1FX1NJWkU7Ci0gICAgfQotCi0gICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gYml0cmF0ZSAqLwotICAgIHN3aXRjaChwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjRfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzJfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDhfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjRfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNTZfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjg4X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s1MTJfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwX0tCUFM6Ci0vKisgTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMl9NQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s1X01CUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazhfTUJQUzoKLS8qLSBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLkJpdHJhdGUgPSBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkFSSUFCTEVfS0JQUzoKLS8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgRW5jUGFyYW1zLkJpdHJhdGUgPSBNNFZJREVPRURJVElOR19rOF9NQlBTOwotLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogdW5rbm93biBmb3JtYXQgMHgleCByZXR1cm5pbmdcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfTTRQVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0JJVFJBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZm9ybWF0ICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0IDoKLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgICAgPSBNNEVOQ09ERVJfa01QRUc0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjMgOgotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCAgICA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCAgICA9IE00RU5DT0RFUl9rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogdW5rbm93biBmb3JtYXQgMHgleCByZXR1cm5pbmdcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfTTRQVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZnJhbWUgcmF0ZSAoc2V0IGl0IHRvIG1heCA9IDMwIGZwcykgKi8KLSAgICBFbmNQYXJhbXMudWlUaW1lU2NhbGUgPSAzMDsKLSAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gMTsKLQotICAgIEVuY1BhcmFtcy5GcmFtZVJhdGUgPSBNNEVOQ09ERVJfazMwX0ZQUzsKLQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKiogM0dQIG91dCBpbml0ICoqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBHZXQgdGhlIDNHUFAgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIGVyciA9IE00V1JJVEVSXzNHUF9nZXRJbnRlcmZhY2VzKCZvdXRwdXRGaWxlVHlwZSwgJnBDLT5tX3BXcml0ZXJHbG9iSW50LCAmcEMtPm1fcFdyaXRlckRhdGFJbnQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlczogTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBJbml0IHRoZSAzR1BQIHdyaXRlciAqLwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0T3BlbigmcEMtPm1fcDNncFdyaXRlckNvbnRleHQsIHBDLT5tX1BhcmFtcy5wT3V0cHV0M2dwcEZpbGUsCi0gICAgICAgIHBDLT5wT3NhbEZpbGVXcml0ZSwgcEMtPm1fUGFyYW1zLnBUZW1wb3JhcnlGaWxlLCBwQy0+cE9zYWxGaWxlUmVhZCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBwV3JpdGVyR2xvYkludC0+cEZjdE9wZW4gcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgTGluayB0byB0aGUgd3JpdGVyIGNvbnRleHQgaW4gdGhlIHdyaXRlciBpbnRlcmZhY2UgKi8KLSAgICBwQy0+bV9wV3JpdGVyRGF0YUludC0+cFdyaXRlckNvbnRleHQgPSBwQy0+bV9wM2dwV3JpdGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqICBTZXQgdGhlIHByb2R1Y3QgZGVzY3JpcHRpb24gc3RyaW5nIGluIHRoZSB3cml0dGVuIGZpbGUgKi8KLSAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilNNFBUTzNHUFBfU0lHTkFUVVJFKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICBTZXQgdGhlIHByb2R1Y3QgdmVyc2lvbiBpbiB0aGUgd3JpdHRlbiBmaWxlICovCi0gICAgdWlWZXJzaW9uID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUioxMDAgKyBNNFZJREVPRURJVElOR19WRVJTSU9OX01JTk9SKjEwCi0gICAgICAgICsgTTRWSURFT0VESVRJTkdfVkVSU0lPTl9SRVZJU0lPTjsKLSAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgTTRXUklURVJfa0VtYmVkZGVkVmVyc2lvbiwKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pJnVpVmVyc2lvbik7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBcCi0gICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24pIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIEFsbG9jYXRlIGFuZCBmaWxsIHRoZSB2aWRlbyBzdHJlYW0gc3RydWN0dXJlcyBmb3IgdGhlIHdyaXRlciAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbSA9Ci0gICAgICAgIChNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiksIE00UFRPM0dQUCwKLSAgICAgICAgKE00T1NBX0NoYXIgKikicFdyaXRlclZpZGVvU3RyZWFtIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBwV3JpdGVyVmlkZW9TdHJlYW0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mbyA9Ci0gICAgICAgIChNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00V1JJVEVSX1N0cmVhbVZpZGVvSW5mb3MpLCBNNFBUTzNHUFAsCi0gICAgICAgIChNNE9TQV9DaGFyICopInBXcml0ZXJWaWRlb1N0cmVhbUluZm8iKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBwV3JpdGVyVmlkZW9TdHJlYW1JbmZvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsIFZpZGVvIHByb3BlcnRpZXMgc3RydWN0dXJlIGZvciB0aGUgQWRkU3RyZWFtIG1ldGhvZCAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8tPmhlaWdodCAgICAgICAgPSBFbmNQYXJhbXMuRnJhbWVIZWlnaHQ7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mby0+d2lkdGggICAgICAgICA9IEVuY1BhcmFtcy5GcmFtZVdpZHRoOwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8tPmZwcyAgICAgICAgICAgPSAwOyAgICAgICAgLyoqPCBOb3QgdXNlZCBieSB0aGUgY29yZSB3cml0ZXIgKi8KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT5IZWFkZXIucEJ1ZiAgID0gTTRPU0FfTlVMTDsKLSAgICAvKiogTm8gaGVhZGVyLCB3aWxsIGJlIHNldCBieSBzZXRPcHRpb24gKi8KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW1JbmZvLT5IZWFkZXIuU2l6ZSAgID0gMDsKLQotICAgIC8qKgotICAgICAqICBGaWxsIFZpZGVvIHN0cmVhbSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBBZGRTdHJlYW0gbWV0aG9kICovCi0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5zdHJlYW1JRCA9IE00UFRPM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEOwotCi0gICAgLyoqCi0gICAgICogVmlkZW8gZm9ybWF0ICovCi0gICAgc3dpdGNoKHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotICAgICAgICAgICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5zdHJlYW1UeXBlID0gTTRTWVNfa01QRUdfNDsgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+c3RyZWFtVHlwZSA9IE00U1lTX2tIMjYzOyAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjQ6Ci0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPnN0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogdW5rbm93biBmb3JtYXQgMHgleCByZXR1cm5pbmcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJSX000UFRPM0dQUF9VTkRFRklORURfT1VUUFVUX1ZJREVPX0ZPUk1BVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9Gb3JtYXQpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fRk9STUFUOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZpZGVvIGJpdHJhdGUgKi8KLSAgICBzd2l0Y2gocEMtPm1fUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE2X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMyX0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazk2X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyOF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTJfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjU2X0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI4OF9LQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szODRfS0JQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNTEyX0tCUFM6Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazgwMF9LQlBTOgotLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazJfTUJQUzoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9NQlBTOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s4X01CUFM6Ci0vKi0gTmV3IEVuY29kZXIgYml0cmF0ZXMgKi8KLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+YXZlcmFnZUJpdHJhdGUgPSBwQy0+bV9QYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkFSSUFCTEVfS0JQUyA6Ci0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPmF2ZXJhZ2VCaXRyYXRlID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiB1bmtub3duIGZvcm1hdCAweCV4IHJldHVybmluZ1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9NNFBUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX1BhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfVklERU9fQklUUkFURTsKLSAgICB9Ci0KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPmR1cmF0aW9uICAgICAgICAgICAgICAgICAgPSAwOyAgICAgICAgLyoqPCBEdXJhdGlvbiBpcyBub3Qga25vd24gKi8KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPnRpbWVTY2FsZSAgICAgICAgICAgICAgICAgPSAwOyAgICAvKio8IE5vdCB1c2VkIGJ5IHRoZSBjb3JlIHdyaXRlciAqLwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+bWF4Qml0cmF0ZSAgICAgICAgICAgICAgICA9IHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+YXZlcmFnZUJpdHJhdGU7Ci0gICAgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtLT5wcm9maWxlTGV2ZWwgICAgICAgICAgICAgID0gMDsgICAgLyoqPCBOb3QgdXNlZCBieSB0aGUgY29yZSB3cml0ZXIgKi8KLSAgICBwQy0+bV9wV3JpdGVyVmlkZW9TdHJlYW0tPmRlY29kZXJTcGVjaWZpY0luZm8gICAgICAgPSAoTTRPU0FfTWVtQWRkcjMyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbUluZm8pOwotICAgIHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbS0+ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgICA9IHNpemVvZihNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSBBVSBwcm9wZXJ0aWVzIGZvciB2aWRlbyBzdHJlYW0gKi8KLSAgICBwQy0+bV9Xcml0ZXJWaWRlb0FVLkNUUyAgICAgICAgID0gcEMtPm1fV3JpdGVyVmlkZW9BVS5EVFMgPSAwOyAgLyoqIFJlc2V0IHRpbWUgKi8KLSAgICBwQy0+bV9Xcml0ZXJWaWRlb0FVLnNpemUgICAgICAgID0gMDsKLSAgICBwQy0+bV9Xcml0ZXJWaWRlb0FVLmZyYWcgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9Xcml0ZXJWaWRlb0FVLm5iRnJhZyAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgcEMtPm1fV3JpdGVyVmlkZW9BVS5zdHJlYW0gICAgICA9IHBDLT5tX3BXcml0ZXJWaWRlb1N0cmVhbTsKLSAgICBwQy0+bV9Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSAgID0gQVVfUkFQOwotICAgIHBDLT5tX1dyaXRlclZpZGVvQVUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgICogIElmIHRoZXJlIGlzIGFuIGF1ZGlvIGlucHV0LCBhbGxvY2F0ZSBhbmQgZmlsbCB0aGUgYXVkaW8gc3RyZWFtIHN0cnVjdHVyZXMgZm9yIHRoZSB3cml0ZXIgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSA9Ci0gICAgICAgICAgICAoTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24qKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24pLCBNNFBUTzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwV3JpdGVyQXVkaW9TdHJlYW0iKTsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHBXcml0ZXJBdWRpb1N0cmVhbSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mbyA9Ci0gICAgICAgICAgICAoTTRXUklURVJfU3RyZWFtQXVkaW9JbmZvcyopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zKSwgTTRQVE8zR1BQLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicFdyaXRlckF1ZGlvU3RyZWFtSW5mbyIpOwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcoKTogdW5hYmxlIHRvIGFsbG9jYXRlIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJBdWRpb1N0cmVhbUluZm8sIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mby0+bmJTYW1wbGVzUGVyU2VjID0gMDsgLyoqPCB1bnVzZWQgYnkgb3VyIHNoZWxsIHdyaXRlciAqLwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvLT5uYkJpdHNQZXJTYW1wbGUgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPm5iQ2hhbm5lbHMgPSAxOyAgICAgIC8qKjwgdW51c2VkIGJ5IG91ciBzaGVsbCB3cml0ZXIgKi8KLQotICAgICAgICBpZiggKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtKSAmJiAvKiBhdWRpbyBjb3VsZCBoYXZlIGJlZW4gZGlzY2FyZGVkICovCi0gICAgICAgICAgICAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8pICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogSWYgd2UgY29weSB0aGUgc3RyZWFtIGZyb20gdGhlIGlucHV0LCB3ZSBjb3B5IGl0cyBEU0kgKi8KLSAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbUluZm8tPkhlYWRlci5TaXplID0KLSAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvLT5IZWFkZXIucEJ1ZiA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5tX3BSZWFkZXJBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdyaXRlciB3aWxsIHB1dCBhIGRlZmF1bHQgRFNJICovCi0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvLT5IZWFkZXIuU2l6ZSA9IDA7Ci0gICAgICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW1JbmZvLT5IZWFkZXIucEJ1ZiA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgc3dpdGNoIChwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ6Ci0gICAgICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5zdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM6Ci0gICAgICAgICAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5zdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjOgotICAgICAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+c3RyZWFtVHlwZSA9IE00U1lTX2tFVlJDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHVuaGFuZGxlZCBhdWRpbyBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgRVJSX1BUTzNHUFBfVU5ERUZJTkVEX09VVFBVVF9WSURFT19CSVRSQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9QVE8zR1BQX1VOREVGSU5FRF9PVVRQVVRfQVVESU9fRk9STUFUOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRmlsbCBBdWRpbyBzdHJlYW0gZGVzY3JpcHRpb24gc3RydWN0dXJlIGZvciB0aGUgQWRkU3RyZWFtIG1ldGhvZCAqLwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPnN0cmVhbUlEICAgICAgICAgICAgICAgICAgPSBNNFBUTzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRDsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5kdXJhdGlvbiAgICAgICAgICAgICAgICAgID0gMDsvKio8IER1cmF0aW9uIGlzIG5vdCBrbm93biB5ZXQgKi8KLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT50aW1lU2NhbGUgICAgICAgICAgICAgICAgID0gTTRQVE8zR1BQX1dSSVRFUl9BVURJT19BTVJfVElNRV9TQ0FMRTsKLSAgICAgICAgcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtLT5wcm9maWxlTGV2ZWwgICAgICAgICAgICAgID0gTTRQVE8zR1BQX1dSSVRFUl9BVURJT19QUk9GSUxFX0xFVkVMOwotICAgICAgICBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW0tPmF2ZXJhZ2VCaXRyYXRlICAgICAgICAgICAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUmVhZGVyQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+bWF4Qml0cmF0ZSAgICAgICAgICAgICAgICA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+YXZlcmFnZUJpdHJhdGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE91ciB3cml0ZXIgc2hlbGwgaW50ZXJmYWNlIGlzIGEgbGl0dGxlIHRyaWNreTogd2UgcHV0IE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3MgXAotICAgICAgICAgICAgaW4gdGhlIERTSSBwb2ludGVyLi4uICovCi0gICAgICAgIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbS0+ZGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpcEMtPm1fcFdyaXRlckF1ZGlvU3RyZWFtSW5mbzsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVXBkYXRlIEFVIHByb3BlcnRpZXMgZm9yIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLkNUUyAgICAgICAgID0gcEMtPm1fV3JpdGVyQXVkaW9BVS5EVFMgPSAwOyAgLyoqIFJlc2V0IHRpbWUgKi8KLSAgICAgICAgcEMtPm1fV3JpdGVyQXVkaW9BVS5zaXplICAgICAgICA9IDA7Ci0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuZnJhZyAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9Xcml0ZXJBdWRpb0FVLm5iRnJhZyAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuc3RyZWFtICAgICAgPSBwQy0+bV9wV3JpdGVyQXVkaW9TdHJlYW07Ci0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuYXR0cmlidXRlICAgPSBBVV9SQVA7Ci0gICAgICAgIHBDLT5tX1dyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqIFZpZGVvIEVuY29kZXIgSW5pdCAqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyoqCi0gICAgICogUFRPIHVzZXMgaXRzIG93biBiaXRyYXRlIHJlZ3VsYXRpb24sIG5vdCB0aGUgInRydWUiIGNvcmUgcmVndWxhdGlvbiAqLwotICAgIEVuY1BhcmFtcy5iSW50ZXJuYWxSZWd1bGF0aW9uID0gTTRPU0FfVFJVRTsgLy9NNE9TQV9GQUxTRTsKLSAgICBFbmNQYXJhbXMudWlTdGFydGluZ1F1YW50aXplclZhbHVlID0gTTRQVE8zR1BQX1FVQU5USVpFUl9TVEVQOwotCi0gICAgRW5jUGFyYW1zLnZpZGVvUHJvZmlsZSA9IHBDLT5tX1BhcmFtcy52aWRlb1Byb2ZpbGU7Ci0gICAgRW5jUGFyYW1zLnZpZGVvTGV2ZWwgPSBwQy0+bV9QYXJhbXMudmlkZW9MZXZlbDsKLQotICAgIC8qKgotICAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKi8KLQotICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSAgPSAwOyAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aVZlcnRpY2FsU2VhcmNoUmFuZ2UgICAgPSAwOyAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlICAgICAgICAgPSBNNE9TQV9GQUxTRTsgICAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCAgICAgICAgICAgICA9IDE1OyAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aU1vdGlvbkVzdGltYXRpb25Ub29scyAgPSAwOyAgICAgICAgICAgICAvKiBNNFZfTU9USU9OX0VTVF9UT09MU19BTEwgKi8KLSAgICBFbmNQYXJhbXMuYkFjUHJlZGljdGlvbiAgICAgICAgICAgID0gTTRPU0FfVFJVRTsgICAgLyogdXNlIEFDIHByZWRpY3Rpb24gKi8KLSAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgICAgICAgID0gTTRPU0FfRkFMU0U7ICAgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHZpZGVvIGVuY29kZXIgKi8KLSAgICBlcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdEluaXQoJnBDLT5tX3BNcDRFbmNvZGVyQ29udGV4dCwgcEMtPm1fcFdyaXRlckRhdGFJbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFBUTzNHUFBfYXBwbHlWUFAsIHBDLCBwQy0+bV9wRW5jb2RlckV4dGVybmFsQVBJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcEVuY29kZXJVc2VyRGF0YSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBFbmNvZGVySW50LT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5tX2VFbmNvZGVyU3RhdGUgPSBNNFBUTzNHUFBfa0VuY29kZXJDbG9zZWQ7Ci0KLSAgICBlcnIgPSBwQy0+bV9wRW5jb2RlckludC0+cEZjdE9wZW4ocEMtPm1fcE1wNEVuY29kZXJDb250ZXh0LCAmcEMtPm1fV3JpdGVyVmlkZW9BVSwgJkVuY1BhcmFtcyk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBFbmNvZGVySW50LT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5tX2VFbmNvZGVyU3RhdGUgPSBNNFBUTzNHUFBfa0VuY29kZXJTdG9wcGVkOwotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcEVuY29kZXJJbnQtPnBGY3RTdGFydCkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDLT5tX3BFbmNvZGVySW50LT5wRmN0U3RhcnQocEMtPm1fcE1wNEVuY29kZXJDb250ZXh0KTsKLQotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogRW5jb2RlckludC0+cEZjdFN0YXJ0IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPm1fZUVuY29kZXJTdGF0ZSA9IE00UFRPM0dQUF9rRW5jb2RlclJ1bm5pbmc7Ci0KLSAgICAvKioKLSAgICAgKiBObyBtb3JlICBzZXRvcHRpb24gb24gIk00RU5DT0RFUl9rVmlkZW9GcmFnbWVudFNpemUiIGhlcmUuCi0gICAgICogSXQgaXMgbm93IGF1dG9tYXRpY2x5IGFuZCAic21hcnRseSIgc2V0IGluIHRoZSBlbmNvZGVyIHNoZWxsLiAqLwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKiAzR1Agb3V0IGFkZCBzdHJlYW1zICAqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdEFkZFN0cmVhbShwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwgcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0QWRkU3RyZWFtKHZpZGVvKSByZXR1cm5zXAotICAgICAgICAgICAgICAgICAgICAgICAweCV4IiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdmlkZW8gbWF4IGF1IHNpemUgKi8KLSAgICBvcHRpb25WYWx1ZS5zdHJlYW1JRCAgICA9IE00UFRPM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgIG9wdGlvblZhbHVlLnZhbHVlID0gKE00T1NBX1VJbnQzMikoMS41RiAqIChNNE9TQV9GbG9hdCkocEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mby0+d2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPm1fcFdyaXRlclZpZGVvU3RyZWFtSW5mby0+aGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBNNFBUTzNHUFBfVklERU9fTUlOX0NPTVBSRVNTSU9OX1JBVElPKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3NpbmcsTTRXUklURVJfa01heEFVU2l6ZTogJXUiLG9wdGlvblZhbHVlLnZhbHVlKTsKLSAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4QVVTaXplLChNNE9TQV9EYXRhT3B0aW9uKSAmb3B0aW9uVmFsdWUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfUmVhZHk0UHJvY2Vzc2luZzogcFdyaXRlckdsb2JJbnQtPnBGY3RTZXRPcHRpb24odmlkZW8sXAotICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9rTWF4QVVTaXplKSByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB2aWRlbyBtYXggY2h1bmNrIHNpemUgKi8KLSAgICBvcHRpb25WYWx1ZS52YWx1ZSA9IChNNE9TQV9VSW50MzIpKChNNE9TQV9GbG9hdClvcHRpb25WYWx1ZS52YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgKiBNNFBUTzNHUFBfVklERU9fQVVfU0laRV9UT19DSFVOQ0tfU0laRV9SQVRJTyk7Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nLE00V1JJVEVSX2tNYXhDaHVuY2tTaXplOiAldSIsb3B0aW9uVmFsdWUudmFsdWUpOwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSwoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKHZpZGVvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfa01heENodW5ja1NpemUpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcFJlYWRlckF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPm1fcFdyaXRlckdsb2JJbnQtPnBGY3RBZGRTdHJlYW0ocEMtPm1fcDNncFdyaXRlckNvbnRleHQsIHBDLT5tX3BXcml0ZXJBdWRpb1N0cmVhbSk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBwV3JpdGVyR2xvYkludC0+cEZjdEFkZFN0cmVhbShhdWRpbykgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IGF1ZGlvIG1heCBhdSBzaXplICovCi0gICAgICAgIG9wdGlvblZhbHVlLnZhbHVlICAgICAgID0gTTRQVE8zR1BQX0FVRElPX01BWF9BVV9TSVpFOwotICAgICAgICBvcHRpb25WYWx1ZS5zdHJlYW1JRCAgICA9IE00UFRPM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEFVU2l6ZSwoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0U2V0T3B0aW9uKGF1ZGlvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX2tNYXhBVVNpemUpIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCBhdWRpbyBtYXggY2h1bmNrIHNpemUgKi8KLSAgICAgICAgb3B0aW9uVmFsdWUudmFsdWUgPSBNNFBUTzNHUFBfQVVESU9fTUFYX0NIVU5LX1NJWkU7IC8qKjwgTWFnaWNhbCAqLwotICAgICAgICBlcnIgPSBwQy0+bV9wV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihwQy0+bV9wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heENodW5ja1NpemUsKE00T1NBX0RhdGFPcHRpb24pICZvcHRpb25WYWx1ZSk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiBwV3JpdGVyR2xvYkludC0+cEZjdFNldE9wdGlvbihhdWRpbyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9rTWF4Q2h1bmNrU2l6ZSkgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENsb3NlIHRoZSBzdHJlYW0gcmVnaXN0ZXJpbmcgaW4gb3JkZXIgdG8gYmUgcmVhZHkgdG8gd3JpdGUgZGF0YSAqLwotICAgIGVyciA9IHBDLT5tX3BXcml0ZXJHbG9iSW50LT5wRmN0U3RhcnRXcml0aW5nKHBDLT5tX3AzZ3BXcml0ZXJDb250ZXh0KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX1JlYWR5NFByb2Nlc3Npbmc6IHBXcml0ZXJHbG9iSW50LT5wRmN0U3RhcnRXcml0aW5nIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9SZWFkeTRQcm9jZXNzaW5nOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTEyMkZyYW1lKE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0NvbnRleHQqIHBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwV3JpdGVyQXVkaW9BVSwgTTRPU0FfVGltZSBtdEluY0N0cykKLSAqIEBicmllZiAgIFdyaXRlIGFuIEFNUiAxMi4ya2JwcyBzaWxlbmNlIEZSQU1FIGludG8gdGhlIHdyaXRlcgotICogQG5vdGUgICAgTWFpbmx5IHVzZWQgdG8gZml4IHRoZSAnYnp6JyBidWcuLi4KLSAqIEBwYXJhbSAgIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlIChJTikgICAgd3JpdGVyIGRhdGEgaW50ZXJmYWNlcwotICogICAgICAgICAgcFdyaXRlckNvbnRleHQgICAgICAgICAgKElOL09VVCl3cml0ZXIgY29udGV4dAotICogICAgICAgICAgcFdyaXRlckF1ZGlvQVUgICAgICAgICAgKE9VVCkgICB3cml0ZXIgYXVkaW8gYWNjZXNzIHVuaXQKLSAqICAgICAgICAgIG10SW5jQ3RzICAgICAgICAgICAgICAgIChJTikgICAgd3JpdGVyIENUUwotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgTTRPU0FfRVJSIE00UFRPM0dQUF93cml0ZUFtclNpbGVuY2UxMjJGcmFtZShNNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiBwV3JpdGVyRGF0YUludEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0NvbnRleHQqIHBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBXcml0ZXJBdWRpb0FVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUgbXRJbmNDdHMpCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9IHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLT5wU3RhcnRBVShwV3JpdGVyQ29udGV4dCwgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckF1ZGlvQVUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMTIyRnJhbWU6IHBXcml0ZXJEYXRhSW50LT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1lbWNweSgodm9pZCAqKXBXcml0ZXJBdWRpb0FVLT5kYXRhQWRkcmVzcywKLSAgICAgKHZvaWQgKilNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfMTIyX0ZSQU1FLCBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMTIyX1NJWkUpOwotICAgIHBXcml0ZXJBdWRpb0FVLT5zaXplICAgID0gTTRQVE8zR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzEyMl9TSVpFOwotICAgIHBXcml0ZXJBdWRpb0FVLT5DVFMgICAgID0gbXRJbmNDdHM7Ci0gICAgcFdyaXRlckF1ZGlvQVUtPm5iRnJhZyAgPSAwOwotCi0gICAgZXJyID0gcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UtPnBQcm9jZXNzQVUocFdyaXRlckNvbnRleHQsIE00UFRPM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckF1ZGlvQVUpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMTIyRnJhbWU6IHBXcml0ZXJEYXRhSW50LT5wUHJvY2Vzc0FVKHNpbGVuY2UpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBNNFBUTzNHUFBfd3JpdGVBbXJTaWxlbmNlMDQ4RnJhbWUoTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBXcml0ZXJBdWRpb0FVLCBNNE9TQV9UaW1lIG10SW5jQ3RzKQotICogQGJyaWVmICAgV3JpdGUgYW4gQU1SIDEyLjJrYnBzIHNpbGVuY2UgRlJBTUUgaW50byB0aGUgd3JpdGVyCi0gKiBAbm90ZSAgICBNYWlubHkgdXNlZCB0byBmaXggdGhlICdienonIGJ1Zy4uLgotICogQHBhcmFtICAgcFdyaXRlckRhdGFJbnRJbnRlcmZhY2UgKElOKSAgICB3cml0ZXIgZGF0YSBpbnRlcmZhY2VzCi0gKiAgICAgICAgICBwV3JpdGVyQ29udGV4dCAgICAgICAgICAoSU4vT1VUKXdyaXRlciBjb250ZXh0Ci0gKiAgICAgICAgICBwV3JpdGVyQXVkaW9BVSAgICAgICAgICAoT1VUKSAgIHdyaXRlciBhdWRpbyBhY2Nlc3MgdW5pdAotICogICAgICAgICAgbXRJbmNDdHMgICAgICAgICAgICAgICAgKElOKSAgICB3cml0ZXIgQ1RTCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTA0OEZyYW1lKE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfQ29udGV4dCogcFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFNZU19BY2Nlc3NVbml0KiBwV3JpdGVyQXVkaW9BVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RpbWUgbXRJbmNDdHMpCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9IHBXcml0ZXJEYXRhSW50SW50ZXJmYWNlLT5wU3RhcnRBVShwV3JpdGVyQ29udGV4dCwgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJBdWRpb0FVKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTA0OEZyYW1lOiBwV3JpdGVyRGF0YUludC0+cFN0YXJ0QVUoYXVkaW8pXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtZW1jcHkoKHZvaWQgKilwV3JpdGVyQXVkaW9BVS0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgKHZvaWQgKilNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfMDQ4X0ZSQU1FLAotICAgICAgICAgICAgICAgIE00UFRPM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRSk7Ci0gICAgcFdyaXRlckF1ZGlvQVUtPnNpemUgICAgPSBNNFBUTzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgcFdyaXRlckF1ZGlvQVUtPkNUUyAgICAgPSBtdEluY0N0czsKLSAgICBwV3JpdGVyQXVkaW9BVS0+bmJGcmFnICA9IDA7Ci0KLSAgICBlcnIgPSBwV3JpdGVyRGF0YUludEludGVyZmFjZS0+cFByb2Nlc3NBVShwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRQVE8zR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsIHBXcml0ZXJBdWRpb0FVKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX3dyaXRlQW1yU2lsZW5jZTA0OEZyYW1lOiBcCi0gICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhSW50LT5wUHJvY2Vzc0FVKHNpbGVuY2UpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRQVE8zR1BQX1ZpZGVvUHJlUHJvY2Vzc2luZy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBUTzNHUFBfVmlkZW9QcmVQcm9jZXNzaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2YTY0OTguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFBUTzNHUFBfVmlkZW9QcmVQcm9jZXNzaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00UFRPM0dQUF9WaWRlb1ByZVByb2Nlc3NpbmcuYwotICogQGJyaWVmICAgUGljdHVyZSB0byAzZ3BwIFNlcnZpY2UgdmlkZW8gcHJlcHJvY2Vzc2luZyBtYW5hZ2VtZW50LgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKgotICogICAgT1NBTCBEZWJ1ZyB1dGlsaXRpZXMgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotCi0vKioKLSAqICAgIE9TQUwgTWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotLyoqCi0gKiAgICBEZWZpbml0aW9uIG9mIHRoZSBNNFBUTzNHUFAgaW50ZXJuYWwgY29udGV4dCAqLwotI2luY2x1ZGUgIk00UFRPM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0KLS8qKgotICogICAgRGVmaW5pdGlvbiBvZiB0aGUgTTRQVE8zR1BQIGVycm9ycyAqLwotI2luY2x1ZGUgIk00UFRPM0dQUF9FcnJvckNvZGVzLmgiCi0KLS8qIElmIHRpbWUgaW5jcmVtZW50IGlzIHRvbyBsb3cgdGhlbiB3ZSBoYXZlIGFuIGluZmluaXRlIGFsbG9jIGxvb3AgaW50byBNNFZpRW5jQ2FwdHVyZUZyYW1lKCkgKi8KLS8qIFRpbWUgaW5jcmVtZW50IHNob3VsZCBtYXRjaCAzMCBmcHMgbWF4aW11bSAqLwotI2RlZmluZSBNNFBUTzNHUFBfTUlOX1RJTUVfSU5DUkVNRU5UIDMzLjMzMzMzMzQKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFBUTzNHUFBfYXBwbHlWUFAoTTRWUFBfQ29udGV4dCBwQ29udGV4dCwgTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lT3V0KQotICogQGJyaWVmICAgIENhbGwgYW4gZXh0ZXJuYWwgY2FsbGJhY2sgdG8gZ2V0IHRoZSBwaWN0dXJlIHRvIGVuY29kZQotICogQG5vdGUgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBWUFAgY29udGV4dCwgd2hpY2ggYWN0dWFsbHkgaXMgdGhlIE00UFRPM0dQUCBpbnRlcm5hbCBjb250ZXh0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBvdXIgY2FzZQotICogQHBhcmFtICAgIHBQbGFuZUluICAgIChJTikgQ29udGFpbnMgdGhlIGltYWdlCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0ICAgIChJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMyBwbGFuZXMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBZVVY0MjAgaW1hZ2UgcmVhZCB3aXRoIHRoZSBtX3BQaWN0dXJlQ2FsbGJhY2tGY3QKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgQW55IGVycm9yIHJldHVybmVkIGJ5IGFuIHVuZGVybGF5aW5nIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIE00UFRPM0dQUF9hcHBseVZQUChNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSogcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVPdXQpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0VSUiAgICBlcnI7Ci0gICAgTTRPU0FfRG91YmxlIG10RHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAvKioqIE5PVEUgKioqLwotICAgIC8qIEl0J3MgT0sgdG8gZ2V0IHBQbGFuZUluID09IE00T1NBX05VTEwgaGVyZSAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogc2luY2UgaXQgaGFzIGJlZW4gZ2l2ZW4gTlVMTCBpbiB0aGUgcEZjdEVuY29kZSgpIGNhbGwuICAgICAgICAgICAgKi8KLSAgICAvKiBJdCdzIGJlY2F1c2Ugd2UgdXNlIHRoZSBNNFBUTzNHUFAgaW50ZXJuYWwgY29udGV4dCB0byAgICAgICAgICAgICovCi0gICAgLyogdHJhbnNtaXQgdGhlIGVuY29kZXIgaW5wdXQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFRoZSBpbnB1dCBkYXRhIGlzIHRoZSBpbWFnZSByZWFkIGZyb20gdGhlIG1fcFBpY3R1cmVDYWxsYmFja0ZjdCAgICAqLwotCi0gICAgLyoqCi0gICAgICogICAgVGhlIFZQUCBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBNNFBUTzNHUFAgY29udGV4dCEgKi8KLSAgICBNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0ICpwQyA9IChNNFBUTzNHUFBfSW50ZXJuYWxDb250ZXh0KikocENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiAgR2V0IHRoZSBwaWN0dXJlIHRvIGVuY29kZSAqLwotICAgIGlmIChNNE9TQV9GQUxTRSA9PSBwQy0+bV9iTGFzdEludGVybmFsQ2FsbEJhY2spCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+bV9QYXJhbXMucFBpY3R1cmVDYWxsYmFja0ZjdChwQy0+bV9QYXJhbXMucFBpY3R1cmVDYWxsYmFja0N0eHQsIHBQbGFuZU91dCwKLSAgICAgICAgICAgICAmbXREdXJhdGlvbik7Ci0KLSAgICAgICAgLyogSW4gY2FzZSBvZiBlcnJvciB3aGVuIGdldHRpbmcgWVVWIHRvIGVuY29kZSAoZXg6IGVycm9yIHdoZW4gZGVjb2RpbmcgYSBKUEVHKSAqLwotICAgICAgICBpZigoTTROT19FUlJPUiAhPSBlcnIpICYmICgoKE00T1NBX1VJbnQzMilNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRSkgIT0gZXJyKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZiBlbmQgb2YgZW5jb2RpbmcgaXMgYXNrZWQgYnkgdGhlIHNpemUgbGltaXRhdGlvbiBzeXN0ZW0sCi0gICAgICAgICAqIHdlIG11c3QgZW5kIHRoZSBlbmNvZGluZyB0aGUgc2FtZSB3YXkgdGhhdCB3aGVuIGl0IGlzIGFza2VkIGJ5IHRoZQotICAgICAgICAgKiBwaWN0dXJlIGNhbGxiYWNrIChhLmsuYS4gdGhlIGludGVncmF0b3IpLgotICAgICAgICAgKiBUaHVzIHdlIHNpbXVsYXRlIHRoZSBMYXN0UGljdHVyZSBjb2RlIHJldHVybjogKi8KLSAgICAgICAgaWYgKE00T1NBX1RSVUUgPT0gcEMtPm1fSXNMYXN0UGljdHVyZSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZigoKE00T1NBX1VJbnQzMilNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRSkgPT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bV9iTGFzdEludGVybmFsQ2FsbEJhY2sgPSBNNE9TQV9UUlVFOyAvKiBUb2dnbGUgZmxhZyBmb3IgdGhlIGZpbmFsIGNhbGwgb2YgdGhlIENCKi8KLSAgICAgICAgICAgIHBDLT5tX0lzTGFzdFBpY3R1cmUgICAgICAgICA9IE00T1NBX1RSVUU7IC8qIFRvIHN0b3AgdGhlIGVuY29kZXIgKi8KLSAgICAgICAgICAgIHBDLT5wU2F2ZWRQbGFuZSAgICAgICAgICAgICA9IHBQbGFuZU91dDsgIC8qIFNhdmUgdGhlIGxhc3QgWVVWIHBsYW5lIHB0ciAqLwotICAgICAgICAgICAgcEMtPnVpU2F2ZWREdXJhdGlvbiAgICAgICAgID0gKE00T1NBX1VJbnQzMiltdER1cmF0aW9uOyAvKiBTYXZlIHRoZSBsYXN0IGR1cmF0aW9uICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqPCBOb3QgbmVjZXNzYXJ5IGhlcmUgYmVjYXVzZSB0aGUgbGFzdCBmcmFtZSBkdXJhdGlvbiBpcyBzZXQgdG8gdGhlLWxhc3QtYnV0LW9uZSBieQotICAgICAgICAgICAgICAgIHRoZSBsaWdodCB3cml0ZXIgKi8KLSAgICAgICAgLyoqPCBPbmx5IG5lY2Vzc2FyeSBmb3IgcEMtPm1fbXROZXh0Q3RzIGJlbG93Li4uKi8KLSAgICAgICAgbXREdXJhdGlvbiA9IHBDLT51aVNhdmVkRHVyYXRpb247Ci0KLQotICAgICAgICAvKiogQ29weSB0aGUgbGFzdCBZVVYgcGxhbmUgaW50byB0aGUgY3VycmVudCBvbmUKLSAgICAgICAgICogKHRoZSBsYXN0IHBpYyBpcyBzcGxpdGVkIGR1ZSB0byB0aGUgY2FsbGJhY2sgZXh0cmEtY2FsbC4uLiAqLwotICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFtpXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cFNhdmVkUGxhbmVbaV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXRbaV0udV9zdHJpZGUgKiBwUGxhbmVPdXRbaV0udV9oZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVGltZUluY3JlbWVudCBzaG91bGQgYmUgMzAgZnBzIG1heGltdW0gKi8KLSAgICBpZihtdER1cmF0aW9uIDwgTTRQVE8zR1BQX01JTl9USU1FX0lOQ1JFTUVOVCkKLSAgICB7Ci0gICAgICAgIG10RHVyYXRpb24gPSBNNFBUTzNHUFBfTUlOX1RJTUVfSU5DUkVNRU5UOwotICAgIH0KLQotICAgIHBDLT5tX210TmV4dEN0cyArPSBtdER1cmF0aW9uOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00UFRPM0dQUF9hcHBseVZQUDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9BbXIuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfQW1yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcxZjBlMjguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9BbXIuYworKysgL2Rldi9udWxsCkBAIC0xLDc5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00UkVBREVSX0Ftci5jCi0gKiBAYnJpZWYgIEdlbmVyaWMgZW5jYXBzdWxhdGlvbiBvZiB0aGUgY29yZSBhbXIgcmVhZGVyCi0gKiBAbm90ZSAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBnZW5lcmljIE00UkVBREVSIGludGVyZmFjZQotICogICAgICAgICBvbiB0b3Agb2YgdGhlIEFNUiByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0KLSNpbmNsdWRlICJNNF9VdGlscy5oIgotCi0jaW5jbHVkZSAiTTRBTVJSX0NvcmVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFJFQURFUl9BbXIuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgICAgTTRSRUFERVJfQU1SX0NvbnRleHQKLSAqIEBicmllZiAgICAgICBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBpbnRlcm5hbCBjb250ZXh0IG9mIGEgYW1yIHJlYWRlciBpbnN0YW5jZQotICogQG5vdGUgICAgICAgIFRoZSBjb250ZXh0IGlzIGFsbG9jYXRlZCBhbmQgZGUtYWxsb2NhdGVkIGJ5IHRoZSByZWFkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCBfTTRSRUFERVJfQU1SX0NvbnRleHQKLXsKLSAgICBNNE9TQV9Db250ZXh0ICAgICAgICAgICBtX3BDb3JlQ29udGV4dDsgICAgIC8qKjwgY29yZSBhbXIgcmVhZGVyIGNvbnRleHQgKi8KLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICBtX3BBdWRpb1N0cmVhbTsgICAgIC8qKjwgcG9pbnRlciBvbiB0aGUgYXVkaW8gc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gcmV0dXJuZWQgYnkgdGhlIGNvcmUgKi8KLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICBtX2F1ZGlvQXU7ICAgICAgICAgIC8qKjwgYXVkaW8gYWNjZXNzIHVuaXQgdG8gYmUgZmlsbGVkIGJ5IHRoZSBjb3JlICovCi0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgbV9tYXhEdXJhdGlvbjsgICAgICAvKio8IGR1cmF0aW9uIG9mIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqICAgIG1fcE9zYUZpbGVSZWFkZXJGY3RzOyAgICAvKio8IE9TQUwgZmlsZSByZWFkIGZ1bmN0aW9ucyAqLwotCi19IE00UkVBREVSX0FNUl9Db250ZXh0OwotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAoT1VUKSAgICBwb2ludGVyIG9uIGEgcmVhZGVyIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogcFJlYWRlckNvbnRleHQ7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQ29udGV4dCA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9jcmVhdGU6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBwUmVhZGVyQ29udGV4dCA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFJFQURFUl9BTVJfQ29udGV4dCksCi0gICAgICAgICBNNFJFQURFUl9BTVIsIChNNE9TQV9DaGFyICopIk00UkVBREVSX0FNUl9Db250ZXh0Iik7Ci0gICAgaWYgKHBSZWFkZXJDb250ZXh0ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcFJlYWRlckNvbnRleHQtPm1fcEF1ZGlvU3RyZWFtICA9IE00T1NBX05VTEw7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1fYXVkaW9BdS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1fbWF4RHVyYXRpb24gPSAwOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BDb3JlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1fcE9zYUZpbGVSZWFkZXJGY3RzID0gTTRPU0FfTlVMTDsKLQotICAgICpwQ29udGV4dCA9IHBSZWFkZXJDb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGRlc3Ryb3kgdGhlIGluc3RhbmNlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgICBhZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfZGVzdHJveShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEM9KE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9kZXN0cm95OiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcEMpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2Rlc3Ryb3koKTogTTRSRUFERVJfQU1SX2Rlc3Ryb3k6IGNvbnRleHQgaXMgTTRPU0FfTlVMTCxcCi0gICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX1BBUkFNRVRFUiIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGZyZWUocEMpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgb3BlbiB0aGUgcmVhZGVyIGFuZCBpbml0aWFsaXplcyBpdHMgY3JlYXRlZCBpbnN0YW5jZQotICogQG5vdGUgICAgIHRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIEFNUiBmaWxlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBGaWxlRGVzY3JpcHRvcjogICAgKElOKSAgICBQb2ludGVyIHRvIHByb3ByaWV0YXJ5IGRhdGEgaWRlbnRpZnlpbmcgdGhlIG1lZGlhIHRvIG9wZW4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgTTRSRUFERVJfQU1SX29wZW4oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9Wb2lkKiBwRmlsZURlc2NyaXB0b3IpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgICBlcnI7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCAgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9vcGVuOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwRmlsZURlc2NyaXB0b3IpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX29wZW46IGludmFsaWQgcG9pbnRlciBwRmlsZURlc2NyaXB0b3IiKTsKLQotICAgIGVyciA9IE00QU1SUl9vcGVuUmVhZCggJnBDLT5tX3BDb3JlQ29udGV4dCwgcEZpbGVEZXNjcmlwdG9yLCBwQy0+bV9wT3NhRmlsZVJlYWRlckZjdHMpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNsb3NlIHRoZSByZWFkZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRSRUFERVJfQU1SX2Nsb3NlKE00T1NBX0NvbnRleHQgY29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgIGVycjsKLSAgICBNNEFNUlJfU3RhdGUgU3RhdGU7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2Nsb3NlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyoqCi0gICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcEMpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2Nsb3NlKCk6IE00UkVBREVSX0FNUl9jbG9zZTogY29udGV4dCBpcyBNNE9TQV9OVUxMLFwKLSAgICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRBTVJSX2dldFN0YXRlKHBDLT5tX3BDb3JlQ29udGV4dCwgJlN0YXRlLAotICAgICAgICAgICAgICAgICgoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKS0+bV9zdHJlYW1JZCk7Ci0gICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2Nsb3NlOiBlcnJvciB3aGVuIGNhbGxpbmcgTTRBTVJSX2dldFN0YXRlXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoTTRBTVJSX2tSZWFkaW5nX25leHRBVSA9PSBTdGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRBTVJSX2ZyZWVBVShwQy0+bV9wQ29yZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgKChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pLT5tX3N0cmVhbUlkLCAgJnBDLT5tX2F1ZGlvQXUpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfY2xvc2U6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIERlbGV0ZSB0aGUgRFNJIGlmIG5lZWRlZCAqLwotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbykKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShcCi0gICAgICAgICAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLQotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5hbGx5IGRlc3Ryb3kgdGhlIHN0cmVhbSBoYW5kbGVyICovCi0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQ29yZUNvbnRleHQpCi0gICAgewotICAgICAgICBlcnIgPSBNNEFNUlJfY2xvc2VSZWFkKHBDLT5tX3BDb3JlQ29udGV4dCk7Ci0gICAgICAgIHBDLT5tX3BDb3JlQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgbWVkaWEKLSAqIEBub3RlICAgIGN1cnJlbnQgdmVyc2lvbiBuZWVkcyB0byB0cmFuc2xhdGUgTTRTWVNfU3RyZWFtIHRvIE00X1N0cmVhbUhhbmRsZXIKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwTWVkaWFGYW1pbHk6ICAgKE9VVCkgIHBvaW50ZXIgdG8gYSB1c2VyIGFsbG9jYXRlZCBNNFJFQURFUl9NZWRpYUZhbWlseQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBtZWRpYSBmYW1pbHkgb2YgdGhlIGZvdW5kIHN0cmVhbQotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyOiAoT1VUKSAgcG9pbnRlciB0byBhIHN0cmVhbSBoYW5kbGVyIHRoYXQgd2lsbCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGFuZCBmaWxsZWQgd2l0aCB0aGUgZm91bmQgc3RyZWFtIGRlc2NyaXB0aW9uCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gIG5vIG1vcmUgYXZhaWxhYmxlIHN0cmVhbSBpbiB0aGUgbWVkaWEgKGFsbCBzdHJlYW1zIGZvdW5kKQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBtb2RlIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRSRUFERVJfTWVkaWFGYW1pbHkgKnBNZWRpYUZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICoqcFN0cmVhbUhhbmRsZXJQYXJhbSkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICBwQz0oTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRTWVNfU3RyZWFtRGVzY3JpcHRpb24gc3RyZWFtRGVzYzsKLSAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqICBwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00X1N0cmVhbUhhbmRsZXIqICAgICAgIHBTdHJlYW1IYW5kbGVyOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgIk00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBNZWRpYUZhbWlseSA9PSAwKSwgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAiTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW06IGludmFsaWQgcG9pbnRlciB0byBNZWRpYUZhbWlseSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXJQYXJhbSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIGVyciA9IE00QU1SUl9nZXROZXh0U3RyZWFtKCBwQy0+bV9wQ29yZUNvbnRleHQsICZzdHJlYW1EZXNjKTsKLSAgICBpZiAoZXJyID09IE00V0FSX05PX01PUkVfU1RSRUFNKQotICAgIHsKLSAgICAgICAgc3RyZWFtSWRBcnJheVswXSA9IDA7Ci0gICAgICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotICAgICAgICBlcnIgPSBNNEFNUlJfc3RhcnRSZWFkaW5nKHBDLT5tX3BDb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSk7Ci0gICAgICAgIGlmICgoTTRPU0FfVUludDMyKU00RVJSX0FMTE9DID09IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UkVBREVSX0FNUl9nZXROZXh0U3RyZWFtOiBNNEFNUlJfc3RhcnRSZWFkaW5nIHJldHVybnMgTTRFUlJfQUxMT0MhIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgICpwTWVkaWFGYW1pbHkgPSBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbzsKLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXIgPSAoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlciksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9BTVIsIChNNE9TQV9DaGFyICopIk00X0F1ZGlvU3RyZWFtSGFuZGxlciIpOwotICAgIGlmIChwQXVkaW9TdHJlYW1IYW5kbGVyID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHBTdHJlYW1IYW5kbGVyID0oTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICpwU3RyZWFtSGFuZGxlclBhcmFtID0gcFN0cmVhbUhhbmRsZXI7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gcEF1ZGlvU3RyZWFtSGFuZGxlcjsKLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc3RydWN0U2l6ZSA9IHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpOwotCi0gICAgLyoKLSAgICAgKiBBdWRpbyBzdHJlYW0gaGFuZGxlciBmaWVsZHMgYXJlIGluaXRpYWxpc2VkIHdpdGggMCB2YWx1ZS4KLSAgICAgKiBUaGV5IHdpbGwgYmUgcHJvcGVybHkgc2V0IGJ5IHRoZSBBTVIgZGVjb2RlcgotICAgICAqLwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoICAgPSAwOwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemUgICAgPSAwOwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyAgICAgICAgPSAwOwotCi0gICAgcFN0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gICAgPSAoTTRPU0FfVUludDgqKShzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm8pOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCAgICAgICAgICAgICAgICA9IHN0cmVhbURlc2Muc3RyZWFtSUQ7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fZHVyYXRpb24gICAgICAgICAgICAgICAgPSBzdHJlYW1EZXNjLmR1cmF0aW9uOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YSAgICAgICAgICAgICAgID0gKHZvaWQqKShpbnRwdHJfdClzdHJlYW1EZXNjLnRpbWVTY2FsZTsgLyp0cmljayB0byBjaGFuZ2UqLwotCi0gICAgaWYgKHN0cmVhbURlc2MuZHVyYXRpb24gPiBwQy0+bV9tYXhEdXJhdGlvbikKLSAgICB7Ci0gICAgICAgIHBDLT5tX21heER1cmF0aW9uID0gc3RyZWFtRGVzYy5kdXJhdGlvbjsKLSAgICB9Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fYXZlcmFnZUJpdFJhdGUgICAgICAgICAgPSBzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlOwotCi0gICAgTTRBTVJSX2dldG1heEFVc2l6ZShwQy0+bV9wQ29yZUNvbnRleHQsICZwU3RyZWFtSGFuZGxlci0+bV9tYXhBVVNpemUpOwotCi0gICAgc3dpdGNoIChzdHJlYW1EZXNjLnN0cmVhbVR5cGUpCi0gICAgewotICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFNZU19rQU1SX1dCOgotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJXaWRlQmFuZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgZmlsbCB0aGUgYWNjZXNzIHVuaXQgc3RydWN0dXJlIHdpdGggaW5pdGlhbGl6YXRpb24gdmFsdWVzCi0gKiBAbm90ZQotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKElOKSAgICAgcG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgdG8KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIGFjY2VzcyB1bml0IHdpbGwgYmUgYXNzb2NpYXRlZAotICogQHBhcmFtICAgIHBBY2Nlc3NVbml0OiAgICAoSU4vT1VUKSBwb2ludGVyIHRvIHRoZSBhY2Nlc3MgdW5pdCAoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaW5pdGlhbGl6ZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3QoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgcG9pbnRlciB0byBNNF9BY2Nlc3NVbml0Iik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2ZpbGxBdVN0cnVjdDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQXUtPnNpemUgICAgICAgID0gMDsKLSAgICAvKiBKQzogYnVnIGZpeCAxMTk3IChzZXQgQ1RTIHRvIC0yMCBpbiBvcmRlciB0aGUgZmlyc3QgQVUgQ1RTIGlzIDApICovCi0gICAgcEF1LT5DVFMgICAgICAgICA9IC0yMDsKLSAgICBwQXUtPkRUUyAgICAgICAgID0gLTIwOwotICAgIHBBdS0+YXR0cmlidXRlICAgPSAwOwotICAgIHBBdS0+bmJGcmFnICAgICAgPSAwOwotCi0gICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSAgICAgICAgID0gMDsKLSAgICAvKiBKQzogYnVnIGZpeCAxMTk3IChzZXQgQ1RTIHRvIC0yMCBpbiBvcmRlciB0aGUgZmlyc3QgQVUgQ1RTIGlzIDApICovCi0gICAgcEFjY2Vzc1VuaXQtPm1fQ1RTICAgICAgICAgID0gLTIwOwotICAgIHBBY2Nlc3NVbml0LT5tX0RUUyAgICAgICAgICA9IC0yMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzICA9IE00T1NBX05VTEw7LypwQnVmZmVyOyovCi0gICAgcEFjY2Vzc1VuaXQtPm1fbWF4c2l6ZSAgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cmVhbUlEICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cnVjdFNpemUgICA9IHNpemVvZihNNF9BY2Nlc3NVbml0KTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBnZXQgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIHJlYWRlcgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotICogICAgICAgICAgLSB0aGUgZHVyYXRpb24gb2YgdGhlIGxvbmdlc3Qgc3RyZWFtIG9mIHRoZSBtZWRpYQotICogICAgICAgICAgLSB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHJlYWRlciAobm90IGltcGxlbWVudGVkIHlldCkKLSAqCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIGdldAotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAgICAoT1VUKSAgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkIGJ5IHVzZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybiAgICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKQotCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqIHBDID0gKE00UkVBREVSX0FNUl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksICAgICBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaChvcHRpb25JZCkKLSAgICB7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfRHVyYXRpb24gOgotICAgICAgICB7Ci0gICAgICAgICAgICAqKE00T1NBX1RpbWUqKXBWYWx1ZSA9IHBDLT5tX21heER1cmF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZToKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwQml0cmF0ZSA9IChNNE9TQV9VSW50MzIqKXBWYWx1ZTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcEJpdHJhdGUgPSBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEJpdHJhdGUgPSAwOwotICAgICAgICAgICAgICAgIGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX1ZlcnNpb246Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00QU1SUl9nZXRWZXJzaW9uKChNNF9WZXJzaW9uSW5mbyopcFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIHNldCBlbiBvcHRpb24gdmFsdWUgb2YgdGhlIHJlYWRkZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2V0IGEgcHJvcGVydHkgdmFsdWU6Ci0gKiAgICAgICAgICAtIHRoZSBPU0FMIGZpbGUgcmVhZCBmdW5jdGlvbnMKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSBkZWNvZGVyCi0gKiBAcGFyYW0gICBvcHRpb25JZDogICAoSU4pICAgICAgICBJZGVudGlmaWVyIGluZGljYXRpbmcgdGhlIG9wdGlvbiB0byBzZXQKLSAqIEBwYXJhbSAgIHBWYWx1ZTogICAgIChJTikgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQgYnkgdXNlcikKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICBUaGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgVGhlIG9wdGlvbiBJRCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gIE00RVJSX1NUQVRFICAgICAgICAgICAgIFN0YXRlIGF1dG9tYXRvbiBpcyBub3QgYXBwbGllZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgVGhlIG9wdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgICAgIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBWYWx1ZSksIE00RVJSX1BBUkFNRVRFUiwgImludmFsaWQgdmFsdWUgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKG9wdGlvbklkKQotICAgIHsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0ciA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5tX3BPc2FGaWxlUmVhZGVyRmN0cyA9IChNNE9TQV9GaWxlUmVhZFBvaW50ZXIqKXBWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgcmVzZXQgdGhlIHN0cmVhbSwgdGhhdCBpcyBzZWVrIGl0IHRvIGJlZ2lubmluZyBhbmQgbWFrZSBpdCByZWFkeSB0byBiZSByZWFkCi0gKiBAbm90ZSAgICB0aGlzIGZ1bmN0aW9uIGlzIHRvIGJlIGRlcHJlY2F0ZWQgaW4gbmV4dCB2ZXJzaW9ucwotICoKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgICAoSU4pICAgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIHJlc2V0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gbW9yZSBtZW1vcnkgYXZhaWxhYmxlCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgICAgIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICogQHJldHVybiAgICBNNEVSUl9TVEFURSAgICB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgbm93Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgICBNNFdBUl9JTlZBTElEX1RJTUUgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtIGNhbiBub3QgYmUgcmVhY2hlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfcmVzZXQoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcikKLXsKLSAgICBNNFJFQURFUl9BTVJfQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9BTVJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNFNZU19TdHJlYW1JRCAgICAgICAgICBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVycjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgdGltZTY0ID0gMDsKLSAgICBNNEFNUlJfU3RhdGUgICAgICAgICAgICBTdGF0ZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwgIk00UkVBREVSX0FNUl9yZXNldDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9yZXNldDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfcmVzZXQ6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRBTVJSX2dldFN0YXRlKHBDLT5tX3BDb3JlQ29udGV4dCwgJlN0YXRlLCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCk7Ci0gICAgaWYgKE00QU1SUl9rUmVhZGluZ19uZXh0QVUgPT0gU3RhdGUpCi0gICAgewotICAgICAgICBlcnIgPSBNNEFNUlJfZnJlZUFVKHBDLT5tX3BDb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9yZXNldDogZXJyb3Igd2hlbiBmcmVlaW5nIGFjY2VzcyB1bml0XG4iKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgc3RyZWFtSWRBcnJheVswXSA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotCi0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIGZvciByZXNldCBkdXJpbmcgcGxheWJhY2sgKi8KLSAgICAvKiAoc2V0IENUUyB0byAtMjAgaW4gb3JkZXIgdGhlIGZpcnN0IEFVIENUUyBpcyAwKSAqLwotICAgIHBBdS0+Q1RTID0gLTIwOwotICAgIHBBdS0+RFRTID0gLTIwOwotCi0gICAgZXJyID0gTTRBTVJSX3NlZWsocEMtPm1fcENvcmVDb250ZXh0LCBzdHJlYW1JZEFycmF5LCB0aW1lNjQsIE00U1lTX2tCZWdpbm5pbmcsICZ0aW1lNjQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfcmVzZXQ6IGVycm9yIHdoZW4gY2FsbGluZyBNNEFNUlJfc2VlaygpXG4iKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBqdW1wIGludG8gdGhlIHN0cmVhbSBhdCB0aGUgc3BlY2lmaWVkIHRpbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAgIChJTikgICAgIHRoZSBzdHJlYW0gZGVzY3JpcHRpb24gb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgICBwVGltZSAgICAgICAgICAgIChJTi9PVVQpIElOOiAgdGhlIHRpbWUgdG8ganVtcCB0byAoaW4gbXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IHRoZSB0aW1lIHRvIHdoaWNoIHRoZSBzdHJlYW0gcmVhbGx5IGp1bXBlZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIG1vcmUgbWVtb3J5IGF2YWlsYWJsZQotICogQHJldHVybiAgICBNNFdBUl9JTlZBTElEX1RJTUUgICAgICAgIHRoZSB0aW1lIGNhbiBub3QgYmUgcmVhY2hlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBNNFJFQURFUl9BTVJfanVtcChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiogcFRpbWUpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRTWVNfU3RyZWFtSUQgICAgICAgICAgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgcEF1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgIHRpbWU2NCA9IChNNE9TQV9UaW1lKSpwVGltZTsKLSAgICBNNEFNUlJfU3RhdGUgICAgICAgICAgICBTdGF0ZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwgIk00UkVBREVSX0FNUl9yZXNldDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9yZXNldDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBUaW1lID09IDApLCBNNEVSUl9QQVJBTUVURVIsICJNNFJFQURFUl8zR1BfanVtcDogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVJfanVtcDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNEFNUlJfZ2V0U3RhdGUocEMtPm1fcENvcmVDb250ZXh0LCAmU3RhdGUsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkKTsKLSAgICBpZiAoTTRBTVJSX2tSZWFkaW5nX25leHRBVSA9PSBTdGF0ZSkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00QU1SUl9mcmVlQVUocEMtPm1fcENvcmVDb250ZXh0LCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCwgcEF1KTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfQU1SX2p1bXA6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLQotICAgIHBBdS0+Q1RTID0gdGltZTY0OwotICAgIHBBdS0+RFRTID0gdGltZTY0OwotICAgIGVyciA9IE00QU1SUl9zZWVrKHBDLT5tX3BDb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSwgdGltZTY0LCBNNFNZU19rTm9SQVBwcmV2aW91cywgJnRpbWU2NCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9qdW1wOiBlcnJvciB3aGVuIGNhbGxpbmcgTTRBTVJSX3NlZWsoKVxuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgKnBUaW1lID0gKE00T1NBX0ludDMyKXRpbWU2NDsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgR2V0cyBhbiBhY2Nlc3MgdW5pdCAoQVUpIGZyb20gdGhlIHN0cmVhbSBoYW5kbGVyIHNvdXJjZS4KLSAqIEBub3RlICAgIEFuIEFVIGlzIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBhbW91bnQgb2YgZGF0YSB0byBiZSBkZWNvZGVkIGJ5IGEgZGVjb2RlciAoYXVkaW8vdmlkZW8pLgotICogICAgICAgICAgSW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwgd2UgbmVlZCB0byB0cmFuc2xhdGUgTTRPU0FfQWNjZXNzVW5pdCB0byBNNF9BY2Nlc3NVbml0Ci0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgKElOKSAgICAgICAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQgICAgIChJTi9PVVQpICAgIFBvaW50ZXIgdG8gYW4gYWNjZXNzIHVuaXQgdG8gZmlsbCB3aXRoIHJlYWQgZGF0YSAodGhlIGF1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIsIGFuZCBtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIGJ5IGNhbGxpbmcgTTRSRUFERVJfZmlsbEF1U3RydWN0X2ZjdCBhZnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DICAgICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9CQURfU1RSRUFNX0lEICAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIHN0cmVhbSBJZC4gZG9lcyBub3QgZXhpc3QuCi0gKiBAcmV0dXJuICAgIE00V0FSX05PX01PUkVfQVUgICAgICAgIHRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0gKGVuZCBvZiBzdHJlYW0pCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIE00UkVBREVSX0FNUl9nZXROZXh0QXUoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpCi17Ci0gICAgTTRSRUFERVJfQU1SX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfQU1SX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0gICAgTTRfTWVkaWFUaW1lICAgICAgICAgICAgdGltZVNjYWxlOwotICAgIE00QU1SUl9TdGF0ZSAgICAgICAgICAgIFN0YXRlOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9nZXROZXh0QXU6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgLyoga2VlcCB0cmFjZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlcnMgaW4gQVUgdG8gYmUgYWJsZSB0byBmcmVlIHRoZW0gYXQgZGVzdHJveSgpCi0gICAgICAgYnV0IGJlIGF3YXJlIHRoYXQgc3lzdGVtIGlzIHJpc2t5IGFuZCB3b3VsZCBuZWVkIHVwZ3JhZGUgaWYgbW9yZSB0aGFuCi0gICAgICAgb25lIHZpZGVvIGFuZCBvbmUgYXVkaW8gQVUgaXMgbmVlZGVkICovCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FNUl9nZXROZXh0QXU6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93blxuIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRBTVJSX2dldFN0YXRlKHBDLT5tX3BDb3JlQ29udGV4dCwgJlN0YXRlLCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCk7Ci0gICAgaWYgKE00QU1SUl9rUmVhZGluZ19uZXh0QVUgPT0gU3RhdGUpCi0gICAgewotICAgICAgICBlcnIgPSBNNEFNUlJfZnJlZUFVKHBDLT5tX3BDb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX0FWSV9nZXROZXh0QXU6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHBBdS0+bmJGcmFnID0gMDsKLSAgICBlcnIgPSBNNEFNUlJfbmV4dEFVKHBDLT5tX3BDb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0KLSAgICBpZiAoZXJyID09IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICB0aW1lU2NhbGUgPSAoTTRPU0FfRmxvYXQpKE00T1NBX0ludDMyKShpbnRwdHJfdCkocFN0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhKS8xMDAwOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOClwQXUtPmRhdGFBZGRyZXNzOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9DVFMgID0gKE00X01lZGlhVGltZSlwQXUtPkNUUy8qL3RpbWVTY2FsZSovOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9EVFMgID0gKE00X01lZGlhVGltZSlwQXUtPkRUUy8qL3RpbWVTY2FsZSovOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgPSBwQXUtPmF0dHJpYnV0ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZT0wOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgUmV0cmlldmVzIHRoZSBnZW5lcmljIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlIHJlYWRlcgotKgotKiBAcGFyYW0gcE1lZGlhVHlwZSAgICAgICAgICA6IFBvaW50ZXIgb24gYSBNNFJFQURFUl9NZWRpYVR5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyByZWFkZXIKLSogQHBhcmFtIHBSZHJHbG9iYWxJbnRlcmZhY2UgOiBBZGRyZXNzIG9mIGEgcG9pbnRlciB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBnbG9iYWwgaW50ZXJmYWNlIGltcGxlbWVudGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKiBAcGFyYW0gcFJkckRhdGFJbnRlcmZhY2UgICA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGRhdGEgaW50ZXJmYWNlIGltcGxlbWVudGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVuLWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgotKgotKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgICAgIGlmIE9LCi0qICAgICAgICAgICAgRVJSX0FMTE9DICAgICAgaWYgYW4gYWxsb2NhdGlvbiBmYWlsZWQKLSogICAgICAgICAgICBFUlJfUEFSQU1FVEVSICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSICAgTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoTTRSRUFERVJfTWVkaWFUeXBlICpwTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKipwUmRyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwTWVkaWFUeXBlID09IDApLCAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNZWRpYVR5cGUiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZHJHbG9iYWxJbnRlcmZhY2UgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9BTVJfZ2V0SW50ZXJmYWNlczogaW52YWxpZCBwb2ludGVyIHRvIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJkckRhdGFJbnRlcmZhY2UgPT0gMCksICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX0FNUl9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRSRUFERVJfRGF0YUludGVyZmFjZSIpOwotCi0gICAgKnBSZHJHbG9iYWxJbnRlcmZhY2UgPQotICAgICAgICAgKE00UkVBREVSX0dsb2JhbEludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCBzaXplb2YoTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKSwKLSAgICAgICAgICAgICBNNFJFQURFUl9BTVIsIChNNE9TQV9DaGFyICopIk00UkVBREVSX0dsb2JhbEludGVyZmFjZSIgKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcFJkckdsb2JhbEludGVyZmFjZSkKLSAgICB7Ci0gICAgICAgICpwUmRyRGF0YUludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgKnBSZHJEYXRhSW50ZXJmYWNlID0gKE00UkVBREVSX0RhdGFJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0RhdGFJbnRlcmZhY2UpLAotICAgICAgICAgTTRSRUFERVJfQU1SLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9EYXRhSW50ZXJmYWNlIik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gKnBSZHJEYXRhSW50ZXJmYWNlKQotICAgIHsKLSAgICAgICAgZnJlZSgqcFJkckdsb2JhbEludGVyZmFjZSk7Ci0gICAgICAgICpwUmRyR2xvYmFsSW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICpwTWVkaWFUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZUFNUjsKLQotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICAgICAgICAgPSBNNFJFQURFUl9BTVJfY3JlYXRlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICAgICAgICAgPSBNNFJFQURFUl9BTVJfZGVzdHJveTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RPcGVuICAgICAgICAgICAgID0gTTRSRUFERVJfQU1SX29wZW47Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q2xvc2UgICAgICAgICAgICA9IE00UkVBREVSX0FNUl9jbG9zZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfQU1SX2dldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfQU1SX3NldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0U3RyZWFtICAgID0gTTRSRUFERVJfQU1SX2dldE5leHRTdHJlYW07Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RmlsbEF1U3RydWN0ICAgICA9IE00UkVBREVSX0FNUl9maWxsQXVTdHJ1Y3Q7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RhcnQgICAgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RvcCAgICAgICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0SnVtcCAgICAgICAgICAgICA9IE00UkVBREVSX0FNUl9qdW1wOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFJlc2V0ICAgICAgICAgICAgPSBNNFJFQURFUl9BTVJfcmVzZXQ7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0UHJldlJhcFRpbWUgICA9IE00T1NBX05VTEw7IC8qYWxsIEFVcyBhcmUgUkFQKi8KLQotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0QXUgICAgICAgICAgPSBNNFJFQURFUl9BTVJfZ2V0TmV4dEF1OwotCi0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9QY20uYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRSRUFERVJfUGNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5MjM2N2YuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFJFQURFUl9QY20uYworKysgL2Rldi9udWxsCkBAIC0xLDcyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFJFQURFUl9XYXYuYwotICogQGJyaWVmICBHZW5lcmljIGVuY2Fwc3VsYXRpb24gb2YgdGhlIGNvcmUgcGNtIHJlYWRlcgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZ2VuZXJpYyBNNFJFQURFUiBpbnRlcmZhY2UKLSAqICAgICAgICAgb24gdG9wIG9mIHRoZSBQQ00gcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jaW5jbHVkZSAiTTRPU0FfVHlwZXMuaCIKLSNpbmNsdWRlICJNNE9TQV9FcnJvci5oIgotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRUT09MX1ZlcnNpb25JbmZvLmgiCi0jaW5jbHVkZSAiTTRQQ01SX0NvcmVSZWFkZXIuaCIKLSNpbmNsdWRlICJNNFJFQURFUl9QY20uaCIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc3RydWN0dXJlICAgIE00UkVBREVSX1dBVl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgaW50ZXJuYWwgY29udGV4dCBvZiBhIHdhdiByZWFkZXIgaW5zdGFuY2UKLSAqIEBub3RlICAgICAgICBUaGUgY29udGV4dCBpcyBhbGxvY2F0ZWQgYW5kIGRlLWFsbG9jYXRlZCBieSB0aGUgcmVhZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXR5cGVkZWYgc3RydWN0IF9NNFJFQURFUl9QQ01fQ29udGV4dAotewotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgIG1fY29yZUNvbnRleHQ7ICAgICAgICAvKio8IGNvcmUgd2F2IHJlYWRlciBjb250ZXh0ICovCi0gICAgTTRfU3RyZWFtSGFuZGxlciogICAgICAgbV9wQXVkaW9TdHJlYW07ICAgICAgIC8qKjwgcG9pbnRlciBvbiB0aGUgYXVkaW8gc3RyZWFtIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGJ5IHRoZSBjb3JlICovCi0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgbV9hdWRpb0F1OyAgICAgICAgICAgIC8qKjwgYXVkaW8gYWNjZXNzIHVuaXQgdG8gYmUgZmlsbGVkIGJ5IHRoZSBjb3JlICovCi0gICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiAgbV9wT3NhRmlsZVJlYWRlckZjdHM7IC8qKjwgT1NBTCBmaWxlIHJlYWQgZnVuY3Rpb25zICovCi0KLX0gTTRSRUFERVJfUENNX0NvbnRleHQ7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBDcmVhdGVzIGEgd2F2IHJlYWRlciBpbnN0YW5jZQotICogQG5vdGUgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQ29udGV4dDogICAgICAgICAgICAoT1VUKSAgUG9pbnRlciB0byBhIHdhdiByZWFkZXIgY29udGV4dAotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9BTExPQzogICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2NyZWF0ZShNNE9TQV9Db250ZXh0KiBwQ29udGV4dCkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwUmVhZGVyQ29udGV4dDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocENvbnRleHQgPT0gMCksICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fY3JlYXRlOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcFJlYWRlckNvbnRleHQgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRSRUFERVJfUENNX0NvbnRleHQpLAotICAgICAgICAgTTRSRUFERVJfV0FWLCAoTTRPU0FfQ2hhciAqKSJNNFJFQURFUl9QQ01fQ29udGV4dCIpOwotICAgIGlmIChwUmVhZGVyQ29udGV4dCA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBSZWFkZXJDb250ZXh0LT5tX2NvcmVDb250ZXh0ICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BBdWRpb1N0cmVhbSAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX2F1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tX3BPc2FGaWxlUmVhZGVyRmN0cyAgPSBNNE9TQV9OVUxMOwotCi0gICAgKnBDb250ZXh0ID0gcFJlYWRlckNvbnRleHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBEZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVhZGVyCi0gKiBAbm90ZSAgICB0aGUgY29udGV4dCBpcyB1bi1hbGxvY2F0ZWQKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAgKElOKSBjb250ZXh0IG9mIHRoZSBuZXR3b3JrIHJlYWRlcgotICogQHJldHVybiAgTTROT19FUlJPUjogICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2Rlc3Ryb3koTTRPU0FfQ29udGV4dCBjb250ZXh0KQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2Rlc3Ryb3k6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBmcmVlKHBDKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEluaXRpYWxpemVzIHRoZSByZWFkZXIgaW5zdGFuY2UKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAgICAoSU4pICAgIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBwRmlsZURlc2NyaXB0b3I6ICAgKElOKSAgICBQb2ludGVyIHRvIHByb3ByaWV0YXJ5IGRhdGEgaWRlbnRpZnlpbmcgdGhlIG1lZGlhIHRvIG9wZW4KLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fb3BlbihNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00T1NBX1ZvaWQqIHBGaWxlRGVzY3JpcHRvcikKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9vcGVuOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwRmlsZURlc2NyaXB0b3IpLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgZXJyID0gTTRQQ01SX29wZW5SZWFkKCYocEMtPm1fY29yZUNvbnRleHQpLCAoTTRPU0FfQ2hhciopcEZpbGVEZXNjcmlwdG9yLAotICAgICAgICAgcEMtPm1fcE9zYUZpbGVSZWFkZXJGY3RzKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgICBjbG9zZSB0aGUgcmVhZGVyCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotICogQHJldHVybiAgICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9jbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotCi0gICAgLyogQ2hlY2sgZnVuY3Rpb24gcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fY2xvc2U6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiBGcmVlIGF1ZGlvIEFVIGFuZCBhdWRpbyBzdHJlYW0gKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+bV9hdWRpb0F1LmRhdGFBZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFBDTVJfZnJlZUFVKHBDLT5tX2NvcmVDb250ZXh0LCBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fc3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgICZwQy0+bV9hdWRpb0F1KTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2Nsb3NlOiBFcnJvciB3aGVuIGZyZWVpbmcgYXVkaW8gYWNjZXNzIHVuaXQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLQotICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5tX2NvcmVDb250ZXh0KQotICAgIHsKLSAgICAgICAgLyogQ2xvc2UgdGhhIFBDTSBmaWxlICovCi0gICAgICAgZXJyID0gTTRQQ01SX2Nsb3NlUmVhZChwQy0+bV9jb3JlQ29udGV4dCk7Ci0gICAgICAgcEMtPm1fY29yZUNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBzZXQgZW4gb3B0aW9uIHZhbHVlIG9mIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2V0L2dldCBvcHRpb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBPU0FMIDMuMAotICogICAgICAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc2V0IGEgcHJvcGVydHkgdmFsdWU6Ci0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICAgcFZhbHVlOiAgICAgICAgIChJTikgICAgcG9pbnRlciB0byBzdHJ1Y3R1cmUgb3IgdmFsdWUgKGFsbG9jYXRlZCBieSB1c2VyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9DT05URVhUICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIHZvaWQqIHBWYWx1ZSkKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKiBDaGVjayBmdW5jdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fc2V0T3B0aW9uOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX3NldE9wdGlvbjogaW52YWxpZCB2YWx1ZSBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2gob3B0aW9uSWQpCi0gICAgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyIDoKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPm1fcE9zYUZpbGVSZWFkZXJGY3RzID0gKE00T1NBX0ZpbGVSZWFkUG9pbnRlciopcFZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIFJldHJpZXZlcyB0aGUgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIHJlYWRlciwgZ2l2ZW4gYW4gb3B0aW9uIElELgotICogQG5vdGUgICAgdGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzZXQvZ2V0IG9wdGlvbiBtZWNoYW5pc20gZGVzY3JpYmVkIGluIE9TQUwgMy4wCi0gKiAgICAgICAgICBpdCBhbGxvd3MgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBhIHByb3BlcnR5IHZhbHVlOgotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAoSU4pIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBvcHRpb25JZDogKElOKSBvcHRpb24gaWRlbnRpZmljYXRvciB3aG9zZSBvcHRpb24gdmFsdWUgaXMgdG8gYmUgcmV0cmlldmVkLgotICogQHBhcmFtICAgcFZhbHVlOiAgKE9VVCkgb3B0aW9uIHZhbHVlIHJldHJpZXZlZC4KLSAqCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SOiAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgTTRFUlJfQkFEX09QVElPTl9JRDogdGhlIHJlcXVpcmVkIG9wdGlvbiBpZGVudGlmaWNhdG9yIGlzIHVua25vd24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00UkVBREVSX1BDTV9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgdm9pZCogcFZhbHVlKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDb250ZXh0ID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVyciAgICAgID0gTTROT19FUlJPUjsKLQotICAgIC8qIG5vIGNoZWNrIG9mIGNvbnRleHQgYXQgdGhpcyBsZXZlbCBiZWNhdXNlIHNvbWUgb3B0aW9uIGRvZXMgbm90IG5lZWQgaXQgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBWYWx1ZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXRPcHRpb246IGludmFsaWQgcG9pbnRlciBvbiB2YWx1ZSIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JZCkKLSAgICB7Ci0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfRHVyYXRpb246Ci0gICAgICAgICooKE00T1NBX1VJbnQzMiopcFZhbHVlKSA9IHBDb250ZXh0LT5tX3BBdWRpb1N0cmVhbS0+bV9kdXJhdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICBlcnIgPSBNNFBDTVJfZ2V0VmVyc2lvbigoTTRfVmVyc2lvbkluZm8qKXBWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQ29weXJpZ2h0OgotICAgICAgICByZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQ29udGV4dC0+bV9wQXVkaW9TdHJlYW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBCaXRyYXRlID0gcENvbnRleHQtPm1fcEF1ZGlvU3RyZWFtLT5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBCaXRyYXRlID0gMDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2dldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSBtZWRpYQotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSAgY29udGV4dCBvZiB0aGUgbmV0d29yayByZWFkZXIKLSAqIEBwYXJhbSAgIHBNZWRpYUZhbWlseTogICAoT1VUKSBwb2ludGVyIHRvIGEgdXNlciBhbGxvY2F0ZWQgTTRSRUFERVJfTWVkaWFGYW1pbHkgdGhhdCB3aWxsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgZmlsbGVkCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKE9VVCkgcG9pbnRlciB0byBhIHN0cmVhbSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgYW5kIGZpbGxlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGZvdW5kIHN0cmVhbSBkZXNjcmlwdGlvbgotICoKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYSAoYWxsIHN0cmVhbXMgZm91bmQpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00UkVBREVSX01lZGlhRmFtaWx5ICpwTWVkaWFGYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqKnBTdHJlYW1IYW5kbGVyKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDPShNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgICAgICAgICAgICAgICBlcnI7Ci0vKiAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICBwU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7Ki8KLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiBzdHJlYW1EZXNjOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogIHBBdWRpb1N0cmVhbUhhbmRsZXI7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgZkR1cmF0aW9uOwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRQQ01DX0RlY29kZXJTcGVjaWZpY0luZm8qIHBEc2k7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhRmFtaWx5ID09IDApLCAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBwb2ludGVyIHRvIE1lZGlhRmFtaWx5Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIHBvaW50ZXIgdG8gU3RyZWFtSGFuZGxlciIpOwotCi0gICAgZXJyID0gTTRQQ01SX2dldE5leHRTdHJlYW0oIHBDLT5tX2NvcmVDb250ZXh0LCAmc3RyZWFtRGVzYyk7Ci0gICAgaWYgKGVyciA9PSBNNFdBUl9OT19NT1JFX1NUUkVBTSkKLSAgICB7Ci0gICAgICAgIHN0cmVhbUlkQXJyYXlbMF0gPSAwOwotICAgICAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLSAgICAgICAgZXJyID0gTTRQQ01SX3N0YXJ0UmVhZGluZyhwQy0+bV9jb3JlQ29udGV4dCwgc3RyZWFtSWRBcnJheSk7IC8qdG8gcHV0IGluIG9wZW4gZnVuY3Rpb24qLwotCi0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX1NUUkVBTTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICByZXR1cm4gZXJyOyAvKmFsc28gcmV0dXJuIE00V0FSX05PX01PUkVfU1RSRUFNKi8KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHN0cmVhbURlc2Muc3RyZWFtVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0F1ZGlvVW5rbm93bjoKLSAgICAgICAgY2FzZSBNNFNZU19rUENNXzE2Yml0c1M6Ci0gICAgICAgIGNhc2UgTTRTWVNfa1BDTV8xNmJpdHNVOgotICAgICAgICBjYXNlIE00U1lTX2tQQ01fOGJpdHNVOgotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00UkVBREVSX1BDTV9nZXROZXh0U3RyZWFtOiBmb3VuZCBhdWRpbyBzdHJlYW0iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseVVua25vd247Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGZvdW5kIFVOS05PV04gc3RyZWFtIik7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyID0gKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpLAotICAgICAgICAgTTRSRUFERVJfV0FWLCAoTTRPU0FfQ2hhciAqKSJNNF9BdWRpb1N0cmVhbUhhbmRsZXIiKTsKLSAgICBpZiAocEF1ZGlvU3RyZWFtSGFuZGxlciA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0gPSAoTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotCi0gICAgcERzaSA9IChNNFBDTUNfRGVjb2RlclNwZWNpZmljSW5mbyopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwRHNpID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW06IGludmFsaWQgZGVjb2RlciBzcGVjaWZpYyBpbmZvIGluIHN0cmVhbSIpOwotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IHBEc2ktPlNhbXBsZUZyZXF1ZW5jeTsKLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplICAgID0gKE00T1NBX1VJbnQzMikocERzaS0+Qml0c1BlclNhbXBsZS84KTsKLSAgICAvKiBtX2J5dGVGcmFtZUxlbmd0aCBpcyBiYWRseSBuYW1lZDogaXQgaXMgbm90IGluIGJ5dGVzIGJ1dCBpbiBzYW1wbGVzIG51bWJlciAqLwotICAgIGlmKHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc2FtcGxpbmdGcmVxdWVuY3kgPT0gODAwMCkKLSAgICB7Ci0gICAgICAgIC8qIEFNUiBjYXNlICovCi0gICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoICAgPQotICAgICAgICAgICAgICgoKHN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGUvOCkvNTApL3BEc2ktPm5iQ2hhbm5lbHMpXAotICAgICAgICAgICAgICAgIC9wQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplOy8qLzUwIHRvIGdldCBhcm91bmQgMjAgbXMgb2YgYXVkaW8qLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBBQUMgQ2FzZSAqLwotICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCA9Ci0gICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKChzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlLzgpLzE1LjYyNSkvcERzaS0+bmJDaGFubmVscylcCi0gICAgICAgICAgICAgICAgL3BBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemU7Ci0gICAgfQotCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzICAgICAgICA9IHBEc2ktPm5iQ2hhbm5lbHM7Ci0KLSAgICBNNE9TQV9USU1FX1RPX01TKCBmRHVyYXRpb24sIHN0cmVhbURlc2MuZHVyYXRpb24sIHN0cmVhbURlc2MudGltZVNjYWxlKTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fZHVyYXRpb24gICAgICAgICAgICAgICAgPSAoTTRPU0FfSW50MzIpZkR1cmF0aW9uOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyAgICA9IChNNE9TQV9VSW50OCopKHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgcEMtPm1fcEF1ZGlvU3RyZWFtLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fc3RyZWFtSWQgICAgICAgICAgICAgICAgPSBzdHJlYW1EZXNjLnN0cmVhbUlEOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9wVXNlckRhdGEgICAgICAgICAgICAgICA9Ci0gICAgICAgICh2b2lkKikoaW50cHRyX3Qpc3RyZWFtRGVzYy50aW1lU2NhbGU7IC8qdHJpY2sgdG8gY2hhbmdlKi8KLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fYXZlcmFnZUJpdFJhdGUgICAgICAgICAgPSBzdHJlYW1EZXNjLmF2ZXJhZ2VCaXRyYXRlOwotICAgIHBDLT5tX3BBdWRpb1N0cmVhbS0+bV9tYXhBVVNpemUgICAgICAgICAgICAgICA9Ci0gICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCpwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplXAotICAgICAgICAgICAgKnBBdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVsczsKLSAgICBwQy0+bV9wQXVkaW9TdHJlYW0tPm1fc3RyZWFtVHlwZSAgICAgICAgICAgICAgPSBNNERBX1N0cmVhbVR5cGVBdWRpb1BjbTsKLQotICAgICpwU3RyZWFtSGFuZGxlciA9IHBDLT5tX3BBdWRpb1N0cmVhbTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIGZpbGwgdGhlIGFjY2VzcyB1bml0IHN0cnVjdHVyZSB3aXRoIGluaXRpYWxpemF0aW9uIHZhbHVlcwotICogQG5vdGUKLSAqCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSBjb250ZXh0IG9mIHRoZSBuZXR3b3JrIHJlYWRlcgotICogQHBhcmFtICAgcFN0cmVhbUhhbmRsZXI6IChJTikgcG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgdG8gd2hpY2ggdGhlIGFjY2VzcyB1bml0IHdpbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXNzb2NpYXRlZAotICogQHBhcmFtICAgcEFjY2Vzc1VuaXQ6ICAgIChJTikgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQoYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIpIHRvIGluaXRpYWxpemUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6ICAgICAgIHRoZXJlIGlzIG5vIGVycm9yLgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSOiAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0IChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2ZpbGxBdVN0cnVjdChNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICJNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBwb2ludGVyIHRvIE00X1N0cmVhbUhhbmRsZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBBY2Nlc3NVbml0ID09IDApLCAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fZmlsbEF1U3RydWN0OiBwYXNzZWQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQXUtPnNpemUgICAgICAgID0gMDsKLSAgICBwQXUtPkNUUyAgICAgICAgID0gMDsKLSAgICBwQXUtPkRUUyAgICAgICAgID0gMDsKLSAgICBwQXUtPmF0dHJpYnV0ZSAgID0gMDsKLSAgICBwQXUtPm5iRnJhZyAgICAgID0gMDsKLQotICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fQ1RTICAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9EVFMgICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MgID0gTTRPU0FfTlVMTDsvKnBCdWZmZXI7Ki8KLSAgICBwQWNjZXNzVW5pdC0+bV9tYXhzaXplICAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9tYXhBVVNpemU7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fc3RyZWFtSUQgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fc3RydWN0U2l6ZSAgID0gc2l6ZW9mKE00X0FjY2Vzc1VuaXQpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgcmVzZXQgdGhlIHN0cmVhbSwgdGhhdCBpczogc2VlayBpdCB0byBiZWdpbm5pbmcgYW5kIG1ha2UgaXQgcmVhZHkgdG8gYmUgcmVhZAotICogQG5vdGUKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAoSU4pIGNvbnRleHQgb2YgdGhlIG5ldHdvcmsgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKElOKSBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byByZXNldAotICogQHJldHVybiAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFJFQURFUl9QQ01fcmVzZXQoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcikKLXsKLSAgICBNNFJFQURFUl9QQ01fQ29udGV4dCogICBwQyA9IChNNFJFQURFUl9QQ01fQ29udGV4dCopY29udGV4dDsKLSAgICBNNFNZU19TdHJlYW1JRCAgICAgICAgICBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00T1NBX0VSUiAgICAgICAgICAgICAgIGVycjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICB0aW1lNjQgPSAwOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfUENNX3Jlc2V0OiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX3Jlc2V0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotCi0gICAgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bV9wQXVkaW9TdHJlYW0pCi0gICAgewotICAgICAgICBwQXUgPSAmcEMtPm1fYXVkaW9BdTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTV9yZXNldDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBBdS0+ZGF0YUFkZHJlc3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00UENNUl9mcmVlQVUocEMtPm1fY29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fcmVzZXQ6IGVycm9yIHdoZW4gZnJlZWluZyBhY2Nlc3MgdW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBzdHJlYW1JZEFycmF5WzBdID0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQ7Ci0gICAgc3RyZWFtSWRBcnJheVsxXSA9IDA7Ci0KLSAgICBwQXUtPkNUUyA9IDA7Ci0gICAgcEF1LT5EVFMgPSAwOwotCi0gICAgLyogVGhpcyBjYWxsIGlzIG5lZWRlZCBvbmx5IHdoZW4gcmVwbGF5IGR1cmluZyBwbGF5YmFjayAqLwotICAgIGVyciA9IE00UENNUl9zZWVrKHBDLT5tX2NvcmVDb250ZXh0LCBzdHJlYW1JZEFycmF5LCB0aW1lNjQsIE00U1lTX2tCZWdpbm5pbmcsICZ0aW1lNjQpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXQgdGhlIG5leHQgYWNjZXNzIHVuaXQgb2YgdGhlIHNwZWNpZmllZCBzdHJlYW0KLSAqIEBub3RlCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlciAgKElOKSAgICAgICAgVGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICBwQWNjZXNzVW5pdCAgICAgKElOL09VVCkgICAgUG9pbnRlciB0byBhbiBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoZSBhdSBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLCBhbmQgbXVzdCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBjYWxsaW5nIE00UkVBREVSX2ZpbGxBdVN0cnVjdF9mY3QgYWZ0ZXIgY3JlYXRpb24pCi0gKiBAcmV0dXJuICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9DT05URVhUICAgICAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICogQHJldHVybnMgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybnMgTTRFUlJfQkFEX1NUUkVBTV9JRCAgICAgICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3RyZWFtIElkLiBkb2VzIG5vdCBleGlzdC4KLSAqIEByZXR1cm5zIE00V0FSX05PX0RBVEFfWUVUICAgICAgICAgICB0aGVyZSBpcyBubyBlbm91Z2ggZGF0YSBvbiB0aGUgc3RyZWFtIGZvciBuZXcgYWNjZXNzIHVuaXQKLSAqIEByZXR1cm5zIE00V0FSX05PX01PUkVfQVUgICAgICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtIChlbmQgb2Ygc3RyZWFtKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2dldE5leHRBdShNNE9TQV9Db250ZXh0IGNvbnRleHQsIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpCi17Ci0gICAgTTRSRUFERVJfUENNX0NvbnRleHQqICAgcEMgPSAoTTRSRUFERVJfUENNX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiAgICAgICBwQXU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldE5leHRBdTogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0QXU6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXROZXh0QXU6IGludmFsaWQgcG9pbnRlciB0byBNNF9BY2Nlc3NVbml0Iik7Ci0KLSAgICAvKiBrZWVwIHRyYWNlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVycyBpbiBBVSB0byBiZSBhYmxlIHRvIGZyZWUgdGhlbSBhdCBkZXN0cm95KCkKLSAgICAgICBidXQgYmUgYXdhcmUgdGhhdCBzeXN0ZW0gaXMgcmlza3kgYW5kIHdvdWxkIG5lZWQgdXBncmFkZSBpZiBtb3JlIHRoYW4KLSAgICAgICBvbmUgdmlkZW8gYW5kIG9uZSBhdWRpbyBBVSBpcyBuZWVkZWQgKi8KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tX3BBdWRpb1N0cmVhbSkKLSAgICB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bV9hdWRpb0F1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRSRUFERVJfUENNX2dldE5leHRBdTogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBBdS0+ZGF0YUFkZHJlc3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00UENNUl9mcmVlQVUocEMtPm1fY29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fZ2V0TmV4dEF1OiBlcnJvciB3aGVuIGZyZWVpbmcgYWNjZXNzIHVuaXQiKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQXUtPm5iRnJhZyA9IDA7Ci0gICAgZXJyID0gTTRQQ01SX25leHRBVShwQy0+bV9jb3JlQ29udGV4dCwgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQsIHBBdSk7Ci0KLSAgICBpZiAoZXJyID09IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOClwQXUtPmRhdGFBZGRyZXNzOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9DVFMgID0gKE00T1NBX0RvdWJsZSlwQXUtPkNUUzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fRFRTICA9IChNNE9TQV9Eb3VibGUpcEF1LT5EVFM7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSA9IHBBdS0+YXR0cmlidXRlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplPTA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotICogQG5vdGUKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyICAoSU4pICAgICB0aGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byBtYWtlIGp1bXAKLSAqIEBwYXJhbSAgIHBUaW1lICAgICAgICAgICAoSU4vT1VUKSBJTjogIHRoZSB0aW1lIHRvIGp1bXAgdG8gKGluIG1zKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDogdGhlIHRpbWUgdG8gd2hpY2ggdGhlIHN0cmVhbSByZWFsbHkganVtcGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXQgaW4gdGhpcyByZWFkZXIsIHdlIGRvIG5vdCBtb2RpZnkgdGhlIHRpbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICBNNEVSUl9BTExPQyAgICAgICAgICAgICB0aGVyZSBpcyBubyBtb3JlIG1lbW9yeSBhdmFpbGFibGUKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9TVFJFQU1fSUQgICAgIHRoZSBzdHJlYW1JRCBkb2VzIG5vdCBleGlzdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRSRUFERVJfUENNX2p1bXAoTTRPU0FfQ29udGV4dCBjb250ZXh0LCBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgTTRPU0FfSW50MzIqIHBUaW1lKQotewotICAgIE00UkVBREVSX1BDTV9Db250ZXh0KiAgIHBDID0gKE00UkVBREVSX1BDTV9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX1N0cmVhbUlEICAgICAgICAgIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgZXJyOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqICAgICAgIHBBdTsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgIHRpbWU2NDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwgIk00UkVBREVSX1BDTV9qdW1wOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2p1bXA6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLCAiTTRSRUFERVJfUENNX2p1bXA6IGludmFsaWQgdGltZSBwb2ludGVyIik7Ci0KLSAgICB0aW1lNjQgPSAoTTRPU0FfVGltZSkqcFRpbWU7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gcEMtPm1fcEF1ZGlvU3RyZWFtKQotICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tX2F1ZGlvQXU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fanVtcDogcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKHBBdS0+ZGF0YUFkZHJlc3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00UENNUl9mcmVlQVUocEMtPm1fY29yZUNvbnRleHQsIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkLCBwQXUpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9QQ01fanVtcDogRXJyb3Igd2hlbiBmcmVlaW5nIGFjY2VzcyB1bml0Iik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLQotICAgIHBBdS0+Q1RTID0gdGltZTY0OwotICAgIHBBdS0+RFRTID0gdGltZTY0OwotCi0gICAgZXJyID0gTTRQQ01SX3NlZWsocEMtPm1fY29yZUNvbnRleHQsIHN0cmVhbUlkQXJyYXksIHRpbWU2NCwgTTRTWVNfa0JlZ2lubmluZywgJnRpbWU2NCk7Ci0KLSAgICAqcFRpbWUgPSAoTTRPU0FfSW50MzIpdGltZTY0OwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmIFJldHJpZXZlcyB0aGUgZ2VuZXJpYyBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZSByZWFkZXIKLSAqCi0gKiBAcGFyYW0gcE1lZGlhVHlwZSAgICAgICAgICA6IFBvaW50ZXIgb24gYSBNNFJFQURFUl9NZWRpYVR5cGUgKGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIG1lZGlhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgcmVhZGVyCi0gKiBAcGFyYW0gcFJkckdsb2JhbEludGVyZmFjZSA6IEFkZHJlc3Mgb2YgYSBwb2ludGVyIHRoYXQgd2lsbCBiZSBzZXQgdG8gdGhlIGdsb2JhbCBpbnRlcmZhY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSAqIEBwYXJhbSBwUmRyRGF0YUludGVyZmFjZSAgIDogQWRkcmVzcyBvZiBhIHBvaW50ZXIgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgZGF0YSBpbnRlcmZhY2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoZSBpbnRlcmZhY2UgaXMgYSBzdHJ1Y3R1cmUgYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBmdW5jdGlvbiBhbmQgbXVzdCBiZSB1bi1hbGxvY2F0ZWQgYnkgdGhlIGNhbGxlci4KLSAqCi0gKiBAcmV0dXJucyA6IE00Tk9fRVJST1IgICAgIGlmIE9LCi0gKiAgICAgICAgICAgIEVSUl9BTExPQyAgICAgIGlmIGFuIGFsbG9jYXRpb24gZmFpbGVkCi0gKiAgICAgICAgICAgIEVSUl9QQVJBTUVURVIgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiAgIE00UkVBREVSX1BDTV9nZXRJbnRlcmZhY2VzKE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICoqcFJkckRhdGFJbnRlcmZhY2UpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotewotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhVHlwZSA9PSAwKSwgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTWVkaWFUeXBlIHBhc3NlZCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJkckdsb2JhbEludGVyZmFjZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgIk00UkVBREVSX1BDTV9nZXRJbnRlcmZhY2VzOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwUmRyRGF0YUludGVyZmFjZSA9PSAwKSwgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTRSRUFERVJfUENNX2dldEludGVyZmFjZXM6IGludmFsaWQgcG9pbnRlciB0byBNNFJFQURFUl9EYXRhSW50ZXJmYWNlIik7Ci0KLSAgICAqcFJkckdsb2JhbEludGVyZmFjZSA9Ci0gICAgICAgICAoTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoIHNpemVvZihNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UpLCBNNFJFQURFUl9XQVYsCi0gICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTRSRUFERVJfUENNIEdsb2JhbEludGVyZmFjZSIpOwotICAgIGlmIChNNE9TQV9OVUxMID09ICpwUmRyR2xvYmFsSW50ZXJmYWNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAqcFJkckRhdGFJbnRlcmZhY2UgPQotICAgICAgICAgKE00UkVBREVSX0RhdGFJbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyggc2l6ZW9mKE00UkVBREVSX0RhdGFJbnRlcmZhY2UpLCBNNFJFQURFUl9XQVYsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSAiTTRSRUFERVJfUENNIERhdGFJbnRlcmZhY2UiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSAqcFJkckRhdGFJbnRlcmZhY2UpCi0gICAgewotICAgICAgICBmcmVlKCpwUmRyR2xvYmFsSW50ZXJmYWNlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICpwTWVkaWFUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZVBDTTsKLQotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICAgICAgICAgPSBNNFJFQURFUl9QQ01fY3JlYXRlOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdERlc3Ryb3kgICAgICAgICAgPSBNNFJFQURFUl9QQ01fZGVzdHJveTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RPcGVuICAgICAgICAgICAgID0gTTRSRUFERVJfUENNX29wZW47Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q2xvc2UgICAgICAgICAgICA9IE00UkVBREVSX1BDTV9jbG9zZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTdGFydCAgICAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTdG9wICAgICAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfUENNX2dldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTZXRPcHRpb24gICAgICAgID0gTTRSRUFERVJfUENNX3NldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0U3RyZWFtICAgID0gTTRSRUFERVJfUENNX2dldE5leHRTdHJlYW07Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RmlsbEF1U3RydWN0ICAgICA9IE00UkVBREVSX1BDTV9maWxsQXVTdHJ1Y3Q7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0SnVtcCAgICAgICAgICAgICA9IE00UkVBREVSX1BDTV9qdW1wOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFJlc2V0ICAgICAgICAgICAgPSBNNFJFQURFUl9QQ01fcmVzZXQ7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0UHJldlJhcFRpbWUgICA9IE00T1NBX05VTEw7IC8qYWxsIEFVcyBhcmUgUkFQKi8KLQotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0QXUgICAgICAgICAgPSBNNFJFQURFUl9QQ01fZ2V0TmV4dEF1OwotCi0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfRVhURVJOQUxfQml0c3RyZWFtUGFyc2VyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfRVhURVJOQUxfQml0c3RyZWFtUGFyc2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiODM5NTIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZEX0VYVEVSTkFMX0JpdHN0cmVhbVBhcnNlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIk00VkRfVG9vbHMuaCIKLSNpbmNsdWRlICJNNF9WaWRlb0VkaXRpbmdDb21tb24uaCIKLSNpbmNsdWRlICJPTVhfVmlkZW8uaCIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFZEX0VYVEVSTkFMX0JpdHN0cmVhbVBhcnNlci5jCi0gKiBAYnJpZWYKLSAqIEBub3RlICAgVGhpcyBmaWxlIGltcGxlbWVudHMgZXh0ZXJuYWwgQml0c3RyZWFtIHBhcnNlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9VSW50OCBjb2RlOwotICAgIE00T1NBX0ludDMyIHByb2ZpbGU7Ci0gICAgTTRPU0FfSW50MzIgbGV2ZWw7Ci19IGNvZGVQcm9maWxlTGV2ZWw7Ci0KLXN0YXRpYyBjb2RlUHJvZmlsZUxldmVsIG1wZWc0UHJvZmlsZUxldmVsVGFibGVbXSA9IHsKLSAgICB7MHgwMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHgwMiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHgwMywgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHgwNCwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0YX0sCi0gICAgezB4MDUsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNX0sCi0gICAgezB4MDgsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMH0sCi0gICAgezB4MTEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZSxPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDEyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUsT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHgyMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4MjIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDMyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlTWFpbiwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHgzMywgT01YX1ZJREVPX01QRUc0UHJvZmlsZU1haW4sIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4MzQsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluLCBPTVhfVklERU9fTVBFRzRMZXZlbDR9LAotICAgIHsweDQyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlTmJpdCwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHg1MSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNjYWxhYmxlVGV4dHVyZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHg2MSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZhY2UsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4NjIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGYWNlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweDcxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZCwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKLSAgICB7MHg3MiwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUJhc2ljQW5pbWF0ZWQsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4ODEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVIeWJyaWQsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4ODIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVIeWJyaWQsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4OTEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweDkyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHg5MywgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4OTQsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lLCBPTVhfVklERU9fTVBFRzRMZXZlbDR9LAotICAgIHsweGExLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweGEyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAotICAgIHsweGEzLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweGIxLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4YjIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZywgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHhiMywgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nLCBPTVhfVklERU9fTVBFRzRMZXZlbDN9LAotICAgIHsweGI0LCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcsIE9NWF9WSURFT19NUEVHNExldmVsNH0sCi0gICAgezB4YzEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvcmUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCi0gICAgezB4YzIsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvcmUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4ZDEsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNjYWxhYmxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweGQyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKLSAgICB7MHhkMywgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCi0gICAgezB4ZjAsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwwfSwKLSAgICB7MHhmMSwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAotICAgIHsweGYyLCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCi0gICAgezB4ZjMsIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKLSAgICB7MHhmNCwgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDR9LAotICAgIHsweGY1LCBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNX0KLX07Ci0KLU00T1NBX1VJbnQzMiBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KE00VlNfQml0c3RyZWFtX2N0eHQqIHBhcnNpbmdDdHh0LAotICAgICBNNE9TQV9VSW50MzIgbmJfYml0cykKLXsKLSAgICAgICAgcmV0dXJuKE00VkRfVG9vbHNfR2V0Qml0c0Zyb21NZW1vcnkocGFyc2luZ0N0eHQsbmJfYml0cykpOwotfQotCi1NNE9TQV9FUlIgTTRWRF9FWFRFUk5BTF9Xcml0ZUJpdHNUb01lbW9yeShNNE9TQV9VSW50MzIgYml0c1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjMyIGRlc3RfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCBvZmZzZXQsIE00T1NBX1VJbnQ4IG5iX2JpdHMpCi17Ci0gICAgICAgIHJldHVybiAoTTRWRF9Ub29sc19Xcml0ZUJpdHNUb01lbW9yeSggYml0c1RvV3JpdGUsZGVzdF9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCAgbmJfYml0cykpOwotfQotCi1NNE9TQV9FUlIgTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0koTTRPU0FfVUludDgqIHBWb2wsIE00T1NBX0ludDMyIGFWb2xTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvKiBwRGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvU2l6ZSogcFZpZGVvU2l6ZSkKLXsKLSAgICBNNFZTX0JpdHN0cmVhbV9jdHh0IHBhcnNpbmdDdHh0OwotICAgIE00T1NBX1VJbnQzMiBjb2RlLCBqOwotICAgIE00T1NBX01lbUFkZHI4IHN0YXJ0OwotICAgIE00T1NBX1VJbnQ4IGk7Ci0gICAgTTRPU0FfVUludDMyIHRpbWVfaW5jcl9sZW5ndGg7Ci0gICAgTTRPU0FfVUludDggdm9sX3ZlcmlkPTAsIGJfaGllcmFyY2h5X3R5cGU7Ci0KLSAgICAvKiBQYXJzaW5nIHZhcmlhYmxlcyAqLwotICAgIE00T1NBX1VJbnQ4IHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9IDA7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX2VuYWJsZSA9IDA7Ci0gICAgTTRPU0FfVUludDggcmVkdWNlZF9yZXNvbHV0aW9uX3ZvcF9lbmFibGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNjYWxhYmlsaXR5ID0gMDsKLSAgICBNNE9TQV9VSW50OCBlbmhhbmNlbWVudF90eXBlID0gMDsKLSAgICBNNE9TQV9VSW50OCBjb21wbGV4aXR5X2VzdGltYXRpb25fZGlzYWJsZSA9IDA7Ci0gICAgTTRPU0FfVUludDggaW50ZXJsYWNlZCA9IDA7Ci0gICAgTTRPU0FfVUludDggc3ByaXRlX3dhcnBpbmdfcG9pbnRzID0gMDsKLSAgICBNNE9TQV9VSW50OCBzcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2UgPSAwOwotICAgIE00T1NBX1VJbnQ4IHF1YW50X3ByZWNpc2lvbiA9IDA7Ci0KLSAgICAvKiBGaWxsIHRoZSBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KLSAgICBwVmlkZW9TaXplLT5tX3VpV2lkdGggICAgICAgICAgICAgID0gMDsKLSAgICBwVmlkZW9TaXplLT5tX3VpSGVpZ2h0ICAgICAgICAgICAgID0gMDsKLQotICAgIHBEY2ktPnVpVGltZVNjYWxlICAgICAgICAgID0gMDsKLSAgICBwRGNpLT51aVByb2ZpbGUgICAgICAgICAgICA9IDA7Ci0gICAgcERjaS0+dWlVc2VPZlJlc3luY2hNYXJrZXIgPSAwOwotICAgIHBEY2ktPmJEYXRhUGFydGl0aW9uICAgICAgID0gTTRPU0FfRkFMU0U7Ci0gICAgcERjaS0+YlVzZU9mUlZMQyAgICAgICAgICAgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIFJlc2V0IHRoZSBiaXRzdHJlYW0gY29udGV4dCAqLwotICAgIHBhcnNpbmdDdHh0LnN0cmVhbV9ieXRlID0gMDsKLSAgICBwYXJzaW5nQ3R4dC5zdHJlYW1faW5kZXggPSA4OwotICAgIHBhcnNpbmdDdHh0LmluID0gKE00T1NBX0ludDggKilwVm9sOwotCi0gICAgc3RhcnQgPSAoTTRPU0FfSW50OCAqKXBWb2w7Ci0KLSAgICAvKiBTdGFydCBwYXJzaW5nICovCi0gICAgd2hpbGUgKHBhcnNpbmdDdHh0LmluIC0gc3RhcnQgPCBhVm9sU2l6ZSkKLSAgICB7Ci0gICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgIGlmIChjb2RlID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICBpZiAoY29kZSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGNvZGUgZm91bmQgKi8KLSAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweDIwLi4weDJGIDogdmlkZW9fb2JqZWN0X2xheWVyX3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGUgPiAweDFGKSAmJiAoY29kZSA8IDB4MzApKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiByYW5kb20gYWNjZXNzaWJsZSB2b2wgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpOy8qIHZpZGVvIG9iamVjdCB0eXBlIGluZGljYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIGlzIG9iamVjdCBsYXllciBpZGVudGlmaWVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0KTsgLyogdmlkZW8gb2JqZWN0IGxheWVyIHZlcmlkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sX3ZlcmlkID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMpOyAvKiB2aWRlbyBvYmplY3QgbGF5ZXIgcHJpb3JpdHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpOy8qIGFzcGVjdCByYXRpbyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMTUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsgLyogcGFyX3dpZHRoIGFuZCBwYXJfaGVpZ2h0ICg4KzgpICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiB2b2wgY29udHJvbCBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKTsvKiBjaHJvbWEgZm9ybWF0ICsgbG93IGRlbGF5ICgzKzEpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHZidiBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpOy8qIGZpcnN0IGFuZCBsYXR0ZXIgaGFsZiBiaXRyYXRlICsgMiBtYXJrZXIgYml0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTUgKyAxICsgMTUgKyAxKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxKTsvKiBmaXJzdCBhbmQgbGF0dGVyIGhhbGYgdmJ2IGJ1ZmZlciBzaXplICsgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbGYgdmJ2IG9jY3VwYW5jeSArIG1hcmtlciBiaXRzICgxNSsxKzMrMTErMSkqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsvKiBmaXJzdCBoYWxmIHZidiBvY2N1cGFuY3kgKyBtYXJrZXIgYml0cyAoMTUrMSkqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOyAvKiB2aWRlbyBvYmplY3QgbGF5ZXIgc2hhcGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZWQgdG8gc2F2ZSBpdCBmb3Igdm9wIHBhcnNpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9IChNNE9TQV9VSW50OCljb2RlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSAwKSByZXR1cm4gMDsgLyogb25seSByZWN0YW5ndWxhciBjYXNlIHN1cHBvcnRlZCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsgLyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOyAvKiBWT1AgdGltZSBpbmNyZW1lbnQgcmVzb2x1dGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+dWlUaW1lU2NhbGUgPSBjb2RlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21wdXRlcyB0aW1lIGluY3JlbWVudCBsZW5ndGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGogICAgPSBjb2RlIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IChpIDwgMzIpICYmIChqICE9IDApOyBqID4+PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9pbmNyX2xlbmd0aCA9IChpID09IDApID8gMSA6IGk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIEZpeGVkIFZPUCByYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2luY3JfbGVuZ3RoKTsvKiBGaXhlZCBWT1AgdGltZSBpbmNyZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlICE9IDEpIC8qIDEgPSBCaW5hcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMCkgLyogMCA9IHJlY3Rhbmd1bGFyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMyk7LyogV2lkdGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvU2l6ZS0+bV91aVdpZHRoID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMpOy8qIEhlaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9TaXplLT5tX3VpSGVpZ2h0ID0gY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBpbnRlcmxhY2VkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmxhY2VkID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBPQk1DIGRpc2FibGUgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYodm9sX3ZlcmlkID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHNwcml0ZSBlbmFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfZW5hYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOy8qIHNwcml0ZSBlbmFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfZW5hYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNwcml0ZV9lbmFibGUgPT0gMSkgfHwgKHNwcml0ZV9lbmFibGUgPT0gMikpCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTcHJpdGUgc3RhdGljID0gMSBhbmQgU3ByaXRlIEdNQyA9IDIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ByaXRlX2VuYWJsZSAhPSAyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKTsvKiBzcHJpdGUgd2lkdGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMpOy8qIHNwcml0ZSBoZWlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMpOy8qIHNwcml0ZSBsIGNvb3JkaW5hdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMpOy8qIHNwcml0ZSB0b3AgY29vcmRpbmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNik7Lyogc3ByaXRlIHdhcnBpbmcgcG9pbnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX3dhcnBpbmdfcG9pbnRzID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOy8qIHNwcml0ZSB3YXJwaW5nIGFjY3VyYWN5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHNwcml0ZSBicmlnaHRuZXNzIGNoYW5nZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZV9icmlnaHRuZXNzX2NoYW5nZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcHJpdGVfZW5hYmxlICE9IDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBsb3cgbGF0ZW5jeSBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2b2xfdmVyaWQgIT0gMSkgJiYgKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAhPSAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOy8qIHNhZGN0IGRpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsgLyogbm90IDggYml0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpOy8qIHF1YW50IHByZWNpc2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50X3ByZWNpc2lvbiA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCk7LyogYml0cyBwZXIgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JleXNjYWxlIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9PSAzKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKTsgLyogbm9ncmF5IHF1YW50IHVwZGF0ZSArIGNvbXBvc2l0aW9uIG1ldGhvZCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVhciBjb21wb3NpdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogcXVhbnQgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBsb2FkIGludHJhIHF1YW50IG1hdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsvKiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAgICA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgNjQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBsb2FkIG5vbiBpbnRyYSBxdWFudCBtYXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7LyogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgICAgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IDY0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbF92ZXJpZCAhPSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsvKiBxdWFydGVyIHNhbXBsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogY29tcGxleGl0eSBlc3RpbWF0aW9uIGRpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhpdHlfZXN0aW1hdGlvbl9kaXNhYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogcmVzeW5jIG1hcmtlciBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT51aVVzZU9mUmVzeW5jaE1hcmtlciA9IChjb2RlKSA/IDAgOiAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7LyogZGF0YSBwYXJ0aXRpb25uZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPmJEYXRhUGFydGl0aW9uID0gKGNvZGUpID8gTTRPU0FfVFJVRSA6IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV2ZXJzaWJsZSBWTEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPmJVc2VPZlJWTEMgPSAoY29kZSkgPyBNNE9TQV9UUlVFIDogTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2xfdmVyaWQgIT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOy8qIG5ld3ByZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVkdWNlZCByZXNvbHV0aW9uIHZvcCBlbmFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZWRfcmVzb2x1dGlvbl92b3BfZW5hYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Lyogc2NhbGFiaWxpdHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhYmlsaXR5ID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoaWVyYXJjaHkgdHlwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYl9oaWVyYXJjaHlfdHlwZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZiBsYXllciBpZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVmIHNhbXBsaW5nIGRpcmVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaG9yIHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBob3Igc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlcnQgc2FtcGxpbmcgZmFjdG9yIE4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlcnQgc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuaGFuY2VtZW50IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuaGFuY2VtZW50X3R5cGUgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFiX2hpZXJhcmNoeV90eXBlKSAmJiAodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID09IDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIHJlZiBzaGFwZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgcmVmIHRleHR1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hhcGUgaG9yIHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYXBlIGhvciBzYW1wbGluZyBmYWN0b3IgTSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFwZSB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBOICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBNNFZEX0VYVEVSTkFMX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNoYXBlIHZlcnQgc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIC0tLS0tIDB4QjAgOiB2aXN1YWxfb2JqZWN0X3NlcXVlbmNlX3N0YXJ0X2NvZGUgLS0tLS0gKi8KLQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGNvZGUgPT0gMHhCMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPnVpUHJvZmlsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gMHhCNSA6IHZpc3VhbF9vYmplY3Rfc3RhcnRfY29kZSAtLS0tLSAqLwotCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoY29kZSA9PSAweEI1KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpcyBvYmplY3QgbGF5ZXIgaWRlbnRpZmllciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpc3VhbCBvYmplY3QgdmVyaWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gTTRWRF9FWFRFUk5BTF9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aXN1YWwgb2JqZWN0IGxheWVyIHByaW9yaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhbGlnbiBvbiBieXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IE00VkRfRVhURVJOQUxfR2V0Qml0c0Zyb21NZW1vcnkoJnBhcnNpbmdDdHh0LCA3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xfdmVyaWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gZW5kIC0tLS0tICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoY29kZSA+PiAyKSA9PSAweDIwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBIMjYzIC4uLi0+IHdyb25nKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBnZXRBVkNQcm9maWxlQW5kTGV2ZWwoTTRPU0FfVUludDgqIHBEU0ksIE00T1NBX0ludDMyIERTSVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKSB7Ci0KLSAgICBNNE9TQV9VSW50MTYgaW5kZXggPSAyODsgLyogdGhlIDI5dGggYnl0ZSBpcyBTUFMgc3RhcnQgKi8KLSAgICBNNE9TQV9Cb29sIGNvbnN0cmFpbnRTZXQzOwotCi0gICAgaWYgKChwUHJvZmlsZSA9PSBNNE9TQV9OVUxMKSB8fCAocExldmVsID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKChEU0lTaXplIDw9IGluZGV4KSB8fCAocERTSSA9PSBNNE9TQV9OVUxMKSkgewotICAgICAgICBBTE9HRSgiZ2V0QVZDUHJvZmlsZUFuZExldmVsOiBEU0kgaXMgaW52YWxpZCIpOwotICAgICAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgICAgICpwTGV2ZWwgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGNvbnN0cmFpbnRTZXQzID0gKHBEU0lbaW5kZXgrMl0gJiAweDEwKTsKLSAgICBBTE9HVigiZ2V0QVZDUHJvZmlsZUFuZExldmVsIHByb2ZpbGVfYnl0ZSAlZCwgbGV2ZWxfYnl0ZTogJWQgY29uc3RyYWluM2ZsYWc6ICVkIiwKLSAgICAgICAgICBwRFNJW2luZGV4KzFdLCBwRFNJW2luZGV4KzNdLCBjb25zdHJhaW50U2V0Myk7Ci0KLSAgICBzd2l0Y2ggKHBEU0lbaW5kZXgrMV0pIHsKLSAgICAgICAgY2FzZSA2NjoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3NzoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVFeHRlbmRlZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExMDoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIyOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDIyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ0OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDQ0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgfQotCi0gICAgc3dpdGNoIChwRFNJW2luZGV4KzNdKSB7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnRTZXQzKQotICAgICAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxYjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMTE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwxMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDEzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDIxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMjI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMzE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWwzMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICpwTGV2ZWwgPSBPTVhfVklERU9fQVZDTGV2ZWw0MTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDQyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsNTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgKnBMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDUxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICB9Ci0gICAgQUxPR1YoImdldEFWQ1Byb2ZpbGVBbmRMZXZlbCBwcm9maWxlICUiIFBSSWQzMiAiIGxldmVsICUiIFBSSWQzMiwKLSAgICAgICAgICAqcFByb2ZpbGUsICpwTGV2ZWwpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCogcERTSSwgTTRPU0FfSW50MzIgRFNJU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcFByb2ZpbGUsIE00T1NBX0ludDMyICpwTGV2ZWwpIHsKLQotICAgIE00T1NBX1VJbnQxNiBpbmRleCA9IDc7IC8qIHRoZSA1dGggYW5kIDZ0aCBieXRlcyBjb250YWluIHRoZSBsZXZlbCBhbmQgcHJvZmlsZSAqLwotCi0gICAgaWYgKChwUHJvZmlsZSA9PSBNNE9TQV9OVUxMKSB8fCAocExldmVsID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIGludmFsaWQgcG9pbnRlciBmb3IgcFByb2ZpbGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAoKERTSVNpemUgPCBpbmRleCkgfHwgKHBEU0kgPT0gTTRPU0FfTlVMTCkpIHsKLSAgICAgICAgQUxPR0UoImdldEgyNjNQcm9maWxlQW5kTGV2ZWw6IERTSSBpcyBpbnZhbGlkIik7Ci0gICAgICAgICpwUHJvZmlsZSA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICAgICAgKnBMZXZlbCA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fTEVWRUw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIHByb2ZpbGVfYnl0ZSAlZCwgbGV2ZWxfYnl0ZSAlZCIsCi0gICAgICAgICAgcERTSVs2XSwgcERTSVs1XSk7Ci0gICAgLyogZ2V0IHRoZSBIMjYzIGxldmVsICovCi0gICAgc3dpdGNoIChwRFNJWzVdKSB7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDMwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDQwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDQ1OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDUwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDYwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzA6Ci0gICAgICAgICAgICAqcExldmVsID0gT01YX1ZJREVPX0gyNjNMZXZlbDcwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICpwTGV2ZWwgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgIH0KLQotICAgIC8qIGdldCBIMjYzIHByb2ZpbGUgKi8KLSAgICBzd2l0Y2ggKHBEU0lbNl0pIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSDMyMENvZGluZzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgKnBQcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybmV0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybGFjZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAqcFByb2ZpbGUgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAqcFByb2ZpbGUgPSBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX1BST0ZJTEU7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRIMjYzUHJvZmlsZUFuZExldmVsIHByb2ZpbGUgJSIgUFJJZDMyICIgbGV2ZWwgJSIgUFJJZDMyLAotICAgICAgICAgICpwUHJvZmlsZSwgKnBMZXZlbCk7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChNNE9TQV9VSW50OCBwcm9maWxlQW5kTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgKnBQcm9maWxlLCBNNE9TQV9JbnQzMiAqcExldmVsKSB7Ci0KLSAgICBNNE9TQV9VSW50MzIgaSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgaWYgKChwUHJvZmlsZSA9PSBNNE9TQV9OVUxMKSB8fCAocExldmVsID09IE00T1NBX05VTEwpKSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIEFMT0dWKCJnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbCBwcm9maWxlQW5kTGV2ZWwgJWQiLCBwcm9maWxlQW5kTGV2ZWwpOwotICAgIGxlbmd0aCA9IHNpemVvZihtcGVnNFByb2ZpbGVMZXZlbFRhYmxlKSAvc2l6ZW9mKG1wZWc0UHJvZmlsZUxldmVsVGFibGVbMF0pOwotICAgICpwUHJvZmlsZSA9IE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICAqcExldmVsID0gTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgaWYgKG1wZWc0UHJvZmlsZUxldmVsVGFibGVbaV0uY29kZSA9PSBwcm9maWxlQW5kTGV2ZWwpIHsKLSAgICAgICAgICAgICpwUHJvZmlsZSA9IG1wZWc0UHJvZmlsZUxldmVsVGFibGVbaV0ucHJvZmlsZTsKLSAgICAgICAgICAgICpwTGV2ZWwgPSBtcGVnNFByb2ZpbGVMZXZlbFRhYmxlW2ldLmxldmVsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoImdldE1QRUc0UHJvZmlsZUFuZExldmVsIHByb2ZpbGUgJSIgUFJJZDMyICIgbGV2ZWwgJSIgUFJJZDMyLAotICAgICAgICAgICpwUHJvZmlsZSwgKnBMZXZlbCk7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VkRfVG9vbHMuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9Ub29scy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZGI0YjQxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWRF9Ub29scy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLSNpbmNsdWRlICJNNFZEX1Rvb2xzLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICBNNFZEX1Rvb2xzLmMKLSAqIEBicmllZgotICogQG5vdGUgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBoZWxwZXIgZnVuY3Rpb25zIGZvciBCaXRzdHJlYW0gcGFyc2VyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfVUludDMyIE00VkRfVG9vbHNfR2V0Qml0c0Zyb21NZW1vcnkoTTRWU19CaXRzdHJlYW1fY3R4dCogcGFyc2luZ0N0eHQsCi0gICAgIE00T1NBX1VJbnQzMiBuYl9iaXRzKQotewotICAgIE00T1NBX1VJbnQzMiAgICBjb2RlOwotICAgIE00T1NBX1VJbnQzMiAgICBpOwotICAgIGNvZGUgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9iaXRzOyBpKyspCi0gICAgewotICAgICAgICBpZiAocGFyc2luZ0N0eHQtPnN0cmVhbV9pbmRleCA9PSA4KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL000T1NBX21lbWNweSggKE00T1NBX01lbUFkZHI4KSYocGFyc2luZ0N0eHQtPnN0cmVhbV9ieXRlKSwgcGFyc2luZ0N0eHQtPmluLAotICAgICAgICAgICAgLy8gICAgIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7Ci0gICAgICAgICAgICBwYXJzaW5nQ3R4dC0+c3RyZWFtX2J5dGUgPSAodW5zaWduZWQgY2hhcikocGFyc2luZ0N0eHQtPmluKVswXTsKLSAgICAgICAgICAgIHBhcnNpbmdDdHh0LT5pbisrOwotICAgICAgICAgICAgLy9mcmVhZCgmc3RyZWFtX2J5dGUsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwxLGluKTsKLSAgICAgICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1faW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGNvZGUgPSAoY29kZSA8PCAxKTsKLSAgICAgICAgY29kZSB8PSAoKHBhcnNpbmdDdHh0LT5zdHJlYW1fYnl0ZSAmIDB4ODApID4+IDcpOwotCi0gICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1fYnl0ZSA9IChwYXJzaW5nQ3R4dC0+c3RyZWFtX2J5dGUgPDwgMSk7Ci0gICAgICAgIHBhcnNpbmdDdHh0LT5zdHJlYW1faW5kZXgrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29kZTsKLX0KLQotTTRPU0FfRVJSIE00VkRfVG9vbHNfV3JpdGVCaXRzVG9NZW1vcnkoTTRPU0FfVUludDMyIGJpdHNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX01lbUFkZHIzMiBkZXN0X2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggb2Zmc2V0LCBNNE9TQV9VSW50OCBuYl9iaXRzKQotewotICAgIE00T1NBX1VJbnQ4IGksajsKLSAgICBNNE9TQV9VSW50MzIgdGVtcF9kZXN0ID0gMCwgbWFzayA9IDAsIHRlbXAgPSAxOwotICAgIE00T1NBX1VJbnQzMiBpbnB1dCA9IGJpdHNUb1dyaXRlOwotICAgIGlucHV0ID0gKGlucHV0IDw8ICgzMiAtIG5iX2JpdHMgLSBvZmZzZXQpKTsKLQotICAgIC8qIFB1dCBkZXN0aW5hdGlvbiBidWZmZXIgdG8gMCAqLwotICAgIGZvcihqPTA7ajwzO2orKykKLSAgICB7Ci0gICAgICAgIGZvcihpPTA7aTw4O2krKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKGoqOCkraSA+PSBvZmZzZXQgJiYgKGoqOCkraSA8IG5iX2JpdHMgKyBvZmZzZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWFzayB8PSAodGVtcCA8PCAoKDcqKGorMSkpLWkraikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1hc2sgPSB+bWFzazsKLSAgICAqZGVzdF9iaXRzICY9IG1hc2s7Ci0KLSAgICAvKiBQYXJzZSBpbnB1dCBiaXRzLCBhbmQgZmlsbCBvdXRwdXQgYnVmZmVyICovCi0gICAgZm9yKGo9MDtqPDM7aisrKQotICAgIHsKLSAgICAgICAgZm9yKGk9MDtpPDg7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoaio4KStpID49IG9mZnNldCAmJiAoaio4KStpIDwgbmJfYml0cyArIG9mZnNldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gKChpbnB1dCAmICgweDgwMDAwMDAwID4+IG9mZnNldCkpID4+ICgzMS1vZmZzZXQpKTsKLSAgICAgICAgICAgICAgICAvLypkZXN0X2JpdHMgfD0gKHRlbXAgPDwgKDMxIC0gaSkpOwotICAgICAgICAgICAgICAgICpkZXN0X2JpdHMgfD0gKHRlbXAgPDwgKCg3KihqKzEpKS1pK2opKTsKLSAgICAgICAgICAgICAgICBpbnB1dCA9IChpbnB1dCA8PCAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZJRklfeFZTU19SR0I1NjV0b1lVVjQyMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmJiNDZiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAuYworKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMC5jCi0gKiBAYnJpZWYgICAgQ29udGFpbiB2aWRlbyBsaWJyYXJ5IGZ1bmN0aW9uCi0gKiBAbm90ZSAgICAgQ29sb3IgQ29udmVyc2lvbiBGaWx0ZXIKLSAqICAgICAgICAgICAtIyBDb250YWlucyB0aGUgZm9ybWF0IGNvbnZlcnNpb24gZmlsdGVycyBmcm9tIFJHQjU2NSB0byBZVVY0MjAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgdHJhbnNmb3JtIFJHQjU2NSBpbWFnZSB0byBhIFlVVjQyMCBpbWFnZS4KLSAqIEBub3RlICAgIENvbnZlcnQgUkdCNTY1IHRvIFlVVjQyMCwKLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKCAyIHJvd3MgYnkgMiByb3dzICkKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uICggMiBjb2wgYnkgMiBjb2wgKQotICogICAgICAgICAgICAgICAgICBHZXQgNCBSR0Igc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgYW5kIGJ1aWxkIDQgb3V0cHV0IFkgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBhbmQgZWFjaCBzaW5nbGUgVSAmIFYgZGF0YQotICogICAgICAgICAgICAgIGVuZCBsb29wIG9uIGNvbAotICogICAgICAgICAgZW5kIGxvb3Agb24gcm93Ci0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBTcGVjaWZpYyBEYXRhCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFJHQjU2NSBQbGFuZQotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvICBZVVY0MjAgYnVmZmVyIFBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IFlVViBQbGFuZSBoZWlnaHQgaXMgT0RECi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIFlVViBQbGFuZSB3aWR0aCBpcyBPREQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1Y7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfcmdiLCB1MzJfc3RyaWRlXzJyZ2I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfcmdibl9kYXRhLCAqcHU4X3JnYm47Ci0gICAgTTRWSUZJX1VJbnQxNiAgIHUxNl9waXgxLCB1MTZfcGl4MiwgdTE2X3BpeDMsIHUxNl9waXg0OwotICAgIE00VklGSV9VSW50OCBjb3VudF9udWxsPTA7Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgaGVpZ2h0IGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmKCAocFBsYW5lSW4tPnVfaGVpZ2h0ICE9IHBQbGFuZU91dFswXS51X2hlaWdodCkgICAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0PDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIC8qIENoZWNrIHBsYW5lcyB3aWR0aCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiggKHBQbGFuZUluLT51X3dpZHRoICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzFdLnVfd2lkdGg8PDEpKSB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsyXS51X3dpZHRoPDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfeV9kYXRhID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwdThfdV9kYXRhID0gcFBsYW5lT3V0WzFdLnBhY19kYXRhICsgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsgcFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfcmdibl9kYXRhICAgPSBwUGxhbmVJbi0+cGFjX2RhdGEgKyBwUGxhbmVJbi0+dV90b3BsZWZ0OwotCi0gICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICB1MzJfd2lkdGggPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlMl9ZID0gdTMyX3N0cmlkZV9ZIDw8IDE7Ci0gICAgdTMyX3N0cmlkZV9VID0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IHBQbGFuZUluLT51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlXzJyZ2IgPSB1MzJfc3RyaWRlX3JnYiA8PCAxOwotCi0KLSAgICAvKiBMb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIFR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIEN1cnJlbnQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3luID0gcHU4X3lfZGF0YTsKLSAgICAgICAgLyogTmV4dCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeXMgPSBwdThfeW4gKyB1MzJfc3RyaWRlX1k7Ci0gICAgICAgIC8qIEN1cnJlbnQgVSBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdSA9IHB1OF91X2RhdGE7Ci0gICAgICAgIC8qIEN1cnJlbnQgViBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdiA9IHB1OF92X2RhdGE7Ci0KLSAgICAgICAgcHU4X3JnYm4gPSBwdThfcmdibl9kYXRhOwotCi0gICAgICAgIC8qIExvb3Agb24gZWFjaCBjb2x1bW4gb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXQgZm91ciBSR0IgNTY1IHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICB1MTZfcGl4MSA9ICooIChNNFZJRklfVUludDE2ICopIHB1OF9yZ2JuKTsKLSAgICAgICAgICAgIHUxNl9waXgyID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICB1MTZfcGl4MyA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiKSk7Ci0gICAgICAgICAgICB1MTZfcGl4NCA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0KLSAgICAgICAgICAgIC8qIFVucGFjayBSR0I1NjUgdG8gOGJpdCBSLCBHLCBCICovCi0gICAgICAgICAgICAvKiAoeCx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAwLGkzMl9nMDAsaTMyX3IwMCx1MTZfcGl4MSk7Ci0gICAgICAgICAgICAvKiAoeCsxLHkpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMTAsaTMyX2cxMCxpMzJfcjEwLHUxNl9waXgyKTsKLSAgICAgICAgICAgIC8qICh4LHkrMSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEsdTE2X3BpeDMpOwotICAgICAgICAgICAgLyogKHgrMSx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMTEsaTMyX2cxMSxpMzJfcjExLHUxNl9waXg0KTsKLSAgICAgICAgICAgIC8qIElmIFJHQiBpcyB0cmFuc3BhcmVudCBjb2xvciAoMCwgNjMsIDApLCB3ZSB0cmFuc2Zvcm0gaXQgdG8gd2hpdGUgKDMxLDYzLDMxKSAqLwotICAgICAgICAgICAgaWYoaTMyX2IwMCA9PSAwICYmIGkzMl9nMDAgPT0gNjMgJiYgaTMyX3IwMCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDAgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAwID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihpMzJfYjEwID09IDAgJiYgaTMyX2cxMCA9PSA2MyAmJiBpMzJfcjEwID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IxMCA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMTAgPSAzMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGkzMl9iMDEgPT0gMCAmJiBpMzJfZzAxID09IDYzICYmIGkzMl9yMDEgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAxID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMSA9IDMxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaTMyX2IxMSA9PSAwICYmIGkzMl9nMTEgPT0gNjMgJiYgaTMyX3IxMSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMTEgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjExID0gMzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBDb252ZXJ0IFJHQiB2YWx1ZSB0byBZVVYgKi8KLSAgICAgICAgICAgIGkzMl91MDAgPSBVMTYoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICBpMzJfdjAwID0gVjE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTAwID0gWTE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotCi0gICAgICAgICAgICBpMzJfdTEwID0gVTE2KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3YxMCA9IFYxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kxMCA9IFkxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLQotICAgICAgICAgICAgaTMyX3UwMSA9IFUxNihpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl92MDEgPSBWMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MDEgPSBZMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0KLSAgICAgICAgICAgIGkzMl91MTEgPSBVMTYoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfdjExID0gVjE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTExID0gWTE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotCi0gICAgICAgICAgICAvKiBTdG9yZSBsdW1pbmFuY2UgZGF0YSAqLwotICAgICAgICAgICAgcHU4X3luWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAwOwotICAgICAgICAgICAgcHU4X3luWzFdID0gKE00VklGSV9VSW50OClpMzJfeTEwOwotICAgICAgICAgICAgcHU4X3lzWzBdID0gKE00VklGSV9VSW50OClpMzJfeTAxOwotICAgICAgICAgICAgcHU4X3lzWzFdID0gKE00VklGSV9VSW50OClpMzJfeTExOwotICAgICAgICAgICAgKnB1OF91ID0gKE00VklGSV9VSW50OCkoKGkzMl91MDAgKyBpMzJfdTAxICsgaTMyX3UxMCArIGkzMl91MTEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICpwdThfdiA9IChNNFZJRklfVUludDgpKChpMzJfdjAwICsgaTMyX3YwMSArIGkzMl92MTAgKyBpMzJfdjExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAvKiBQcmVwYXJlIGZvciBuZXh0IGNvbHVtbiAqLwotICAgICAgICAgICAgcHU4X3JnYm4gKz0gKENTVF9SR0JfMTZfU0laRTw8MSk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgY3VycmVudCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeW4gKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF95cyArPSAyOwotICAgICAgICAgICAgLyogVXBkYXRlIFUgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgLyogVXBkYXRlIFYgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF92ICsrOwotICAgICAgICB9IC8qIEVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgLyogUHJlcGFyZSBwb2ludGVycyBmb3IgdGhlIG5leHQgcm93ICovCi0gICAgICAgIHB1OF95X2RhdGEgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSArPSB1MzJfc3RyaWRlX1U7Ci0gICAgICAgIHB1OF92X2RhdGEgKz0gdTMyX3N0cmlkZV9WOwotICAgICAgICBwdThfcmdibl9kYXRhICs9IHUzMl9zdHJpZGVfMnJnYjsKLQotCi0gICAgfSAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0vKiBFbmQgb2YgZmlsZSBNNFZJRklfUkdCNTY1dG9ZVVY0MjAuYyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9BdWRpb01peGluZy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQXVkaW9NaXhpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmYwYmMwNi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9BdWRpb01peGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nLmMKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGF1ZGlvIG1peGluZyBpbXBsZW1lbnRhdGlvbi4KLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbEZ1bmN0aW9ucy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9FcnJvckNvZGVzLmgiCi0KLS8qIFB1dCB0aGUgZGVmaW5pdGlvbiBvZiBzaWxlbmNlIGZyYW1lcyBoZXJlICovCi0jZGVmaW5lIE00VlNTM0dQUF9TSUxFTkNFX0ZSQU1FUwotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oIgotCi0vKioKLSAqIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKio8IE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JSZXNhbXBsZXIuaCIKLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIFN0YXRpYyBmdW5jdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbiggTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MgKnBTZXR0aW5ncyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8oCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfQm9vbCBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCggTTRPU0FfSW50MzIgKmF2ZXJhZ2VWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHN0b3JlQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aHJlc2hvbGRWYWx1ZSApOwotLyoqCi0gKiAgICBJbnRlcm5hbCB3YXJuaW5nICovCi0jZGVmaW5lIE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICAgIE00T1NBX0VSUl9DUkVBVEUoIE00X1dBUiwgTTRWU1MzR1BQLCAweDAwMzApCi0KLS8qIEEgZGVmaW5lIHVzZWQgd2l0aCBTU1JDIDEuMDQgYW5kIGFib3ZlIHRvIGF2b2lkIHRha2luZwotYmxvY2tzIHNtYWxsZXIgdGhhdCB0aGUgbWluaW1hbCBibG9jayBzaXplICovCi0jZGVmaW5lIE00VlNTX1NTUkNfTUlOQkxPQ0tTSVpFICAgICAgICA2MDAKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdChNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0KiBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKiBwU2V0dGluZ3MpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgYXVkaW8gbWl4aW5nIHNldHRpbmdzCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgIHBGaWxlV3JpdGVQdHJGY3QgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSB3cml0ZXIgZnVuY3Rpb25zCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MgKnBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVdyaXRlclBvaW50ZXIgKnBGaWxlV3JpdGVQdHJGY3QgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEM7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBwU2V0dGluZ3M9MHgleCIsCi0gICAgICAgIHBDb250ZXh0LCBwU2V0dGluZ3MpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0OiBwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0OiBwRmlsZVJlYWRQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVdyaXRlUHRyRmN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdDogcEZpbGVXcml0ZVB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICBpZiggcFNldHRpbmdzLT51aUJlZ2luTG9vcCA+IHBTZXR0aW5ncy0+dWlFbmRMb29wICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQ6IEJlZ2luIGxvb3AgdGltZSBpcyBoaWdoZXIgdGhhbiBlbmQgbG9vcCB0aW1lISIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IGFuZCByZXR1cm4gaXQgdG8gdGhlIHVzZXIgKi8KLSAgICBwQyA9IChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQKLSAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCksCi0gICAgICAgIE00VlNTM0dQUCwoTTRPU0FfQ2hhciAqKSJNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQiKTsKLSAgICAqcENvbnRleHQgPSBwQzsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoKTogdW5hYmxlIHRvIGFsbG9jYXRlIFwKLSAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCxyZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgbWVtc2V0KCh2b2lkICopcEMgLDAsCi0gICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQpKTsKLSAgICAvKioKLSAgICAqIENvcHkgdGhpcyBzZXR0aW5nIGluIGNvbnRleHQgKi8KLSAgICBwQy0+aUFkZEN0cyA9IHBTZXR0aW5ncy0+dWlBZGRDdHM7Ci0gICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IHBTZXR0aW5ncy0+YlJlbW92ZU9yaWdpbmFsOwotICAgIHBDLT5iX0R1Y2tpbmdOZWVkZWVkID0gcFNldHRpbmdzLT5iX0R1Y2tpbmdOZWVkZWVkOwotICAgIHBDLT5JbkR1Y2tpbmdfdGhyZXNob2xkID0gcFNldHRpbmdzLT5JbkR1Y2tpbmdfdGhyZXNob2xkOwotICAgIHBDLT5mQlRWb2xMZXZlbCA9IHBTZXR0aW5ncy0+ZkJUVm9sTGV2ZWw7Ci0gICAgcEMtPmZQVFZvbExldmVsID0gcFNldHRpbmdzLT5mUFRWb2xMZXZlbDsKLSAgICBwQy0+SW5EdWNraW5nX2xvd1ZvbHVtZSA9IHBTZXR0aW5ncy0+SW5EdWNraW5nX2xvd1ZvbHVtZTsKLSAgICBwQy0+YkRvRHVja2luZyA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iTG9vcCA9IHBTZXR0aW5ncy0+Ykxvb3A7Ci0gICAgcEMtPmJOb0xvb3BpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+Ymp1bXBmbGFnID0gTTRPU0FfVFJVRTsKLSAgICAvKioKLSAgICAqIEluaXQgc29tZSBjb250ZXh0IHZhcmlhYmxlcyAqLwotCi0gICAgcEMtPnBJbnB1dENsaXBDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFkZGVkQ2xpcEN0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5mT3JpZ0ZhY3RvciA9IDEuMEY7Ci0gICAgcEMtPmZBZGRlZEZhY3RvciA9IDAuMEY7Ci0gICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iSGFzQXVkaW8gPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIEluaXQgUEMtPmV3YyBtZW1iZXJzICovCi0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgcEMtPmV3Yy5iVmlkZW9EYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9IDE7Ci0gICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5wQXVkaW9FbmNEU0kucEluZm8gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEVuY0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucER1bW15QXVCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wTFZBdWRpb1Jlc2FtcGxlciA9IE00T1NBX05VTEw7Ci0gICAgLyoqCi0gICAgKiBTZXQgdGhlIE9TQUwgZmlsZXN5c3RlbSBmdW5jdGlvbiBzZXQgKi8KLSAgICBwQy0+cE9zYUZpbGVSZWFkUHRyID0gcEZpbGVSZWFkUHRyRmN0OwotICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIgPSBwRmlsZVdyaXRlUHRyRmN0OwotCi0gICAgLyoqCi0gICAgKiBTc3JjIHN0dWZmICovCi0gICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5wU3NyY0J1ZmZlckluID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVGVtcEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+U3NyY1NjcmF0Y2ggPSBNNE9TQV9OVUxMOwotICAgIHBDLT51aUJlZ2luTG9vcCA9IHBTZXR0aW5ncy0+dWlCZWdpbkxvb3A7Ci0gICAgcEMtPnVpRW5kTG9vcCA9IHBTZXR0aW5ncy0+dWlFbmRMb29wOwotCi0gICAgLyoKLSAgICAqIFJlc2V0IHBvaW50ZXJzIGZvciBtZWRpYSBhbmQgY29kZWNzIGludGVyZmFjZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKiAgQ2FsbCB0aGUgbWVkaWEgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24gbW9kdWxlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIE9wZW4gaW5wdXQgY2xpcCwgYWRkZWQgY2xpcCBhbmQgb3V0cHV0IGNsaXAgYW5kIHByb2NlZWQgd2l0aCB0aGUgc2V0dGluZ3MgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKHBDLCBwU2V0dGluZ3MpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoqCi0gICAgKiBVcGRhdGUgbWFpbiBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTzsKLSAgICBlbHNlCi0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOwotCi0gICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gPSAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICBDbGlwUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAvKmdJbnB1dFBhcmFtcy5sdkJUQ2hhbm5lbENvdW50Ki8KLSAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBMVkF1ZGlvUmVzYW1wbGVyQ3JlYXRlKDE2LAotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzLAotICAgICAgICAvKiBnSW5wdXRQYXJhbXMubHZPdXRTYW1wbGVSYXRlKi8oTTRPU0FfSW50MzIpcFNldHRpbmdzLT5vdXRwdXRBU0YsIDEpOwotICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cExWQXVkaW9SZXNhbXBsZXIgKQotICAgICB7Ci0gICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgIH0KLSAgICAgICAgTFZBdWRpb3NldFNhbXBsZVJhdGUocEMtPnBMVkF1ZGlvUmVzYW1wbGVyLAotICAgICAgICAvKmdJbnB1dFBhcmFtcy5sdkluU2FtcGxlUmF0ZSovCi0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5KTsKLQotICAgIExWQXVkaW9zZXRWb2x1bWUocEMtPnBMVkF1ZGlvUmVzYW1wbGVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MTYpKDB4MTAwMCApLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MTYpKDB4MTAwMCApKTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nSW5pdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdTdGVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBhdWRpbyBtaXhpbmcuCi0gKiBAbm90ZQotICogQHBhcmFtICAgICBwQ29udGV4dCAgICAgICAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICogQHBhcmFtICAgICBwUHJvZ3Jlc3MgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIGZpbmFsaXphdGlvbiBvcGVyYXRpb24KLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgVlNTIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBjYWxsZWQKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HOiBBdWRpbyBtaXhpbmcgaXMgb3ZlciwgdXNlciBzaG91bGQgbm93IGNhbGwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKCkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAoIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCAqcFByb2dyZXNzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwKLSAgICAgICAgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBTdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9WSURFTzoKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbyhwQyk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb21wdXRlIHRoZSBwcm9ncmVzcyBwZXJjZW50YWdlCi0gICAgICAgICAgICAqIE5vdGU6IGF1ZGlvIGFuZCB2aWRlbyBDVFMgYXJlIG5vdCBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgICAgICogdGhlIGNhbGwgb2YgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvICovCi0KLSAgICAgICAgICAgIC8qIFA0TUUwMDAwMzI3NjogRmlyc3QgMC01MCUgc2VnbWVudCBpcyBkZWRpY2F0ZWQgdG8gc3RhdGUgOgotICAgICAgICAgICAgICAgTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX1ZJREVPICovCi0gICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSg1MCAqIChwQy0+ZXdjLldyaXRlclZpZGVvQVUuQ1RTKQotICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhlcmUgbWF5IGJlIG5vIGF1ZGlvIHRyYWNrIChSZW1vdmUgYXVkaW8gdHJhY2sgZmVhdHVyZSkuCi0gICAgICAgICAgICAqIEluIHRoYXQgY2FzZSB3ZSBkb3VibGUgdGhlIGN1cnJlbnQgcGVyY2VudGFnZSAqLwotICAgICAgICAgICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gPT0gcEMtPmV3Yy5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoICpwUHJvZ3Jlc3MpIDw8PSAxOyAvKio8IHgyICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCAqcFByb2dyZXNzID49IDUwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0KLSAgICAgICAgICAgICAgICAgICAgNDk7IC8qKjwgVmlkZW8gcHJvY2Vzc2luZyBpcyBub3QgZ3JlYXRlciB0aGFuIDUwJSAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwQy0+Ykhhc0F1ZGlvICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFZpZGVvIGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gYXVkaW8gYW5kIHJldHVybiBPSyAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPmlBZGRDdHMgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fRklSU1RfU0VHTUVOVDsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogTm8gYXVkaW8sIHN0YXRlIHRyYW5zaXRpb24gdG8gRklOSVNIRUQgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0ZJTklTSEVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDoKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgIT0gLXBDLT5wQWRkZWRDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgJiYgKHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgLSAwLjUpCi0gICAgICAgICAgICAgICAgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvID4gcEMtPnVpRW5kTG9vcAotICAgICAgICAgICAgICAgICYmIHBDLT51aUVuZExvb3AgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBDLT5iTG9vcCA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+Yk5vTG9vcGluZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfSW50MzIganVtcENUUyA9IChNNE9TQV9JbnQzMikocEMtPnVpQmVnaW5Mb29wKTsKLQotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbSwgJmp1bXBDVFMpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IGVycm9yIHdoZW4ganVtcGluZyBpbiBhZGRlZCBhdWRpbyBjbGlwOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVXNlIG9mZnNldCB0byBnaXZlIGEgY29ycmVjdCBDVFMgLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQW9mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5iUmVtb3ZlT3JpZ2luYWwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peChwQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZShwQyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb21wdXRlIHRoZSBwcm9ncmVzcyBwZXJjZW50YWdlCi0gICAgICAgICAgICAqIE5vdGU6IGF1ZGlvIGFuZCB2aWRlbyBDVFMgYXJlIG5vdCBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgICAgICogdGhlIGNhbGwgb2YgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvICovCi0gICAgICAgICAgICBpZiggMCAhPSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogUDRNRTAwMDAzMjc2OiBTZWNvbmQgNTAtMTAwJSBzZWdtZW50IGlzIGRlZGljYXRlZCB0byBzdGF0ZXMgOgotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJTy4uLiAqLwotICAgICAgICAgICAgICAgIC8qIEZvciBBdWRpbyB0aGUgcHJvZ3Jlc3MgY29tcHV0YXRpb24gaXMgYmFzZWQgb24gZEF0byBhbmQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIGl0IGlzIG1vcmUgYWNjdXJhdGUgKi8KLSAgICAgICAgICAgICAgICAqcFByb2dyZXNzID0gKE00T1NBX1VJbnQ4KSg1MAotICAgICAgICAgICAgICAgICAgICArICg1MCAqIHBDLT5ld2MuZEFUbyAtIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aVZvZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgIC8gKHBDLT5ld2MuaU91dHB1dER1cmF0aW9uKSk7IC8qKjwgNTAgZm9yIDEwMC8yICoqLwotCi0gICAgICAgICAgICAgICAgaWYoICpwUHJvZ3Jlc3MgPj0gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwUHJvZ3Jlc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgOTk7IC8qKjwgSXQncyBub3QgcmVhbGx5IGZpbmlzaGVkLCBJIHByZWZlciB0byByZXR1cm4gbGVzcyB0aGFuIDEwMCUgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDk5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXVkaW8gaXMgb3Zlciwgc3RhdGUgdHJhbnNpdGlvbiB0byBGSU5JU0hFRCAqLwotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9GSU5JU0hFRDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXA6IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpbyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfRklOSVNIRUQ6Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBQcm9ncmVzcyBwZXJjZW50YWdlOiBmaW5hbGl6ZSBmaW5pc2hlZCAtPiAxMDAlICovCi0gICAgICAgICAgICAqcFByb2dyZXNzID0gMTAwOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQXVkaW8gbWl4aW5nIGlzIGZpbmlzaGVkLCByZXR1cm4gY29ycmVjdCB3YXJuaW5nICovCi0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nU3RlcDogU3RhdGUgZXJyb3IgKDB4JXgpISBSZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgRnJlZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uLgotICogQG5vdGUgICAgVGhlIGNvbnRleHQgaXMgbm8gbW9yZSB2YWxpZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCggTTRWU1MzR1BQX0F1ZGlvTWl4aW5nQ29udGV4dCBwQ29udGV4dCApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX1VJbnQzMiBsYXN0Q1RTOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXAgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsCi0gICAgICAgIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENvbnRleHQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpOiBNNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwOiBwQ29udGV4dCBpc1wKLSAgICAgICAgICAgICBNNE9TQV9OVUxMLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBJbnB1dCAzR1BQIGZpbGUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cElucHV0Q2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBBZGRlZCAzR1BQIGZpbGUgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEFkZGVkQ2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQWRkZWRDbGlwQ3R4dCk7Ci0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSB0aGUgM0dQIHdyaXRlci4gSW4gbm9ybWFsIHVzZSBjYXNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLAotICAgICAgYnV0IG5vdCBpbiBhYm9ydCB1c2UgY2FzZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgKQotICAgIHsKLSAgICAgICAgLyogVXBkYXRlIGxhc3QgVmlkZW8gQ1RTICovCi0gICAgICAgIGxhc3RDVFMgPSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbjsKLQotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uLCAmbGFzdENUUyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IFNldE9wdGlvbihNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlKAotICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2VXcml0ZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4gdGhlIGVycm9yIGJlY2F1c2Ugd2UgaGF2ZSBvdGhlciB0aGluZ3MgdG8gZnJlZSEgKi8KLSAgICAgICAgfQotICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIEF1ZGlvIGVuY29kZXIgY29udGV4dCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ0NsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IGRvbid0IHJldHVybiwgd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc3NyYyBzdHVmZiAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPlNzcmNTY3JhdGNoICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPlNzcmNTY3JhdGNoKTsKLSAgICAgICAgcEMtPlNzcmNTY3JhdGNoID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFNzcmNCdWZmZXJJbiApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wU3NyY0J1ZmZlckluKTsKLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAmJiAoTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDApICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBTc3JjQnVmZmVyT3V0KTsKLSAgICAgICAgcEMtPnBTc3JjQnVmZmVyT3V0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cFRlbXBCdWZmZXIgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+cFRlbXBCdWZmZXIpOwotICAgICAgICBwQy0+cFRlbXBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmIChwQy0+cExWQXVkaW9SZXNhbXBsZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIExWRGVzdHJveShwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgICAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgc2hlbGxzIGludGVyZmFjZXMgKi8KLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoJnBDLT5TaGVsbEFQSSk7Ci0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVycygmcEMtPlNoZWxsQVBJKTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgY29udGV4dCAqLwotICAgIGZyZWUocENvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKiogICAgICAgICAgICAgICAgICBTVEFUSUMgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyBhdWRpbyBtaXhpbmcgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgVlNTIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gdmFsaWQgYXVkaW8gbWl4aW5nIHNldHRpbmdzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oIE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dEFTRiA9IDA7Ci0gICAgTTRFTkNPREVSX0hlYWRlciAqZW5jSGVhZGVyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBTZXR0aW5ncz0weCV4IiwKLSAgICAgICAgcEMsIHBTZXR0aW5ncyk7Ci0KLSAgICAvKioKLSAgICAqIFRoZSBBZGQgVm9sdW1lIG11c3QgYmUgKHN0cmljdGx5KSBzdXBlcmlvciB0aGFuIHplcm8gKi8KLSAgICBpZiggcFNldHRpbmdzLT51aUFkZFZvbHVtZSA9PSAwICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogQWRkVm9sdW1lIGlzIHplcm8sXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQUREVk9MVU1FX0VRVUFMU19aRVJPIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTzsKLSAgICB9Ci0gICAgLyoKLSAgICBlbHNlIGlmKHBTZXR0aW5ncy0+dWlBZGRWb2x1bWUgPj0gMTAwKSAvLyBJZiB2b2x1bWUgaXMgc2V0IHRvIDEwMCwgbm8gbW9yZSBvcmlnaW5hbCBhdWRpbyAuLi4KLSAgICB7Ci0gICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgICovCi0gICAgLyoqCi0gICAgKiBCdWlsZCB0aGUgaW5wdXQgY2xpcCBzZXR0aW5ncyAqLwotICAgIHBDLT5JbnB1dENsaXBTZXR0aW5ncy5wRmlsZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+cE9yaWdpbmFsQ2xpcEZpbGU7IC8qKjwgSW5wdXQgM0dQUCBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBwQy0+SW5wdXRDbGlwU2V0dGluZ3MuRmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDsKLSAgICBwQy0+SW5wdXRDbGlwU2V0dGluZ3MudWlCZWdpbkN1dFRpbWUgPQotICAgICAgICAwOyAvKio8IE5vIG5vdGlvbiBvZiBjdXQgZm9yIHRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSAqLwotICAgIHBDLT5JbnB1dENsaXBTZXR0aW5ncy51aUVuZEN1dFRpbWUgPQotICAgICAgICAwOyAvKio8IE5vIG5vdGlvbiBvZiBjdXQgZm9yIHRoZSBhdWRpbyBtaXhpbmcgZmVhdHVyZSAqLwotCi0gICAgLyoqCi0gICAgKiBPcGVuIHRoZSBvcmlnaW5hbCBBdWRpby9WaWRlbyAzR1BQIGNsaXAgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEluaXQoJnBDLT5wSW5wdXRDbGlwQ3R4dCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBNNFZTUzNHUFBfaW50Q2xpcEluaXQob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBPcGVuKHBDLT5wSW5wdXRDbGlwQ3R4dCwgJnBDLT5JbnB1dENsaXBTZXR0aW5ncywKLSAgICAgICAgTTRPU0FfRkFMU0UsIE00T1NBX0ZBTFNFLCBNNE9TQV9UUlVFKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRDbGlwT3BlbihvcmlnKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cElucHV0Q2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgICAgIHsKLSAgICAgICAgcEMtPmJSZW1vdmVPcmlnaW5hbCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLSAgICAvKioKLSAgICAqIElmIHRoZXJlIGlzIG5vIHZpZGVvLCBpdCdzIGFuIGVycm9yICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBubyB2aWRlbyBzdHJlYW0gaW4gY2xpcCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBjbGlwIHByb3BlcnRpZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcyhwQy0+cElucHV0Q2xpcEN0eHQsCi0gICAgICAgICZwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBCdWlsZCB0aGUgYWRkZWQgY2xpcCBzZXR0aW5ncyAqLwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy5wRmlsZSA9Ci0gICAgICAgIHBTZXR0aW5ncy0+cEFkZGVkQXVkaW9UcmFja0ZpbGU7IC8qKjwgQWRkZWQgZmlsZSBkZXNjcmlwdG9yICovCi0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLkZpbGVUeXBlID0gcFNldHRpbmdzLT5BZGRlZEF1ZGlvRmlsZVR5cGU7Ci0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLnVpQmVnaW5DdXRUaW1lID0KLSAgICAgICAgMDsgLyoqPCBObyBub3Rpb24gb2YgY3V0IGZvciB0aGUgYXVkaW8gbWl4aW5nIGZlYXR1cmUgKi8KLSAgICBwQy0+QWRkZWRDbGlwU2V0dGluZ3MudWlFbmRDdXRUaW1lICAgPSAwOy8qKjwgTm8gbm90aW9uIG9mIGN1dCBmb3IgdGhlIGF1ZGlvIG1peGluZyBmZWF0dXJlICovCi0gICAgcEMtPkFkZGVkQ2xpcFNldHRpbmdzLkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscz0KLSAgICAgICAgcFNldHRpbmdzLT51aU51bUNoYW5uZWxzOwotICAgIHBDLT5BZGRlZENsaXBTZXR0aW5ncy5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5PSAgICBwU2V0dGluZ3MtPnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+QWRkZWRDbGlwU2V0dGluZ3MucEZpbGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogT3BlbiB0aGUgYWRkZWQgQXVkaW8gY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEluaXQoJnBDLT5wQWRkZWRDbGlwQ3R4dCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludENsaXBJbml0KGFkZGVkKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBPcGVuKHBDLT5wQWRkZWRDbGlwQ3R4dCwgJnBDLT5BZGRlZENsaXBTZXR0aW5ncywKLSAgICAgICAgICAgIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludENsaXBPcGVuKGFkZGVkKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8sIGl0J3MgYW4gZXJyb3IgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBubyBhdWRpbyBub3IgdmlkZW8gc3RyZWFtIGluIGNsaXAsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSBjbGlwIHByb3BlcnRpZXMgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMocEMtPnBBZGRlZENsaXBDdHh0LAotICAgICAgICAgICAgJnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoYWRkZWQpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2goIHBTZXR0aW5ncy0+b3V0cHV0QVNGICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDE2MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMjA1MF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gMjIwNTA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgICAgICBvdXRwdXRBU0YgPSAyNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgICAgIG91dHB1dEFTRiA9IDMyMDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgb3V0cHV0QVNGID0gNDQxMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgICAgICBvdXRwdXRBU0YgPSA0ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIHBhcmFtZXRlciBpbiBvdXRwdXQgQVNGICIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPmJSZW1vdmVPcmlnaW5hbCA9PSBNNE9TQV9UUlVFCi0gICAgICAgICAgICAmJiAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QMyB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa1BDTQotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ICE9IG91dHB1dEFTRgotICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMpICkKLSAgICAgICAgewotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dEFTRiA9IE00VklERU9FRElUSU5HX2s4MDAwX0FTRjsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gMzIwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDIwNDggKiBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICAgICAgICBvdXRwdXRBU0Y7Ci0KLSAgICAgICAgICAgIGlmKCBvdXRwdXRBU0YgIT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gY2FsbCBTU1JDIGluIG9yZGVyIHRvIGFsaWduIEFTRiBhbmQvb3IgbmIgb2YgY2hhbm5lbHMgKi8KLSAgICAgICAgICAgICAgICAvKiBNb3Jlb3ZlciwgYXVkaW8gZW5jb2RlciBtYXkgYmUgbmVlZGVkIGluIGNhc2Ugb2YgYXVkaW8gcmVwbGFjaW5nLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMKLSAgICAgICAgICAgICAgICA8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFN0ZXJlbyB0byBNb25vICovCi0gICAgICAgICAgICAgICAgcEMtPkNoYW5uZWxDb252ZXJzaW9uID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscwotICAgICAgICAgICAgICAgID4gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogTW9ubyB0byBTdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPSAyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzID0KLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBjb21wYXRpYmlsaXR5IGNoYXJ0ICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkocEMsCi0gICAgICAgICAgICAmcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgJnBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgbG9vcCBwYXJhbWV0ZXJzICovCi0gICAgICAgIGlmKCBwQy0+dWlCZWdpbkxvb3AgPiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgYmVnaW4gbG9vcCB0aW1lIGlzIGhpZ2hlciB0aGFuIGFkZGVkIGNsaXAgYXVkaW8gZHVyYXRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0JFR0lOTE9PUF9ISUdIRVJfRU5ETE9PUDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIE9rLCBsZXQncyBnbyB3aXRoIHRoaXMgYXVkaW8gdHJhY2sgKi8KLSAgICAgICAgcEMtPmJIYXNBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5vIGFkZGVkIGZpbGUsIGZvcmNlIHJlbW92ZSBvcmlnaW5hbCAqLwotICAgICAgICBwQy0+QWRkZWRDbGlwU2V0dGluZ3MuRmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfVW5zdXBwb3J0ZWQ7Ci0gICAgICAgIHBDLT5iUmVtb3ZlT3JpZ2luYWwgPSBNNE9TQV9UUlVFOwotICAgICAgICBwQy0+Ykhhc0F1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSB2aWRlbyBwcm9wZXJ0aWVzIG9mIHRoZSBpbnB1dCBjbGlwIHRvIHRoZSBvdXRwdXQgcHJvcGVydGllcyAqLwotICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPQotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoOwotICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0OwotICAgIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgIHBDLT5ld2MuYlZpZGVvRGF0YVBhcnRpdGlvbmluZyA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iTVBFRzRkYXRhUGFydGl0aW9uOwotICAgIHBDLT5ld2Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9Qcm9maWxlOwotICAgIHBDLT5ld2Mub3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvTGV2ZWw7Ci0gICAgc3dpdGNoKCBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0gyNjM6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tIMjYzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTVBFRzQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tNUEVHXzQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBBZGQgYSBsaW5rIHRvIHZpZGVvIGRzaSAqLwotICAgIGlmKCBNNFNZU19rSDI2NCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSApCi0gICAgewotCi0gICAgICAgIC8qIEZvciBILjI2NCBlbmNvZGVyIGNhc2UKLSAgICAgICAgKiBGZXRjaCB0aGUgRFNJIGZyb20gdGhlIHNoZWxsIHZpZGVvIGVuY29kZXIsIGFuZCBmZWVkIGl0IHRvIHRoZSB3cml0ZXIgKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogZ2V0IERTSSBmb3IgSDI2NCBzdHJlYW0iKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IHBDLT5ld2MucEVuY0NvbnRleHQgaXMgTlVMTCIpOwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQsIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogZW5jSGVhZGVyLT5wQnVmPTB4JXgsIHNpemU9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVuY0hlYWRlci0+cEJ1ZiwgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IHNlbmQgRFNJIGZvciBIMjY0IHN0cmVhbSB0byAzR1Agd3JpdGVyIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBuZXcgRFNJICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGVuY0hlYWRlci0+U2l6ZSwgTTRWU1MzR1BQLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwQy0+ZXdjLnBWaWRlb091dHB1dERzaSAoSDI2NCkiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFZpZGVvT3V0cHV0RHNpIChIMjY0KSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IChNNE9TQV9VSW50MTYpZW5jSGVhZGVyLT5TaXplOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MucFZpZGVvT3V0cHV0RHNpLCAodm9pZCAqKWVuY0hlYWRlci0+cEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlciByZXR1cm5lZCBlcnJvciAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBwQy0+ZXdjLnBFbmNDb250ZXh0IGlzIE5VTEwsIGNhbm5vdCBnZXQgdGhlIERTSSIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGlucHV0IGNsaXAgdmlkZW8gc3RyZWFtIHR5cGUgPSAweCV4IiwKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemU7Ci0gICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBhdWRpbyBwcm9wZXJ0aWVzIG9mIHRoZSBhZGRlZCBjbGlwIHRvIHRoZSBvdXRwdXQgcHJvcGVydGllcyAqLwotICAgIGlmKCBwQy0+Ykhhc0F1ZGlvICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+YlJlbW92ZU9yaWdpbmFsID09IE00T1NBX1RSVUUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgIC8qIGlmIG91dHB1dCBzZXR0aW5ncyBhcmUgZGlmZmVyZW50cyBmcm9tIGFkZGVkIGNsaXAgc2V0dGluZ3MsCi0gICAgICAgICAgICB3ZSBuZWVkIHRvIHJlZW5jb2RlIEJHTSAqLwotICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAhPSBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gb3V0cHV0QVNGCi0gICAgICAgICAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscwotICAgICAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscwotICAgICAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogU2V0IHJlYWRlciBEU0kgdG8gTlVMTCAodW5rbm93biksIHdlIHdpbGwgdXNlIGVuY29kZXIgRFNJIGxhdGVyICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5vdXRwdXRBdWRpb0Zvcm1hdCA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4OwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPSAxMjIwMDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gODAwMDsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0gMzIwOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBQUMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa1VuZGVmaW5lZEJpdHJhdGUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazMyX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNDhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNjRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLnVpTmJDaGFubmVscyA9PSAyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYml0cmF0ZSBoYXZlIHRvIGJlIGRvdWJsZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlICs9IHBDLT5ld2MudWlBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0gcFNldHRpbmdzLT5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy51aU5iQ2hhbm5lbHMgPT0gMSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05POwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAxMDI0OyAvKiBBQUMgaXMgYWx3YXlzIDEwMjQvRnJlcSBzYW1wbGUgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4OwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rRVZSQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAxNjA7IC8qIEVWUkMgZnJhbWVzIGFyZSAyMCBtcyBhdCA4MDAwIEh6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWtlcyBpdCBlYXNpZXIgdG8gZmFjdG9yaXplIGFtciBhbmQgZXZyYyBjb2RlKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUENNOgotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHJlYWRlciBEU0kgdG8gTlVMTCAodW5rbm93biksIHdlIHdpbGwgdXNlIGVuY29kZXIgRFNJIGxhdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDgwMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FNUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BTVJfQVVfU0lMRU5DRV9GUkFNRV8wNDhfRFVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2sxMl8yX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAxNjAwMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05POwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0OyAvKiBBQUMgaXMgYWx3YXlzIDEwMjQvRnJlcSBzYW1wbGUgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQUFDOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gKE00T1NBX1VJbnQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU9fU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0F1ZGlvVW5rbm93bjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEFkZCBhIGxpbmsgdG8gYXVkaW8gZHNpICovCi0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSAoTTRPU0FfTWVtQWRkcjgpcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPgotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTYW1wbGluZ0ZyZXF1ZW5jeSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgLyAxMDAwLjA7Ci0KLSAgICAgICAgICAgIHN3aXRjaCggcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBTVI7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X0RVUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBQUM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OT19TSVpFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FBQ19BVV9TSUxFTkNFX1NURVJFTzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOiBObyBhdWRpbyB0cmFjayBpbiBpbnB1dCBmaWxlLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBBZGQgYSBsaW5rIHRvIGF1ZGlvIGRzaSAqLwotICAgICAgICAgICAgcEMtPmV3Yy51aUF1ZGlvT3V0cHV0RHNpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQy0+cElucHV0Q2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KXBDLT5wSW5wdXRDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IGNvbW1vbiAnc2lsZW5jZSBmcmFtZSBzdHVmZicgdG8gQ2xpcENvbnRleHQgKi8KLSAgICBwQy0+cElucHV0Q2xpcEN0eHQtPnVpU2lsZW5jZVBjbVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZVBjbVNpemU7Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YSA9IHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT51aVNpbGVuY2VGcmFtZVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZTsKLSAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgIC1wQy0+cElucHV0Q2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsgLyogUmVzZXQgdGltZSAqLwotCi0gICAgLyoqCi0gICAgKiBDb3B5IGNvbW1vbiAnc2lsZW5jZSBmcmFtZSBzdHVmZicgdG8gQ2xpcENvbnRleHQgKi8KLSAgICBpZiggcEMtPmJIYXNBdWRpbyApCi0gICAgewotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpU2lsZW5jZVBjbVNpemUgPSBwQy0+ZXdjLnVpU2lsZW5jZVBjbVNpemU7Ci0gICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEgPSBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhOwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpU2lsZW5jZUZyYW1lU2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbyA9IHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAtcEMtPnBBZGRlZENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247IC8qIFJlc2V0IHRpbWUgKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIEFkZEN0cyBpcyBsb3dlciB0aGFuIG9yaWdpbmFsIGNsaXAgZHVyYXRpb24gKi8KLSAgICBpZiggKCBNNE9TQV9OVUxMICE9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtKQotICAgICAgICAmJiAocEMtPmlBZGRDdHMgPiAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IHVpQWRkQ3RzIGlzIGxhcmdlciB0aGFuIHZpZGVvIGR1cmF0aW9uLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTiIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BRERDVFNfSElHSEVSX1RIQU5fVklERU9fRFVSQVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB0aGUgYXVkaW8gdHJhY2tzIGFyZSBub3QgY29tcGF0aWJsZSwgcmVwbGFjZSBpbnB1dCB0cmFjayBieSBzaWxlbmNlICovCi0gICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgQ2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgKQotICAgIHsKLSAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKHBDLT5wSW5wdXRDbGlwQ3R4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBhdWRpbyBtaXhpbmcgaXMgcmVxdWlyZWQgKi8KLSAgICBpZiggKCAoIHBDLT5iSGFzQXVkaW8pICYmIChNNE9TQV9GQUxTRQotICAgICAgICA9PSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNFZGl0YWJsZSkpCi0gICAgICAgIHx8IChNNE9TQV9UUlVFID09IHBDLT5iUmVtb3ZlT3JpZ2luYWwpICkgLyp8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwU2V0dGluZ3MtPnVpQWRkVm9sdW1lID49IDEwMCkpICovCi0gICAgewotICAgICAgICBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPmJBdWRpb01peGluZ0lzTmVlZGVkID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIG91dHB1dCBhdWRpbyBjYW4gc3VwcG9ydCBzaWxlbmNlIGZyYW1lcwotICAgIFRyaWNrIGkgdXNlIGJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwIGZpbGVkIHRvIHN0b3JlIHRoYXQgICovCi0gICAgaWYoIHBDLT5iSGFzQXVkaW8gKQotICAgIHsKLSAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwOwotCi0gICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBDLT5pQWRkQ3RzID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6XAotICAgICAgICAgICAgICAgICAgICBpQWRkQ3RzIHNob3VsZCBiZSBzZXQgdG8gMCB3aXRoIHRoaXMgYXVkaW8gdHJhY2sgISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0ZFQVRVUkVfVU5TVVBQT1JURURfV0lUSF9BVURJT19UUkFDSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIDAgPCBwQy0+dWlFbmRMb29wICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgIHVpRW5kTG9vcCBzaG91bGQgYmUgc2V0IHRvIDAgd2l0aCB0aGlzIGF1ZGlvIHRyYWNrICEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9GRUFUVVJFX1VOU1VQUE9SVEVEX1dJVEhfQVVESU9fVFJBQ0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoIHBDLT5iX0R1Y2tpbmdOZWVkZWVkID09IE00T1NBX0ZBTFNFKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgZmFjdG9yIHRvIGFwcGx5IHRvIHNhbXBsZSB0byBkbyB0aGUgbWl4aW5nICovCi0gICAgICAgIHBDLT5mQWRkZWRGYWN0b3IgPSAwLjUwRjsKLSAgICAgICAgcEMtPmZPcmlnRmFjdG9yID0gMC41MEY7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIFNTUkMgaXMgbmVlZGVkICovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgbnVtZXJhdG9yLCBkZW5vbWluYXRvciwgcmF0aW8sIHJhdGlvQnVmZmVyOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEluaXQgdGhlIFNTUkMgbW9kdWxlICovCi0gICAgICAgIFNTUkNfUmV0dXJuU3RhdHVzX2VuCi0gICAgICAgICAgICBSZXR1cm5TdGF0dXM7IC8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIExWTV9JTlQxNiBOclNhbXBsZXNNaW4gPQotICAgICAgICAgICAgMDsgLyogTWluaW1hbCBudW1iZXIgb2Ygc2FtcGxlcyBvbiB0aGUgaW5wdXQgb3Igb24gdGhlIG91dHB1dCAqLwotICAgICAgICBMVk1fSU5UMzIKLSAgICAgICAgICAgIFNjcmF0Y2hTaXplOyAvKiBUaGUgc2l6ZSBvZiB0aGUgc2NyYXRjaCBtZW1vcnkgICAgICAgICAgICAgICAqLwotICAgICAgICBMVk1fSU5UMTYKLSAgICAgICAgICAgICpwSW5wdXRJblNjcmF0Y2g7IC8qIFBvaW50ZXIgdG8gaW5wdXQgaW4gdGhlIHNjcmF0Y2ggYnVmZmVyICAgICAgICovCi0gICAgICAgIExWTV9JTlQxNgotICAgICAgICAgICAgKgotICAgICAgICAgICAgcE91dHB1dEluU2NyYXRjaDsgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGluIHRoZSBzY3JhdGNoIGJ1ZmZlciAgKi8KLSAgICAgICAgU1NSQ19QYXJhbXNfdCBzc3JjUGFyYW1zOyAgICAgICAgICAvKiBNZW1vcnkgZm9yIGluaXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBzd2l0Y2goIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzgwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMTEwMjU6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzExMDI1OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDEyMDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18xMjAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzIyMDUwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU18yNDAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfSW4gPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX0luID0gTFZNX0ZTXzQ0MTAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19JbiA9IExWTV9GU180ODAwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW46IGludmFsaWQgYWRkZWQgY2xpcCBzYW1wbGluZyBmcmVxdWVuY3kgKCVkIEh6KSxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlTYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfQURERURfQVVESU9fU1RSRUFNOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIDEgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fTU9OTzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Ock9mQ2hhbm5lbHMgPSBMVk1fU1RFUkVPOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKCBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU184MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzI0MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgIHNzcmNQYXJhbXMuU1NSQ19Gc19PdXQgPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgc3NyY1BhcmFtcy5TU1JDX0ZzX091dCA9IExWTV9GU180NDEwMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICBzc3JjUGFyYW1zLlNTUkNfRnNfT3V0ID0gTFZNX0ZTXzQ4MDAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbjogaW52YWxpZCBvdXRwdXQgc2FtcGxpbmcgZnJlcXVlbmN5ICglZCBIeiksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BVURJT19DQU5OT1RfQkVfTUlYRUQiLAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBSZXR1cm5TdGF0dXMgPSAwOwotCi0gICAgICAgIHN3aXRjaCAoc3NyY1BhcmFtcy5TU1JDX0ZzX0luKXsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAzMjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID00NDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTIwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gICAgNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzE2MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9ICAgIDY0MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18yMjA1MDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAgICA4ODI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMjQwMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gICAgOTYwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzMyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA9IDEyODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfNDQxMDA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc0luID0gMTc2NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU180ODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBSZXR1cm5TdGF0dXMgPSAtMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzc3JjUGFyYW1zLlNTUkNfRnNfT3V0KXsKLSAgICAgICAgY2FzZSBMVk1fRlNfODAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAzMjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMTEwMjU6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA9NDQxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzEyMDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQ9ICAgIDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18xNjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAgICA2NDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVk1fRlNfMjIwNTA6Ci0gICAgICAgICAgICBzc3JjUGFyYW1zLk5yU2FtcGxlc091dD0gICAgODgyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzI0MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQ9ICAgIDk2MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU18zMjAwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0ID0gMTI4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWTV9GU180NDEwMDoKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0PSAxNzY0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFZNX0ZTXzQ4MDAwOgotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAxOTIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBSZXR1cm5TdGF0dXMgPSAtMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmKCBSZXR1cm5TdGF0dXMgIT0gU1NSQ19PSyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuOlwKLSAgICAgICAgICAgICAgICBFcnJvciBjb2RlICVkIHJldHVybmVkIGJ5IHRoZSBTU1JDX0dldE5yU2FtcGxlcyBmdW5jdGlvbiIsCi0gICAgICAgICAgICAgICAgUmV0dXJuU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDsKLSAgICAgICAgfQotCi0gICAgICAgIE5yU2FtcGxlc01pbiA9Ci0gICAgICAgICAgICAoTFZNX0lOVDE2KSgoc3NyY1BhcmFtcy5OclNhbXBsZXNJbiA+IHNzcmNQYXJhbXMuTnJTYW1wbGVzT3V0KQotICAgICAgICAgICAgPyBzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA6IHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4pOwotCi0gICAgICAgIHdoaWxlKCBOclNhbXBsZXNNaW4gPCBNNFZTU19TU1JDX01JTkJMT0NLU0laRSApCi0gICAgICAgIHsgLyogRG9uJ3QgdGFrZSBibG9ja3Mgc21hbGxlciB0aGF0IHRoZSBtaW5pbWFsIGJsb2NrIHNpemUgKi8KLSAgICAgICAgICAgIHNzcmNQYXJhbXMuTnJTYW1wbGVzSW4gPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc0luIDw8IDEpOwotICAgICAgICAgICAgc3NyY1BhcmFtcy5OclNhbXBsZXNPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCA8PCAxKTsKLSAgICAgICAgICAgIE5yU2FtcGxlc01pbiA9IChMVk1fSU5UMTYpKE5yU2FtcGxlc01pbiA8PCAxKTsKLSAgICAgICAgfQotICAgICAgICBwQy0+aVNzcmNOYlNhbXBsSW4gPSAoTFZNX0lOVDE2KSgKLSAgICAgICAgICAgIHNzcmNQYXJhbXMuCi0gICAgICAgICAgICBOclNhbXBsZXNJbik7IC8qIG11bHRpcGxpY2F0aW9uIGJ5IE5yT2ZDaGFubmVscyBpcyBkb25lIGJlbG93ICovCi0gICAgICAgIHBDLT5pU3NyY05iU2FtcGxPdXQgPSAoTFZNX0lOVDE2KShzc3JjUGFyYW1zLk5yU2FtcGxlc091dCk7Ci0KLSAgICAgICAgbnVtZXJhdG9yID0KLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgIGRlbm9taW5hdG9yID0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5Ci0gICAgICAgICAgICAqIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgaWYoIG51bWVyYXRvciAlIGRlbm9taW5hdG9yID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByYXRpb0J1ZmZlciA9IChNNE9TQV9VSW50MzIpKG51bWVyYXRvciAvIGRlbm9taW5hdG9yKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJhdGlvQnVmZmVyID0gKE00T1NBX1VJbnQzMikobnVtZXJhdG9yIC8gZGVub21pbmF0b3IpICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIHJhdGlvID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCggcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICogcmF0aW9CdWZmZXIpIC8gKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgaWYoIHJhdGlvID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJdCBtZWFucyB0aGF0IHRoZSBpbnB1dCBzaXplIG9mIFNTUkMgYnVmZmVySW4gaXMgYmlnZ2VyIHRoYW4gdGhlIGFza2VkIGJ1ZmZlciAqLwotICAgICAgICAgICAgcEMtPm1pbmltdW1CdWZmZXJJbiA9IHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByYXRpbysrOyAvKiBXZSB1c2UgdGhlIGltbWVkaWF0ZSBzdXBlcmlvciBpbnRlZ2VyICovCi0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gcmF0aW8gKiAocEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBpbnB1dCBvZiB0aGUgU1NSQyAqLwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJJbiA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5taW5pbXVtQnVmZmVySW4KLSAgICAgICAgICAgICsgcEMtPnBBZGRlZENsaXBDdHh0LT4KLSAgICAgICAgICAgIEF1ZGlvRGVjQnVmZmVyT3V0LgotICAgICAgICAgICAgbV9idWZmZXJTaXplLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlckluIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbiwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgLyogVGhlICIzIiB2YWx1ZSBiZWxvdyBzaG91bGQgYmUgb3B0aW1pemVkIC4uLiBvbmUgZGF5IC4uLiAqLwotICAgICAgICBwQy0+cFNzcmNCdWZmZXJPdXQgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzICogcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICogcEMtPmV3Yy51aU5iQ2hhbm5lbHMsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJPdXQsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIHRlbXBvcmFyeSBidWZmZXIgbmVlZGVkIGluIGNhc2Ugb2YgY2hhbm5lbCBjb252ZXJzaW9uICovCi0gICAgICAgIGlmKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGhlICIzIiB2YWx1ZSBiZWxvdyBzaG91bGQgYmUgb3B0aW1pemVkIC4uLiBvbmUgZGF5IC4uLiAqLwotICAgICAgICAgICAgcEMtPnBUZW1wQnVmZmVyID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKDMgKiBwQy0+aVNzcmNOYlNhbXBsT3V0Ci0gICAgICAgICAgICAgICAgKiBzaXplb2Yoc2hvcnQpICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscywgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlck91dCIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFRlbXBCdWZmZXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBUZW1wQnVmZmVyLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cFBvc0luVGVtcEJ1ZmZlciA9IHBDLT5wVGVtcEJ1ZmZlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICB7Ci0gICAgICAgIHBDLT5taW5pbXVtQnVmZmVySW4gPQotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgaW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwQy0+bWluaW11bUJ1ZmZlckluCi0gICAgICAgICAgICArIHBDLT5wQWRkZWRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dC4KLSAgICAgICAgICAgIG1fYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJJbiIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5wU3NyY0J1ZmZlckluICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogXAotICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwU3NyY0J1ZmZlckluLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluID0gKE00T1NBX01lbUFkZHI4KXBDLT5wU3NyY0J1ZmZlckluOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIG91dHB1dCBvZiB0aGUgU1NSQyAqLwotICAgICAgICAvKiBUaGUgIjMiIHZhbHVlIGJlbG93IHNob3VsZCBiZSBvcHRpbWl6ZWQgLi4uIG9uZSBkYXkgLi4uICovCi0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFNzcmNCdWZmZXJPdXQiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFNzcmNCdWZmZXJPdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJPdXQsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgIH0KLSAgICBlbHNlIGlmKCAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVAzKXx8Ci0gICAgICAgICAocEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rUENNKSkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBtaW5idWZmZXIgPSAwOwotCi0gICAgICAgIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBQUMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gMjA0OCAqIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotICAgICAgICAgICAgbWluYnVmZmVyID0gcEMtPm1pbmltdW1CdWZmZXJJbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBwU2V0dGluZ3MtPm91dHB1dEF1ZGlvRm9ybWF0ID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+bWluaW11bUJ1ZmZlckluID0gMzIwOwotCi0gICAgICAgICAgICBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgPiAzMjAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1pbmJ1ZmZlciA9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1pbmJ1ZmZlciA9IHBDLT5taW5pbXVtQnVmZmVySW47IC8qIE5vdCByZWFsbHkgcG9zc2libGUgLi4uKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJCYWQgb3V0cHV0IGF1ZGlvIGZvcm1hdCwgaW4gY2FzZSBvZiBNUDMgcmVwbGFjaW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgaW5wdXQgb2YgdGhlIFNTUkMgKi8KLSAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygyICogbWluYnVmZmVyLCBNNFZTUzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwU3NyY0J1ZmZlckluIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBTc3JjQnVmZmVySW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiB1bmFibGUgdG8gYWxsb2NhdGUgcFNzcmNCdWZmZXJJbixcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiA9IChNNE9TQV9NZW1BZGRyOClwQy0+cFNzcmNCdWZmZXJJbjsKLQotICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCA9IHBDLT5wUG9zSW5Tc3JjQnVmZmVySW47Ci0gICAgICAgIHBDLT5wU3NyY0J1ZmZlck91dCA9IHBDLT5wU3NyY0J1ZmZlckluOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgYXVkaW8gZW5jb2RlciBpcyBuZWVkZWQgdG8gZG8gYXVkaW8gbWl4aW5nIG9yIGF1ZGlvIHJlc2FtcGxpbmcgKi8KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgfHwgTTRWSURFT0VESVRJTkdfa1BDTQotICAgICAgICA9PSBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgIHx8IE00VklERU9FRElUSU5HX2tNUDMKLSAgICAgICAgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgIT0gb3V0cHV0QVNGCi0gICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMKLSAgICAgICAgIT0gcFNldHRpbmdzLT5vdXRwdXROQkNoYW5uZWxzICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEluaXQgdGhlIGF1ZGlvIGVuY29kZXIgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcigmcEMtPmV3YywgJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb0JpdHJhdGUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdPcGVuKCk6IE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSW4gY2FzZSBvZiBQQ00sIE1QMyBvciBhdWRpbyByZXBsYWNlIHdpdGggcmVlbmNvZGluZywgdXNlIGVuY29kZXIgRFNJICovCi0gICAgICAgIGlmKCBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID09IDAgJiYgKE00VklERU9FRElUSU5HX2tQQ00KLSAgICAgICAgICAgID09IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgIHx8IE00VklERU9FRElUSU5HX2tNUDMgPT0gcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgIHx8IHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gb3V0cHV0QVNGCi0gICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscykgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDLT5ld2MucEF1ZGlvRW5jRFNJLmluZm9TaXplOwotICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgPSBwQy0+ZXdjLnBBdWRpb0VuY0RTSS5wSW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdCB0aGUgb3V0cHV0IDNHUFAgZmlsZSAqLwotICAgIC8qMTEvMTIvMjAwOCBDUjMyODMgYWRkIHRoZSBtYXggb3V0cHV0IGZpbGUgc2l6ZSBmb3IgdGhlIE1NUyB1c2UgY2FzZSBpbiBWaWRlb0FydGlzdCovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICBwQy0+cE9zYUZpbGVXcml0UHRyLCBwU2V0dGluZ3MtPnBPdXRwdXRDbGlwRmlsZSwKLSAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwgMCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nT3BlbigpOiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ09wZW4oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKCkKLSAqIEBicmllZiAgICBXcml0ZSBhbiBhdWRpbyBzaWxlbmNlIGZyYW1lIGludG8gdGhlIHdyaXRlcgotICogQG5vdGUgICAgTWFpbmx5IHVzZWQgd2hlbiBwYWRkaW5nIHdpdGggc2lsZW5jZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlOlwKLSAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8wKCJBICMjIyMgc2lsZW5jZSBBVSIpOwotCi0gICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAodm9pZCAqKXBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEsIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplKTsKLQotICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgIChNNE9TQV9UaW1lKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgIE00T1NBX1RSQUNFMl8yKCJCIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8pLCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2U6XAotICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHNpbGVuY2UpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmRBVG8gKz0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbyhNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgdmlkZW8uCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW8oCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MTYgb2Zmc2V0OwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIiAgVklERU8gc3RlcCA6IGRWVG8gPSAlZiAgc3RhdGUgPSAlZCAgb2Zmc2V0ID0gJWxkIiwKLSAgICAgICAgcEMtPmV3Yy5kT3V0cHV0VmlkQ3RzLCBwQy0+U3RhdGUsIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aVZvZmZzZXQpOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIHRoZSBpbnB1dCB2aWRlbyBBVSAqLwotICAgIGVyciA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBJbnB1dENsaXBDdHh0LT5wVmlkZW9TdHJlYW0sCi0gICAgICAgICZwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbygpOiBtX3BGY3RHZXROZXh0QXUodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICVsZCBbIDB4JXggXSIsCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX0NUUywgcEMtPnBJbnB1dENsaXBDdHh0LT5pVm9mZnNldCwKLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSk7Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgb2Zmc2V0ID0gMDsKLSAgICAvKiBmb3IgaC4yNjQgc3RyZWFtIGRvIG5vdCByZWFkIHRoZSAxc3QgNCBieXRlcyBhcyB0aGV5IGFyZSBoZWFkZXIgaW5kaWNhdG9ycyAqLwotICAgIGlmKCBwQy0+cElucHV0Q2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlCi0gICAgICAgID09IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmMgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvKCk6IGlucHV0IHN0cmVhbSB0eXBlIEgyNjQiKTsKLSAgICAgICAgb2Zmc2V0ID0gNDsKLSAgICB9Ci0gICAgcEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSAgLT0gIG9mZnNldDsKLSAgICAvKioKLSAgICAqIENoZWNrIHRoYXQgdGhlIHZpZGVvIEFVIGlzIG5vdCBsYXJnZXIgdGhhbiBleHBlY3RlZCAqLwotICAgIGlmKCBwQy0+cElucHV0Q2xpcEN0eHQtPlZpZGVvQVUubV9zaXplID4gcEMtPmV3Yy51aVZpZGVvTWF4QXVTaXplICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBWaWRlbzogQVUgc2l6ZSBncmVhdGVyIHRoYW4gTWF4QXVTaXplICglZD4lZCkhXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFIiwKLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemUsIHBDLT5ld2MudWlWaWRlb01heEF1U2l6ZSk7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX1ZJREVPX0FVX1RPT19MQVJHRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvcHkgdGhlIGlucHV0IEFVIHBheWxvYWQgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyVmlkZW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgKHZvaWQgKikocEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fZGF0YUFkZHJlc3MgKyBvZmZzZXQpLAotICAgICAgICAocEMtPnBJbnB1dENsaXBDdHh0LT5WaWRlb0FVLm1fc2l6ZSkpOwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBpbnB1dCBBVSBwYXJhbWV0ZXJzIHRvIHRoZSBvdXRwdXQgQVUgKi8KLSAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX3NpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUyA9Ci0gICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX0NUUyArIDAuNSk7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLmF0dHJpYnV0ZSA9IHBDLT5wSW5wdXRDbGlwQ3R4dC0+VmlkZW9BVS5tX2F0dHJpYnV0ZTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgTTRPU0FfVFJBQ0UyXzIoIkQgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbHUgWyAweCV4IF0iLAotICAgICAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuQ1RTLCBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwVmlkZW86IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcFZpZGVvKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFBlcmZvcm0gb25lIHN0ZXAgb2YgYXVkaW8uCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8zKCIgIEFVRElPIG1peCAgOiBkQVRvID0gJWYgIHN0YXRlID0gJWQgIG9mZnNldCA9ICVsZCIsCi0gICAgICAgIHBDLT5ld2MuZEFUbywgcEMtPlN0YXRlLCBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0KTsKLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgQWRkQ3RzICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+aUFkZEN0cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBGaXJzdCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gc2Vjb25kIGFuZCByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1NFQ09ORF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zaXRpb24gZnJvbSByZWFkaW5nIHN0YXRlIHRvIGVuY29kaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gKiBwQy0+ZXdjLnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IgKDEtPjIpIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgKSAvKio8IE1peCAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCB0aGUgYWRkZWQgYXVkaW8gQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgfHwgcEMtPmJfU1NSQ25lZWRlZCA9PSBNNE9TQV9UUlVFCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIGNhc2Ugb2Ygc2FtcGxpbmcgZnJlcSBjb252ZXJzaW9uIGFuZC9vciBjaGFubmVsIGNvbnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVhZCBuZXh0IEFVIHdpbGwgYmUgICAgY2FsbGVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkUgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpRW5kTG9vcCA+IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSnVtcCBhdCB0aGUgQmVnaW4gbG9vcCB0aW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT51aUJlZ2luTG9vcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyYW5zaXRpb24gZnJvbSBlbmNvZGluZyBzdGF0ZSB0byByZWFkaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNlY29uZCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhpcmQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykgYSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCB0aGUgb3JpZ2luYWwgYXVkaW8gQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiRiAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUFvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPkNoYW5uZWxDb252ZXJzaW9uID09IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5iX1NTUkNuZWVkZWQgPT0gTTRPU0FfRkFMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUGVyZm9ybSB0aGUgYXVkaW8gbWl4aW5nICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKHBDKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09IE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZyByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIC8qKjwgTm8gbWl4LCBqdXN0IGNvcHkgYWRkZWQgYXVkaW8gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZChwQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIERlY2lkZSB3aGF0IHRvIGRvIHdoZW4gYXVkaW8gaXMgb3ZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDLT51aUVuZExvb3AgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEp1bXAgYXQgdGhlIEJlZ2luIGxvb3AgdGltZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIHRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT51aUJlZ2luTG9vcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICdCWlpaJyBidWcgZml4OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZShwQyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgYXVkaW8gZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAwLjUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAobG9vcCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2l0aW9uIHRvIGJlZ2luIGN1dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb24ocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1lbmNvZGUgZmFpbHMgZXJyID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU2Vjb25kIHNlZ21lbnQgaXMgb3Zlciwgc3RhdGUgdHJhbnNpdGlvbiB0byB0aGlyZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19USElSRF9TRUdNRU5UOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykgYiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygyKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogVmlkZW8gZHVyYXRpb24gcmVhY2hlZCxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsgLyoqPCBTaW11bGF0ZSBlbmQgb2YgZmlsZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZyhwQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKDMpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdmlkZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPmV3Yy5kQVRvID49IHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvIGR1cmF0aW9uIHJlYWNoZWQsIHJldHVybmluZyBNNFdBUl9OT19NT1JFX0FVIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOyAvKio8IFNpbXVsYXRlIGVuZCBvZiBmaWxlIGVycm9yICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBhdWRpby4KLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgICAgICAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIE00T1NBX1RSQUNFMl8zKCIgIEFVRElPIHJlcGwgOiBkQVRvID0gJWYgIHN0YXRlID0gJWQgIG9mZnNldCA9ICVsZCIsCi0gICAgICAgIHBDLT5ld2MuZEFUbywgcEMtPlN0YXRlLCBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0KTsKLQotICAgIHN3aXRjaCggcEMtPlN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19GSVJTVF9TRUdNRU5UOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVwbGFjZSB0aGUgU0lEIChzaWxlbmNlKSBwYXlsb2FkIGluIHRoZSB3cml0ZXIgQVUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UocEMpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb01peCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgdGhlIEFkZEN0cyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLmRBVG8gPj0gcEMtPmlBZGRDdHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRmlyc3Qgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHNlY29uZCBhbmQgcmV0dXJuIE9LICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9BVURJT19TRUNPTkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00Tk9fRVJST1IgKDEtPjIpIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fU0VDT05EX1NFR01FTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9OT19NT1JFX0FVID09IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLQotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnVpRW5kTG9vcCA+IDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogSnVtcCBhdCB0aGUgQmVnaW4gbG9vcCB0aW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aW1lID0gKE00T1NBX0ludDMyKShwQy0+dWlCZWdpbkxvb3ApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwgJnRpbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RKdW1wKGF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqICdCWlpaJyBidWcgZml4OgotICAgICAgICAgICAgICAgICAgICAgICAgKiBhZGQgYSBzaWxlbmNlIGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UocEMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4KCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBhdWRpbyBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAobG9vcCkiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFNlY29uZCBzZWdtZW50IGlzIG92ZXIsIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhpcmQgYW5kIHJldHVybiBPSyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tBdWRpb01peGluZ1N0YXRlX0FVRElPX1RISVJEX1NFR01FTlQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciBzbyB0aGUgc3RlcCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiAoMi0+MykiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSB0aGlyZCBzZWdtZW50IChzaWxlbmNlKSBpcyBvbmx5IGRvbmUgaWYgc3VwcG9ydGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgKiBJbiBvdGhlciBjYXNlLCB3ZSBmaW5pc2ggaGVyZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rQXVkaW9NaXhpbmdTdGF0ZV9GSU5JU0hFRDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yIHNvIHRoZSBzdGVwIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SICgyLT5GKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvUmVwbGFjZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKDIpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBjbGlwICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6IENsaXAgZHVyYXRpb24gcmVhY2hlZCxcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsgLyoqPCBTaW11bGF0ZSBlbmQgb2YgZmlsZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlcGxhY2UgdGhlIFNJRCAoc2lsZW5jZSkgcGF5bG9hZCBpbiB0aGUgd3JpdGVyIEFVICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nV3JpdGVTaWxlbmNlKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdXcml0ZVNpbGVuY2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5ld2MuZEFUbyA+PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9SZXBsYWNlKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW8gZHVyYXRpb24gcmVhY2hlZCwgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7IC8qKjwgU2ltdWxhdGUgZW5kIG9mIGZpbGUgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1N0ZXBBdWRpb1JlcGxhY2UoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBSZWFkIG9uZSBBVSBmcm9tIHRoZSBvcmlnaW5hbCBhdWRpbyBmaWxlIGFuZCB3cml0ZSBpdCB0byB0aGUgb3V0cHV0Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weU9yaWcoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogUmVhZCB0aGUgaW5wdXQgb3JpZ2luYWwgYXVkaW8gQVUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cElucHV0Q2xpcEN0eHQpOwotCi0gICAgTTRPU0FfVFJBQ0UyXzMoIkcgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cElucHV0Q2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0IC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZygpOiBtX3BGY3RHZXROZXh0QXUoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZzogcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29weSB0aGUgaW5wdXQgQVUgcHJvcGVydGllcyB0byB0aGUgb3V0cHV0IEFVICovCi0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPSBwQy0+cElucHV0Q2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemU7Ci0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cElucHV0Q2xpcEN0eHQtPmlBb2Zmc2V0OwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBBVSBpdHNlbGYgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICh2b2lkICopcEMtPnBJbnB1dENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciwgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICBNNE9TQV9UUkFDRTJfMigiSCAtLS0tIHdyaXRlIDogY3RzICA9ICVsZCBbIDB4JXggXSIsCi0gICAgICAgIChNNE9TQV9JbnQzMikocEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyAvIHBDLT5ld2Muc2NhbGVfYXVkaW8pLAotICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5T3JpZzogcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbmNyZW1lbnQgdGhlIGF1ZGlvIENUUyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5ld2MuZEFUbyArPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiAvIHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlPcmlnKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIFJlYWQgb25lIEFVIGZyb20gdGhlIGFkZGVkIGF1ZGlvIGZpbGUgYW5kIHdyaXRlIGl0IHRvIHRoZSBvdXRwdXQKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb3B5QWRkZWQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGlmKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QMyB8fAotICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tQQ00gfHwKLSAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9PSBNNE9TQV9UUlVFIHx8Ci0gICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDApCi0gICAgewotICAgICAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY0luQnVmZmVyOyAvKio8IEVuY29kZXIgaW5wdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyCi0gICAgICAgICAgICBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgICAgIE00T1NBX1RpbWUKLSAgICAgICAgICAgIGZyYW1lVGltZURlbHRhOyAvKio8IER1cmF0aW9uIG9mIHRoZSBlbmNvZGVkICh0aGVuIHdyaXR0ZW4pIGRhdGEgKi8KLSAgICAgICAgTTRPU0FfTWVtQWRkcjggdGVtcFBvc0J1ZmZlcjsKLQotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KHBDKTsKLQotICAgICAgICBpZiggZXJyID09IE00VlNTM0dQUF9XQVJfRU5EX09GX0FEREVEX0FVRElPICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZDpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCBlbmQgb2YgYWRkZWQgZmlsZSIpOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0IHJldHVybmVkIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nU3RlcEF1ZGlvTWl4OlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPSBwQy0+cFNzcmNCdWZmZXJPdXQ7Ci0gICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMV0gPSAwOwotCi0gICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICBmcmFtZVRpbWVEZWx0YSA9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgLyBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMCgiSyAqKioqIGJsZW5kIEFVcyIpOwotICAgICAgICAvKioKLSAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQsICZwRW5jSW5CdWZmZXIsICZwRW5jT3V0QnVmZmVyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoKTpcCi0gICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgQVUgY3RzIGFuZCBzaXplICovCi0gICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0KLSAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIuCi0gICAgICAgICAgICBwVGFibGVCdWZmZXJTaXplWzBdOyAvKio8IEdldCB0aGUgc2l6ZSBvZiBlbmNvZGVkIGRhdGEgKi8KLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgICAgICAvKiBVcGRhdGUgZGVjb2RlZCBidWZmZXIgaGVyZSAqLwotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICAgICAgKyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJPdXQsICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLT0KLSAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJJbiArIHBDLT5taW5pbXVtQnVmZmVySW47Ci0gICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVySW4sICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09IHBDLT5taW5pbXVtQnVmZmVySW47Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkogLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgcEMtPmV3Yy5kQVRvICs9IGZyYW1lVGltZURlbHRhIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVhZCB0aGUgYWRkZWQgYXVkaW8gQVUgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMygiSSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgIC8gcEMtPnBBZGRlZENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkKCk6IG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKGF1ZGlvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvcHkgdGhlIGlucHV0IEFVIHByb3BlcnRpZXMgdG8gdGhlIG91dHB1dCBBVSAqLwotCi0gICAgICAgIC8qKiBUSEUgQ0hFQ0sgQkVMT1cgSVMgQURERUQgVE8gUFJFVkVOVCBJU1NVRVMgTElOS0VEIFRPIFBSRS1BTExPQ0FURUQgTUFYIEFVIFNJWkUKLSAgICAgICAgbWF4IEFVIHNpemUgaXMgc2V0IGJhc2VkIG9uIE00VlNTM0dQUF9BVURJT19NQVhfQVVfU0laRSBkZWZpbmVkIGluIGZpbGUKLSAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgsIElmIHRoaXMgZXJyb3Igb2NjdXJzIGluY3JlYXNlIHRoZSBsaW1pdCBzZXQgaW4gdGhpcyBmaWxlCi0gICAgICAgICovCi0gICAgICAgIGlmKCBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPiBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICJFUlJPUjogYXVkaW8gQVUgc2l6ZSAoJWQpIHRvIGNvcHkgbGFyZ2VyIHRoYW4gYWxsb2NhdGVkIG9uZSAoJWQpID0+IGFib3J0IiwKLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUsCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIlBMRUFTRSBDT05UQUNUIFNVUFBPUlQgVE8gRVhURU5EIE1BWCBBVSBTSVpFIElOIFRIRSBQUk9EVUNUIExJQlJBUlkiKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEU7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEFkZGVkQ2xpcEN0eHQtPmlBb2Zmc2V0OwotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvcHkgdGhlIEFVIGl0c2VsZiAqLwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKXBDLT5wQWRkZWRDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIsIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgbWl4ZWQgQVUgKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkogLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgZXJyID0KLSAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELCAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29weUFkZGVkOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgcEMtPmV3Yy5kQVRvICs9IHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvcHlBZGRlZCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydChNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDKQotICogQGJyaWVmICAgIENvbnZlcnQgUENNIG9mIGFkZGVkIHRyYWNrIHRvIHRoZSByaWdodCBBU0YgLyBuYiBvZiBDaGFubmVscwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQyAgICAoSU4pIFZTUyBhdWRpbyBtaXhpbmcgaW50ZXJuYWwgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBpbnQgc3NyY0VycjsgLyoqPCBFcnJvciB3aGlsZSBzc3JjIHByb2Nlc3NpbmcgKi8KLSAgICBNNE9TQV9VSW50MzIgdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzID0KLSAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICBNNE9TQV9NZW1BZGRyOCB0ZW1wUG9zQnVmZmVyOwotCi0gICAgTTRPU0FfVUludDMyIG91dEZyYW1lQ291bnQgPSB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXM7Ci0gICAgLyogRG8gd2UgbmVlZCB0byBmZWVkIFNTUkMgYnVmZmVyIEluID8gKi8KLSAgICAvKioKLSAgICAqIFJDOiBUaGlzIGlzIG5vdCByZWFsbHkgb3B0aW11bSAobWVtbW92ZSkuIFdlIHNob3VsZCBoYW5kbGUgdGhpcyB3aXRoIGxpbmtlZCBsaXN0LiAqLwotICAgIHdoaWxlKCBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gcEMtPnBTc3JjQnVmZmVySW4gPCAoTTRPU0FfSW50MzIpcEMtPm1pbmltdW1CdWZmZXJJbiApCi0gICAgewotICAgICAgICAvKiBXZSBuZWVkIHRvIGdldCBtb3JlIFBDTSBkYXRhICovCi0gICAgICAgIGlmIChwQy0+Yk5vTG9vcGluZyA9PSBNNE9TQV9UUlVFKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEFkZGVkQ2xpcEN0eHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHBDLT5ianVtcGZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgYXQgdGhlIEJlZ2luIGxvb3AgdGltZSAqLwotICAgICAgICAgICAgTTRPU0FfSW50MzIgdGltZSA9IChNNE9TQV9JbnQzMikocEMtPnVpQmVnaW5Mb29wKTsKLQotICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICBwQy0+cEFkZGVkQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0SnVtcFwKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcEMtPnBBZGRlZENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sICZ0aW1lKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCgpOlwKLSAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+Ymp1bXBmbGFnID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkUgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQWRkZWRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+aUFvZmZzZXQgLyBwQy0+cEFkZGVkQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplKTsKLSAgICAgICAgaWYoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocEMtPmJOb0xvb3BpbmcgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+dWlFbmRMb29wID0wOyAvKiBWYWx1ZSAwIG1lYW5zIG5vIGxvb3BpbmcgaXMgcmVxdWlyZWQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBEZWNpZGUgd2hhdCB0byBkbyB3aGVuIGF1ZGlvIGlzIG92ZXIgKi8KLSAgICAgICAgICAgIGlmKCBwQy0+dWlFbmRMb29wID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBKdW1wIGF0IHRoZSBCZWdpbiBsb29wIHRpbWUgKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiB0aW1lID0gKE00T1NBX0ludDMyKShwQy0+dWlCZWdpbkxvb3ApOwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBBZGRlZENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBBZGRlZENsaXBDdHh0LT4KLSAgICAgICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtLCAmdGltZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlYWRlci0+bV9wRmN0SnVtcChhdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVHJhbnNpdGlvbiBmcm9tIGVuY29kaW5nIHN0YXRlIHRvIHJlYWRpbmcgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKHBDKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXgoKTogcHJlLWVuY29kZSBmYWlscyBlcnIgPSAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBTZWNvbmQgc2VnbWVudCBpcyBvdmVyLCBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoaXJkIGFuZCByZXR1cm4gT0sgKi8KLSAgICAgICAgICAgICAgICBwQy0+U3RhdGUgPSBNNFZTUzNHUFBfa0F1ZGlvTWl4aW5nU3RhdGVfQVVESU9fVEhJUkRfU0VHTUVOVDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3Igc28gdGhlIHN0ZXAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWdhaW4gKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQoKTpcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTyAoMi0+MykgYSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VORF9PRl9BRERFRF9BVURJTzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0KCk6IG1fcEZjdEdldE5leHRBdShhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBBZGRlZENsaXBDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmc6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUoYWRkZWQpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvcHkgZGVjb2RlZCBkYXRhIGludG8gU1NSQyBidWZmZXIgaW4gKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBQb3NJblNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICh2b2lkICopcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotICAgICAgICAvKiBVcGRhdGUgcG9zaXRpb24gcG9pbnRlciBpbnRvIFNTUkMgYnVmZmVyIEluICovCi0KLSAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiArPQotICAgICAgICAgICAgcEMtPnBBZGRlZENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgfQotCi0gICAgLyogRG8gdGhlIHJlc2FtcGxpbmcgLyBjaGFubmVsIGNvbnZlcnNpb24gaWYgbmVlZGVkICg9ZmVlZCBidWZmZXIgb3V0KSAqLwotICAgIGlmKCBwQy0+Yl9TU1JDbmVlZGVkID09IE00T1NBX1RSVUUgKQotICAgIHsKLSAgICAgICAgcEMtPkNoYW5uZWxDb252ZXJzaW9uID0gMDsKLSAgICAgICAgaWYoIHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSggcEMtPnBQb3NJblRlbXBCdWZmZXIgLSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMikocEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICAgICAqcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscykKLSAgICAgICAgICAgICAgICAvIHBDLT5DaGFubmVsQ29udmVyc2lvbiApCi0gICAgICAgICAgICAgICAgLyogV2UgdXNlIENoYW5uZWxDb252ZXJzaW9uIHZhcmlhYmxlIGJlY2F1c2UgaW4gY2FzZSAyLCB3ZSBuZWVkIHR3aWNlIGxlc3MgZGF0YSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNzcmNFcnIgPSAwOwotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBDLT5wUG9zSW5UZW1wQnVmZmVyLDAsCi0gICAgICAgICAgICAgICAgICAgIChwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSAqIHBDLT5ld2MudWlOYkNoYW5uZWxzKSk7Ci0KLSAgICAgICAgICAgICAgICBMVkF1ZGlvcmVzYW1wbGVfTG93UXVhbGl0eSgoc2hvcnQqKXBDLT5wUG9zSW5UZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAoc2hvcnQqKXBDLT5wU3NyY0J1ZmZlckluLAotICAgICAgICAgICAgICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0LAotICAgICAgICAgICAgICAgICAgICBwQy0+cExWQXVkaW9SZXNhbXBsZXIpOwotICAgICAgICAgICAgICAgIGlmKCAwICE9IHNzcmNFcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29udmVydDogU1NSQ19Qcm9jZXNzIHJldHVybnMgMHgleCwgcmV0dXJuaW5nICIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzc3JjRXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNzcmNFcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgKz0gcEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBTU1JDIGJ1ZmZlckluICovCi0gICAgICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wU3NyY0J1ZmZlckluICsgKHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09IHBDLT5pU3NyY05iU2FtcGxJbiAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAgICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzc3JjRXJyID0gMDsKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwwLAotICAgICAgICAgICAgICAgICAgICAocEMtPmlTc3JjTmJTYW1wbE91dCAqIHNpemVvZihzaG9ydCkgKiBwQy0+ZXdjLnVpTmJDaGFubmVscykpOwotCi0gICAgICAgICAgICAgICAgTFZBdWRpb3Jlc2FtcGxlX0xvd1F1YWxpdHkoKHNob3J0KilwQy0+cFBvc0luU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgKHNob3J0KilwQy0+cFNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmlTc3JjTmJTYW1wbE91dCwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBMVkF1ZGlvUmVzYW1wbGVyKTsKLSAgICAgICAgICAgICAgICBpZiggMCAhPSBzc3JjRXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQ6IFNTUkNfUHJvY2VzcyByZXR1cm5zIDB4JXgsIHJldHVybmluZyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3NyY0Vycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzc3JjRXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICBwQy0+aVNzcmNOYlNhbXBsT3V0ICogc2l6ZW9mKHNob3J0KSAqIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgLyogVXBkYXRlIFNTUkMgYnVmZmVySW4gKi8KLSAgICAgICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBTc3JjQnVmZmVySW4gKyAocEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICBtZW1tb3ZlKCh2b2lkICopcEMtPnBTc3JjQnVmZmVySW4sICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0gcEMtPmlTc3JjTmJTYW1wbEluICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29udmVydCBTdGVyZW88LT5Nb25vICovCi0gICAgICAgIHN3aXRjaCggcEMtPkNoYW5uZWxDb252ZXJzaW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOiAvKiBObyBjaGFubmVsIGNvbnZlcnNpb24gKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAxOiAvKiBzdGVyZW8gdG8gbW9ubyAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCAtIHBDLT5wU3NyY0J1ZmZlck91dAotICAgICAgICAgICAgICAgICAgICA8IChNNE9TQV9JbnQzMilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fMTYoKHNob3J0ICopcEMtPnBUZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KSh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHBUZW1wQnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHMpOyAvKiBCdWZmZXIgaXMgaW4gYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wVGVtcEJ1ZmZlciwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjogLyogbW9ubyB0byBzdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICAgICAgICAgPCAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTW9ub1RvMklfMTYoKHNob3J0ICopcEMtPnBUZW1wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0ICopcEMtPnBTc3JjQnVmZmVyT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KXVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFRlbXBCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wVGVtcEJ1ZmZlciwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLSB0ZW1wUG9zQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblRlbXBCdWZmZXIgLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPkNoYW5uZWxDb252ZXJzaW9uID4gMCApCi0gICAgewotICAgICAgICAvL000T1NBX1VJbnQzMiB1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgPQotICAgICAgICAvLyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSAvIHNpemVvZihzaG9ydCkgLwotICAgICAgICAvLyBwQy0+cElucHV0Q2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlOYkNoYW5uZWxzOwotICAgICAgICAvKiBDb252ZXJ0IFN0ZXJlbzwtPk1vbm8gKi8KLSAgICAgICAgc3dpdGNoKCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6IC8qIE5vIGNoYW5uZWwgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6IC8qIHN0ZXJlbyB0byBtb25vICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gcEMtPnBTc3JjQnVmZmVyT3V0Ci0gICAgICAgICAgICAgICAgICAgIDwgKE00T1NBX0ludDMyKXBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub18xNigoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCAqKXBDLT5wU3NyY0J1ZmZlck91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzaG9ydCkodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBwVGVtcEJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICB0ZW1wUG9zQnVmZmVyID0gcEMtPnBTc3JjQnVmZmVySW4KLSAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpQ2hhbm5lbENvbnZlcnRvck5iU2FtcGxlcyAqIHNpemVvZihzaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aU5iQ2hhbm5lbHMpOyAvKiBCdWZmZXIgaXMgaW4gYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjogLyogbW9ubyB0byBzdGVyZW8gKi8KLSAgICAgICAgICAgICAgICBpZiggcEMtPnBQb3NJblNzcmNCdWZmZXJPdXQgLSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICAgICAgICAgPCAoTTRPU0FfSW50MzIpcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTW9ub1RvMklfMTYoKHNob3J0ICopcEMtPnBTc3JjQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQgKilwQy0+cFNzcmNCdWZmZXJPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQpdWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFBvc0J1ZmZlciA9IHBDLT5wU3NyY0J1ZmZlckluCi0gICAgICAgICAgICAgICAgICAgICAgICArICh1aUNoYW5uZWxDb252ZXJ0b3JOYlNhbXBsZXMgKiBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIHBDLT5wQWRkZWRDbGlwQ3R4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJJbiwgKHZvaWQgKil0ZW1wUG9zQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBQb3NJblNzcmNCdWZmZXJJbiAtIHRlbXBQb3NCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC09Ci0gICAgICAgICAgICAgICAgICAgICAgICAodWlDaGFubmVsQ29udmVydG9yTmJTYW1wbGVzICogc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+cEFkZGVkQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlck91dCArPQotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIE5vIGNoYW5uZWwgY29udmVyc2lvbiBub3Igc2FtcGwuIGZyZXEuIGNvbnZlcnNpb24gbmVlZGVkLCBqdXN0IGJ1ZmZlciBtYW5hZ2VtZW50ICovCi0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0ID0gcEMtPnBQb3NJblNzcmNCdWZmZXJJbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotTTRPU0FfSW50MzIgTTRWU1MzR1BQX2dldERlY2liZWxTb3VuZCggTTRPU0FfVUludDMyIHZhbHVlICkKLSAgICB7Ci0gICAgaW50IGRiU291bmQgPSAxOwotCi0gICAgaWYoIHZhbHVlID09IDAgKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmKCB2YWx1ZSA+IDB4NDAwMCAmJiB2YWx1ZSA8PSAweDgwMDAgKSAgICAgIC8vIDMyNzY4Ci0gICAgICAgIGRiU291bmQgPSA5MDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgyMDAwICYmIHZhbHVlIDw9IDB4NDAwMCApIC8vIDE2Mzg0Ci0gICAgICAgIGRiU291bmQgPSA4NDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgxMDAwICYmIHZhbHVlIDw9IDB4MjAwMCApIC8vIDgxOTIKLSAgICAgICAgZGJTb3VuZCA9IDc4OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDA4MDAgJiYgdmFsdWUgPD0gMHgxMDAwICkgLy8gNDAyOAotICAgICAgICBkYlNvdW5kID0gNzI7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDQwMCAmJiB2YWx1ZSA8PSAweDA4MDAgKSAvLyAyMDQ4Ci0gICAgICAgIGRiU291bmQgPSA2NjsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMjAwICYmIHZhbHVlIDw9IDB4MDQwMCApIC8vIDEwMjQKLSAgICAgICAgZGJTb3VuZCA9IDYwOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAxMDAgJiYgdmFsdWUgPD0gMHgwMjAwICkgLy8gNTEyCi0gICAgICAgIGRiU291bmQgPSA1NDsKLQotICAgIGVsc2UgaWYoIHZhbHVlID4gMHgwMDgwICYmIHZhbHVlIDw9IDB4MDEwMCApIC8vIDI1NgotICAgICAgICBkYlNvdW5kID0gNDg7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDA0MCAmJiB2YWx1ZSA8PSAweDAwODAgKSAvLyAxMjgKLSAgICAgICAgZGJTb3VuZCA9IDQyOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMjAgJiYgdmFsdWUgPD0gMHgwMDQwICkgLy8gNjQKLSAgICAgICAgZGJTb3VuZCA9IDM2OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMTAgJiYgdmFsdWUgPD0gMHgwMDIwICkgLy8gMzIKLSAgICAgICAgZGJTb3VuZCA9IDMwOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMDggJiYgdmFsdWUgPD0gMHgwMDEwICkgLy8xNgotICAgICAgICBkYlNvdW5kID0gMjQ7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDAwNyAmJiB2YWx1ZSA8PSAweDAwMDggKSAvLzgKLSAgICAgICAgZGJTb3VuZCA9IDI0OwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMDMgJiYgdmFsdWUgPD0gMHgwMDA3ICkgLy8gNAotICAgICAgICBkYlNvdW5kID0gMTg7Ci0KLSAgICBlbHNlIGlmKCB2YWx1ZSA+IDB4MDAwMSAmJiB2YWx1ZSA8PSAweDAwMDMgKSAvLzIKLSAgICAgICAgZGJTb3VuZCA9IDEyOwotCi0gICAgZWxzZSBpZiggdmFsdWUgPiAweDAwMCAmJiB2YWx1ZSA8PSAweDAwMDEgKSAgLy8gMQotICAgICAgICBkYlNvdW5kID0gNjsKLQotICAgIGVsc2UKLSAgICAgICAgZGJTb3VuZCA9IDA7Ci0KLSAgICByZXR1cm4gZGJTb3VuZDsKLSAgICB9Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmcoTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQykKLSAqIEBicmllZiAgICBNaXggdGhlIGN1cnJlbnQgYXVkaW8gQVVzIChkZWNvZGVyLCBtaXgsIGVuY29kZSkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEMgICAgKElOKSBWU1MgYXVkaW8gbWl4aW5nIGludGVybmFsIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZygKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDE2ICpwUENNZGF0YTE7Ci0gICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhMjsKLSAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplOwotCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YTsgLyoqPCBEdXJhdGlvbiBvZiB0aGUgZW5jb2RlZCAodGhlbiB3cml0dGVuKSBkYXRhICovCi0gICAgTTRPU0FfTWVtQWRkcjggdGVtcFBvc0J1ZmZlcjsKLSAgICAvKiBkdWNraW5nIHZhcmlhYmxlICovCi0gICAgTTRPU0FfVUludDE2IGxvb3BJbmRleCA9IDA7Ci0gICAgTTRPU0FfSW50MTYgKnBQQ00xNlNhbXBsZSA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSW50MzIgcGVha0RiVmFsdWUgPSAwOwotICAgIE00T1NBX0ludDMyIHByZXZpb3VzRGJWYWx1ZSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAvKioKLSAgICAqIERlY29kZSBvcmlnaW5hbCBhdWRpbyB0cmFjayBBVSAqLwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cElucHV0Q2xpcEN0eHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUob3JpZykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+Yl9TU1JDbmVlZGVkIHx8IHBDLT5DaGFubmVsQ29udmVyc2lvbiA+IDAKLSAgICAgICAgfHwgcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbnZlcnQocEMpOwotCi0gICAgICAgIGlmKCBlcnIgPT0gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQURERURfQVVESU8gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb252ZXJ0IHJldHVybmVkIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVEX1BDTV9TSVpFX0lTU1VFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdTdGVwQXVkaW9NaXg6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcFBDTWRhdGEyID0gKE00T1NBX0ludDE2ICopcEMtPnBTc3JjQnVmZmVyT3V0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBEZWNvZGUgYWRkZWQgYXVkaW8gdHJhY2sgQVUgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cEFkZGVkQ2xpcEN0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEb01peGluZzpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShhZGRlZCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBkZWNvZGVkIHRoZSBzYW1lIGFtb3VudCBvZiBQQ00gc2FtcGxlcyAqLwotICAgICAgICBpZiggcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgICAgICE9IHBDLT5wQWRkZWRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nOlwKLSAgICAgICAgICAgICAgICBib3RoIGNsaXBzIEFVIG11c3QgaGF2ZSB0aGUgc2FtZSBkZWNvZGVkIFBDTSBzaXplISIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQVVESU9fREVDT0RFRF9QQ01fU0laRV9JU1NVRTsKLSAgICAgICAgfQotICAgICAgICBwUENNZGF0YTIgPSAoTTRPU0FfSW50MTYgKilwQy0+cEFkZGVkQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBNaXggdGhlIHR3byBkZWNvZGVkIFBDTSBhdWRpb3MgKi8KLSAgICBwUENNZGF0YTEgPQotICAgICAgICAoTTRPU0FfSW50MTYgKilwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3M7Ci0gICAgdWlQQ01zaXplID0gcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgLyAyOyAvKmJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpKi8KLQotICAgIGlmKCBwQy0+Yl9EdWNraW5nTmVlZGVlZCApCi0gICAgewotICAgICAgICBsb29wSW5kZXggPSAwOwotICAgICAgICBwZWFrRGJWYWx1ZSA9IDA7Ci0gICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotCi0gICAgICAgIHBQQ00xNlNhbXBsZSA9IChNNE9TQV9JbnQxNiAqKXBDLT5wSW5wdXRDbGlwQ3R4dC0+Ci0gICAgICAgICAgICBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotCi0gICAgICAgIC8vQ2FsY3VsYXRlIHRoZSBwZWFrIHZhbHVlCi0gICAgICAgICB3aGlsZSggbG9vcEluZGV4Ci0gICAgICAgICAgICAgPCBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgLyBzaXplb2YoTTRPU0FfSW50MTYpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdID49IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBlYWtEYlZhbHVlID0gcHJldmlvdXNEYlZhbHVlID4gcFBDTTE2U2FtcGxlW2xvb3BJbmRleF0KLSAgICAgICAgICAgICAgICA/IHByZXZpb3VzRGJWYWx1ZSA6IHBQQ00xNlNhbXBsZVtsb29wSW5kZXhdOwotICAgICAgICAgICAgICAgIHByZXZpb3VzRGJWYWx1ZSA9IHBlYWtEYlZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBlYWtEYlZhbHVlID0gcHJldmlvdXNEYlZhbHVlID4gLXBQQ00xNlNhbXBsZVtsb29wSW5kZXhdCi0gICAgICAgICAgICAgICAgPyBwcmV2aW91c0RiVmFsdWUgOiAtcFBDTTE2U2FtcGxlW2xvb3BJbmRleF07Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNEYlZhbHVlID0gcGVha0RiVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb29wSW5kZXgrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5hdWRpb1ZvbHVtZUFycmF5W3BDLT5hdWRWb2xBcnJJbmRleF0gPQotICAgICAgICAgICAgTTRWU1MzR1BQX2dldERlY2liZWxTb3VuZChwZWFrRGJWYWx1ZSk7Ci0KLSAgICAgICAgLyogV0lORE9XX1NJWkUgaXMgMTAgYnkgZGVmYXVsdCBhbmQgY2hlY2sgZm9yIHRocmVzaG9sZCBpcyBkb25lIGFmdGVyIDEwIGN5Y2xlcyAqLwotICAgICAgICBpZiggcEMtPmF1ZFZvbEFyckluZGV4ID49IFdJTkRPV19TSVpFIC0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5iRG9EdWNraW5nID0KLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCgoTTRPU0FfSW50MzIgKikmKHBDLT5hdWRpb1ZvbHVtZUFycmF5KSwKLSAgICAgICAgICAgICAgICBwQy0+YXVkVm9sQXJySW5kZXgsIHBDLT5JbkR1Y2tpbmdfdGhyZXNob2xkKTsKLQotICAgICAgICAgICAgcEMtPmF1ZFZvbEFyckluZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5hdWRWb2xBcnJJbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKkJlbG93IGxvZ2ljIGNvbnRyb2xzIHRoZSBtaXhpbmcgd2VpZ2h0YWdlIGZvciBCYWNrZ3JvdW5kIFRyYWNrIGFuZCBQcmltYXJ5IFRyYWNrCi0gICAgICAgICpmb3IgdGhlIGR1cmF0aW9uIG9mIHdpbmRvdyB1bmRlciBhbmFseXNpcyB0byBnaXZlIGZhZGUtb3V0IGZvciBCYWNrZ3JvdW5kIGFuZCBmYWRlLWluCi0gICAgICAgICpmb3IgcHJpbWFyeQotICAgICAgICAqCi0gICAgICAgICpDdXJyZW50IGZhZGluZyBmYWN0b3IgaXMgZGlzdHJpYnV0ZWQgaW4gZXF1YWwgcmFuZ2Ugb3ZlciB0aGUgZGVmaW5lZCB3aW5kb3cgc2l6ZS4KLSAgICAgICAgKgotICAgICAgICAqRm9yIGEgd2luZG93IHNpemUgPSAyNSAoNTAwIG1zICh3aW5kb3cgdW5kZXIgYW5hbHlzaXMpIC8gMjAgbXMgKHNhbXBsZSBkdXJhdGlvbikpCi0gICAgICAgICoKLSAgICAgICAgKi8KLQotICAgICAgICBpZiggcEMtPmJEb0R1Y2tpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPmR1Y2tpbmdGYWN0b3IKLSAgICAgICAgICAgICAgICA+IHBDLT5JbkR1Y2tpbmdfbG93Vm9sdW1lICkgLy8gRkFERSBPVVQgQkcgVHJhY2sKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGR1Y2tpbmcgZmFjdG9yIGluIHRvdGFsIHN0ZXBzIGluIGZhY3RvciBvZiBsb3cgdm9sdW1lIHN0ZXBzIHRvIHJlYWNoCi0gICAgICAgICAgICAgICAgICAgIC8vIGxvdyB2b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciAtPSAocEMtPkluRHVja2luZ19sb3dWb2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5kdWNraW5nRmFjdG9yID0gcEMtPkluRHVja2luZ19sb3dWb2x1bWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPmR1Y2tpbmdGYWN0b3IgPCAxLjAgKSAvLyBGQURFIElOIEJHIFRyYWNrCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IGR1Y2tpbmcgZmFjdG9yIGluIHRvdGFsIHN0ZXBzIG9mIGxvdyB2b2x1bWUgZmFjdG9yIHRvIHJlYWNoCi0gICAgICAgICAgICAgICAgLy8gb3JpZy52b2x1bWUgbGV2ZWwKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciArPSAocEMtPkluRHVja2luZ19sb3dWb2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+ZHVja2luZ0ZhY3RvciA9IDEuMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBlbmRpZiAtIGR1Y2tpbmdfZW5hYmxlICovCi0KLSAgICAgICAgLyogTWl4aW5nIExvZ2ljICovCi0KLSAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX0ludDMyIHRlbXA7Ci0KLSAgICAgICAgICAgLyogc2V0IHZvbCBmYWN0b3IgZm9yIEJUIGFuZCBQVCAqLwotICAgICAgICAgICAgKnBQQ01kYXRhMiA9IChNNE9TQV9JbnQxNikoKnBQQ01kYXRhMiAqIHBDLT5mQlRWb2xMZXZlbCk7Ci0KLSAgICAgICAgICAgICpwUENNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwUENNZGF0YTEgKiBwQy0+ZlBUVm9sTGV2ZWwpOwotCi0gICAgICAgICAgICAvKiBtaXggdGhlIHR3byBzYW1wbGVzICovCi0KLSAgICAgICAgICAgICpwUENNZGF0YTIgPSAoTTRPU0FfSW50MTYpKCggKnBQQ01kYXRhMikgKiAocEMtPmR1Y2tpbmdGYWN0b3IpKTsKLSAgICAgICAgICAgICpwUENNZGF0YTEgPSAoTTRPU0FfSW50MTYpKCpwUENNZGF0YTIgLyAyICsgKnBQQ01kYXRhMSAvIDIpOwotCi0KLSAgICAgICAgICAgIGlmKCAqcFBDTWRhdGExIDwgMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IC0oICpwUENNZGF0YTEpCi0gICAgICAgICAgICAgICAgICAgICogMjsgLy8gYnJpbmcgdG8gc2FtZSBBbXBsaXR1ZGUgbGV2ZWwgYXMgaXQgd2FzIG9yaWdpbmFsCi0KLSAgICAgICAgICAgICAgICBpZiggdGVtcCA+IDMyNzY3ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwUENNZGF0YTEgPSAtMzI3NjY7IC8vIGxlc3MgdGhlbiBtYXggYWxsb3dlZCB2YWx1ZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqcFBDTWRhdGExID0gKE00T1NBX0ludDE2KSgtdGVtcCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wID0gKCAqcFBDTWRhdGExKQotICAgICAgICAgICAgICAgICogMjsgLy8gYnJpbmcgdG8gc2FtZSBBbXBsaXR1ZGUgbGV2ZWwgYXMgaXQgd2FzIG9yaWdpbmFsCi0KLSAgICAgICAgICAgIGlmKCB0ZW1wID4gMzI3NjggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwUENNZGF0YTEgPSAzMjc2NzsgLy8gbGVzcyB0aGFuIG1heCBhbGxvd2VkIHZhbHVlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBQQ01kYXRhMSA9IChNNE9TQV9JbnQxNil0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBQQ01kYXRhMisrOwotICAgICAgICAgICAgcFBDTWRhdGExKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApCi0gICAgICAgewotICAgICAgICAvKiBtaXggdGhlIHR3byBzYW1wbGVzICovCi0gICAgICAgICAgICAqcFBDTWRhdGExID0gKE00T1NBX0ludDE2KSgqcFBDTWRhdGExICogcEMtPmZPcmlnRmFjdG9yICogcEMtPmZQVFZvbExldmVsCi0gICAgICAgICAgICAgICArICpwUENNZGF0YTIgKiBwQy0+ZkFkZGVkRmFjdG9yICogcEMtPmZCVFZvbExldmVsICk7Ci0KLSAgICAgICAgICAgIHBQQ01kYXRhMSsrOwotICAgICAgICAgICAgcFBDTWRhdGEyKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgcEMtPnBTc3JjQnVmZmVyT3V0IGJ1ZmZlciAqLwotCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJfU1NSQ25lZWRlZCB8fCBwQy0+Q2hhbm5lbENvbnZlcnNpb24gPiAwICkKLSAgICB7Ci0gICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJPdXQKLSAgICAgICAgICAgICsgcEMtPnBJbnB1dENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgIG1lbW1vdmUoKHZvaWQgKilwQy0+cFNzcmNCdWZmZXJPdXQsICh2b2lkICopdGVtcFBvc0J1ZmZlciwKLSAgICAgICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVyT3V0IC09Ci0gICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiggcEMtPnBBZGRlZENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVAzICkKLSAgICB7Ci0gICAgICAgIHRlbXBQb3NCdWZmZXIgPSBwQy0+cFNzcmNCdWZmZXJJbgotICAgICAgICAgICAgKyBwQy0+cElucHV0Q2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgbWVtbW92ZSgodm9pZCAqKXBDLT5wU3NyY0J1ZmZlckluLCAodm9pZCAqKXRlbXBQb3NCdWZmZXIsCi0gICAgICAgICAgICBwQy0+cFBvc0luU3NyY0J1ZmZlckluIC0gdGVtcFBvc0J1ZmZlcik7Ci0gICAgICAgIHBDLT5wUG9zSW5Tc3JjQnVmZmVySW4gLT0KLSAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgIH0KLQotICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAvKioKLSAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UyXzAoIksgKioqKiBibGVuZCBBVXMiKTsKLQotICAgIC8qKgotICAgICogRW5jb2RlIHRoZSBQQ00gYXVkaW8gKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKCk6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBBVSBjdHMgYW5kIHNpemUgKi8KLSAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9Ci0gICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgIC8qKgotICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgTTRPU0FfVFJBQ0UyXzIoIkwgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRG9NaXhpbmc6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbmNyZW1lbnQgdGhlIGF1ZGlvIENUUyBmb3IgdGhlIG5leHQgc3RlcCAqLwotICAgIHBDLT5ld2MuZEFUbyArPSBmcmFtZVRpbWVEZWx0YSAvIHBDLT5ld2Muc2NhbGVfYXVkaW87Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0RvTWl4aW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uKE00VlNTM0dQUF9JbnRlcm5hbEF1ZGlvTWl4aW5nQ29udGV4dCAqcEMpCi0gKiBAYnJpZWYgICAgRGVjb2RlL2VuY29kZSBhIGZldyBBVSBiYWNrd2FyZCB0byBpbml0aWF0ZSB0aGUgZW5jb2RlciBmb3IgbGF0ZXIgTWl4IHNlZ21lbnQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgIChJTikgVlNTIGF1ZGlvIG1peGluZyBpbnRlcm5hbCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNJbkJ1ZmZlcjsgIC8qKjwgRW5jb2RlciBpbnB1dCBidWZmZXIgZm9yIGFwaSAqLwotICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciBwRW5jT3V0QnVmZmVyOyAvKio8IEVuY29kZXIgb3V0cHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRPU0FfVGltZQotICAgICAgICBmcmFtZVRpbWVEZWx0YSA9IDA7IC8qKjwgRHVyYXRpb24gb2YgdGhlIGVuY29kZWQgKHRoZW4gd3JpdHRlbikgZGF0YSAqLwotCi0gICAgTTRPU0FfSW50MzIgaVRhcmdldEN0cywgaUN1cnJlbnRDdHM7Ci0KLSAgICAvKioKLSAgICAqICdCWlpaJyBidWcgZml4OgotICAgICogYWRkIGEgc2lsZW5jZSBmcmFtZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZShwQyk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigpOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ1dyaXRlU2lsZW5jZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpQ3VycmVudEN0cyA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAvKiBEbyBub3QgZG8gcHJlLWVuY29kZSBzdGVwIGlmIHRoZXJlIGlzIG5vIG1peGluZyAocmVtb3ZlLCAxMDAgJSwgb3Igbm90IGVkaXRhYmxlKSAqLwotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+YkF1ZGlvTWl4aW5nSXNOZWVkZWQgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQWR2YW5jZSBpbiB0aGUgb3JpZ2luYWwgYXVkaW8gc3RyZWFtIHRvIHJlYWNoIHRoZSBjdXJyZW50IHRpbWUKLSAgICAgICAgKiAoV2UgZG9uJ3Qgd2FudCBpQXVkaW9DVFMgdG8gYmUgbW9kaWZpZWQgYnkgdGhlIGp1bXAgZnVuY3Rpb24sCi0gICAgICAgICogc28gd2UgaGF2ZSB0byB1c2UgYSBsb2NhbCB2YXJpYWJsZSkuICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocEMtPnBJbnB1dENsaXBDdHh0LCAmaUN1cnJlbnRDdHMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOlwKLSAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KCkgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKjwgZG9uJ3QgdHJ5IHRvIHByZS1kZWNvZGUgaWYgY2xpcCBpcyBhdCBpdHMgYmVnaW5uaW5nLi4uICovCi0gICAgICAgIGlmKCBpQ3VycmVudEN0cyA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOlwKLSAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVShhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgYSBmZXcgQVVzIGJhY2t3YXJkICovCi0gICAgICAgICAgICBpVGFyZ2V0Q3RzID0gaUN1cnJlbnRDdHMgLSBNNFZTUzNHUFBfTkJfQVVfUFJFRkVUQ0gKLSAgICAgICAgICAgICAgICAqIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotCi0gICAgICAgICAgICBpZiggaVRhcmdldEN0cyA8IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlUYXJnZXRDdHMgPSAwOyAvKio8IFNhbml0eSBjaGVjayAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0KHBDLT5wSW5wdXRDbGlwQ3R4dCwgJmlUYXJnZXRDdHMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIERlY29kZS9lbmNvZGUgdXAgdG8gdGhlIHdhbnRlZCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgd2hpbGUoIHBDLT5wSW5wdXRDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPCBpQ3VycmVudEN0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJNIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICBwQy0+cElucHV0Q2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPnBJbnB1dENsaXBDdHh0LT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0LT5pQW9mZnNldAotICAgICAgICAgICAgICAgICAgICAvIHBDLT5wSW5wdXRDbGlwQ3R4dC0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbjogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShiKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBJbnB1dENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdUcmFuc2l0aW9uOiBERUNPREVfRU5DT0RFLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFtNb25vXSBvciBbU3RlcmVvIGludGVybGVhdmVkXSA6IGFsbCBpcyBpbiBvbmUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk4gKioqKiBwcmUtZW5jb2RlIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LCAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nVHJhbnNpdGlvbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBTZXQgQVUgY3RzIGFuZCBzaXplICovCi0gICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSA9IHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsKLSAgICAgICAgICAgICAgICAwXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLkNUUyArPSBmcmFtZVRpbWVEZWx0YTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIk8gLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ1RyYW5zaXRpb246XAotICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVIHJldHVybnMgMHgleCEiLCAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSW5jcmVtZW50IHRoZSBhdWRpbyBDVFMgZm9yIHRoZSBuZXh0IHN0ZXAgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLmRBVG8gKz0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXIoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsQXVkaW9NaXhpbmdDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMgRW5jUGFyYW1zOwotCi0gICAgLyoqCi0gICAgKiBTaW11bGF0ZSBhIHdyaXRlciBpbnRlcmZhY2Ugd2l0aCBvdXIgc3BlY2lmaWMgZnVuY3Rpb24gKi8KLSAgICBwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UucFByb2Nlc3NBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRQcm9jZXNzQVU7IC8qKjwgVGhpcyBmdW5jdGlvbiBpcyBWU1MgM0dQUCBzcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGZvbGxvdyB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZS5wU3RhcnRBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTdGFydEFVOyAvKio8IFRoaXMgZnVuY3Rpb24gaXMgVlNTIDNHUFAgc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaXQgZm9sbG93IHRoZSB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLnBXcml0ZXJDb250ZXh0ID0KLSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQpCi0gICAgICAgIHBDOyAvKio8IFdlIGdpdmUgdGhlIGludGVybmFsIGNvbnRleHQgYXMgd3JpdGVyIGNvbnRleHQgKi8KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBlbmNvZGVyIGludGVyZmFjZSwgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6IHNldEN1cnJlbnRFbmNvZGVyIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBlbmNvZGVyIHNoZWxsIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIFZTUyBzZXR0aW5ncyAqLwotCi0gICAgLyogQ29tbW9uIHBhcmFtZXRlcnMgKi8KLSAgICBFbmNQYXJhbXMuSW5wdXRGb3JtYXQgPSBNNEVOQ09ERVJfa0lZVVY0MjA7Ci0gICAgRW5jUGFyYW1zLkZyYW1lV2lkdGggPSBwQy0+ZXdjLnVpVmlkZW9XaWR0aDsKLSAgICBFbmNQYXJhbXMuRnJhbWVIZWlnaHQgPSBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQ7Ci0gICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlOwotICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZXdjLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9MZXZlbCA9IHBDLT5ld2Mub3V0cHV0VmlkZW9MZXZlbDsKLQotICAgIC8qIE5vIHN0cmljdCByZWd1bGF0aW9uIGluIHZpZGVvIGVkaXRvciAqLwotICAgIC8qIEJlY2F1c2Ugb2YgdGhlIGVmZmVjdHMgYW5kIHRyYW5zaXRpb25zIHdlIHNob3VsZCBhbGxvdyBtb3JlIGZsZXhpYmlsaXR5ICovCi0gICAgLyogQWxzbyBpdCBwcmV2ZW50cyB0byBkcm9wIGltcG9ydGFudCBmcmFtZXMKLSAgICAgICh3aXRoIGEgYmFkIHJlc3VsdCBvbiBzaGVkdWxpbmcgYW5kIGJsb2NrIGVmZmV0Y3MpICovCi0gICAgRW5jUGFyYW1zLmJJbnRlcm5hbFJlZ3VsYXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBFbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRFTkNPREVSX2tWQVJJQUJMRV9GUFM7Ci0KLSAgICAvKioKLSAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKGRlZmF1bHRzKSAqLwotICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSA9IDA7ICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aVZlcnRpY2FsU2VhcmNoUmFuZ2UgPSAwOyAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7ICAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCA9IDA7ICAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpTW90aW9uRXN0aW1hdGlvblRvb2xzID0gMDsgICAgIC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uID0gTTRPU0FfVFJVRTsgICAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsgICAvKiBpbml0aWFsIFFQID0gMTAgKi8KLSAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotICAgIHN3aXRjaCggcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUEVHNDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDg7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gMTsKLQotICAgICAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5ld2MuYlZpZGVvRGF0YVBhcnRpdGlvbmluZyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbmNQYXJhbXMuYkVycm9yUmVzaWxpZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBNNFNZU19IMjY0Iik7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0gyNjQ7Ci0KLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsKLSAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBVbmtub3duIHZpZGVvU3RyZWFtVHlwZSAweCV4IiwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBFbmNQYXJhbXMuQml0cmF0ZSA9Ci0gICAgICAgIHBDLT5wSW5wdXRDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLQotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdEluaXQiKTsKLSAgICAvKioKLSAgICAqIEluaXQgdGhlIHZpZGVvIGVuY29kZXIgKGFkdmFuY2VkIHNldHRpbmdzIHZlcnNpb24gb2YgdGhlIGVuY29kZXIgT3BlbiBmdW5jdGlvbikgKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0KCZwQy0+ZXdjLnBFbmNDb250ZXh0LAotICAgICAgICAmcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNFZTUzNHUFBfaW50VlBQLCBwQywKLSAgICAgICAgcEMtPlNoZWxsQVBJLnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEksCi0gICAgICAgIHBDLT5TaGVsbEFQSS5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RJbml0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyQ2xvc2VkOwotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdE9wZW4iKTsKLSAgICBNNE9TQV9UUkFDRTFfMigidnNzOiBhdWRpbyBtaXggZW5jb2RlciBvcGVuIHByb2ZpbGUgOiVkLCBsZXZlbCAlZCIsCi0gICAgICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUsIEVuY1BhcmFtcy52aWRlb0xldmVsKTsKLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLldyaXRlclZpZGVvQVUsICZFbmNQYXJhbXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NyZWF0ZVZpZGVvRW5jb2RlcjpcCi0gICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkOwotICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdFN0YXJ0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RhcnQgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyUnVubmluZzsKLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDcmVhdGVWaWRlb0VuY29kZXI6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIERlc3Ryb3kgdGhlIHZpZGVvIGVuY29kZXIKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nRGVzdHJveVZpZGVvRW5jb2RlcigKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEVuY0NvbnRleHQgKQotICAgIHsKLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmcgPT0gcEMtPmV3Yy5lbmNvZGVyU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEhhcyB0aGUgZW5jb2RlciBhY3R1YWxseSBiZWVuIG9wZW5lZD8gRG9uJ3QgY2xvc2UgaXQgaWYgdGhhdCdzIG5vdCB0aGUgY2FzZS4gKi8KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQgPT0gcEMtPmV3Yy5lbmNvZGVyU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbG9zZSgKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0Rlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tFbmNvZGVyQ2xvc2VkOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgV2UgZG8gbm90IHJldHVybiB0aGUgZXJyb3IgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa05vRW5jb2RlcjsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVzZXQgdmFyaWFibGUgKi8KLSAgICAgICAgcEMtPmV3Yy5wRW5jQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdEZXN0cm95VmlkZW9FbmNvZGVyOiByZXR1cm5pbmcgMHgleCIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfQm9vbCBNNFZTUzNHUFBfaXNUaHJlc2hvbGRCcmVhY2hlZCggTTRPU0FfSW50MzIgKmF2ZXJhZ2VWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgc3RvcmVDb3VudCwgTTRPU0FfSW50MzIgdGhyZXNob2xkVmFsdWUgKQotewotICAgIE00T1NBX0Jvb2wgcmVzdWx0ID0gMDsKLSAgICBpbnQgaTsKLSAgICBpbnQgZmluYWxWYWx1ZSA9IDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IHN0b3JlQ291bnQ7IGkrKyApCi0gICAgICAgIGZpbmFsVmFsdWUgKz0gYXZlcmFnZVZhbHVlW2ldOwotCi0gICAgZmluYWxWYWx1ZSA9IGZpbmFsVmFsdWUgLyBzdG9yZUNvdW50OwotCi0KLSAgICBpZiggZmluYWxWYWx1ZSA+IHRocmVzaG9sZFZhbHVlICkKLSAgICAgICAgcmVzdWx0ID0gTTRPU0FfVFJVRTsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IE00T1NBX0ZBTFNFOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDA2MTJmMy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9DbGlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfQ2xpcC5jCi0gKiBAYnJpZWYgICAgSW1wbGVtZW50YXRpb24gb2YgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gaW5wdXQgY2xpcCBtYW5hZ2VtZW50LgotICogQG5vdGUgICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIHN0YXRpYywgaS5lLiBub24gcHVibGljCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiAgICBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0KLS8qKgotICogICAgT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiIC8qIE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyogT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLQotLyoqCi0gKiBDb21tb24gaGVhZGVycyAoZm9yIGFhYykgKi8KLSNpbmNsdWRlICJNNF9Db21tb24uaCIKLQotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotI2luY2x1ZGUgIk00VkRfRVhURVJOQUxfSW50ZXJmYWNlLmgiCi0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotLyogT3NhbCBoZWFkZXIgZmlsZW5vICovCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBkZWZpbmUgICAgU3RhdGljIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApOwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKQotICogQGJyaWVmICAgIE9wZW4gYSBjbGlwLiBDcmVhdGVzIGEgY2xpcCBjb250ZXh0LgotICogQG5vdGUKLSAqIEBwYXJhbSAgIGhDbGlwQ3R4dCAgICAgICAgICAgIChPVVQpIFJldHVybiB0aGUgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwQ2xpcFNldHRpbmdzICAgICAgICAoSU4pIEVkaXQgc2V0dGluZ3Mgb2YgdGhpcyBjbGlwLiBUaGUgbW9kdWxlIHdpbGwga2VlcCBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgdG8gdGhpcyBwb2ludGVyCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyRmN0ICAgICAgICAoSU4pIFBvaW50ZXIgdG8gT1NBTCBmaWxlIHJlYWRlciBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBiU2tpcEF1ZGlvVHJhY2sgICAgICAgIChJTikgSWYgdHJ1ZSwgZG8gbm90IG9wZW4gdGhlIGF1ZGlvCi0gKiBAcGFyYW0gICAgYkZhc3RPcGVuTW9kZSAgICAgICAgKElOKSBJZiB0cnVlLCB1c2UgdGhlIGZhc3QgbW9kZSBvZiB0aGUgM2dwcCByZWFkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSB0aGUgZmlyc3QgQVUgaXMgcmVhZCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSW5pdCggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICoqIGhDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyICpwRmlsZVJlYWRQdHJGY3QgKQotewotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gaENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBJbml0OiBoQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcEluaXQ6IHBGaWxlUmVhZFB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIHRoZSBjbGlwIGNvbnRleHQgKi8KLSAgICAqaENsaXBDdHh0ID0KLSAgICAgICAgKE00VlNTM0dQUF9DbGlwQ29udGV4dCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0NsaXBDb250ZXh0KSwKLSAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJNNFZTUzNHUFBfQ2xpcENvbnRleHQiKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09ICpoQ2xpcEN0eHQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBJbml0KCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBNNFZTUzNHUFBfQ2xpcENvbnRleHQsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwSW5pdCgpOiBjbGlwQ3R4dD0weCV4IiwgKmhDbGlwQ3R4dCk7Ci0KLQotICAgIC8qKgotICAgICogVXNlIHRoaXMgc2hvcnRjdXQgdG8gc2ltcGxpZnkgdGhlIGNvZGUgKi8KLSAgICBwQ2xpcEN0eHQgPSAqaENsaXBDdHh0OwotCi0gICAgLyogSW5pYWxpemF0aW9uIG9mIGNvbnRleHQgVmFyaWFibGVzICovCi0gICAgbWVtc2V0KCh2b2lkICopcENsaXBDdHh0LCAwLHNpemVvZihNNFZTUzNHUFBfQ2xpcENvbnRleHQpKTsKLQotICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogSW5pdCB0aGUgY2xpcCBjb250ZXh0ICovCi0gICAgcENsaXBDdHh0LT5pVm9mZnNldCA9IDA7Ci0gICAgcENsaXBDdHh0LT5pQW9mZnNldCA9IDA7Ci0gICAgcENsaXBDdHh0LT5Wc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0gICAgcENsaXBDdHh0LT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0KLSAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwQ3R4dC0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0KLSAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzID0gMDsKLSAgICBwQ2xpcEN0eHQtPmlWaWRlb1JlbmRlckN0cyA9IDA7Ci0gICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPmJWaWRlb0F1QXZhaWxhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBDdHh0LT5iRmlyc3RBdVdyaXR0ZW4gPSBNNE9TQV9GQUxTRTsKLQotICAgIHBDbGlwQ3R4dC0+Yk1wZWc0R292U3RhdGUgPSBNNE9TQV9GQUxTRTsKLQotICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgPSAwOwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gMDsKLSAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotCi0gICAgcENsaXBDdHh0LT5wRmlsZVJlYWRQdHJGY3QgPSBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXYgICA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lID0gTTRPU0FfTlVMTDsKLSAgICBwQ2xpcEN0eHQtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoKLSAgICAqIFJlc2V0IHBvaW50ZXJzIGZvciBtZWRpYSBhbmQgY29kZWNzIGludGVyZmFjZXMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoKLSAgICAqICBDYWxsIHRoZSBtZWRpYSBhbmQgY29kZWNzIHN1YnNjcmlwdGlvbiBtb2R1bGUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYygmcENsaXBDdHh0LT5TaGVsbEFQSSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLy8gVGhpcyBtZXRob2QgbWFwcyB0aGUgZnJlcXVlbmN5IHZhbHVlIHRvIGEgc3RyaW5nLgotc3RhdGljIGNvbnN0IGNoYXIqIGZyZXFUb1N0cmluZyhpbnQgZnJlcSkgewotICAgIHN3aXRjaCAoZnJlcSkgewotICAgIGNhc2UgODAwMDoKLSAgICAgICAgcmV0dXJuICJfODAwMCI7Ci0gICAgY2FzZSAxMTAyNToKLSAgICAgICAgcmV0dXJuICJfMTEwMjUiOwotICAgIGNhc2UgMTIwMDA6Ci0gICAgICAgIHJldHVybiAiXzEyMDAwIjsKLSAgICBjYXNlIDE2MDAwOgotICAgICAgICByZXR1cm4gIl8xNjAwMCI7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgICAgcmV0dXJuICJfMjIwNTAiOwotICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgIHJldHVybiAiXzI0MDAwIjsKLSAgICBjYXNlIDMyMDAwOgotICAgICAgICByZXR1cm4gIl8zMjAwMCI7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgICAgcmV0dXJuICJfNDQxMDAiOwotICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgIHJldHVybiAiXzQ4MDAwIjsKLSAgICBkZWZhdWx0OgotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiVW5zdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZTogJWQgSHoiLCBmcmVxKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi0vLyBUaGlzIG1ldGhvZCBtYXBzIHRoZSBudW1iZXIgb2YgY2hhbm5lbCB2YWx1ZSB0bwotLy8gYSBzdHJpbmcgdGhhdCB3aWxsIGJlIHBhcnQgb2YgYSBmaWxlIG5hbWUgZXh0ZW5zaW9uCi1zdGF0aWMgY29uc3QgY2hhciogY2hhbm5lbFRvU3RyaW5nQW5kRmlsZUV4dChpbnQgY2hhbm5lbHMpIHsKLSAgICBzd2l0Y2ggKGNoYW5uZWxzKSB7Ci0gICAgY2FzZSAxOgotICAgICAgICByZXR1cm4gIl8xLnBjbSI7Ci0gICAgY2FzZSAyOgotICAgICAgICByZXR1cm4gIl8yLnBjbSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIlVuc3VwcG9ydGVkICVkIGNoYW5uZWxzIiwgY2hhbm5lbHMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLS8qIE5vdGU6IGlmIHRoZSBjbGlwIGlzIG9wZW5lZCBpbiBmYXN0IG1vZGUsIGl0IGNhbiBvbmx5IGJlIHVzZWQgZm9yIGFuYWx5c2lzIGFuZCBub3RoaW5nIGVsc2UuICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBPcGVuKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncywgTTRPU0FfQm9vbCBiU2tpcEF1ZGlvVHJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkZhc3RPcGVuTW9kZSwgTTRPU0FfQm9vbCBiQXZvaWRPcGVuaW5nVmlkZW9EZWMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRSRUFERVJfTWVkaWFGYW1pbHkgbWVkaWFGYW1pbHk7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXI7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAgZHVtbXlTdHJlYW1IYW5kbGVyOwotICAgIE00T1NBX0ludDMyIGlEdXJhdGlvbjsKLSAgICBNNE9TQV9Wb2lkICpkZWNvZGVyVXNlckRhdGE7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8gZHVtbXk7Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSB2aWRlb1NpemVGcm9tRFNJOwotI2VuZGlmIC8qIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUyAqLwotCi0gICAgTTRERUNPREVSX091dHB1dEZpbHRlciBGaWx0ZXJPcHRpb247Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBwQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwiKTsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBjYWxsZWQgd2l0aCBwQ2xpcEN0eHQ6IDB4JXgsIGJBdm9pZE9wZW5pbmdWaWRlb0RlYz0weCV4IiwKLSAgICAgICAgcENsaXBDdHh0LCBiQXZvaWRPcGVuaW5nVmlkZW9EZWMpOwotICAgIC8qKgotICAgICogS2VlcCBhIHBvaW50ZXIgdG8gdGhlIGNsaXAgc2V0dGluZ3MuIFJlbWVtYmVyIHRoYXQgd2UgZG9uJ3QgcG9zc2VzcyBpdCEgKi8KLSAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncyA9IHBDbGlwU2V0dGluZ3M7Ci0gICAgaWYoTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4ID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSkgewotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBJbWFnZSBzdHJlYW07IHNldCBjdXJyZW50IHZpZCBkZWMiKTsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoCi0gICAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5TaGVsbEFQSSwgTTREQV9TdHJlYW1UeXBlVmlkZW9BUkdCODg4OCk7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdENyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAmZHVtbXlTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXIsCi0gICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCwKLSAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPlZpZGVvQVUsCi0gICAgICAgICAgICAgICAgICBkZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogXAotICAgICAgICAgICAgICAgIG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIE00T1NBX1RSQUNFM18xKCJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IFwKLSAgICAgICAgICAgIFZpZCBkZWMgc3RhcnRlZDsgcFZpRGVjQ3R4dD0weCV4IiwgcENsaXBDdHh0LT5wVmlEZWNDdHh0KTsKLQotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgY29ycmVjdCByZWFkZXIgaW50ZXJmYWNlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRSZWFkZXIoJnBDbGlwQ3R4dC0+U2hlbGxBUEksCi0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIEluaXQgdGhlIDNHUFAgb3IgTVAzIHJlYWRlciAqLwotICAgIGVyciA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RDcmVhdGUoJnBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdENyZWF0ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIExpbmsgdGhlIHJlYWRlciBpbnRlcmZhY2UgdG8gdGhlIHJlYWRlciBjb250ZXh0ICh1c2VkIGJ5IHRoZSBkZWNvZGVyIHRvIGtub3cgdGhlIHJlYWRlcikgKi8KLSAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9yZWFkZXJDb250ZXh0ID0KLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dDsKLQotICAgIC8qKgotICAgICogU2V0IHRoZSBPU0FMIHJlYWQgZnVuY3Rpb24gc2V0ICovCi0gICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgTTRSRUFERVJfa09wdGlvbklEX1NldE9zYUZpbGVSZWFkZXJGY3RzUHRyLAotICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikocENsaXBDdHh0LT5wRmlsZVJlYWRQdHJGY3QpKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGZhc3Qgb3BlbiBtb2RlIGlmIGFza2VkICgzR1BQIG9ubHkpICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSApCi0gICAgewotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBiRmFzdE9wZW5Nb2RlICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlLCBNNE9TQV9OVUxMKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oRmFzdE9wZW5Nb2RlKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHNraXAgYXVkaW8gb3B0aW9uIGlmIGFza2VkICovCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IGJTa2lwQXVkaW9UcmFjayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1Bfa09wdGlvbklEX1ZpZGVvT25seSwgTTRPU0FfTlVMTCk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RTZXRPcHRpb24oVmlkZW9Pbmx5KSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNKSB7Ci0gICAgICAgIC8vIENvbXBvc2UgdGhlIHRlbXAgZmlsZW5hbWUgd2l0aCBzYW1wbGUgcmF0ZSBhbmQgY2hhbm5lbCBpbmZvcm1hdGlvbi4KLSAgICAgICAgY29uc3QgY2hhciogZnJlcVN0ciA9IGZyZXFUb1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kpOwotCi0gICAgICAgIGlmIChmcmVxU3RyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TQU1QTElOR19GUkVRVUVOQ1k7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBjaGFyKiBjaGFuU3RyID0gY2hhbm5lbFRvU3RyaW5nQW5kRmlsZUV4dCgKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyk7Ci0KLSAgICAgICAgaWYgKGNoYW5TdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19OQl9PRl9DSEFOTkVMUzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFsbG9jYXRlIG9uZSBieXRlIG1vcmUgdG8gaG9sZCB0aGUgbnVsbCB0ZXJtaW5hdG9yCi0gICAgICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPQotICAgICAgICAgICAgc3RybGVuKHBDbGlwU2V0dGluZ3MtPnBGaWxlKSArIHN0cmxlbihmcmVxU3RyKSArIHN0cmxlbihjaGFuU3RyKSArIDE7Ci0KLSAgICAgICAgY2hhciogcFRlbXBGaWxlID0gKGNoYXIgKikgbWFsbG9jKGxlbmd0aCk7Ci0gICAgICAgIGlmIChwVGVtcEZpbGUgPT0gTlVMTCkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtYWxsb2MgJWQgYnl0ZXMgZmFpbCIsbGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1zZXQocFRlbXBGaWxlLCAwLCBsZW5ndGgpOwotICAgICAgICBtZW1jcHkocFRlbXBGaWxlLCBwQ2xpcFNldHRpbmdzLT5wRmlsZSwgc3RybGVuKHBDbGlwU2V0dGluZ3MtPnBGaWxlKSk7Ci0gICAgICAgIHN0cm5jYXQocFRlbXBGaWxlLCBmcmVxU3RyLCBzdHJsZW4oZnJlcVN0cikpOwotICAgICAgICBzdHJuY2F0KHBUZW1wRmlsZSwgY2hhblN0ciwgc3RybGVuKGNoYW5TdHIpKTsKLQotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0T3BlbiggcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwgcFRlbXBGaWxlKTsKLSAgICAgICAgaWYgKHBUZW1wRmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBUZW1wRmlsZSk7Ci0gICAgICAgICAgICBwVGVtcEZpbGUgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmICggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG9wZW4gcGNtIGZpbGUgcmV0dXJucyBlcnJvciA6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIC8qKgotICAgICAgICAqIE9wZW4gdGhlIDNHUFAvTVAzIGNsaXAgZmlsZSAqLwotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0T3BlbiggcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSk7Ci0gICAgfQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdWlEdW1teSwgdWlDb3JlSWQ7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBtX3BSZWFkZXItPm1fcEZjdE9wZW4gcmV0dXJucyAweCV4IiwgZXJyKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgZXJyb3IgaXMgZnJvbSB0aGUgY29yZSByZWFkZXIsIHdlIGNoYW5nZSBpdCB0byBhIHB1YmxpYyBWU1MzR1BQIGVycm9yICovCi0gICAgICAgIE00T1NBX0VSUl9TUExJVChlcnIsIHVpRHVtbXksIHVpQ29yZUlkLCB1aUR1bW15KTsKLQotICAgICAgICBpZiggTTRNUDRfUkVBREVSID09IHVpQ29yZUlkICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlZBTElEXzNHUFBfRklMRSIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgYXVkaW8gYW5kIHZpZGVvIHN0cmVhbXMgKi8KLSAgICB3aGlsZSggZXJyID09IE00Tk9fRVJST1IgKQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE5leHRTdHJlYW0oCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LCAmbWVkaWFGYW1pbHksICZwU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgLyppbiBjYXNlIHdlIGZvdW5kIGEgQklGUyBzdHJlYW0gb3Igc29tZXRoaW5nIGVsc2UuLi4qLwotICAgICAgICBpZiggKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEUpKQotICAgICAgICAgICAgfHwgKGVyciA9PSAoKE00T1NBX1VJbnQzMilNNFdBUl9UT09fTVVDSF9TVFJFQU1TKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSAvKio8IE9uZSBzdHJlYW0gZm91bmQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIGEgdmlkZW8gc3RyZWFtICovCi0gICAgICAgICAgICBpZiggKCBtZWRpYUZhbWlseSA9PSBNNFJFQURFUl9rTWVkaWFGYW1pbHlWaWRlbykKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MyA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNAotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YwotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhIEgyNjMgb3IgTVBFRy00IG9yIEgyNjQgdmlkZW8gc3RyZWFtIGluIGlucHV0IDNncHAgY2xpcDsgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSB2aWRlbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1ZpZGVvU3RyZWFtSGFuZGxlciAqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RSZXNldCh2aWRlbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QodmlkZW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBIMjYzIG9yIE1QRUctNCAoSDI2NCwgZXRjLikgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTX2VkaXRDbGlwT3BlbigpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZvdW5kIGFuIHVuc3VwcG9ydGVkIHZpZGVvIHN0cmVhbSAoMHgleCkgaW4gaW5wdXQgM2dwcCBjbGlwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX2JTdHJlYW1Jc09LID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZvdW5kIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgZWxzZSBpZiggKCBtZWRpYUZhbWlseSA9PSBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbykKLSAgICAgICAgICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZAotICAgICAgICAgICAgICAgICAgICA9PSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlKQotICAgICAgICAgICAgICAgICAgICB8fCAoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IChNNERBX1N0cmVhbVR5cGVBdWRpb0V2cmMKLSAgICAgICAgICAgICAgICAgICAgPT0gcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtCi0gICAgICAgICAgICAgICAgICAgID09IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbigpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiBBTVItTkIgb3IgQUFDIG9yIE1QMyBhdWRpbyBzdHJlYW0gaW4gaW5wdXQgY2xpcDsgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogS2VlcCBwb2ludGVyIHRvIHRoZSBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00X0F1ZGlvU3RyZWFtSGFuZGxlciAqKXBTdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdFJlc2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTogbV9wUmVhZGVyLT5tX3BGY3RSZXNldChhdWRpbykgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEluaXRpYWxpemVzIGFuIGFjY2VzcyBVbml0ICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyLT5tX3BGY3RGaWxsQXVTdHJ1Y3QoYXVkaW8pIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvKio8IE5vdCBBTVItTkIgb3IgQUFDIChBTVItV0IuLi4pICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBGb3VuZCBhbiB1bnN1cHBvcnRlZCBhdWRpbyBzdHJlYW0gKDB4JXgpIGluIGlucHV0IDNncHAvbXAzIGNsaXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYlN0cmVhbUlzT0sgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IG1fcFJlYWRlci0+bV9wRmN0R2V0TmV4dFN0cmVhbSgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0IFZpZGVvIGRlY29kZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgewotI2lmZGVmIE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUwotICAvKiBJZiBleHRlcm5hbCBkZWNvZGVycyBhcmUgcG9zc2libGUsIGl0J3MgYmVzdCB0byBhdm9pZCBvcGVuaW5nIHRoZSBkZWNvZGVyIGlmIHRoZSBjbGlwIGlzIG9ubHkKLSAgZ29pbmcgdG8gYmUgdXNlZCBmb3IgYW5hbHlzaXMsIGFzIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQgZm9yIHRoZSBhbmFseXNpcyBpbiB0aGUgY2FzZSBvZiBhCi0gIHBvc3NpYmxlIGV4dGVybmFsIGRlY29kZXIgYW55d2F5LCBhbmQgZWl0aGVyIHRoZXJlIGNvdWxkIGJlIG5vIGRlY29kZXIgYXQgdGhpcyBwb2ludCBvciB0aGUgSFcKLSAgZGVjb2RlciBjb3VsZCBiZSBwcmVzZW50LCB3aGljaCB3ZSB3YW50IHRvIGF2b2lkIG9wZW5pbmcgZm9yIHRoYXQuIFNlZSBjb21tZW50cyBpbgotICBpbnRCdWlsZEFuYWx5c2lzIGZvciBtb3JlIGRldGFpbHMuICovCi0KLSAgLyogQ0hBTkdFTUUgVGVtcG9yYXJpbHkgb25seSBkbyB0aGlzIGZvciBNUEVHNCwgc2luY2UgZm9yIG5vdyBvbmx5IE1QRUc0IGV4dGVybmFsIGRlY29kZXJzIGFyZQotICBzdXBwb3J0ZWQsIGFuZCB0aGUgZm9sbG93aW5nIHdvdWxkbid0IHdvcmsgZm9yIEgyNjMgc28gYSByZWxlYXNlIHdoZXJlIGV4dGVybmFsIGRlY29kZXJzIGFyZQotICBwb3NzaWJsZSwgYnV0IG5vdCB1c2VkLCB3b3VsZG4ndCB3b3JrIHdpdGggSDI2MyBzdHVmZi4gKi8KLQotICAgICAgICBpZiggYkF2b2lkT3BlbmluZ1ZpZGVvRGVjICYmIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBPb3BzISBUaGUgbWVyZSBhY3Qgb2Ygb3BlbmluZyB0aGUgZGVjb2RlciBhbHNvIHJlc3VsdHMgaW4gdGhlIGltYWdlIHNpemUgYmVpbmcKLSAgICAgICAgICAgIGZpbGxlZCBpbiB0aGUgdmlkZW8gc3RyZWFtISBDb21wZW5zYXRlIGZvciB0aGlzIGJ5IHVzaW5nIFBhcnNlVmlkZW9EU0kgdG8gZmlsbAotICAgICAgICAgICAgdGhpcyBpbmZvLiAqLwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwT3BlbjogTXBlZzQgc3RyZWFtOyB2aWQgZGVjIG5vdCBzdGFydGVkIik7Ci0gICAgICAgICAgICBlcnIgPSBNNERFQ09ERVJfRVhURVJOQUxfUGFyc2VWaWRlb0RTSShwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmZHVtbXksICZ2aWRlb1NpemVGcm9tRFNJKTsKLQotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fdmlkZW9XaWR0aCA9IHZpZGVvU2l6ZUZyb21EU0kubV91aVdpZHRoOwotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fdmlkZW9IZWlnaHQgPQotICAgICAgICAgICAgICAgIHZpZGVvU2l6ZUZyb21EU0kubV91aUhlaWdodDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IE1wNC9IMjYzL0gyNjQgc3RyZWFtOyBzZXQgY3VycmVudCB2aWQgZGVjIik7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRGVjb2RlcigmcENsaXBDdHh0LT5TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICAgICAgICAgIGRlY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BDdXJyZW50VmlkZW9EZWNvZGVyVXNlckRhdGE7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgIGRlY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlKAotICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlciwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCwKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5WaWRlb0FVLCBkZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICBpZiggKCAoKE00T1NBX1VJbnQzMilNNEVSUl9ERUNPREVSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEKSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgfHwgKCgoTTRPU0FfVUludDMyKU00RVJSX0RFQ09ERVJfSDI2M19OT1RfQkFTRUxJTkUpID09IGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogT3VyIGRlY29kZXIgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBIMjYzIHByb2ZpbGUgb3RoZXIgdGhhbiAwLgotICAgICAgICAgICAgICAgICogU28gaXQgcmV0dXJucyB0aGlzIGludGVybmFsIGVycm9yIGNvZGUuCi0gICAgICAgICAgICAgICAgKiBXZSB0cmFuc2xhdGUgaXQgdG8gb3VyIG93biBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IFZpZCBkZWMgc3RhcnRlZDsgcFZpRGVjQ3R4dD0weCV4IiwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQpOwotCi0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YwotICAgICAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZpbHRlck9wdGlvbi5tX3BGaWx0ZXJGdW5jdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopICZNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMDsKLSAgICAgICAgICAgICAgICBGaWx0ZXJPcHRpb24ubV9wRmlsdGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmRmlsdGVyT3B0aW9uKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcE9wZW46IG1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uXAotICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXIgT0siKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgIH0KLQotICAgIC8qKgotICAgICogSW5pdCBBdWRpbyBkZWNvZGVyICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0gKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyKHBDbGlwQ3R4dCk7Ci0gICAgICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludENsaXBPcGVuOiBBdWRpbyBkZWMgc3RhcnRlZDsgY29udGV4dD0weCV4IiwKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX3N0cmVhbUlEID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zaXplID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fRFRTID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fYXR0cmlidXRlID0gMDsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0FVLm1fbWF4c2l6ZSA9IDA7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX3N0cnVjdFNpemUgPSBzaXplb2YocENsaXBDdHh0LT5BdWRpb0FVKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEdldCB0aGUgZHVyYXRpb24gb2YgdGhlIGxvbmdlc3Qgc3RyZWFtICovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJBbmFseXNlZCApCi0gICAgewotICAgICAgICAvKiBJZiBhbHJlYWR5IGNhbGN1bGF0ZWQgc2V0IGl0IHRvIHByZXZpb3VzIHZhbHVlICovCi0gICAgICAgIC8qIEJlY2F1c2UgZmFzdCBvcGVuIGFuZCBmdWxsIG9wZW4gY2FuIHJldHVybiBhIGRpZmZlcmVudCB2YWx1ZSwKLSAgICAgICAgICAgaXQgY2FuIG1pc21hdGNoIHVzZXIgc2V0dGluZ3MgKi8KLSAgICAgICAgLyogVmlkZW8gdHJhY2sgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbiBhdWRpbyB0cmFjayAoaWYgdmlkZW8gdHJhY2sgaXMgc2hvcnRlciB0aGFuCi0gICAgICAgICAgIGF1ZGlvIHRyYWNrLCBpdCBjYW4gbGVkIHRvIGN1dCBsYXJnZXIgdGhhbiBleHBlY3RlZCkgKi8KLSAgICAgICAgaUR1cmF0aW9uID0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0KLSAgICAgICAgaWYoIGlEdXJhdGlvbiA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgaUR1cmF0aW9uID0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEVsc2UgY29tcHV0ZSBpdCBmcm9tIHN0cmVhbXMgKi8KLSAgICAgICAgaUR1cmF0aW9uID0gMDsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlEdXJhdGlvbiA9IChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSkgJiYgKChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbikKLSAgICAgICAgICAgID4gaUR1cmF0aW9uKSAmJiBpRHVyYXRpb24gPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlEdXJhdGlvbiA9IChNNE9TQV9JbnQzMikoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZHVyYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiBlbmQgdGltZSBpcyBub3QgdXNlZCwgd2Ugc2V0IGl0IHRvIHRoZSB2aWRlbyB0cmFjayBkdXJhdGlvbiAqLwotICAgIGlmKCAwID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT51aUVuZEN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnVpRW5kQ3V0VGltZSA9IChNNE9TQV9VSW50MzIpaUR1cmF0aW9uOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+aUVuZFRpbWUgPSAoTTRPU0FfSW50MzIpcENsaXBDdHh0LT5wU2V0dGluZ3MtPnVpRW5kQ3V0VGltZTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBPcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50Q2xpcERlbGV0ZUF1ZGlvVHJhY2soKQotICogQGJyaWVmICAgIERlbGV0ZSB0aGUgYXVkaW8gdHJhY2suIENsaXAgd2lsbCBiZSBsaWtlIGlmIGl0IGhhZCBubyBhdWRpbyB0cmFjawotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENsaXBEZWxldGVBdWRpb1RyYWNrKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgLyoqCi0gICAgKiBCdXQgd2UgZG9uJ3QgaGF2ZSB0byBmcmVlIHRoZSBhdWRpbyBzdHJlYW0uIEl0IHdpbGwgYmUgZnJlZWQgYnkgdGhlIHJlYWRlciB3aGVuIGNsb3NpbmcgaXQqLwotICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogV2Ugd2lsbCByZXR1cm4gYSBjb25zdGFudCBzaWxlbmNlIEFNUiBBVS4KLSAgICAqIFdlIHNldCBpdCBoZXJlIG9uY2UsIGluc3RlYWQgb2YgYXQgZWFjaCByZWFkIGF1ZGlvIHN0ZXAuICovCi0gICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9IChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBTaWxlbmNlRnJhbWVEYXRhOwotICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAoaXQgbmVlZHMgdG8gYmUgcmUtYWxsb2NhdGVkIHRvIHN0b3JlIHNpbGVuY2UKLSAgICAgIGZyYW1lIGV2ZW50dWFsbHkpKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MpOwotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdXJyZW50VGltZSgpCi0gKiBAYnJpZWYgICAgSnVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGFuZCBkZWNvZGUgdXAgdG8gdGhlIGN1cnJlbnQgdmlkZW8gdGltZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBpQ3RzICAgICAgICAoSU4pIFRhcmdldCBDVFMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBpQ3RzICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpUmFwQ3RzLCBpQ2xpcEN0czsKLSAgICBNNF9NZWRpYVRpbWUgZERlY29kZVRpbWU7Ci0gICAgTTRPU0FfQm9vbCBiQ2xpcEp1bXAgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIHRoZSB0aW1lIGluIHRoZSBjbGlwIGJhc2UgKi8KLSAgICBpQ2xpcEN0cyA9IGlDdHMgLSBwQ2xpcEN0eHQtPmlWb2Zmc2V0OwotCi0gICAgLyoqCi0gICAgKiBJZiB3ZSB3ZXJlIHJlYWRpbmcgdGhlIGNsaXAsIHdlIG11c3QganVtcCB0byB0aGUgcHJldmlvdXMgUkFQCi0gICAgKiB0byBkZWNvZGUgZnJvbSB0aGF0IHBvaW50LiAqLwotICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRCA9PSBwQ2xpcEN0eHQtPlZzdGF0dXMgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogVGhlIGRlY29kZXIgbXVzdCBiZSB0b2xkIHRvIGp1bXAgKi8KLSAgICAgICAgYkNsaXBKdW1wID0gTTRPU0FfVFJVRTsKLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgPSBpQ2xpcEN0czsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBSZW1lbWJlciB0aGUgY2xpcCByZWFkaW5nIHN0YXRlICovCi0gICAgICAgIHBDbGlwQ3R4dC0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB3ZSBhcmUgaW4gZGVjb2RlVXBUbygpIHByb2Nlc3MsIGNoZWNrIGlmIHdlIG5lZWQgdG8gZG8KLSAgICBvbmUgbW9yZSBzdGVwIG9yIGlmIGRlY29kaW5nIGlzIGZpbmlzaGVkICovCi0gICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19ERUNPREVfVVBfVE8gPT0gcENsaXBDdHh0LT5Wc3RhdHVzICkKLSAgICB7Ci0gICAgICAgIC8qIERvIGEgc3RlcCBvZiA1MDAgbXMgZGVjb2RpbmcgKi8KLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgKz0gNTAwOwotCi0gICAgICAgIGlmKCBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyA+IGlDbGlwQ3RzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGFyZ2V0IHRpbWUgcmVhY2hlZCwgd2Ugc3dpdGNoIGJhY2sgdG8gREVDT0RFIG1vZGUgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzID0gaUNsaXBDdHM7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPlZzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UyXzEoImMgLCwsLCBkZWNvZGUgdXAgdG8gOiAlbGQiLCBwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0cyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEp1c3QgZGVjb2RlIGF0IGN1cnJlbnQgY2xpcCBjdHMgKi8KLSAgICAgICAgcENsaXBDdHh0LT5pVmlkZW9EZWNDdHMgPSBpQ2xpcEN0czsKLQotICAgICAgICBNNE9TQV9UUkFDRTJfMSgiZCAsLCwsIGRlY29kZSB1cCB0byA6ICVsZCIsIHBDbGlwQ3R4dC0+aVZpZGVvRGVjQ3RzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIERlY29kZSB1cCB0byB0aGUgdGFyZ2V0ICovCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0czogRGVjb2RpbmcgdXBUbyBDVFMgJS4zZiwgcENsaXBDdHh0PTB4JXgiLAotICAgICAgICBkRGVjb2RlVGltZSwgcENsaXBDdHh0KTsKLQotICAgIGREZWNvZGVUaW1lID0gKE00T1NBX0RvdWJsZSlwQ2xpcEN0eHQtPmlWaWRlb0RlY0N0czsKLSAgICBwQ2xpcEN0eHQtPmlzUmVuZGVyRHVwID0gTTRPU0FfRkFMU0U7Ci0gICAgZXJyID0KLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlY29kZShwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICZkRGVjb2RlVGltZSwgYkNsaXBKdW1wLCAwKTsKLQotICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpCi0gICAgICAgICYmIChlcnIgIT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzOiBtX3BGY3REZWNvZGUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmKCBlcnIgPT0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5pc1JlbmRlckR1cCA9IE00T1NBX1RSVUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHM6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCkKLSAqIEBicmllZiAgICBSZWFkIG9uZSBBVSBmcmFtZSBpbiB0aGUgY2xpcAotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgSW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKAotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBOTyBBVURJTyAtLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgewotICAgICAgICAvKiBJZiB0aGVyZSBpcyBubyBhdWRpbyB0cmFjaywgd2UgcmV0dXJuIHNpbGVuY2UgQVVzICovCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzICs9IHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uOwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJiICMjIyMgYmxhbmsgdHJhY2siKTsKLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBBTVItTkIsIEVWUkMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIGVsc2UgaWYoICggTTRWSURFT0VESVRJTkdfa0FNUl9OQgotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKQotICAgICAgICB8fCAoTTRWSURFT0VESVRJTkdfa0VWUkMKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogTm8gQVUgYXZhaWxhYmxlLCBzbyB3ZSBtdXN0IG11c3QgcmVhZCBvbmUgZnJvbSB0aGUgb3JpZ2luYWwgdHJhY2sgcmVhZGVyICovCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCB0aGUgY3VycmVudCBBTVIgZnJhbWUgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVhZCBBVSAqLwotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzczsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBBTVIgZnJhbWUgQ1RTICovCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgICAgICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCAoIE00V0FSX05PX01PUkVfQVUgPT0gZXJyKSAmJiAoTTRWSURFT0VESVRJTkdfa0FNUl9OQgotICAgICAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHRoZXJlIGlzIGxlc3MgYXVkaW8gdGhhbiB0aGUgc3RyZWFtIGR1cmF0aW9uIGluZGljYXRlZCwKLSAgICAgICAgICAgICAgICAqIHdlIHJldHVybiBzaWxlbmNlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gKi8KLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID0gcENsaXBDdHh0LT51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJhICMjIyMgc2lsZW5jZSBBVSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBNNFdBUl9OT19NT1JFX0FVICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRXQVJfTk9fTU9SRV9BVSAoc2lsZW5jZSkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgLyoqPCBmYXRhbCBlcnJvciAob3Igbm8gc2lsZW5jZSBpbiBFVlJDKSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BTVI6IG1fcEZjdEdldE5leHRBdSgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIGJBdWRpb0ZyYW1lQXZhaWxhYmxlICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBHbyB0byB0aGUgbmV4dCBBTVIgZnJhbWUgaW4gdGhlIEFVICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyICs9IHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEluY3JlbWVudCBDVFM6IG9uZSBBTVIgZnJhbWUgaXMgMjAgbXMgbG9uZyAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgcG9pbnRlZCBBTVIgZnJhbWUgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9BTVJOQigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0cik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0VWUkM6Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilNNFZTUzNHUFBfaW50R2V0RnJhbWVTaXplX0VWUkMoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCAwID09IHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogQVUgZnJhbWUgc2l6ZSA9PSAwLFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQU1SX0FVIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19DT1JSVVBURURfQVU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplID4gcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFNUjogQVUgZnJhbWUgc2l6ZSBncmVhdGVyIHRoYW4gQVUgc2l6ZSEsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BTVJfQVUiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGlmIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgQVUgaGFzIGJlZW4gcmVhY2hlZCBvciBub3QgKi8KLSAgICAgICAgaWYoICggcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciArIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSkKLSAgICAgICAgICAgIDwgKHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzICsgcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmJBdWRpb0ZyYW1lQXZhaWxhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOyAvKio8IHdpbGwgYmUgdXNlZCBmb3IgbmV4dCBjYWxsICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgLyogLS0tLS0tLS0tLSBBQUMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIGVsc2UgaWYoICggTTRWSURFT0VESVRJTkdfa0FBQwotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKQotICAgICAgICB8fCAoTTRWSURFT0VESVRJTkdfa0FBQ3BsdXMKLSAgICAgICAgPT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSkKLSAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tlQUFDcGx1cwotICAgICAgICA9PSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlKSApCi0gICAgewotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpcENsaXBDdHh0LT5BdWRpb0FVLm1fc2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikocENsaXBDdHh0LT5BdWRpb0FVLm1fQ1RTICogcENsaXBDdHh0LT5zY2FsZV9hdWRpbwotICAgICAgICAgICAgICAgICsgMC41KTsKLQotICAgICAgICAgICAgLyogUGF0Y2ggYmVjYXVzZSBtX0NUUyBpcyB1bmZvcnR1bmF0ZWx5IHJvdW5kZWQgaW4gM2dwIHJlYWRlciBzaGVsbCAqLwotICAgICAgICAgICAgLyogKGN0cyBpcyBub3QgYW4gaW50ZWdlciB3aXRoIGZyZXF1ZW5jeSAyNCBrSHogZm9yIGV4YW1wbGUpICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzID0gKCAoIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICArIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uIC8gMikKLSAgICAgICAgICAgICAgICAvIHBDbGlwQ3R4dC0+aVNpbGVuY2VGcmFtZUR1cmF0aW9uKQotICAgICAgICAgICAgICAgICogcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSWYgdGhlcmUgaXMgbGVzcyBhdWRpbyB0aGFuIHRoZSBzdHJlYW0gZHVyYXRpb24gaW5kaWNhdGVkLAotICAgICAgICAgICAgKiB3ZSByZXR1cm4gc2lsZW5jZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICovCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpcENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9IHBDbGlwQ3R4dC0+dWlTaWxlbmNlRnJhbWVTaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyArPSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoImEgIyMjIyBzaWxlbmNlIEFVIik7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBSZXR1cm4gd2l0aCBNNFdBUl9OT19NT1JFX0FVICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKS1BQUM6XAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFdBUl9OT19NT1JFX0FVIChzaWxlbmNlKSIpOwotICAgICAgICAgICAgcmV0dXJuIE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKio8IGZhdGFsIGVycm9yICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSgpLUFBQzogbV9wRmN0R2V0TmV4dEF1KCkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0gTVAzLCBvdGhlcnMgLS0tLS0tLS0tLSAqLwotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgJnBDbGlwQ3R4dC0+QXVkaW9BVSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKCktTVAzOiBtX3BGY3RHZXROZXh0QXUoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciA9IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzOwotICAgICAgICBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemUgPSAoTTRPU0FfVUludDE2KXBDbGlwQ3R4dC0+QXVkaW9BVS5tX3NpemU7Ci0gICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvCi0gICAgICAgICAgICArIDAuNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoKQotICogQGJyaWVmICAgIENyZWF0ZXMgYW5kIGluaXRpYWxpemUgdGhlIGF1ZGlvIGRlY29kZXIgZm9yIHRoZSBjbGlwLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgKElOKSBpbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRfU3RyZWFtVHlwZSBhdWRpb3R5cGU7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICBNNF9BQUNUeXBlIGlBYWNUeXBlID0gMDsKLQotI2VuZGlmCi0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgcHJvcGVyIGF1ZGlvIGRlY29kZXIgKi8KLQotICAgIGF1ZGlvdHlwZSA9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGU7Ci0KLSAgICAvL0VWUkMKLSAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjCi0gICAgICAgICE9IGF1ZGlvdHlwZSApIC8qIGRlY29kZXIgbm90IHN1cHBvcnRlZCB5ZXQsIGJ1dCBhbGxvdyB0byBkbyBudWxsIGVuY29kaW5nICovCi0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoJnBDbGlwQ3R4dC0+U2hlbGxBUEksIGF1ZGlvdHlwZSk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZXMgdGhlIGF1ZGlvIGRlY29kZXIgKi8KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2RlciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXIoKTogRmFpbHMgdG8gaW5pdGlhdGUgdGhlIGF1ZGlvIGRlY29kZXIuIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERVJfSU5JVF9GQUlMRUQ7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0ICkKLSAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcENsaXBDdHh0LT5TaGVsbEFQSS5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkgewotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTTREQV9TdHJlYW1UeXBlQXVkaW9QY20gIT0gYXVkaW90eXBlKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgIE00T1NBX05VTEwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcjogbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlY1wKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcjpcCi0gICAgICAgICAgICAgICAgQ3JlYXRpbmcgZXh0ZXJuYWwgYXVkaW8gZGVjb2RlciBvZiB0eXBlIDB4JXgiLCBhdWRpb3R5cGUpOwotICAgICAgICAgICAgLyogRXh0ZXJuYWwgT01YIGNvZGVjcyBhcmUgdXNlZCovCi0gICAgICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEFBQyBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgICAgICAgICAgLypnZXQgZnJvbSBSZWFkZXI7IHRlbXBvcmFyeSwgdGlsbCBBdWRpbyBkZWNvZGVyIHNoZWxsIEFQSQotICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBnZXQgdGhlIEFBQyBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fc2FtcGxpbmdGcmVxdWVuY3k7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPgotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMocENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmaUFhY1R5cGUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBlcnIgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpQWFjVHlwZSA9IE00X2tBQUM7IC8vc2V0IHRvIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMgcmV0dXJucyBzdHJlYW1UeXBlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlBYWNUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIGlBYWNUeXBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rQUFDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00X2tBQUNwbHVzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFQU1ByZXNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNF9rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFFeHRlbnNpb25TYW1wRnJlcSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6IEFBQyBOQkNoYW5zPSVkLCBTYW1wbEZyZXE9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFOdW1DaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAmcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgbV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotI2Vsc2UKLSAgICAgICAgLyogVHJpY2ssIEkgdXNlIHBVc2VyRGF0YSB0byByZXRyaWV2ZSBhYWMgcHJvcGVydGllcywKLSAgICAgICAgICAgd2FpdGluZyBmb3Igc29tZSBiZXR0ZXIgaW1wbGVtZW50YXRpb24uLi4gKi8KLQotICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICZwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSwgJihwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjKAotICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICBNNE9TQV9OVUxMIC8qIHRvIGJlIGNoYW5nZWQgd2l0aCBIVyBpbnRlcmZhY2VzICovKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBQcmVwYXJlQXVkaW9EZWNvZGVyOlwKLSAgICAgICAgICAgICAgICBtX3BBdWRpb0RlY29kZXItPm1fcEZjdENyZWF0ZUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICB9Ci0KLSAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogQU1SIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9FdnJjID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogRVZSQyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBub3RoaW5nIHNwZWNpZmljIHRvIGRvICovCi0gICAgfQotICAgIGVsc2UgaWYoIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzID09IGF1ZGlvdHlwZSApIHsKLSAgICAgICAgLyogTVAzIERFQ09ERVIgQ09ORklHVVJBVElPTiAqLwotCi0gICAgICAgIC8qIG5vdGhpbmcgc3BlY2lmaWMgdG8gZG8gKi8KLSAgICB9Ci0gICAgZWxzZSBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gYXVkaW90eXBlICkKLSAgICB7Ci0gICAgICAgIC8qIEFBQyBERUNPREVSIENPTkZJR1VSQVRJT04gKi8KLQotICAgICAgICAvKiBEZWNvZGUgaGlnaCBxdWFsaXR5IGFhYyBidXQgZGlzYWJsZSBQUyBhbmQgU0JSICovCi0gICAgICAgIC8qIEJlY2F1c2Ugd2UgaGF2ZSB0byBtaXggZGlmZmVyZW50IGtpbmQgb2YgQUFDIHNvIHdlIG11c3QgdGFrZSB0aGUgbG93ZXN0IGNhcGFiaWxpdHkgKi8KLSAgICAgICAgLyogSW4gTUNTIGl0IHdhcyBub3QgbmVlZGVkIGJlY2F1c2UgdGhlcmUgaXMgb25seSBvbmUgc3RyZWFtICovCi0gICAgICAgIE00X0FhY0RlY29kZXJDb25maWcgQWFjRGVjUGFyYW07Ci0KLSAgICAgICAgQWFjRGVjUGFyYW0ubV9BQUNEZWNvZGVyUHJvZmlsZSA9IEFBQ19rQUFDOwotICAgICAgICBBYWNEZWNQYXJhbS5tX0Rvd25TYW1wbGluZ01vZGUgPSBBQUNfa0RTX09GRjsKLQotICAgICAgICBpZiggTTRFTkNPREVSX2tNb25vID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa01vbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBBYWNEZWNQYXJhbS5tX091dHB1dE1vZGUgPSBBQUNfa1N0ZXJlbzsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgIE00QURfa09wdGlvbklEX1VzZXJQYXJhbSwgKE00T1NBX0RhdGFPcHRpb24pICZBYWNEZWNQYXJhbSk7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjICkgewotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEXzNncFJlYWRlckludGVyZmFjZSwKLSAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdCk7Ci0KLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKAotICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LCBNNEFEX2tPcHRpb25JRF9BdWRpb0FVLAotICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjICkKLSAgICB7Ci0gICAgICAgIC8qIE5vdCBpbXBsZW1lbnRlZCBpbiBhbGwgZGVjb2RlcnMgKi8KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFN0YXJ0QXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcFByZXBhcmVBdWRpb0RlY29kZXI6XAotICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0KLSAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYnl0ZUZyYW1lTGVuZ3RoCi0gICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYnl0ZVNhbXBsZVNpemUKLSAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgIChNNE9TQV9NZW1BZGRyOClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUKLSAgICAgICAgKiBzaXplb2YoTTRPU0FfSW50MTYpLAotICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopIkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwUHJlcGFyZUF1ZGlvRGVjb2RlcigpOlwKLSAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBBdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCkKLSAqIEBicmllZiAgICBEZWNvZGUgdGhlIGN1cnJlbnQgQVVESU8gZnJhbWUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKAotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgKiBTaWxlbmNlIG1vZGUgKi8KLSAgICBpZiggcENsaXBDdHh0LT5wU2lsZW5jZUZyYW1lRGF0YQotICAgICAgICA9PSAoTTRPU0FfVUludDggKilwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgYXVkaW8gZGVjb2RlciAqLwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlTaWxlbmNlUGNtU2l6ZTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgICAgICogc2l6ZW9mKE00T1NBX0ludDE2KSwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFAsKE00T1NBX0NoYXIgKikgIkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpOlwKLSAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIEF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbGwgaXQgd2l0aCAwICg9IHBjbSBzaWxlbmNlKSAqLwotICAgICAgICBtZW1zZXQocENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLDAsCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKiBzaXplb2YoTTRPU0FfSW50MTYpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QQ00pCi0gICAgewotICAgICAgICBwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcyA9IChNNE9TQV9NZW1BZGRyOCkgcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0cjsKLSAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSAgPSBwQ2xpcEN0eHQtPnVpQXVkaW9GcmFtZVNpemU7Ci0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgKHZvaWQgKilwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4ubV9kYXRhQWRkcmVzcywgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplID0gcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICB9Ci0gICAgLyoqCi0gICAgKiBTdGFuZGFyZCBkZWNvZGluZyBtb2RlICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRGVjb2RlIGN1cnJlbnQgQU1SIGZyYW1lICovCi0gICAgICAgIGlmICggcENsaXBDdHh0LT5wQXVkaW9GcmFtZVB0ciAhPSBNNE9TQV9OVUxMICkgewotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fZGF0YUFkZHJlc3MgPQotICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQ2xpcEN0eHQtPnBBdWRpb0ZyYW1lUHRyOwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgcENsaXBDdHh0LT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5BdWRpb0RlY0J1ZmZlckluLm1fdGltZVN0YW1wVXMgPQotICAgICAgICAgICAgIChpbnQ2NF90KSAocENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyAqIDEwMDBMTCk7Ci0KLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVySW4sICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0LAotICAgICAgICAgICAgIE00T1NBX0ZBTFNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFBhc3MgTnVsbCBpbnB1dCBidWZmZXIKLSAgICAgICAgICAgIC8vIFJlYWRlciBpbnZva2VkIGZyb20gQXVkaW8gZGVjb2RlciBzb3VyY2UKLSAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0LAotICAgICAgICAgICAgIE00T1NBX05VTEwsICZwQ2xpcEN0eHQtPkF1ZGlvRGVjQnVmZmVyT3V0LAotICAgICAgICAgICAgIE00T1NBX0ZBTFNFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCk6XAotICAgICAgICAgICAgICAgIG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RlcEF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcERlY29kZUN1cnJlbnRBdWRpb0ZyYW1lKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKQotICogQGJyaWVmICAgIEp1bXAgaW4gdGhlIGF1ZGlvIHRyYWNrIG9mIHRoZSBjbGlwLgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICBwSnVtcEN0cyAgICAgICAgICAgIChJTi9PVVQpIGluOnRhcmdldCBDVFMsIG91dDogcmVhY2hlZCBDVFMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiAqcEp1bXBDdHMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfSW50MzIgaVRhcmdldEN0czsKLSAgICBNNE9TQV9JbnQzMiBpSnVtcEN0c01zOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwQ3R4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQ6IHBDbGlwQ3R4dCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBKdW1wQ3RzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdDogcEp1bXBDdHMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaVRhcmdldEN0cyA9ICpwSnVtcEN0czsKLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8gc3RyZWFtLCB3ZSBzaW11bGF0ZSBhIGp1bXAgYXQgdGhlIHRhcmdldCBqdW1wIENUUyAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIHRoZSB0YXJnZXQgQ1RTIHdpbGwgYmUgcmVhY2hlZCBhdCBuZXh0IFJlYWRGcmFtZSBjYWxsICh0aHVzIHRoZSAtMjApICovCi0gICAgICAgICpwSnVtcEN0cyA9IGlUYXJnZXRDdHMgLSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAvKiBQYXRjaCBiZWNhdXNlIG1fQ1RTIGlzIHVuZm9ydHVuYXRlbHkgcm91bmRlZCBpbiAzZ3AgcmVhZGVyIHNoZWxsICovCi0gICAgICAgIC8qIChjdHMgaXMgbm90IGFuIGludGVnZXIgd2l0aCBmcmVxdWVuY3kgMjQga0h6IGZvciBleGFtcGxlKSAqLwotICAgICAgICAqcEp1bXBDdHMgPSAoICggKnBKdW1wQ3RzICsgcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyAyKQotICAgICAgICAgICAgLyBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbikKLSAgICAgICAgICAgICogcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPQotICAgICAgICAgICAgKgotICAgICAgICAgICAgcEp1bXBDdHM7IC8qIHNpbXVsYXRlIGEgcmVhZCBhdCBqdW1wIHBvc2l0aW9uIGZvciBsYXRlciBzaWxlbmNlIEFVcyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9JbnQzMiBjdXJyZW50X3RpbWUgPSAwOwotICAgICAgICBNNE9TQV9JbnQzMiBsb29wX2NvdW50ZXIgPSAwOwotCi0gICAgICAgIGlmKCAoTTREQV9TdHJlYW1UeXBlQXVkaW9NcDMKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpICkKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUoICggbG9vcF9jb3VudGVyIDwgTTRWU1MzR1BQX01QM19KVU1QRURfQVVfTlVNQkVSX01BWCkKLSAgICAgICAgICAgICAgICAmJiAoY3VycmVudF90aW1lIDwgaVRhcmdldEN0cykgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICZwQ2xpcEN0eHQtPkF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQ6IG1fcEZjdEdldE5leHRBdSgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGN1cnJlbnRfdGltZSA9IChNNE9TQV9JbnQzMilwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFM7Ci0gICAgICAgICAgICAgICAgbG9vcF9jb3VudGVyKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGUgY3VycmVudCBBVSBpcyBzdG9yZWQgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBwQ2xpcEN0eHQtPkF1ZGlvQVUubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlBdWRpb0ZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwQ2xpcEN0eHQtPkF1ZGlvQVUubV9zaXplOwotICAgICAgICAgICAgcENsaXBDdHh0LT5pQXVkaW9GcmFtZUN0cyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQ2xpcEN0eHQtPkF1ZGlvQVUubV9DVFMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvCi0gICAgICAgICAgICAgICAgKyAwLjUpOwotCi0gICAgICAgICAgICAqcEp1bXBDdHMgPSBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEp1bXAgaW4gdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICAgICAgaUp1bXBDdHNNcyA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKSgqcEp1bXBDdHMgLyBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAoCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLAotICAgICAgICAgICAgICAgICZpSnVtcEN0c01zKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKTogbV9wRmN0SnVtcCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKnBKdW1wQ3RzID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKGlKdW1wQ3RzTXMgKiBwQ2xpcEN0eHQtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgLyogUGF0Y2ggYmVjYXVzZSBtX0NUUyBpcyB1bmZvcnR1bmF0ZWx5IHJvdW5kZWQgaW4gM2dwIHJlYWRlciBzaGVsbCAqLwotICAgICAgICAgICAgLyogKGN0cyBpcyBub3QgYW4gaW50ZWdlciB3aXRoIGZyZXF1ZW5jeSAyNCBrSHogZm9yIGV4YW1wbGUpICovCi0gICAgICAgICAgICAqcEp1bXBDdHMgPSAoICggKnBKdW1wQ3RzICsgcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gLyAyKQotICAgICAgICAgICAgICAgIC8gcENsaXBDdHh0LT5pU2lsZW5jZUZyYW1lRHVyYXRpb24pCi0gICAgICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMgPSAwOyAvKiBObyBmcmFtZSByZWFkIHlldCAqLwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVG8gZGV0ZWN0IHNvbWUgbWF5LWJlIGJ1Z3MsIEkgcHJlZmVyIHRvIHJlc2V0IGFsbCB0aGVzZSBhZnRlciBhIGp1bXAgKi8KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkF1ZGlvRnJhbWVBdmFpbGFibGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRnJhbWVQdHIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSW4gQU1SLCB3ZSBoYXZlIHRvIG1hbmFnZSBtdWx0aS1mcmFtZWQgQVVzLAotICAgICAgICAgICAgYnV0IGFsc28gaW4gQUFDIHRoZSBqdW1wIGNhbiBiZSAxIEFVIHRvbyBtdWNoIGJhY2t3YXJkICovCi0gICAgICAgICAgICBpZiggKnBKdW1wQ3RzIDwgaVRhcmdldEN0cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBKdW1wIGRvZXNuJ3QgcmVhZCBhbnkgQVUsIHdlIG11c3QgcmVhZCBhdCBsZWFzdCBvbmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcEN0eHQpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShhKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlYWQgQVUgZnJhbWVzIGFzIGxvbmcgYXMgd2UgcmVhY2ggdGhlIEFVIGJlZm9yZSB0aGUgdGFyZ2V0IENUUwotICAgICAgICAgICAgICAgICogKHNvIHRoZSB0YXJnZXQgd2lsbCBiZSByZWFjaGVkIHdoZW4gdGhlIHVzZXIgY2FsbCBSZWFkTmV4dEF1ZGlvRnJhbWUpLiAqLwotICAgICAgICAgICAgICAgIHdoaWxlKCBwQ2xpcEN0eHQtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIDwgKGlUYXJnZXRDdHMgLSBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocENsaXBDdHh0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShiKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZXR1cm4gdGhlIENUUyB0aGF0IHdpbGwgYmUgcmVhY2hlZCBhdCBuZXh0IFJlYWRGcmFtZSAqLwotICAgICAgICAgICAgICAgICpwSnVtcEN0cyA9IHBDbGlwQ3R4dC0+aUF1ZGlvRnJhbWVDdHMKLSAgICAgICAgICAgICAgICAgICAgKyBwQ2xpcEN0eHQtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2xpcENsb3NlKCkKLSAqIEBicmllZiAgICBDbG9zZSBhIGNsaXAuIERlc3Ryb3kgdGhlIGNvbnRleHQuCi0gKiBAbm90ZQotICogQHBhcmFtICAgcENsaXBDdHh0ICAgICAgICAgICAgKElOKSBJbnRlcm5hbCBjbGlwIGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbG9zZSggTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcEN0eHQgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbG9zZTogcENsaXBDdHh0IGlzIE00T1NBX05VTEwiKTsKLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdmlkZW8gZGVjb2RlciBjb250ZXh0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlEZWNDdHh0ICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3REZXN0cm95KAotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0KTsKLSAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIGF1ZGlvIGRlY29kZXIgY29udGV4dCAgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2U6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBVSBpcyBhbGxvY2F0ZWQgYnkgcmVhZGVyLgotICAgICogSWYgbm8gYXVkaW8gdHJhY2ssIGF1ZGlvIEFVIGlzIHNldCBhdCAnc2lsZW50JyAoU0lEKSBieSBWU1MuCi0gICAgKiBBcyBhIGNvbnNlcXVlbmNlLCBpZiBhdWRpbyBBVSBpcyBzZXQgdG8gJ3NpbGVudCcgKHN0YXRpYykKLSAgICBpdCBjYW4ndCBiZSBmcmVlIHVubGVzcyBpdCBpcyBzZXQgdG8gTlVMTCAqLwotICAgIGlmKCAoIChNNE9TQV9NZW1BZGRyOClNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4Ci0gICAgICAgID09IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzKQotICAgICAgICB8fCAoKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEKLSAgICAgICAgPT0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MpICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgKi8KLSAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdENsb3NlKAotICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoKTogbV9wUmVhZGVyLT5tX3BGY3RDbG9zZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZXN0cm95IHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgY29udGV4dCAqLwotICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0RGVzdHJveSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsb3NlKCk6IG1fcFJlYWRlci0+bV9wRmN0RGVzdHJveSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwQ2xvc2UoQ3R4dD0weCV4KTogcmV0dXJuaW5nIE00Tk9fRVJST1IiLAotICAgICAgICBwQ2xpcEN0eHQpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1IsIGVycjI7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBDdHh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbGVhblVwOiBwQ2xpcEN0eHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSB2aWRlbyBkZWNvZGVyIGNvbnRleHQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgKQotICAgIHsKLSAgICAgICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdERlc3Ryb3koCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQpOwotICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgYXVkaW8gZGVjb2RlciBjb250ZXh0ICAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCApCi0gICAgewotICAgICAgICBlcnIyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdERlc3Ryb3lBdWRpb0RlYygKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyMiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXA6IG1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0RGVzdHJveUF1ZGlvRGVjIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgZXJyID0gZXJyMjsKLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBkZWNvZGVkIGF1ZGlvIGJ1ZmZlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyApCi0gICAgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyk7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBVSBpcyBhbGxvY2F0ZWQgYnkgcmVhZGVyLgotICAgICogSWYgbm8gYXVkaW8gdHJhY2ssIGF1ZGlvIEFVIGlzIHNldCBhdCAnc2lsZW50JyAoU0lEKSBieSBWU1MuCi0gICAgKiBBcyBhIGNvbnNlcXVlbmNlLCBpZiBhdWRpbyBBVSBpcyBzZXQgdG8gJ3NpbGVudCcgKHN0YXRpYykKLSAgICBpdCBjYW4ndCBiZSBmcmVlIHVubGVzcyBpdCBpcyBzZXQgdG8gTlVMTCAqLwotICAgIGlmKCAoIChNNE9TQV9NZW1BZGRyOClNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4Ci0gICAgICAgID09IHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzKQotICAgICAgICB8fCAoKE00T1NBX01lbUFkZHI4KXBDbGlwQ3R4dC0+cFNpbGVuY2VGcmFtZURhdGEKLSAgICAgICAgPT0gcENsaXBDdHh0LT5BdWRpb0FVLm1fZGF0YUFkZHJlc3MpICkKLSAgICB7Ci0gICAgICAgIHBDbGlwQ3R4dC0+QXVkaW9BVS5tX2RhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgKi8KLSAgICAgICAgZXJyMiA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RDbG9zZSgKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVycjIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCk6IG1fcFJlYWRlci0+bV9wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZXN0cm95IHRoZSAzR1BQIG9yIE1QMyByZWFkZXIgY29udGV4dCAqLwotICAgICAgICBlcnIyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdERlc3Ryb3koCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCgpOiBtX3BSZWFkZXItPm1fcEZjdERlc3Ryb3kgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIGVyciA9IGVycjI7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZihwQ2xpcEN0eHQtPnBQbGFuZVl1diAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGlmKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1diA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0ICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgaWYocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QpOwotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHNoZWxscyBpbnRlcmZhY2VzICovCi0gICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxXcml0ZXJzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCZwQ2xpcEN0eHQtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFJlYWRlcnMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoJnBDbGlwQ3R4dC0+U2hlbGxBUEkpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcDogcENsaXBDdHh0PTB4JXgiLCBwQ2xpcEN0eHQpOwotICAgIC8qKgotICAgICogRnJlZSB0aGUgY2xpcCBjb250ZXh0ICovCi0gICAgZnJlZShwQ2xpcEN0eHQpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9BTVJOQigpCi0gKiBAYnJpZWYgICBSZXR1cm4gdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBBTVIgTmFycm93LUJhbmQgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiBAcGFyYW0gICBwQXVkaW9GcmFtZSAgIChJTikgQU1STkIgZnJhbWUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1I6IE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoIE00T1NBX01lbUFkZHI4IHBBdWRpb0ZyYW1lICkKLXsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVUeXBlID0gKCAoICpwQXVkaW9GcmFtZSkgJigweEYgPDwgMykpID4+IDM7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA5NTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNDc1MCBicHMgKi8KLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxMDM7Ci0gICAgICAgICAgICBicmVhazsgLyogIDUxNTAgYnBzICovCi0KLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTE4OwotICAgICAgICAgICAgYnJlYWs7IC8qICA1OTAwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDEzNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgNjcwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAxNDg7Ci0gICAgICAgICAgICBicmVhazsgLyogIDc0MDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMTU5OwotICAgICAgICAgICAgYnJlYWs7IC8qICA3OTUwIGJwcyAqLwotCi0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDIwNDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAxMDIwMCBicHMgKi8KLQotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAyNDQ7Ci0gICAgICAgICAgICBicmVhazsgLyogMTIwMDAgYnBzICovCi0KLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgZnJhbWVTaXplID0gMzk7Ci0gICAgICAgICAgICBicmVhazsgLyogU0lEIChTaWxlbmNlKSAqLwotCi0gICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qIE5vIGRhdGEgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfQU1STkIoKTogQ29ycnVwdGVkIEFNUiBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9VSW50MzIgTTRWU1MzR1BQX2ludEdldEZyYW1lU2l6ZV9FVlJDKCkKLSAqIEBicmllZiAgIFJldHVybiB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIEVWUkMgZnJhbWUgY29udGFpbmVkIGluIHRoZSBnaXZlbiBidWZmZXIKLSAqIEBub3RlCi0gKiAgICAgMCAxIDIgMwotICogICAgKy0rLSstKy0rCi0gKiAgICB8ZnIgdHlwZXwgICAgICAgICAgICAgIFJGQyAzNTU4Ci0gKiAgICArLSstKy0rLSsKLSAqCi0gKiBGcmFtZSBUeXBlOiA0IGJpdHMKLSAqICAgIFRoZSBmcmFtZSB0eXBlIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyBkYXRhCi0gKiAgICBmcmFtZSBpbiB0aGUgUlRQIHBhY2tldC4KLSAqCi0gKiBGb3IgRVZSQyBhbmQgU01WIGNvZGVjcywgdGhlIGZyYW1lIHR5cGUgdmFsdWVzIGFuZCBzaXplIG9mIHRoZQotICogYXNzb2NpYXRlZCBjb2RlYyBkYXRhIGZyYW1lIGFyZSBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93OgotICoKLSAqIFZhbHVlICAgUmF0ZSAgICAgIFRvdGFsIGNvZGVjIGRhdGEgZnJhbWUgc2l6ZSAoaW4gb2N0ZXRzKQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgIDAgICAgIEJsYW5rICAgICAgMCAgICAoMCBiaXQpCi0gKiAgIDEgICAgIDEvOCAgICAgICAgMiAgICAoMTYgYml0cykKLSAqICAgMiAgICAgMS80ICAgICAgICA1ICAgICg0MCBiaXRzOyBub3QgdmFsaWQgZm9yIEVWUkMpCi0gKiAgIDMgICAgIDEvMiAgICAgICAxMCAgICAoODAgYml0cykKLSAqICAgNCAgICAgMSAgICAgICAgIDIyICAgICgxNzEgYml0czsgNSBwYWRkZWQgYXQgZW5kIHdpdGggemVyb3MpCi0gKiAgIDUgICAgIEVyYXN1cmUgICAgMCAgICAoU0hPVUxEIE5PVCBiZSB0cmFuc21pdHRlZCBieSBzZW5kZXIpCi0gKgotICogQHBhcmFtICAgcENwQXVkaW9GcmFtZSAgIChJTikgRVZSQyBmcmFtZQotICogQHJldHVybiAgTTROT19FUlJPUjogTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfVUludDMyIE00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQyggTTRPU0FfTWVtQWRkcjggcEF1ZGlvRnJhbWUgKQotewotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAwOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVR5cGUgPSAoICpwQXVkaW9GcmFtZSkgJjB4MEY7Ci0KLSAgICBzd2l0Y2goIGZyYW1lVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgYnJlYWs7IC8qICBibGFuayAqLwotCi0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE2OwotICAgICAgICAgICAgYnJlYWs7IC8qICAxLzggKi8KLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBmcmFtZVNpemUgPSA0MDsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMS80ICovCi0KLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgZnJhbWVTaXplID0gODA7Ci0gICAgICAgICAgICBicmVhazsgLyogIDEvMiAqLwotCi0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDE3MTsKLSAgICAgICAgICAgIGJyZWFrOyAvKiAgMSAqLwotCi0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsgLyogIGVyYXN1cmUgKi8KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRHZXRGcmFtZVNpemVfRVZSQygpOiBDb3JydXB0ZWQgRVZSQyBmcmFtZSEgcmV0dXJuaW5nIDAuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDEgKyAoKCBmcmFtZVNpemUgKyA3KSAvIDgpKTsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0FuZEdldENvZGVjQWFjUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNEFEX0J1ZmZlciBvdXRwdXRCdWZmZXI7Ci0gICAgdWludDMyX3Qgb3B0aW9uVmFsdWUgPTA7Ci0KLSAgICAvLyBEZWNvZGUgZmlyc3QgYXVkaW8gZnJhbWUgZnJvbSBjbGlwIHRvIGdldCBwcm9wZXJ0aWVzIGZyb20gY29kZWMKLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RDcmVhdGVBdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgJnBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0sICYocENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzKSk7Ci0KLSAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlLAotICAgICAoTTRPU0FfRGF0YU9wdGlvbikgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQpOwotCi0gICAgcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BBdWRpb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbkF1ZGlvRGVjKAotICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX0F1ZGlvQVUsCi0gICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmcENsaXBDdHh0LT5BdWRpb0FVKTsKLQotICAgIGlmKCBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0U3RhcnRBdWRpb0RlYyAhPSBNNE9TQV9OVUxMICkgewotCi0gICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGFydEF1ZGlvRGVjKAotICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9EZWNDdHh0KTsKLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzOiBcCi0gICAgICAgICAgICAgICAgIG1fcEZjdFN0YXJ0QXVkaW9EZWMgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbG9jYXRlIG91dHB1dCBidWZmZXIgZm9yIHRoZSBhdWRpbyBkZWNvZGVyICovCi0gICAgb3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAqIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVTYW1wbGVTaXplCi0gICAgICAgICogcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fbmJDaGFubmVsczsKLQotICAgIGlmKCBvdXRwdXRCdWZmZXIubV9idWZmZXJTaXplID4gMCApIHsKLQotICAgICAgICBvdXRwdXRCdWZmZXIubV9kYXRhQWRkcmVzcyA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG91dHB1dEJ1ZmZlci5tX2J1ZmZlclNpemUgXAotICAgICAgICAgICAgKnNpemVvZihzaG9ydCksIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikib3V0cHV0QnVmZmVyLm1fYnVmZmVyU2l6ZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IG91dHB1dEJ1ZmZlci5tX2RhdGFBZGRyZXNzICkgewotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzKCk6XAotICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgb3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RTdGVwQXVkaW9EZWMoCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsIE00T1NBX05VTEwsICZvdXRwdXRCdWZmZXIsIE00T1NBX0ZBTFNFKTsKLQotICAgIGlmICggZXJyID09IE00V0FSX0lORk9fRk9STUFUX0NIQU5HRSApIHsKLQotICAgICAgICAvLyBHZXQgdGhlIHByb3BlcnRpZXMgZnJvbSBjb2RlYyBub2RlCi0gICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvRGVjQ3R4dCwKLSAgICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9OYkNoYW5uZWxzLCAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYU51bUNoYW4gPSBvcHRpb25WYWx1ZTsKLSAgICAgICAgLy8gUmVzZXQgUmVhZGVyIHN0cnVjdHVyZSB2YWx1ZSBhbHNvCi0gICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHMgPSBvcHRpb25WYWx1ZTsKLQotICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb0RlY0N0eHQsCi0gICAgICAgICAgTTRBRF9rT3B0aW9uSURfQXVkaW9TYW1wRnJlcXVlbmN5LCAoTTRPU0FfRGF0YU9wdGlvbikgJm9wdGlvblZhbHVlKTsKLQotICAgICAgICBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVNhbXBGcmVxID0gb3B0aW9uVmFsdWU7Ci0gICAgICAgIC8vIFJlc2V0IFJlYWRlciBzdHJ1Y3R1cmUgdmFsdWUgYWxzbwotICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IG9wdGlvblZhbHVlOwotCi0gICAgfSBlbHNlIGlmKCBlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludENoZWNrQW5kR2V0Q29kZWNBYWNQcm9wZXJ0aWVzOlwKLSAgICAgICAgICAgIG1fcEZjdFN0ZXBBdWRpb0RlYyByZXR1cm5zIGVyciA9IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIGZyZWUob3V0cHV0QnVmZmVyLm1fZGF0YUFkZHJlc3MpOwotCi0gICAgLy8gUmVzZXQgdGhlIHN0cmVhbSByZWFkZXIKLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0UmVzZXQoCi0gICAgIHBDbGlwQ3R4dC0+cFJlYWRlckNvbnRleHQsCi0gICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0pOwotCi0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50Q2hlY2tBbmRHZXRDb2RlY0FhY1Byb3BlcnRpZXNcCi0gICAgICAgICAgICBFcnJvciBpbiByZXNldGluZyByZWFkZXI6IDB4JXgiLCBlcnIpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0NsaXBBbmFseXNpcy5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUyYzZkN2EuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfQ2xpcEFuYWx5c2lzLmMKLSAqIEBicmllZiAgICBJbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMgcmVsYXRlZCB0byBhbmFseXNpcyBvZiBpbnB1dCBjbGlwcwotICogQG5vdGUgICAgQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIHN0YXRpYywgaS5lLiBub24gcHVibGljCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotLyoqKioqKioqKioqKioqKiovCi0vKioqIEluY2x1ZGVzICoqKi8KLS8qKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotLyoqCi0gKiAgICBPdXIgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00VlNTM0dQUF9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsQ29uZmlnLmgiCi0jaW5jbHVkZSAiTTRWRF9FWFRFUk5BTF9JbnRlcmZhY2UuaCIKLQotCi0vKioKLSAqICAgIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKiBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qIE9TQUwgZGVidWcgbWFuYWdlbWVudCAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjaGVja2luZyBpZiBhIGNsaXAgaXMgY29tcGF0aWJsZSB3aXRoIFZTUyAzR1BQIGVkaXRpbmcKLSAqIEBub3RlICAgIEl0IGFsc28gZmlsbHMgYSBDbGlwQW5hbHlzaXMgc3RydWN0dXJlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0d28KLSAqICAgICAgICBjbGlwcyBhcmUgY29tcGF0aWJsZQotICogQHBhcmFtICAgIHBDbGlwICAgICAgICAgICAgICAgIChJTikgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBpbnB1dCAzR1BQL01QMyBjbGlwIGZpbGUuCi0gKiBAcGFyYW0gICAgcENsaXBQcm9wZXJ0aWVzICAgICAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBDbGlwUHJvcGVydGllcyBzdHJ1Y3R1cmUuCi0gKiBAcGFyYW0gICAgRmlsZVR5cGUgICAgICAgICAgICAoSU4pIFR5cGUgb2YgdGhlIGlucHV0IGZpbGUgKC4zZ3AsIC5hbXIsIC5tcDMpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVECi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0gyNjNfUFJPRklMRQotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9QUk9GSUxFCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1JWTEMKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVAotICogQHJldHVybiAgIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfVklERU9fU1RSRUFNX0lOX0ZJTEUKLSAqIEByZXR1cm4gICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUCi0gKiBAcmV0dXJuICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCggTTRPU0FfVm9pZCAqcENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19GaWxlVHlwZSBGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIgKnBGaWxlUmVhZFB0ckZjdCApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIENsaXBTZXR0aW5nczsKLQotICAgIE00T1NBX1RSQUNFM18yKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCBjYWxsZWQgd2l0aCBwQ2xpcD0weCV4LCBwQ2xpcFByb3BlcnRpZXM9MHgleCIsCi0gICAgICAgIHBDbGlwLCBwQ2xpcFByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwOiBwQ2xpcCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwUHJvcGVydGllcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6IHBDbGlwUHJvcGVydGllcyBpcyBNNE9TQV9OVUxMIik7Ci0KLSAgICAvKioKLSAgICAqIEJ1aWxkIGR1bW15IGNsaXAgc2V0dGluZ3MsIGluIG9yZGVyIHRvIHVzZSB0aGUgZWRpdENsaXBPcGVuIGZ1bmN0aW9uICovCi0gICAgQ2xpcFNldHRpbmdzLnBGaWxlID0gcENsaXA7Ci0gICAgQ2xpcFNldHRpbmdzLkZpbGVUeXBlID0gRmlsZVR5cGU7Ci0gICAgQ2xpcFNldHRpbmdzLnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICBDbGlwU2V0dGluZ3MudWlFbmRDdXRUaW1lID0gMDsKLQotICAgIC8qIENsaXAgcHJvcGVydGllcyBub3QgYnVpbGQgeWV0LCBzZXQgYXQgbGVhc3QgdGhpcyBmbGFnICovCi0gICAgQ2xpcFNldHRpbmdzLkNsaXBQcm9wZXJ0aWVzLmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBPcGVuIHRoZSBjbGlwIGluIGZhc3Qgb3BlbiBtb2RlICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBJbml0KCZwQ2xpcENvbnRleHQsIHBGaWxlUmVhZFB0ckZjdCk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludENsaXBJbml0KCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEZyZWUgdGhlIGNsaXAgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcE9wZW4ocENsaXBDb250ZXh0LCAmQ2xpcFNldHRpbmdzLCBNNE9TQV9GQUxTRSwKLSAgICAgICAgTTRPU0FfVFJVRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludENsaXBPcGVuKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotCi0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEhlcmUgaXQgaXMgYmV0dGVyIHRvIHJldHVybiB0aGUgRWRpdGluZyBzcGVjaWZpYyBlcnJvciBjb2RlICovCi0gICAgICAgIGlmKCAoICgoTTRPU0FfVUludDMyKU00RVJSX0RFQ09ERVJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQpID09IGVycikKLSAgICAgICAgICAgIHx8ICgoKE00T1NBX1VJbnQzMilNNEVSUl9ERUNPREVSX0gyNjNfTk9UX0JBU0VMSU5FKSA9PSBlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0QW5hbHlzZUNsaXA6XAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwT3BlbigpIHJldHVybnMgTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSDI2M19QUk9GSUxFX05PVF9TVVBQT1JURUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFuYWx5c2UgdGhlIGNsaXAgKi8KLSAgICBpZihNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggIT0gcENsaXBDb250ZXh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlKSB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKHBDbGlwQ29udGV4dCwgcENsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDogTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRnJlZSB0aGUgY2xpcCAqLwotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwQ29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogRnJlZSB0aGUgY2xpcCAqLwotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwQ2xvc2UocENsaXBDb250ZXh0KTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwOiBNNFZTU19pbnRDbGlwQ2xvc2UoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayB0aGUgY2xpcCBpcyBjb21wYXRpYmxlIHdpdGggVlNTIGVkaXRpbmcgKi8KLSAgICBpZihNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggIT0gQ2xpcFNldHRpbmdzLkZpbGVUeXBlKSB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcocENsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcDpcCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcCgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIHR3byBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgZm9yCi0gKiAgICAgICAgVlNTIDNHUFAgZWRpdGluZyBhc3NlbWJseSBmZWF0dXJlLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ2xpcDFQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIGZpcnN0IGNsaXAKLSAqIEBwYXJhbSAgICBwQ2xpcDJQcm9wZXJ0aWVzICAgICAgICAoSU4pIENsaXAgYW5hbHlzaXMgb2YgdGhlIHNlY29uZCBjbGlwCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04KLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRk9STUFUCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fVElNRV9TQ0FMRQotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19EQVRBX1BBUlRJVElPTklORwotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkKLSAqIEByZXR1cm4gIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcDFQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgKnBDbGlwMlByb3BlcnRpZXMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiB2aWRlb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiBhdWRpb19lcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgTTRPU0FfQm9vbCBiQ2xpcDFJc0FBQyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkNsaXAySXNBQUMgPSBNNE9TQV9GQUxTRTsKLQotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkgY2FsbGVkIHdpdGggcENsaXAxQW5hbHlzaXM9MHgleCxcCi0gICAgICAgICAgICAgICAgICAgcENsaXAyQW5hbHlzaXM9MHgleCIsIHBDbGlwMVByb3BlcnRpZXMsIHBDbGlwMlByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXAxUHJvcGVydGllcyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTogcENsaXAxUHJvcGVydGllcyBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwMlByb3BlcnRpZXMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHk6IHBDbGlwMlByb3BlcnRpZXMgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgaWYoICggTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyA9PSBwQ2xpcDFQcm9wZXJ0aWVzLT5GaWxlVHlwZSkKLSAgICAgICAgfHwgKE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVIgPT0gcENsaXAxUHJvcGVydGllcy0+RmlsZVR5cGUpICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQ2xpcDFQcm9wZXJ0aWVzICE9IHBDbGlwMlByb3BlcnRpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OiBNUDMgQ0FOIE9OTFkgQkUgQ1VULFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX01QM19BU1NFTUJMWTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFdlIGFyZSBpbiBWU1MgU3BsaXR0ZXIgbW9kZSAqLwotICAgICAgICAgICAgZ290byBhdWRpb19hbmFseXNpczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqIEF1ZGlvICoqKioqKioqKioqKi8KLQotYXVkaW9fYW5hbHlzaXM6Ci0gICAgaWYoIE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gIT0gcENsaXAxUHJvcGVydGllcy0+Ci0gICAgICAgIEF1ZGlvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBhdWRpbyBmb3JtYXQgaXMgQUFDICovCi0gICAgICAgIHN3aXRjaCggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDcGx1czoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa2VBQUNwbHVzOgotICAgICAgICAgICAgICAgIGJDbGlwMUlzQUFDID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwQ2xpcDJQcm9wZXJ0aWVzLT4KLSAgICAgICAgQXVkaW9TdHJlYW1UeXBlICkgLyoqPCBpZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGF1ZGlvIGZvcm1hdCBpcyBBQUMgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgYkNsaXAySXNBQUMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgdGhlcmUgaXMgbm8gYXVkaW8sIHRoZSBjbGlwcyBhcmUgY29tcGF0aWJsZXMgLi4uICovCi0gICAgaWYoICggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICE9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8pCi0gICAgICAgICYmIChwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgIT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbykgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBoYXZlIHNhbWUgYXVkaW8gc3RyZWFtIHR5cGUKLSAgICAgICAgKiBBbmQgbGV0X3Mgc2F5IEFBQywgQUFDKyBhbmQgZUFBQysgYXJlIG1peGFibGUgKi8KLSAgICAgICAgaWYoICggcENsaXAxUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAhPSBwQ2xpcDJQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUpCi0gICAgICAgICAgICAmJiAoKCBNNE9TQV9GQUxTRSA9PSBiQ2xpcDFJc0FBQykgfHwgKE00T1NBX0ZBTFNFID09IGJDbGlwMklzQUFDKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgICAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIEF1ZGlvIFN0cmVhbSBUeXBlIik7Ci0KLSAgICAgICAgICAgIGF1ZGlvX2VyciA9IE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NUUkVBTV9UWVBFOwotICAgICAgICAgICAgZ290byBhbmFseXNpc19kb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYm90aCBjbGlwcyBoYXZlIHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgICAgIGlmKCBwQ2xpcDFQcm9wZXJ0aWVzLT51aU5iQ2hhbm5lbHMgIT0gcENsaXAyUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2hlY2tDbGlwQ29tcGF0aWJpbGl0eTogQ2xpcHMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBOYiBvZiBDaGFubmVscyIpOwotICAgICAgICAgICAgYXVkaW9fZXJyID0gTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fTkJfT0ZfQ0hBTk5FTFM7Ci0gICAgICAgICAgICBnb3RvIGFuYWx5c2lzX2RvbmU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBib3RoIGNsaXBzIGhhdmUgc2FtZSBzYW1wbGluZyBmcmVxdWVuY3kgKi8KLSAgICAgICAgaWYoIHBDbGlwMVByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICE9IHBDbGlwMlByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDaGVja0NsaXBDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgICAgICBDbGlwcyBkb24ndCBoYXZlIHRoZSBzYW1lIFNhbXBsaW5nIEZyZXF1ZW5jeSIpOwotICAgICAgICAgICAgYXVkaW9fZXJyID0gTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZOwotICAgICAgICAgICAgZ290byBhbmFseXNpc19kb25lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcENsaXAyUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotCi1hbmFseXNpc19kb25lOgotICAgIGlmKCB2aWRlb19lcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgIHJldHVybiB2aWRlb19lcnI7Ci0KLSAgICBpZiggYXVkaW9fZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICByZXR1cm4gYXVkaW9fZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKQotICogQGJyaWVmICAgIEdldCB2aWRlbyBhbmQgYXVkaW8gcHJvcGVydGllcyBmcm9tIHRoZSBjbGlwIHN0cmVhbXMKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gbXVzdCByZXR1cm4gZmF0YWwgZXJyb3JzIG9ubHkgKGVycm9ycyB0aGF0IHNob3VsZCBub3QgaGFwcGVuCi0gKiAgICAgICAgaW4gdGhlIGZpbmFsIGludGVncmF0ZWQgcHJvZHVjdCkuCi0gKiBAcGFyYW0gICBwQ2xpcEN0eHQgICAgICAgICAgICAoSU4pIGludGVybmFsIGNsaXAgY29udGV4dAotICogQHBhcmFtICAgIHBDbGlwUHJvcGVydGllcyAgICAgICAgKE9VVCkgUG9pbnRlciB0byBhIHZhbGlkIENsaXBQcm9wZXJ0aWVzIHN0cnVjdHVyZS4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIERlY0NvbmZpZ0luZm87Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSBkdW1teVNpemU7Ci0gICAgTTRERUNPREVSX0FWQ1Byb2ZpbGVMZXZlbCBBVkNQcm9mbGU7Ci0KLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJBbmFseXNlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCB2aWRlbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lVmlkZW87Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBWaWRlb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9NYXhBdVNpemUgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1RpbWVTY2FsZSA9IDA7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5mQXZlcmFnZUZyYW1lUmF0ZSA9IDAuMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9Qcm9maWxlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9QUk9GSUxFOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0xldmVsID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfVklERU9fVU5LTk9XTl9MRVZFTDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNGRhdGFQYXJ0aXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJ2bGMgPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJlc3luY2hNYXJrZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIG1lbXNldCgodm9pZCAqKSAmcENsaXBQcm9wZXJ0aWVzLT5mdHlwLDAsCi0gICAgICAgIHNpemVvZihwQ2xpcFByb3BlcnRpZXMtPmZ0eXApKTsKLQotICAgIC8qKgotICAgICogVmlkZW8gQW5hbHlzaXMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbSApCi0gICAgewotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9XaWR0aCA9IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX3ZpZGVvV2lkdGg7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0hlaWdodCA9IHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX3ZpZGVvSGVpZ2h0OwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmZBdmVyYWdlRnJhbWVSYXRlID0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2F2ZXJhZ2VGcmFtZVJhdGU7Ci0KLSAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVBFRzQ7Ci0KLSAgIC8qIFRoaXMgaXNzdWUgaXMgc28gaW5jcmVkaWJseSBzdHVwaWQgdGhhdCBpdCdzIGRlcHJlc3NpbmcuIEJhc2ljYWxseSwgYSBmaWxlIGNhbiBiZSBhbmFseXNlZAotICAgb3V0c2lkZSBvZiBhbnkgY29udGV4dCAoYmVzaWRlcyB0aGF0IG9mIHRoZSBjbGlwIGl0c2VsZiksIHNvIHRoYXQgZm9yIGluc3RhbmNlIHR3byBjbGlwcyBjYW4KLSAgIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkgYmVmb3JlIGFsbG9jYXRpbmcgYW4gZWRpdCBjb250ZXh0IGZvciBlZGl0aW5nIHRoZW0uIEJ1dCB0aGlzCi0gICBtZWFucyB0aGVyZSBpcyBubyB3YXkgaW4gaGVjayB0byBwYXNzIGFuIGV4dGVybmFsIHZpZGVvIGRlY29kZXIgKHRvIGJlZ2luIHdpdGgpIHRvIHRoaXMKLSAgIGZ1bmN0aW9uLCBhcyB0aGV5IHdvcmsgYnkgYmVpbmcgcmVnaXN0ZXJlZCBpbiBhbiBleGlzdGluZyBjb250ZXh0OyBmdXJ0aGVybW9yZSwgaXQgaXMgYWN0dWFsbHkKLSAgIHByZXR0eSBvdmVya2lsbCB0byB1c2UgYSBmdWxsIGRlY29kZXIgZm9yIHRoYXQsIG1vcmVzbyBhIEhBUkRXQVJFIGRlY29kZXIganVzdCB0byBnZXQgdGhlCi0gICBjbGlwIGNvbmZpZyBpbmZvLiBJbiBmYWN0LCB0aGUgaGFyZHdhcmUgaXRzZWxmIGRvZXNuJ3QgcHJvdmlkZSB0aGlzIHNlcnZpY2UsIGluIHRoZSBjYXNlIG9mIGEKLSAgIEhXIGRlY29kZXIsIHRoZSBzaGVsbCBidWlsZHMgdGhlIGNvbmZpZyBpbmZvIGl0c2VsZiwgc28gd2UgZG9uJ3QgbmVlZCB0aGUgYWN0dWFsIGRlY29kZXIsIG9ubHkKLSAgIGEgZGV0YWNoZWQgZnVuY3Rpb25hbGl0eSBvZiBpdC4gU28gaW4gY2FzZSBIVy9leHRlcm5hbCBkZWNvZGVycyBtYXkgYmUgcHJlc2VudCwgd2UgaW5zdGVhZCB1c2UKLSAgIGRpcmVjdGx5IHRoZSBEU0kgcGFyc2luZyBmdW5jdGlvbiBvZiB0aGUgc2hlbGwgSFcgZGVjb2RlciAod2hpY2ggd2Uga25vdyB0byBiZSBwcmVzZW50LCBzaW5jZQotICAgSFcgZGVjb2RlcnMgYXJlIHBvc3NpYmxlKSB0byBnZXQgdGhlIGNvbmZpZyBpbmZvLiBOb3RpY2UgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGV2ZW4gaWYgdGhlCi0gICBzb2Z0d2FyZSBkZWNvZGVyIGlzIGFjdHVhbGx5IHByZXNlbnQgYW5kIGV2ZW4gaWYgaXQgd2lsbCBlbmQgdXAgYmVpbmcgYWN0dWFsbHkgdXNlZDogZmlndXJpbmcKLSAgIG91dCB0aGUgY29uZmlnIGRvZXMgbm90IGludm9sdmUgYWN0dWFsIGRlY29kaW5nIG5vciB0aGUgcGFydGljdWxhcml0aWVzIG9mIGEgc3BlY2lmaWMgZGVjb2RlciwKLSAgIGl0J3MgdGhlIGZhY3QgdGhhdCBpdCdzIE1QRUc0IHRoYXQgbWF0dGVycywgc28gaXQgc2hvdWxkIG5vdCBiZSBmdW5jdGlvbmFsbHkgYW55IGRpZmZlcmVudAotICAgZnJvbSB0aGUgd2F5IGl0IHdhcyBkb25lIGJlZm9yZSAoYW5kIGl0J3MgbGlnaHQgZW5vdWdoIGZvciBwZXJmb3JtYW5jZSBub3QgdG8gYmUgYW55IHByb2JsZW0KLSAgICAgICAgIHdoYXRzb2V2ZXIpLiAqLwotCi0gICAgICAgICAgICAgICAgZXJyID0gTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0kocENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRlY0NvbmZpZ0luZm8sICZkdW1teVNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX0VYVEVSTkFMX1BhcnNlVmlkZW9EU0kgcmV0dXJucyAweCUwOFgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1RpbWVTY2FsZSA9Ci0gICAgICAgICAgICAgICAgICAgIERlY0NvbmZpZ0luZm8udWlUaW1lU2NhbGU7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRkYXRhUGFydGl0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgRGVjQ29uZmlnSW5mby5iRGF0YVBhcnRpdGlvbjsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJNUEVHNHJ2bGMgPQotICAgICAgICAgICAgICAgICAgICBEZWNDb25maWdJbmZvLmJVc2VPZlJWTEM7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iTVBFRzRyZXN5bmNoTWFya2VyID0KLSAgICAgICAgICAgICAgICAgICAgRGVjQ29uZmlnSW5mby51aVVzZU9mUmVzeW5jaE1hcmtlcjsKLSAgICAgICAgICAgICAgICBlcnIgPSBnZXRNUEVHNFByb2ZpbGVBbmRMZXZlbChEZWNDb25maWdJbmZvLnVpUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBDbGlwUHJvcGVydGllcy0+dWlWaWRlb1Byb2ZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTGV2ZWwpKTsKLSAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1QRUc0UHJvZmlsZUFuZExldmVsIHJldHVybnMgMHglMDhYIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5WaWRlb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICAvKiBIMjYzIHRpbWUgc2NhbGUgaXMgYWx3YXlzIDMwMDAwICovCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvVGltZVNjYWxlID0gMzAwMDA7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBnZXRIMjYzUHJvZmlsZUFuZExldmVsKHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9Qcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9MZXZlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50QnVpbGRBbmFseXNpcygpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SDI2M1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIGVyciA9IGdldEFWQ1Byb2ZpbGVBbmRMZXZlbChwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvTGV2ZWwpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXMoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFWQ1Byb2ZpbGVBbmRMZXZlbCByZXR1cm5zIDB4JTA4WCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEJ1aWxkQW5hbHlzaXM6IHVua25vd24gaW5wdXQgdmlkZW8gZm9ybWF0ICgweCV4KSxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICAgICAgIC8qKiBXZSBkbyBub3QgcmV0dXJuIGVycm9yIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgKiAgVGhlIHZpZGVvIGZvcm1hdCBjb21wYXRpYmlsaXR5IGNoZWNrIHdpbGwgYmUgZG9uZSBsYXR0ZXIgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwVmlkZW9EdXJhdGlvbiA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uOwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplOwotCi0gICAgICAgIC8qIGlmIHZpZGVvIGJpdHJhdGUgbm90IGF2YWlsYWJsZSByZXRyaWV2ZSBhbiBlc3RpbWF0aW9uIG9mIHRoZSBvdmVyYWxsIGJpdHJhdGUgKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cFZpZGVvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0KLSAgICAgICAgaWYoIDAgPT0gcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RHZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUmVhZGVyQ29udGV4dCwgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGUsCi0gICAgICAgICAgICAgICAgJnBDbGlwUHJvcGVydGllcy0+dWlWaWRlb0JpdHJhdGUpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogd2UgZ2V0IHRoZSBvdmVyYWxsIGJpdHJhdGUsIHN1YnN0cmFjdCB0aGUgYXVkaW8gYml0cmF0ZSBpZiBhbnkgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9CaXRyYXRlIC09Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXNldCBhdWRpbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tOb25lQXVkaW87Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBBdWRpb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9NYXhBdVNpemUgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDbGlwUHJvcGVydGllcy0+dWlFeHRlbmRlZFNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBwQ2xpcFByb3BlcnRpZXMtPnVpRGVjb2RlZFBjbVNpemUgPSAwOwotCi0gICAgLyoqCi0gICAgKiBBdWRpbyBBbmFseXNpcyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtICkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCggcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BbXJOYXJyb3dCYW5kOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQU1SX05COwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQUFDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzOgotCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTVAzOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvRXZyYzoKLQotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa0VWUkM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9QY206Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSA9IE00VklERU9FRElUSU5HX2tQQ007Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzOiB1bmtub3duIGlucHV0IGF1ZGlvIGZvcm1hdCAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiEiLAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9zdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgTTROT19FUlJPUjsgLyoqPCBXZSBkbyBub3QgcmV0dXJuIGVycm9yIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBhdWRpbyBmb3JtYXQgY29tcGF0aWJpbGl0eSBjaGVjayB3aWxsIGJlIGRvbmUgbGF0dGVyICovCi0gICAgICAgIH0KLQotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQXVkaW9NYXhBdVNpemUgPQotICAgICAgICAgICAgcENsaXBDdHh0LT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fbWF4QVVTaXplOwotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcEF1ZGlvRHVyYXRpb24gPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9iYXNpY1Byb3BlcnRpZXMubV9kdXJhdGlvbjsKLQotICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyA9IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9zYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aURlY29kZWRQY21TaXplID0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2J5dGVGcmFtZUxlbmd0aAotICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9ieXRlU2FtcGxlU2l6ZQotICAgICAgICAgICAgKiBwQ2xpcEN0eHQtPnBBdWRpb1N0cmVhbS0+bV9uYkNoYW5uZWxzOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEJ1Z2ZpeCBQNE1FMDAwMDExMjg6IFdpdGggc29tZSBJTVRDIGZpbGVzLCB0aGUgQU1SIGJpdCByYXRlIGlzIDAga2JwcwotICAgICAgICBhY2NvcmRpbmcgdGhlIEdldFByb3BlcnRpZXMgZnVuY3Rpb24gKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKXBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT4KLSAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fYXZlcmFnZUJpdFJhdGU7Ci0KLSAgICAgICAgaWYoIDAgPT0gcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rQU1SX05CID09IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqQmV0dGVyIHJldHVybmluZyBhIGd1ZXNzZWQgMTIuMiBrYnBzIHZhbHVlIHRoYW4gYSBzdXJlLXRvLWJlLWZhbHNlIDAga2JwcyB2YWx1ZSEqLwotICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUgPSBNNFZTUzNHUFBfQU1SX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00VklERU9FRElUSU5HX2tFVlJDID09IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqQmV0dGVyIHJldHVybmluZyBhIGd1ZXNzZWQgOS4yIGticHMgdmFsdWUgdGhhbiBhIHN1cmUtdG8tYmUtZmFsc2UgMCBrYnBzIHZhbHVlISovCi0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FVlJDX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LCBNNFJFQURFUl9rT3B0aW9uSURfQml0cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgJnBDbGlwUHJvcGVydGllcy0+dWlBdWRpb0JpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBDdHh0LT5wVmlkZW9TdHJlYW0gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogd2UgZ2V0IHRoZSBvdmVyYWxsIGJpdHJhdGUsIHN1YnN0cmFjdCB0aGUgdmlkZW8gYml0cmF0ZSBpZiBhbnkgKi8KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUF1ZGlvQml0cmF0ZSAtPSBwQ2xpcEN0eHQtPnBWaWRlb1N0cmVhbS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIE5ldyBhYWMgcHJvcGVydGllcyAqLwotICAgICAgICBpZiggTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMKLSAgICAgICAgICAgID09IHBDbGlwQ3R4dC0+cEF1ZGlvU3RyZWFtLT5tX2Jhc2ljUHJvcGVydGllcy5tX3N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscyA9IHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hTnVtQ2hhbjsKLSAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5BYWNQcm9wZXJ0aWVzLmFTYW1wRnJlcTsKLQotICAgICAgICAgICAgaWYoIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hU0JSUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rQUFDcGx1czsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+QWFjUHJvcGVydGllcy5hRXh0ZW5zaW9uU2FtcEZyZXE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwQ2xpcEN0eHQtPkFhY1Byb3BlcnRpZXMuYVBTUHJlc2VudCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBHZXQgJ2Z0eXAnIGF0b20gKi8KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICBwQ2xpcEN0eHQtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveCwgJnBDbGlwUHJvcGVydGllcy0+ZnR5cCk7Ci0KLSAgICAvKioKLSAgICAqIFdlIHdyaXRlIHRoZSBWU1MgM0dQUCB2ZXJzaW9uIGluIHRoZSBjbGlwIGFuYWx5c2lzIHRvIGJlIHN1cmUgdGhlIGludGVncmF0b3IgZG9lc24ndAotICAgICogbWl4IG9sZGVyIGFuYWx5c2lzIHJlc3VsdHMgd2l0aCBuZXdlciBsaWJyYXJpZXMgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gPSBNNFZJREVPRURJVElOR19WRVJTSU9OX01BSk9SOwotICAgIHBDbGlwUHJvcGVydGllcy0+VmVyc2lvblsxXSA9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1I7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzJdID0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9SRVZJU0lPTjsKLQotICAgIHBDbGlwUHJvcGVydGllcy0+RmlsZVR5cGUgPSBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+RmlsZVR5cGU7Ci0KLSAgICBpZiggcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBWaWRlb0R1cmF0aW9uCi0gICAgICAgID4gcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBBdWRpb0R1cmF0aW9uICkKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aUNsaXBEdXJhdGlvbiA9IHBDbGlwUHJvcGVydGllcy0+dWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICBlbHNlCi0gICAgICAgIHBDbGlwUHJvcGVydGllcy0+dWlDbGlwRHVyYXRpb24gPSBwQ2xpcFByb3BlcnRpZXMtPnVpQ2xpcEF1ZGlvRHVyYXRpb247Ci0KLSAgICAvKiBSZXNldCBjb21wYXRpYmlsaXR5IGNoYXJ0ICovCi0gICAgcENsaXBQcm9wZXJ0aWVzLT5iVmlkZW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBQcm9wZXJ0aWVzLT5iVmlkZW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9IE00T1NBX0ZBTFNFOwotICAgIHBDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qIEFuYWx5c2lzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgKi8KLSAgICBwQ2xpcFByb3BlcnRpZXMtPmJBbmFseXNlZCA9IE00T1NBX1RSVUU7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRCdWlsZEFuYWx5c2lzKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKQotICogQGJyaWVmICAgIENoZWNrIGlmIHRoZSBjbGlwIGlzIGNvbXBhdGlibGUgd2l0aCBWU1MgZWRpdGluZwotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBDbGlwQ3R4dCAgICAgICAgICAgIChJTikgaW50ZXJuYWwgY2xpcCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcENsaXBQcm9wZXJ0aWVzICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmFsaWQgQ2xpcFByb3BlcnRpZXMgc3RydWN0dXJlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKAotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgKQotewotICAgIE00T1NBX1VJbnQzMiB1aU5iT2ZWYWxpZFN0cmVhbXMgPSAwOwotICAgIE00T1NBX0VSUiB2aWRlb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX0VSUiBhdWRpb19lcnIgPSBNNE5PX0VSUk9SOwotICAgIC8qKioqKioqKiogZmlsZSB0eXBlICoqKioqKioqKi8KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SID09IHBDbGlwUHJvcGVydGllcy0+RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZzpcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9BTVJfRURJVElOR19VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyA9PSBwQ2xpcFByb3BlcnRpZXMtPkZpbGVUeXBlICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBWaWRlbyAqKioqKioqKiovCi0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbwotICAgICAgICAhPSBwQ2xpcFByb3BlcnRpZXMtPlZpZGVvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYSB2aWRlbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qIENoZWNrIHZpZGVvIGZvcm1hdCBpcyBNUEVHLTQsIEgyNjMgb3IgSDI2NCAqLwotICAgICAgICBzd2l0Y2goIHBDbGlwUHJvcGVydGllcy0+VmlkZW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2MzoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa01QRUc0OgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rSDI2NDoKLSAgICAgICAgICAgICAgICB1aU5iT2ZWYWxpZFN0cmVhbXMrKzsKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJWaWRlb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAvKjwgS08sIHdlIHJldHVybiBlcnJvciAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQ2xpcENvbXBhdGlibGVXaXRoVnNzRWRpdGluZygpOiB1bnN1cHBvcnRlZCB2aWRlbyBmb3JtYXQiKTsKLSAgICAgICAgICAgICAgICB2aWRlb19lcnIgPSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBBdWRpbyBvbmx5IHN0cmVhbSBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFZTUyBlZGl0aW5nIGZlYXR1cmUKLSAgICAgICAgKHVubGVzcyBpbiB0aGUgTVAzIGNhc2UpICovCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoKTogTm8gdmlkZW8gc3RyZWFtIGluIGNsaXAiKTsKLSAgICAgICAgdmlkZW9fZXJyID0gTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqIEF1ZGlvICoqKioqKioqKi8KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwQ2xpcFByb3BlcnRpZXMtPgotICAgICAgICBBdWRpb1N0cmVhbVR5cGUgKSAvKio8IGlmIHRoZXJlIGlzIGFuIGF1ZGlvIHN0cmVhbSAqLwotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgYXVkaW8gZm9ybWF0IGlzIEFNUi1OQiwgRVZSQyBvciBBQUMgKi8KLSAgICAgICAgc3dpdGNoKCBwQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIHVpTmJPZlZhbGlkU3RyZWFtcysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwQ2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDgwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVpTmJPZlZhbGlkU3RyZWFtcysrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgICAgIC8qPCBPSywgd2UgcHJvY2VlZCwgbm8gcmV0dXJuICovCi0gICAgICAgICAgICAgICAgdWlOYk9mVmFsaWRTdHJlYW1zKys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6IC8qPCBLTywgd2UgcmV0dXJuIGVycm9yICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IHVuc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIpOwotICAgICAgICAgICAgICAgIGF1ZGlvX2VyciA9IE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU2lsZW5jZSBpcyBhbHdheXMgZWRpdGFibGUgKi8KLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB2YWxpZCBzdHJlYW0gaW4gdGhlIGZpbGUuLi4gKi8KLSAgICBpZiggdmlkZW9fZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICByZXR1cm4gdmlkZW9fZXJyOwotCi0gICAgaWYoIGF1ZGlvX2VyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgcmV0dXJuIGF1ZGlvX2VycjsKLQotICAgIGlmKCAwID09IHVpTmJPZlZhbGlkU3RyZWFtcyApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IEZpbGUgY29udGFpbnMgbm8gc3VwcG9ydGVkIHN0cmVhbSxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9TVFJFQU1fSU5fRklMRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHkoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGNoZWNraW5nIGlmIHR3byBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIgZm9yCi0gKiAgICAgICAgVlNTIDNHUFAgYXVkaW8gbWl4aW5nIGZlYXR1cmUuCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTikgQ29udGV4dCBvZiB0aGUgYXVkaW8gbWl4ZXIKLSAqIEBwYXJhbSAgICBwSW5wdXRDbGlwUHJvcGVydGllcyAgICAgICAgKElOKSBDbGlwIGFuYWx5c2lzIG9mIHRoZSBmaXJzdCBjbGlwCi0gKiBAcGFyYW0gICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMgICAgICAgIChJTikgQ2xpcCBhbmFseXNpcyBvZiB0aGUgc2Vjb25kIGNsaXAKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTgotICogQHJldHVybiAgTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5KCBNNFZTUzNHUFBfSW50ZXJuYWxBdWRpb01peGluZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyAqcElucHV0Q2xpcFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQWRkZWRDbGlwUHJvcGVydGllcyApCi17Ci0gICAgTTRPU0FfQm9vbCBiQ2xpcDFJc0FBQyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkNsaXAySXNBQUMgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgc2V0dGluZ3MgKi8KLSAgICBwSW5wdXRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX0ZBTFNFOwotICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfRkFMU0U7Ci0gICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIHRoYXQgYW5hbHlzaXMgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoaXMgdmVyc2lvbiBvZiB0aGUgVlNTM0dQUCBsaWJyYXJ5ICovCi0gICAgaWYoICggcElucHV0Q2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gIT0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUikKLSAgICAgICAgfHwgKHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzFdICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IpCi0gICAgICAgIHx8IChwSW5wdXRDbGlwUHJvcGVydGllcy0+VmVyc2lvblsyXQotICAgICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHk6IFRoZSBjbGlwIGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZFwKLSAgICAgICAgICAgIGJ5IGFub3RoZXIgdmVyc2lvbiwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04iKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT047Ci0gICAgfQotCi0gICAgaWYoICggcEFkZGVkQ2xpcFByb3BlcnRpZXMtPlZlcnNpb25bMF0gIT0gTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUikKLSAgICAgICAgfHwgKHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5WZXJzaW9uWzFdICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IpCi0gICAgICAgIHx8IChwQWRkZWRDbGlwUHJvcGVydGllcy0+VmVyc2lvblsyXQotICAgICE9IE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb01peGluZ0NvbXBhdGliaWxpdHk6IFRoZSBjbGlwIGFuYWx5c2lzIGhhcyBiZWVuIGdlbmVyYXRlZFwKLSAgICAgICAgICAgIGJ5IGFub3RoZXIgdmVyc2lvbiwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT04iKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9DTElQX0FOQUxZU0lTX1ZFUlNJT047Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBpbnB1dCBmaWxlIHR5cGUgKioqKioqKioqLwotCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICE9IHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5GaWxlVHlwZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXVkaW9NaXhpbmdDb21wYXRpYmlsaXR5OlwKLSAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOUFVUX0NMSVBfSVNfTk9UX0FfM0dQUCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFA7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKiBpbnB1dCBhdWRpbyAqKioqKioqKiovCi0KLSAgICBpZiggTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyAhPSBwSW5wdXRDbGlwUHJvcGVydGllcy0+Ci0gICAgICAgIEF1ZGlvU3RyZWFtVHlwZSApIC8qKjwgaWYgdGhlcmUgaXMgYW4gYXVkaW8gc3RyZWFtICovCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBhdWRpbyBmb3JtYXQgaXMgQU1SLU5CIG9yIEFBQyAqLwotICAgICAgICBzd2l0Y2goIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBTVJfTkI6Ci0gICAgICAgICAgICAgICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rZUFBQ3BsdXM6Ci0gICAgICAgICAgICAgICAgc3dpdGNoKCBwSW5wdXRDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDAwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSA0ODAwMDoKLSAgICAgICAgICAgICAgICAgICAgcElucHV0Q2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzRWRpdGFibGUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYkNsaXAxSXNBQUMgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFNpbGVuY2UgaXMgYWx3YXlzIGVkaXRhYmxlICovCi0gICAgICAgIHBJbnB1dENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqIGFkZGVkIGF1ZGlvICoqKioqKioqKi8KLQotICAgIGlmKCBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICE9IHBBZGRlZENsaXBQcm9wZXJ0aWVzLT4KLSAgICAgICAgQXVkaW9TdHJlYW1UeXBlICkgLyoqPCBpZiB0aGVyZSBpcyBhbiBhdWRpbyBzdHJlYW0gKi8KLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGF1ZGlvIGZvcm1hdCBpcyBBTVItTkIgb3IgQUFDICovCi0gICAgICAgIHN3aXRjaCggcEFkZGVkQ2xpcFByb3BlcnRpZXMtPkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgcEFkZGVkQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwID0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsgLyogSSB1c2UgdGhpcyBmaWVsZCB0byBrbm93IGlmIHNpbGVuY2Ugc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQ3BsdXM6Ci0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgICAgICBzd2l0Y2goIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjA1MDoKLSAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgICAgICAgICAgY2FzZSA0NDEwMDoKLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7IC8qIEkgdXNlIHRoaXMgZmllbGQgdG8ga25vdyBpZiBzaWxlbmNlIHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgICAgIGJDbGlwMklzQUFDID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRVZSQzoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUENNOgotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLQotICAgICAgICAgICAgICAgIGlmKCBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9PSAxNjAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiQ2xpcDJJc0FBQyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6IC8qUkMqLwotICAgICAgICAgICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0VkaXRhYmxlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBUaGUgd3JpdGVyIGNhbm5vdCB3cml0ZSB0aGlzICBpbnRvIGEgM2dwcCAqLwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eTpcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBTaWxlbmNlIGlzIGFsd2F5cyBlZGl0YWJsZSAqLwotICAgICAgICBwQWRkZWRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNFZGl0YWJsZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBBZGRlZENsaXBQcm9wZXJ0aWVzLT5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBJIHVzZSB0aGlzIGZpZWxkIHRvIGtub3cgaWYgc2lsZW5jZSBzdXBwb3J0ZWQgKi8KLSAgICB9Ci0KLSAgICBpZiggcEMtPmJSZW1vdmVPcmlnaW5hbCA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpU2FtcGxpbmdGcmVxdWVuY3kKLSAgICAgICAgICAgICE9IHBBZGRlZENsaXBQcm9wZXJ0aWVzLT51aVNhbXBsaW5nRnJlcXVlbmN5ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogV2UgbmVlZCB0byBjYWxsIFNTUkMgaW4gb3JkZXIgdG8gYWxpZ24gQVNGIGFuZC9vciBuYiBvZiBjaGFubmVscyAqLwotICAgICAgICAgICAgLyogTW9yZW92ZXIsIGF1ZGlvIGVuY29kZXIgbWF5IGJlIG5lZWRlZCBpbiBjYXNlIG9mIGF1ZGlvIHJlcGxhY2luZy4uLiAqLwotICAgICAgICAgICAgcEMtPmJfU1NSQ25lZWRlZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgPCBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogU3RlcmVvIHRvIE1vbm8gKi8KLSAgICAgICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcElucHV0Q2xpcFByb3BlcnRpZXMtPnVpTmJDaGFubmVscwotICAgICAgICAgICAgPiBwQWRkZWRDbGlwUHJvcGVydGllcy0+dWlOYkNoYW5uZWxzICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogTW9ubyB0byBTdGVyZW8gKi8KLSAgICAgICAgICAgIHBDLT5DaGFubmVsQ29udmVyc2lvbiA9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwSW5wdXRDbGlwUHJvcGVydGllcy0+YkF1ZGlvSXNDb21wYXRpYmxlV2l0aE1hc3RlckNsaXAgPSBNNE9TQV9UUlVFOwotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2ludEF1ZGlvTWl4aW5nQ29tcGF0aWJpbGl0eSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfQ29kZWNzLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9Db2RlY3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWNlZDkzNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9Db2RlY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgIE00VlNTM0dQUF9Db2RlY3MuYwotICogQGJyaWVmICBWU1MgaW1wbGVtZW50YXRpb24KLSAqIEBub3RlICAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBmdW5jdGlvbnMgcmVsYXRlZCB0byBhdWRpby92aWRlbwotICogICAgICAgICAgICBjb2RlYyBtYW5pcHVsYXRpb25zLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgICAgICAgICAgLyoqPCBJbmNsdWRlIGZvciBPU0FMIGRlYnVnIHNlcnZpY2VzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIiAvKio8IEludGVybmFsIHR5cGVzIG9mIHRoZSBWU1MgKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfY2xlYXJJbnRlcmZhY2VUYWJsZXMoKQotICogQGJyaWVmICAgIENsZWFyIGVuY29kZXJzLCBkZWNvZGVycywgcmVhZGVyIGFuZCB3cml0ZXJzIGludGVyZmFjZXMgdGFibGVzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIFRoZSBjb250ZXh0IGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9jbGVhckludGVyZmFjZVRhYmxlcyggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQyApCi17Ci0gICAgTTRPU0FfVUludDggaTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiBJbml0aWFsaXNhdGlvbiB0aGF0IHdpbGwgYWxsb3cgdG8gY2hlY2sgaWYgcmVnaXN0ZXJpbmcgdHdpY2UgKi8KLSAgICBwQy0+cFdyaXRlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wV3JpdGVyRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPnBDdXJyZW50VmlkZW9FbmNvZGVyRXh0ZXJuYWxBUEkgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRXUklURVJfa1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJVc2VyRGF0YVRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00RU5DT0RFUl9rQXVkaW9fTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tpXSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpc2F0aW9uIHRoYXQgd2lsbCBhbGxvdyB0byBjaGVjayBpZiByZWdpc3RlcmluZyB0d2ljZSAqLwotICAgIHBDLT5tX3BSZWFkZXIgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3BSZWFkZXJEYXRhSXQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycyA9IDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IE00UkVBREVSX2tNZWRpYVR5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNERFQ09ERVJfa1ZpZGVvVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLQotICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEFEX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2ldID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIHBDLT5wQXVkaW9EZWNvZGVyVXNlckRhdGFUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBmaWxlIGZvcm1hdCB3cml0ZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgIGNvbnRleHQgdGhlIHdyaXRlciBjb250ZXh0LgotICogQHBhcmFtICAgIHBDb250ZXh0OiAgICAoSU4pIEV4ZWN1dGlvbiBjb250ZXh0LgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgcENvbnRleHQscFd0ckdsb2JhbEludGVyZmFjZSBvciBwV3RyRGF0YUludGVyZmFjZSBpcyBNNE9TQV9OVUxMCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlYnVnIG9ubHkpLCBvciBpbnZhbGlkIE1lZGlhVHlwZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFdSSVRFUl9PdXRwdXRGaWxlVHlwZSBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSAqcFd0ckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSAqcFd0ckRhdGFJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckdsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicFd0ckdsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlcldyaXRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFd0ckRhdGFJbnRlcmZhY2UgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInBXdHJEYXRhSW50ZXJmYWNlIGlzIE00T1NBX05VTEwgaW4gTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyIik7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIlZTUzogTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgsIHBXdHJHbG9iYWxJbnRlcmZhY2U9MHgleCxcCi0gICAgICAgIHBXdHJEYXRhSW50ZXJmYWNlPTB4JXgiLAotICAgICAgICBwQywgcFd0ckdsb2JhbEludGVyZmFjZSwgcFd0ckRhdGFJbnRlcmZhY2UpOwotCi0gICAgaWYoICggTWVkaWFUeXBlID09IE00V1JJVEVSX2tVbmtub3duKSB8fCAoTWVkaWFUeXBlID49IE00V1JJVEVSX2tUeXBlX05CKSApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLCAiSW52YWxpZCBtZWRpYSB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5Xcml0ZXJJbnRlcmZhY2VbTWVkaWFUeXBlXS5wR2xvYmFsRmN0cyAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIGEgd3JpdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJUaGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFNhdmUgd3JpdGVyIGludGVyZmFjZSBpbiBjb250ZXh0ICovCi0gICAgcEMtPldyaXRlckludGVyZmFjZVtNZWRpYVR5cGVdLnBHbG9iYWxGY3RzID0gcFd0ckdsb2JhbEludGVyZmFjZTsKLSAgICBwQy0+V3JpdGVySW50ZXJmYWNlW01lZGlhVHlwZV0ucERhdGFGY3RzID0gcFd0ckRhdGFJbnRlcmZhY2U7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciBhIHNwZWNpZmljIHZpZGVvIGVuY29kZXIuCi0gKiBAbm90ZSAgICBBY2NvcmRpbmcgdG8gdGhlIE1lZGlhdHlwZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIGluIHRoZSBpbnRlcm5hbAotICogICAgICAgIGNvbnRleHQgdGhlIGVuY29kZXIgY29udGV4dC4KLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IG9yIHBFbmNHbG9iYWxJbnRlcmZhY2UgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW52YWxpZCBNZWRpYVR5cGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRFTkNPREVSX0Zvcm1hdCBNZWRpYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocEVuY0dsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJWU1M6IE00VlNTM0dQUF9yZWdpc3RlckVuY29kZXIgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcEVuY0dsb2JhbEludGVyZmFjZT0weCV4LFwKLSAgICAgICAgTWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgcEVuY0dsb2JhbEludGVyZmFjZSwgTWVkaWFUeXBlKTsKLQotICAgIGlmKCBNZWRpYVR5cGUgPj0gTTRFTkNPREVSX2tWaWRlb19OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIkludmFsaWQgdmlkZW8gZW5jb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICAvKiBjYW4gYmUgbGVnaXRpbWF0ZSwgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBvbmUgdmVyc2lvbiB0aGF0IGNhbiB1c2UgZXh0ZXJuYWwgZW5jb2RlcnMKLSAgICAgICAgYnV0IHdoaWNoIHN0aWxsIGhhcyB0aGUgYnVpbHQtaW4gb25lIHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGFuIGV4dGVybmFsIGVuY29kZXI7IGluCi0gICAgICAgIHRoaXMgY2FzZSB0aGUgbmV3IGVuY29kZXIgc2ltcGx5IHJlcGxhY2VzIHRoZSBvbGQgb25lIChpLmUuIHdlIHVucmVnaXN0ZXIgaXQgZmlyc3QpLiAqLwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICBmcmVlKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFNhdmUgZW5jb2RlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBwRW5jR2xvYmFsSW50ZXJmYWNlOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgYW5kIGV4dGVybmFsIEFQSSB3aWxsIGJlIHNldCBieSB0aGUgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGluIHRoZSBjYXNlCi0gICAgb2YgYW4gZXh0ZXJuYWwgZW5jb2RlciAoYWRkIGl0IGFzIGEgcGFyYW1ldGVyIHRvIHRoaXMgZnVuY3Rpb24gaW4gdGhlIGxvbmcgcnVuPykgKi8KLSAgICBwQy0+cFZpZGVvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW01lZGlhVHlwZV0gPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVnaXN0ZXIgYSBzcGVjaWZpYyBhdWRpbyBlbmNvZGVyLgotICogQG5vdGUgICAgQWNjb3JkaW5nIHRvIHRoZSBNZWRpYXR5cGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSBpbiB0aGUgaW50ZXJuYWwKLSAqICAgICAgICBjb250ZXh0IHRoZSBlbmNvZGVyIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6ICAgICAgICAgICAgICAgIChJTikgRXhlY3V0aW9uIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgbWVkaWFUeXBlOiAgICAgICAgICAgICAgICAoSU4pIFRoZSBtZWRpYSB0eXBlLgotICogQHBhcmFtICAgIHBFbmNHbG9iYWxJbnRlcmZhY2U6ICAgIChPVVQpIHRoZSBlbmNvZGVyIGludGVyZmFjZSBmdW5jdGlvbnMuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogcENvbnRleHQgb3IgcEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgTWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UgKnBFbmNHbG9iYWxJbnRlcmZhY2UgKQotewotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigocEMgPT0gTTRPU0FfTlVMTCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZTUzogY29udGV4dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocEVuY0dsb2JhbEludGVyZmFjZSA9PSBNNE9TQV9OVUxMKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAicEVuY0dsb2JhbEludGVyZmFjZSBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciIpOwotCi0gICAgTTRPU0FfVFJBQ0UzXzMoCi0gICAgICAgICJWU1M6IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlciBjYWxsZWQgcENvbnRleHQ9MHgleCwgcEVuY0dsb2JhbEludGVyZmFjZT0weCV4LFwKLSAgICAgICAgTWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgcEVuY0dsb2JhbEludGVyZmFjZSwgTWVkaWFUeXBlKTsKLQotICAgIGlmKCBNZWRpYVR5cGUgPj0gTTRFTkNPREVSX2tBdWRpb19OQiApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgICAgIkludmFsaWQgYXVkaW8gZW5jb2RlciB0eXBlIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYoIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0pOwotICAgICAgICBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLyoKLSAgICAqIFNhdmUgZW5jb2RlciBpbnRlcmZhY2UgaW4gY29udGV4dCAqLwotICAgIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW01lZGlhVHlwZV0gPSBwRW5jR2xvYmFsSW50ZXJmYWNlOwotICAgIHBDLT5wQXVkaW9FbmNvZGVyRmxhZ1tNZWRpYVR5cGVdID0gTTRPU0FfRkFMU0U7IC8qIGludGVybmFsIGVuY29kZXIgKi8KLSAgICBwQy0+cEF1ZGlvRW5jb2RlclVzZXJEYXRhVGFibGVbTWVkaWFUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRW5jb2RlcjogcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbMHgleF0gPSAweCV4IiwKLSAgICAgICAgTWVkaWFUeXBlLCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtNZWRpYVR5cGVdKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlclJlYWRlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgcmVhZGVyLgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgbWVkaWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZHJEYXRhSW50ZXJmYWNlICkKLXsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmRyR2xvYmFsSW50ZXJmYWNlKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyOiBpbnZhbGlkIHBvaW50ZXIgb24gZ2xvYmFsIGludGVyZmFjZSIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmRyRGF0YUludGVyZmFjZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9yZWdpc3RlclJlYWRlcjogaW52YWxpZCBwb2ludGVyIG9uIGRhdGEgaW50ZXJmYWNlIik7Ci0KLSAgICBpZiggbWVkaWFUeXBlID09IE00UkVBREVSX2tNZWRpYVR5cGVVbmtub3duCi0gICAgICAgIHx8IG1lZGlhVHlwZSA+PSBNNFJFQURFUl9rTWVkaWFUeXBlX05CICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsICJJbnZhbGlkIG1lZGlhIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIGEgcmVhZGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtZWRpYSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCAhKi8KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJUaGlzIG1lZGlhIHR5cGUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcEMtPm1fcFJlYWRlckdsb2JhbEl0VGFibGVbbWVkaWFUeXBlXSA9IHBSZHJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW21lZGlhVHlwZV0gPSBwUmRyRGF0YUludGVyZmFjZTsKLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkUmVhZGVycysrOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCkKLSAqIEBicmllZiAgICBSZWdpc3RlciB2aWRlbyBkZWNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHBhcmFtICAgIHBEZWNvZGVySW50ZXJmYWNlICAgIChJTikgRGVjb2RlciBpbnRlcmZhY2UuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlICpwRGVjb2RlckludGVyZmFjZSApCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYoIGRlY29kZXJUeXBlID49IE00REVDT0RFUl9rVmlkZW9UeXBlX05CICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiSW52YWxpZCB2aWRlbyBkZWNvZGVyIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdICE9IE00T1NBX05VTEwgKQotICAgIHsKLSNpZm5kZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0gICAgICAgIC8qIGEgZGVjb2RlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVkaWEgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgISovCi0KLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJEZWNvZGVyIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotCi0jZWxzZSAvKiBleHRlcm5hbCBkZWNvZGVycyBhcmUgcG9zc2libGUgKi8KLSAgICAgICAgLyogY2FuIGJlIGxlZ2l0aW1hdGUsIGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgb25lIHZlcnNpb24gdGhhdCBjYW4gdXNlIGV4dGVybmFsIGRlY29kZXJzCi0gICAgICAgIGJ1dCB3aGljaCBzdGlsbCBoYXMgdGhlIGJ1aWx0LWluIG9uZSB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBhbiBleHRlcm5hbCBkZWNvZGVyOyBpbgotICAgICAgICB0aGlzIGNhc2UgdGhlIG5ldyBkZWNvZGVyIHNpbXBseSByZXBsYWNlcyB0aGUgb2xkIG9uZSAoaS5lLiB3ZSB1bnJlZ2lzdGVyIGl0IGZpcnN0KS4gKi8KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgewotCi0jZW5kaWYKLQotICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgLyogb2gsIGFuZCBkb24ndCBmb3JnZXQgdGhlIHVzZXIgZGF0YSwgdG9vLiAqLwotICAgICAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BWaWRlb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSk7Ci0gICAgICAgICAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0jZW5kaWYgLyogYXJlIGV4dGVybmFsIGRlY29kZXJzIHBvc3NpYmxlPyAqLwotCi0gICAgfQotCi0gICAgcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gcERlY29kZXJJbnRlcmZhY2U7Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wVmlkZW9EZWNvZGVyVXNlckRhdGFUYWJsZVtkZWNvZGVyVHlwZV0gPSBNNE9TQV9OVUxMOwotICAgIC8qIFRoZSBhY3R1YWwgdXNlckRhdGEgd2lsbCBiZSBzZXQgYnkgdGhlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBpbiB0aGUgY2FzZQotICAgIG9mIGFuIGV4dGVybmFsIGRlY29kZXIgKGFkZCBpdCBhcyBhIHBhcmFtZXRlciB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBsb25nIHJ1bj8pICovCi0KLSNlbmRpZiAvKiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMgKi8KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMrKzsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgUmVnaXN0ZXIgYXVkaW8gZGVjb2RlcgotICogQG5vdGUgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGludGVybmFseSBieSB0aGUgVlNTIHRvIHJlZ2lzdGVyIE5YUCBhdWRpbyBkZWNvZGVycywKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAgICAgKElOKSBBdWRpbyBkZWNvZGVyIHR5cGUKLSAqIEBwYXJhbSAgICBwRGVjb2RlckludGVyZmFjZSAgICAoSU4pIEF1ZGlvIGRlY29kZXIgaW50ZXJmYWNlLgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICBBIHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgZGVjb2RlciB0eXBlIGlzIGludmFsaWQoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRBRF9UeXBlIGRlY29kZXJUeXBlLCBNNEFEX0ludGVyZmFjZSAqcERlY29kZXJJbnRlcmZhY2UpCi17Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfcmVnaXN0ZXJBdWRpb0RlY29kZXI6IGludmFsaWQgcG9pbnRlciBvbiBkZWNvZGVyIGludGVyZmFjZSIpOwotCi0gICAgaWYoIGRlY29kZXJUeXBlID49IE00QURfa1R5cGVfTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJJbnZhbGlkIGF1ZGlvIGRlY29kZXIgdHlwZSIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdKTsKLSAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2RlY29kZXJUeXBlXSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0pOwotICAgICAgICAgICAgcEMtPm1fcEF1ZGlvRGVjb2Rlckl0VGFibGVbZGVjb2RlclR5cGVdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV0gPSBwRGVjb2RlckludGVyZmFjZTsKLSAgICBwQy0+bV9wQXVkaW9EZWNvZGVyRmxhZ1RhYmxlW2RlY29kZXJUeXBlXSA9Ci0gICAgICAgIE00T1NBX0ZBTFNFOyAvKiBpbnRlcm5hbCBkZWNvZGVyICovCi0gICAgcEMtPnBBdWRpb0RlY29kZXJVc2VyRGF0YVRhYmxlW2RlY29kZXJUeXBlXSA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbFdyaXRlcnMoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMgKQotewotICAgIE00T1NBX0ludDMyIGk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNFdSSVRFUl9rVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+V3JpdGVySW50ZXJmYWNlW2ldLnBHbG9iYWxGY3RzICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5Xcml0ZXJJbnRlcmZhY2VbaV0ucEdsb2JhbEZjdHMpOwotICAgICAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wR2xvYmFsRmN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMpOwotICAgICAgICAgICAgcEMtPldyaXRlckludGVyZmFjZVtpXS5wRGF0YUZjdHMgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRW5jb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGVuY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxFbmNvZGVyczogcEM9MHgleCIsIHBDKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRFTkNPREVSX2tWaWRlb19OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+cFZpZGVvRW5jb2RlckludGVyZmFjZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICBpZiggTTRPU0FfVFJVRSA9PSBwQy0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlICkKLSAgICAgICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wVmlkZW9FbmNvZGVySW50ZXJmYWNlW2ldKTsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEVOQ09ERVJfa0F1ZGlvX05COyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICAgICAgewotCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZW5jb2RlcnMgaW50ZXJmYWNlcyovCi0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPnBBdWRpb0VuY29kZXJGbGFnW2ldICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0pOwotICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJJbnRlcmZhY2VbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCkKLSAqIEBicmllZiAgICBVbnJlZ2lzdGVyIHJlYWRlcgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxSZWFkZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRSRUFERVJfa01lZGlhVHlwZV9OQjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSk7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BSZWFkZXJEYXRhSXRUYWJsZVtpXSk7Ci0gICAgICAgICAgICBwQy0+bV9wUmVhZGVyRGF0YUl0VGFibGVbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcEMtPm1fdWlOYlJlZ2lzdGVyZWRSZWFkZXJzID0gMDsKLSAgICBwQy0+bV9wUmVhZGVyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gTTRPU0FfTlVMTDsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsRGVjb2RlcnMoKQotICogQGJyaWVmICAgIFVucmVnaXN0ZXIgdGhlIGRlY29kZXJzCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX3VuUmVnaXN0ZXJBbGxEZWNvZGVyczogcEM9MHgleCIsIHBDKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgTTRERUNPREVSX2tWaWRlb1R5cGVfTkI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2Rlckl0VGFibGVbaV0gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJBbGxvd0ZyZWVpbmdPTVhDb2RlY0ludGVyZmFjZSApCi0gICAgICAgICAgICB7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgZnJlZShwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtpXSk7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBDLT5tX3BWaWRlb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBNNEFEX2tUeXBlX05COyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9UUlVFID09IHBDLT5iQWxsb3dGcmVlaW5nT01YQ29kZWNJbnRlcmZhY2UgKQotICAgICAgICAgICAgewotCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAvKkRvbid0IGZyZWUgZXh0ZXJuYWwgYXVkaW8gZGVjb2RlcnMgaW50ZXJmYWNlcyovCi0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPm1fcEF1ZGlvRGVjb2RlckZsYWdUYWJsZVtpXSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgIHBDLT5tX3BBdWRpb0RlY29kZXJJdFRhYmxlW2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHBDLT5tX3VpTmJSZWdpc3RlcmVkVmlkZW9EZWMgPSAwOwotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgcEMtPm1fcEF1ZGlvRGVjb2RlciA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFdyaXRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgd3JpdGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRXUklURVJfT3V0cHV0RmlsZVR5cGUgd3JpdGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBzd2l0Y2goIG1lZGlhVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOgotICAgICAgICAgICAgd3JpdGVyVHlwZSA9IE00V1JJVEVSX2szR1BQOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRSwKLSAgICAgICAgICAgICAgICAiV3JpdGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEU7Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJHbG9iYWxGY3RzID0gcEMtPldyaXRlckludGVyZmFjZVt3cml0ZXJUeXBlXS5wR2xvYmFsRmN0czsKLSAgICBwQy0+cFdyaXRlckRhdGFGY3RzID0gcEMtPldyaXRlckludGVyZmFjZVt3cml0ZXJUeXBlXS5wRGF0YUZjdHM7Ci0KLSAgICBpZiggcEMtPnBXcml0ZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwKLSAgICAgICAgfHwgcEMtPnBXcml0ZXJEYXRhRmN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLCBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFLAotICAgICAgICAgICAgIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIldyaXRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEU7Ci0gICAgfQotCi0gICAgcEMtPnBXcml0ZXJEYXRhRmN0cy0+cFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIE1lZGlhVHlwZSAgICAgICAgICAgKElOKSBFbmNvZGVyIHR5cGUKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgICAgICAgICAgICAgICAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICogQHJldHVybiAgICBNNFdBUl9WU1NfTUVESUFUWVBFX05PVF9TVVBQT1JURUQ6ICAgIE1lZGlhIHR5cGUgbm90IHN1cHBvcnRlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0VuY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRTWVNfU3RyZWFtVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00RU5DT0RFUl9Gb3JtYXQgZW5jb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcjogcEM9MHgleCwgbWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgbWVkaWFUeXBlKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgICAgIGVuY29kZXJUeXBlID0gTTRFTkNPREVSX2tNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRTWVNfa0gyNjQ6Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFULAotICAgICAgICAgICAgICAgICJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID0gcEMtPnBWaWRlb0VuY29kZXJJbnRlcmZhY2VbZW5jb2RlclR5cGVdOwotICAgIHBDLT5wQ3VycmVudFZpZGVvRW5jb2RlckV4dGVybmFsQVBJID0KLSAgICAgICAgcEMtPnBWaWRlb0VuY29kZXJFeHRlcm5hbEFQSVRhYmxlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRWaWRlb0VuY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgIHBDLT5wVmlkZW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBpZiggcEMtPnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfVklERU9fRk9STUFULAotICAgICAgICAgICAgIlZpZGVvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJWaWRlbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGVuY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgTWVkaWFUeXBlICAgICAgICAoSU4pIEVuY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbVR5cGUgbWVkaWFUeXBlICkKLXsKLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgZW5jb2RlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX1RSQUNFM18yKCJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcjogcEM9MHgleCwgbWVkaWFUeXBlPTB4JXgiLAotICAgICAgICBwQywgbWVkaWFUeXBlKTsKLQotICAgIHN3aXRjaCggbWVkaWFUeXBlICkKLSAgICB7Ci0gICAgICAgIGNhc2UgTTRTWVNfa0FNUjoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcjogZW5jb2RlciB0eXBlIEFNUiIpOwotICAgICAgICAgICAgZW5jb2RlclR5cGUgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyOiBlbmNvZGVyIHR5cGUgQUFDIik7Ci0gICAgICAgICAgICBlbmNvZGVyVHlwZSA9IE00RU5DT0RFUl9rQUFDOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAiQXVkaW8gZW5jb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyA9IHBDLT5wQXVkaW9FbmNvZGVySW50ZXJmYWNlW2VuY29kZXJUeXBlXTsKLSAgICBwQy0+cEN1cnJlbnRBdWRpb0VuY29kZXJVc2VyRGF0YSA9Ci0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyVXNlckRhdGFUYWJsZVtlbmNvZGVyVHlwZV07Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9FbmNvZGVyOiBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVsweCV4XT0weCV4LFwKLSAgICAgICAgcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID0gMHgleCIsCi0gICAgICAgIGVuY29kZXJUeXBlLCBwQy0+cEF1ZGlvRW5jb2RlckludGVyZmFjZVtlbmNvZGVyVHlwZV0sCi0gICAgICAgIHBDLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cyk7Ci0KLSAgICBpZiggcEMtPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsCi0gICAgICAgICAgICBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFULAotICAgICAgICAgICAgIkF1ZGlvIGVuY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBdWRpbyBlbmNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudFJlYWRlcigpCi0gKiBAYnJpZWYgICAgU2V0IGN1cnJlbnQgcmVhZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4vT1VUKSBWU1MgY29udGV4dC4KLSAqIEBwYXJhbSAgICBtZWRpYVR5cGUgICAgICAgICAgICAoSU4pIE1lZGlhIHR5cGUuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICAgICAgICAgICAgICAgICAgQSBwYXJhbWV0ZXIgaXMgbnVsbCAoaW4gREVCVUcgb25seSkKLSAqIEByZXR1cm4gICAgTTRXQVJfVlNTX01FRElBVFlQRV9OT1RfU1VQUE9SVEVEOiAgICBNZWRpYSB0eXBlIG5vdCBzdXBwb3J0ZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zZXRDdXJyZW50UmVhZGVyKCBNNFZTUzNHUFBfTWVkaWFBbmRDb2RlY0N0eHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0ZpbGVUeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRSRUFERVJfTWVkaWFUeXBlIHJlYWRlclR5cGU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDoKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0OgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFY6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZTNHUFA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BTVI6Ci0gICAgICAgICAgICByZWFkZXJUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZUFNUjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzoKLSAgICAgICAgICAgIHJlYWRlclR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlTVAzOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfUENNOgotICAgICAgICAgICAgcmVhZGVyVHlwZSA9IE00UkVBREVSX2tNZWRpYVR5cGVQQ007Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUsCi0gICAgICAgICAgICAgICAgIlJlYWRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfRklMRV9UWVBFOwotICAgIH0KLQotICAgIHBDLT5tX3BSZWFkZXIgPSBwQy0+bV9wUmVhZGVyR2xvYmFsSXRUYWJsZVtyZWFkZXJUeXBlXTsKLSAgICBwQy0+bV9wUmVhZGVyRGF0YUl0ID0gcEMtPm1fcFJlYWRlckRhdGFJdFRhYmxlW3JlYWRlclR5cGVdOwotCi0gICAgaWYoIHBDLT5tX3BSZWFkZXIgPT0gTTRPU0FfTlVMTCB8fCBwQy0+bV9wUmVhZGVyRGF0YUl0ID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfREVCVUdfSUYxKE00T1NBX1RSVUUsIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUsCi0gICAgICAgICAgICAiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUmVhZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRTsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICAgTTRWU1MzR1BQX3NldEN1cnJlbnRWaWRlb0RlY29kZXIoKQotICogQGJyaWVmICAgIFNldCBhIHZpZGVvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTi9PVVQpIFZTUyBjb250ZXh0LgotICogQHBhcmFtICAgIGRlY29kZXJUeXBlICAgICAgICAoSU4pIERlY29kZXIgdHlwZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgICAgIEEgcGFyYW1ldGVyIGlzIG51bGwgKGluIERFQlVHIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00V0FSX1ZTU19NRURJQVRZUEVfTk9UX1NVUFBPUlRFRDogICAgTWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRGVjb2RlciggTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNF9TdHJlYW1UeXBlIG1lZGlhVHlwZSApCi17Ci0gICAgTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfVFJBQ0UzXzIoIk00VlNTM0dQUF9zZXRDdXJyZW50VmlkZW9EZWNvZGVyOiBwQz0weCV4LCBtZWRpYVR5cGU9MHgleCIsCi0gICAgICAgIHBDLCBtZWRpYVR5cGUpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YzoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRERUNPREVSX2tWaWRlb1R5cGVBVkM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb0FSR0I4ODg4OgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNERFQ09ERVJfa1ZpZGVvVHlwZVlVVjQyMFA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFULAotICAgICAgICAgICAgICAgICJWaWRlbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5tX3BWaWRlb0RlY29kZXIgPSBwQy0+bV9wVmlkZW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV07Ci0jaWZkZWYgTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTCi0KLSAgICBwQy0+bV9wQ3VycmVudFZpZGVvRGVjb2RlclVzZXJEYXRhID0KLSAgICAgICAgcEMtPm1fcFZpZGVvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotCi0jZW5kaWYgLyogTTRWU1NfRU5BQkxFX0VYVEVSTkFMX0RFQ09ERVJTICovCi0KLSAgICBpZiggcEMtPm1fcFZpZGVvRGVjb2RlciA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQsCi0gICAgICAgICAgICAiVmlkZW8gZGVjb2RlciB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIlZpZGVvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgICBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRGVjb2RlcigpCi0gKiBAYnJpZWYgICAgU2V0IGFuIGF1ZGlvIGRlY29kZXIKLSAqIEBwYXJhbSAgICBjb250ZXh0ICAgICAgICAgICAgKElOL09VVCkgVlNTIGNvbnRleHQuCi0gKiBAcGFyYW0gICAgZGVjb2RlclR5cGUgICAgICAgIChJTikgRGVjb2RlciB0eXBlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBIHBhcmFtZXRlciBpcyBudWxsIChpbiBERUJVRyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0RlY29kZXIoIE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfU3RyZWFtVHlwZSBtZWRpYVR5cGUgKQotewotICAgIE00QURfVHlwZSBkZWNvZGVyVHlwZTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwQyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0gICAgTTRPU0FfVFJBQ0UzXzIoIk00VlNTM0dQUF9zZXRDdXJyZW50QXVkaW9EZWNvZGVyOiBwQz0weCV4LCBtZWRpYVR5cGU9MHgleCIsCi0gICAgICAgIHBDLCBtZWRpYVR5cGUpOwotCi0gICAgc3dpdGNoKCBtZWRpYVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVBdWRpb0Ftck5hcnJvd0JhbmQ6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVBTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM6Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9BYWNBRFRTOgotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjQURJRjoKLSAgICAgICAgICAgIGRlY29kZXJUeXBlID0gTTRBRF9rVHlwZUFBQzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlQXVkaW9NcDM6Ci0gICAgICAgICAgICBkZWNvZGVyVHlwZSA9IE00QURfa1R5cGVNUDM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZUF1ZGlvUGNtOgotICAgICAgICAgICAgZGVjb2RlclR5cGUgPSBNNEFEX2tUeXBlUENNOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX0RFQlVHX0lGMShNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFULAotICAgICAgICAgICAgICAgICJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUOwotICAgIH0KLQotICAgIHBDLT5tX3BBdWRpb0RlY29kZXIgPSBwQy0+bV9wQXVkaW9EZWNvZGVySXRUYWJsZVtkZWNvZGVyVHlwZV07Ci0gICAgcEMtPnBDdXJyZW50QXVkaW9EZWNvZGVyVXNlckRhdGEgPQotICAgICAgICBwQy0+cEF1ZGlvRGVjb2RlclVzZXJEYXRhVGFibGVbZGVjb2RlclR5cGVdOwotCi0gICAgaWYoIHBDLT5tX3BBdWRpb0RlY29kZXIgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9ERUJVR19JRjEoTTRPU0FfVFJVRSwKLSAgICAgICAgICAgIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFULAotICAgICAgICAgICAgIkF1ZGlvIGRlY29kZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBdWRpbyBkZWNvZGVyIHR5cGUgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0LmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRmOGI3ZDUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX0VkaXQuYwotICogQGJyaWVmICAgIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIDNHUFAgZWRpdCBBUEkgaW1wbGVtZW50YXRpb24uCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKioqKioqKioqKioqKioqLwotLyoqKiBJbmNsdWRlcyAqKiovCi0vKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIk5YUFNXX0NvbXBpbGVyU3dpdGNoZXMuaCIKLS8qKgotICogT3VyIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0KLS8qKgotICogT1NBTCBoZWFkZXJzICovCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiICAgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgICAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9DaGFyU3Rhci5oIiAvKio8IE9TQUwgc3RyaW5nIG1hbmFnZW1lbnQgKi8KLQotI2lmZGVmIFdJTjMyCi0jaW5jbHVkZSAic3RyaW5nLmgiICAgICAgICAgLyoqPCBmb3Igc3RyY3B5IChEb24ndCB3YW50IHRvIGdldCBkZXBlbmRlbmNpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggTTRPU0FfU3RyaW5nLi4uKSAqLwotCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgKi8KLSNpZmRlZiBNNFZTU19FTkFCTEVfRVhURVJOQUxfREVDT0RFUlMKLSNpbmNsdWRlICJNNFZEX0VYVEVSTkFMX0ludGVyZmFjZS5oIgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBTdGF0aWMgbG9jYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrKAotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRUcmFuc2l0aW9uU2V0dGluZ3NTYW5pdHlDaGVjaygKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICpwVHJhbnNpdGlvbiApOwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludEZyZWVTZXR0aW5nc0xpc3QoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q3JlYXRlTVAzT3V0cHV0RmlsZSggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcE91dHB1dEZpbGUgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICk7Ci1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aU1hc3RlckNsaXAgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0QXZlcmFnZVZpZGVvQml0cmF0ZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX0dldFZlcnNpb24oKQotICogQGJyaWVmICAgIEdldCB0aGUgVlNTIDNHUFAgdmVyc2lvbi4KLSAqIEBub3RlICAgIENhbiBiZSBjYWxsZWQgYW55dGltZS4gRG8gbm90IG5lZWQgYW55IGNvbnRleHQuCi0gKiBAcGFyYW0gICAgcFZlcnNpb25JbmZvICAgICAgICAoT1VUKSBQb2ludGVyIHRvIGEgdmVyc2lvbiBpbmZvIHN0cnVjdHVyZQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwgKElmIERlYnVnIExldmVsID49IDIpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfR2V0VmVyc2lvbiggTTRfVmVyc2lvbkluZm8gKnBWZXJzaW9uSW5mbyApCi17Ci0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9HZXRWZXJzaW9uIGNhbGxlZCB3aXRoIHBWZXJzaW9uSW5mbz0weCV4IiwKLSAgICAgICAgcFZlcnNpb25JbmZvKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwVmVyc2lvbkluZm8pLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfR2V0VmVyc2lvbjogcFZlcnNpb25JbmZvIGlzIE00T1NBX05VTEwiKTsKLQotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciA9IE00VlNTX1ZFUlNJT05fTUFKT1I7Ci0gICAgcFZlcnNpb25JbmZvLT5tX21pbm9yID0gTTRWU1NfVkVSU0lPTl9NSU5PUjsKLSAgICBwVmVyc2lvbkluZm8tPm1fcmV2aXNpb24gPSBNNFZTU19WRVJTSU9OX1JFVklTSU9OOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0SW5pdCgpCi0gKiBAYnJpZWYgICAgSW5pdGlhbGl6ZXMgdGhlIFZTUyAzR1BQIGVkaXQgb3BlcmF0aW9uIChhbGxvY2F0ZXMgYW4gZXhlY3V0aW9uIGNvbnRleHQpLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIFZTUyAzR1BQIGVkaXQgY29udGV4dCB0byBhbGxvY2F0ZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ckZjdCAgICAgICAgKElOKSBQb2ludGVyIHRvIE9TQUwgZmlsZSByZWFkZXIgZnVuY3Rpb25zCi0gKiBAcGFyYW0gICBwRmlsZVdyaXRlUHRyRmN0ICAgIChJTikgUG9pbnRlciB0byBPU0FMIGZpbGUgd3JpdGVyIGZ1bmN0aW9ucwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgVGhlcmUgaXMgbm8gbW9yZSBhdmFpbGFibGUgbWVtb3J5Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEluaXQoIE00VlNTM0dQUF9FZGl0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcEZpbGVSZWFkUHRyRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcEZpbGVXcml0ZVB0ckZjdCApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDOwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMygKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4LCBcCi0gICAgICAgIHBGaWxlUmVhZFB0ckZjdD0weCV4LCBwRmlsZVdyaXRlUHRyRmN0PTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcEZpbGVSZWFkUHRyRmN0LCBwRmlsZVdyaXRlUHRyRmN0KTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdDogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwRmlsZVJlYWRQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQ6IHBGaWxlUmVhZFB0ckZjdCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBGaWxlV3JpdGVQdHJGY3QpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdEluaXQ6IHBGaWxlV3JpdGVQdHJGY3QgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBBbGxvY2F0ZSB0aGUgVlNTIGNvbnRleHQgYW5kIHJldHVybiBpdCB0byB0aGUgdXNlciAqLwotICAgIHBDID0gKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCksCi0gICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikiTTRWU1MzR1BQX0ludGVybmFsQ29udGV4dCIpOwotICAgICpwQ29udGV4dCA9IHBDOwotICAgICAgICAvKiBJbmlhbGl6YXRpb24gb2YgY29udGV4dCBWYXJpYWJsZXMgKi8KLSAgICBtZW1zZXQoKHZvaWQgKilwQywgMCxzaXplb2YoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQpKTsKLQotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0SW5pdCgpOiB1bmFibGUgdG8gYWxsb2NhdGUgTTRWU1MzR1BQX0ludGVybmFsQ29udGV4dCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotCi0gICAgLyogSW5pdCB0aGUgY29udGV4dC4gKi8KLSAgICBwQy0+dWlDbGlwTnVtYmVyID0gMDsKLSAgICBwQy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT51aUN1cnJlbnRDbGlwID0gMDsKLSAgICBwQy0+cEMxID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+cEMyID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2MVswXS5wYWNfZGF0YSA9IHBDLT55dXYxWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYxWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2MlswXS5wYWNfZGF0YSA9IHBDLT55dXYyWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYyWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2M1swXS5wYWNfZGF0YSA9IHBDLT55dXYzWzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXYzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+eXV2NFswXS5wYWNfZGF0YSA9IHBDLT55dXY0WzFdLnBhY19kYXRhID0gcEMtPgotICAgICAgICB5dXY0WzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+YkNsaXAxQXRCZWdpbkN1dCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5pQ2xpcDFBY3RpdmVFZmZlY3QgPSAwOwotICAgIHBDLT5pQ2xpcDJBY3RpdmVFZmZlY3QgPSAwOwotICAgIHBDLT5iVHJhbnNpdGlvbkVmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogSW5pdCBQQy0+ZXdjIG1lbWJlcnMgKi8KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICA9IDAuMDsKLSAgICBwQy0+ZXdjLmRPdXRwdXRWaWRDdHMgPSAwLjA7Ci0gICAgcEMtPmV3Yy5kQVRvID0gMC4wOwotICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uID0gMDsKLSAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSA9IE00U1lTX2tWaWRlb1Vua25vd247Ci0gICAgcEMtPmV3Yy51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAwOwotICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDA7Ci0gICAgcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlID0gMDsKLSAgICBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsKLSAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQXVkaW9Vbmtub3duOwotICAgIHBDLT5ld2MudWlOYkNoYW5uZWxzID0gMTsKLSAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQy0+ZXdjLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnVpQXVkaW9PdXRwdXREc2lTaXplID0gMDsKLSAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5ld2MucEF1ZGlvRW5jRFNJLmluZm9TaXplID0gMDsKLSAgICBwQy0+ZXdjLnBBdWRpb0VuY0RTSS5wSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0gMDsKLSAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9IDA7Ci0gICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAwOwotICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSAwLjA7Ci0gICAgcEMtPmV3Yy5wRW5jQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5wRHVtbXlBdUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy5pTXBlZzRHb3ZPZmZzZXQgPSAwOwotICAgIHBDLT5ld2MuVnBwRXJyb3IgPSAwOwotICAgIHBDLT5ld2MuZW5jb2RlclN0YXRlID0gTTRWU1MzR1BQX2tOb0VuY29kZXI7Ci0gICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgcEMtPmV3Yy51aVZpZGVvTWF4QXVTaXplID0gMDsKLSAgICBwQy0+ZXdjLnVpQXVkaW9NYXhBdVNpemUgPSAwOwotICAgIC8qKgotICAgICogS2VlcCB0aGUgT1NBTCBmaWxlIGZ1bmN0aW9ucyBwb2ludGVyIHNldCBpbiBvdXIgY29udGV4dCAqLwotICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIgPSBwRmlsZVJlYWRQdHJGY3Q7Ci0gICAgcEMtPnBPc2FGaWxlV3JpdFB0ciA9IHBGaWxlV3JpdGVQdHJGY3Q7Ci0KLSAgICAvKgotICAgICogUmVzZXQgcG9pbnRlcnMgZm9yIG1lZGlhIGFuZCBjb2RlY3MgaW50ZXJmYWNlcyAqLwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2NsZWFySW50ZXJmYWNlVGFibGVzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00RVJSX0NIRUNLX1JFVFVSTihlcnIpOwotCi0gICAgLyoKLSAgICAqICBDYWxsIHRoZSBtZWRpYSBhbmQgY29kZWNzIHN1YnNjcmlwdGlvbiBtb2R1bGUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgIC8qKgotICAgICogVXBkYXRlIG1haW4gc3RhdGUgYXV0b21hdG9uICovCi0gICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ1JFQVRFRDsKLSAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgLyogVGhlIGZsYWcgaXMgc2V0IHRvIGZhbHNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgY2xpcCAqLwotICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBwQy0+YklzTU1TID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBwQy0+aUluT3V0VGltZU9mZnNldCA9IDA7Ci0gICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm5iQWN0aXZlRWZmZWN0cyA9IDA7Ci0gICAgcEMtPm5iQWN0aXZlRWZmZWN0czEgPSAwOwotICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1fYWlyX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRJbml0KCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBBbGxvd3MgZmlsbGluZyBhIGNsaXAgc2V0dGluZ3Mgc3RydWN0dXJlIHdpdGggZGVmYXVsdCB2YWx1ZXMKLSAqCi0gKiBAbm90ZSAgICBXQVJOSU5HOiBwQ2xpcFNldHRpbmdzLT5FZmZlY3RzWyBdIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKiAgICAgICAgICAgICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSAgICAgIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoaXMgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwRmlsZSAgICAgICAgICAgICAgIChJTikgQ2xpcCBmaWxlIG5hbWUKLSAqIEBwYXJhbSAgIGZpbGVQYXRoU2l6ZSAgICAgICAgKElOKSBDbGlwIHBhdGggc2l6ZSAobmVlZGVkIGZvciBVVEYgMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUgotTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MoIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRmlsZSwgTTRPU0FfVUludDMyIGZpbGVQYXRoU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyApCi17Ci0gICAgTTRPU0FfVUludDggdWlGeDsKLQotICAgIE00T1NBX1RSQUNFM18xKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MgY2FsbGVkIHdpdGggcENsaXBTZXR0aW5ncz0weCVwIiwKLSAgICAgICAgcENsaXBTZXR0aW5ncyk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3MgaXMgTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIGNsaXAgc2V0dGluZ3MgdG8gZGVmYXVsdCAqLwotICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlID0gTTRPU0FfTlVMTDsgICAgICAgIC8qKjwgbm8gZmlsZSAqLwotICAgIHBDbGlwU2V0dGluZ3MtPkZpbGVUeXBlID0KLSAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX1Vuc3VwcG9ydGVkOyAvKio8IHVuZGVmaW5lZCAqLwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEZpbGUgKQotICAgIHsKLSAgICAgICAgLy9wQ2xpcFNldHRpbmdzLT5wRmlsZSA9IChNNE9TQV9DaGFyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwRmlsZSkrMSwgTTRWU1MzR1BQLAotICAgICAgICAvLyAicENsaXBTZXR0aW5ncy0+cEZpbGUiKTsKLSAgICAgICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIGJlY2F1c2Ugb2YgdXRmIDE2IGNvbnZlcnNpb24qLwotICAgICAgICBwQ2xpcFNldHRpbmdzLT5wRmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmaWxlUGF0aFNpemUgKyAxLCBNNFZTUzNHUFAsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJwQ2xpcFNldHRpbmdzLT5wRmlsZSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3MtPnBGaWxlICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q3JlYXRlQ2xpcFNldHRpbmdzIDogRVJST1IgYWxsb2NhdGluZyBmaWxlbmFtZSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIC8vbWVtY3B5KHBDbGlwU2V0dGluZ3MtPnBGaWxlLCBwRmlsZSwgc3RybGVuKHBGaWxlKSsxKTsKLSAgICAgICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIGJlY2F1c2Ugb2YgdXRmIDE2IGNvbnZlcnNpb24qLwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQ2xpcFNldHRpbmdzLT5wRmlsZSwgKHZvaWQgKilwRmlsZSwgZmlsZVBhdGhTaXplICsgMSk7Ci0gICAgfQotCi0gICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIHRvIHN1cHBvcnQgVVRGMTYgY29udmVyc2lvbiovCi0gICAgcENsaXBTZXR0aW5ncy0+ZmlsZVBhdGhTaXplID0gZmlsZVBhdGhTaXplICsgMTsKLSAgICAvKiovCi0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYkFuYWx5c2VkID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuRmlsZVR5cGUgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMF0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMV0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZlcnNpb25bMl0gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uID0gMDsKLQotICAgIHBDbGlwU2V0dGluZ3MtPnVpQmVnaW5DdXRUaW1lID0gMDsgLyoqPCBubyBiZWdpbiBjdXQgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT51aUVuZEN1dFRpbWUgPSAwOyAgIC8qKjwgbm8gZW5kIGN1dCAqLwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJTZXRJbWFnZURhdGEgPSBNNE9TQV9GQUxTRTsKLQotICAgIC8qKgotICAgICogUmVzZXQgdmlkZW8gY2hhcmFjdGVyaXN0aWNzICovCi0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb01heEF1U2l6ZSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5mQXZlcmFnZUZyYW1lUmF0ZSA9IDAuMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSA9Ci0gICAgICAgIE00VklERU9FRElUSU5HX1ZJREVPX1VOS05PV05fUFJPRklMRTsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVZpZGVvTGV2ZWwgPQotICAgICAgICBNNFZJREVPRURJVElOR19WSURFT19VTktOT1dOX0xFVkVMOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJNUEVHNGRhdGFQYXJ0aXRpb24gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iTVBFRzRydmxjID0gTTRPU0FfRkFMU0U7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYk1QRUc0cmVzeW5jaE1hcmtlciA9IE00T1NBX0ZBTFNFOwotCi0gICAgLyoqCi0gICAgKiBSZXNldCBhdWRpbyBjaGFyYWN0ZXJpc3RpY3MgKi8KLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcEF1ZGlvRHVyYXRpb24gPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvTWF4QXVTaXplID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aU5iQ2hhbm5lbHMgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpRXh0ZW5kZWRTYW1wbGluZ0ZyZXF1ZW5jeSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZSA9IDA7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0U2V0RGVmYXVsdFNldHRpbmdzKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIER1cGxpY2F0ZXMgYSBjbGlwIHNldHRpbmdzIHN0cnVjdHVyZSwgcGVyZm9ybWluZyBhbGxvY2F0aW9ucyBpZiByZXF1aXJlZAotICoKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzRGVzdCAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3NPcmlnICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICBiQ29weUVmZmVjdHMgICAgICAgIChJTikgRmxhZyB0byBrbm93IGlmIHdlIGhhdmUgdG8gZHVwbGljYXRlIGVmZmVjdHMKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIHBDbGlwU2V0dGluZ3MgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSCi1NNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyggTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0Jvb2wgYkNvcHlFZmZlY3RzICkKLXsKLSAgICBNNE9TQV9VSW50OCB1aUZ4OwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5ncyBjYWxsZWQgd2l0aCBkZXN0PTB4JXAgc3JjPTB4JXAiLAotICAgICAgICBwQ2xpcFNldHRpbmdzRGVzdCwgcENsaXBTZXR0aW5nc09yaWcpOwotCi0gICAgLyogQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDbGlwU2V0dGluZ3NEZXN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3NEZXN0IGlzIE5VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5nc09yaWcpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdER1cGxpY2F0ZUNsaXBTZXR0aW5nczogcENsaXBTZXR0aW5nc09yaWcgaXMgTlVMTCIpOwotCi0gICAgLyogQ29weSBwbGFpbiBzdHJ1Y3R1cmUgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilwQ2xpcFNldHRpbmdzRGVzdCwKLSAgICAgICAgKHZvaWQgKilwQ2xpcFNldHRpbmdzT3JpZywgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MpKTsKLQotICAgIC8qIER1cGxpY2F0ZSBmaWxlbmFtZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSApCi0gICAgewotICAgICAgICAvL3BDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSA9Ci0gICAgICAgIC8vIChNNE9TQV9DaGFyKikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwQ2xpcFNldHRpbmdzT3JpZy0+cEZpbGUpKzEsIE00VlNTM0dQUCwKLSAgICAgICAgLy8gInBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSIpOwotICAgICAgICAvKkZCOiBjbGlwIHBhdGggc2l6ZSBpcyBuZWVkZWQgZm9yIHV0ZiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgLypGQiAyMDA4LzEwLzE2OiBiYWQgYWxsb2NhdGlvbiBzaXplIHdoaWNoIHJhaXNlcyBhIGNyYXNoKi8KLSAgICAgICAgcENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDbGlwU2V0dGluZ3NPcmlnLT5maWxlUGF0aFNpemUgKyAxLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzRGVzdC0+cEZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MgOiBFUlJPUiBhbGxvY2F0aW5nIGZpbGVuYW1lIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgLypGQjogY2xpcCBwYXRoIHNpemUgaXMgbmVlZGVkIGZvciB1dGYgMTYgY29udmVyc2lvbiovCi0gICAgICAgIC8vbWVtY3B5KHBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSwgcENsaXBTZXR0aW5nc09yaWctPnBGaWxlLAotICAgICAgICAvLyBzdHJsZW4ocENsaXBTZXR0aW5nc09yaWctPnBGaWxlKSsxKTsKLSAgICAgICAgLypGQiAyMDA4LzEwLzE2OiBiYWQgYWxsb2NhdGlvbiBzaXplIHdoaWNoIHJhaXNlcyBhIGNyYXNoKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcENsaXBTZXR0aW5nc0Rlc3QtPnBGaWxlLCAodm9pZCAqKXBDbGlwU2V0dGluZ3NPcmlnLT5wRmlsZSwKLSAgICAgICAgICAgIHBDbGlwU2V0dGluZ3NPcmlnLT5maWxlUGF0aFNpemUvKisxKi8pOwotICAgICAgICAoIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAqKXBDbGlwU2V0dGluZ3NEZXN0LT5wRmlsZSlbcENsaXBTZXR0aW5nc09yaWctPmZpbGVQYXRoU2l6ZV0gPSAnXDAnOwotICAgIH0KLQotICAgIC8qIER1cGxpY2F0ZSBlZmZlY3RzICovCi0gICAgLyogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLQotICAgIE00T1NBX1RSQUNFM18wKAotICAgICAgICAiTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEZyZWUgdGhlIHBvaW50ZXJzIGFsbG9jYXRlZCBpbiB0aGUgQ2xpcFNldHRpbmcgc3RydWN0dXJlIChwRmlsZSwgRWZmZWN0cykuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MoCi0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyApCi17Ci0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5nczogcENsaXBTZXR0aW5ncyBpcyBOVUxMIik7Ci0KLSAgICAvKiBmcmVlIGZpbGVuYW1lICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENsaXBTZXR0aW5ncy0+cEZpbGUgKQotICAgIHsKLSAgICAgICAgZnJlZShwQ2xpcFNldHRpbmdzLT5wRmlsZSk7Ci0gICAgICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBmcmVlIGVmZmVjdHMgc2V0dGluZ3MgKi8KLSAgICAvKiAgICBpZihNNE9TQV9OVUxMICE9IHBDbGlwU2V0dGluZ3MtPkVmZmVjdHMpCi0gICAgewotICAgIGZyZWUocENsaXBTZXR0aW5ncy0+RWZmZWN0cyk7Ci0gICAgcENsaXBTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgcENsaXBTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9IFJDICovCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRPcGVuKCkKLSAqIEBicmllZiAgICAgU2V0IHRoZSBWU1MgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KLSAqIEBub3RlICAgICAgSXQgb3BlbnMgdGhlIGlucHV0IGZpbGUsIGJ1dCB0aGUgb3V0cHV0IGZpbGUgbWF5IG5vdCBiZSBjcmVhdGVkIHlldC4KLSAqIEBwYXJhbSAgICAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgICBwU2V0dGluZ3MgICAgICAgICAgIChJTikgRWRpdCBzZXR0aW5ncwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgIFRoZXJlIGlzIG5vIG1vcmUgYXZhaWxhYmxlIG1lbW9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRPcGVuKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKnBTZXR0aW5ncyApCi17Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGk7Ci0gICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgb3V0cHV0RmlsZVR5cGUgPQotICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfVW5zdXBwb3J0ZWQ7IC8qKjwgM0dQUCBvciBNUDMgKHdlIGRvbid0IGRvIEFNUiBvdXRwdXQpICovCi0gICAgTTRPU0FfVUludDMyIHVpQzFkdXJhdGlvbiwgdWlDMmR1cmF0aW9uOwotCi0gICAgTTRPU0FfVFJBQ0UzXzIoCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW4gY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCwgcFNldHRpbmdzPTB4JXgiLAotICAgICAgICBwQ29udGV4dCwgcFNldHRpbmdzKTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVycyAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHBTZXR0aW5ncyBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBTZXR0aW5ncy0+cENsaXBMaXN0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBwU2V0dGluZ3MtPnBDbGlwTGlzdCBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfREVCVUdfSUYyKCggcFNldHRpbmdzLT51aUNsaXBOdW1iZXIgPiAxKQotICAgICAgICAmJiAoTTRPU0FfTlVMTCA9PSBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gKi8KLSAgICBpZiggKCBwQy0+U3RhdGUgIT0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ1JFQVRFRCkKLSAgICAgICAgJiYgKHBDLT5TdGF0ZSAhPSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9DTE9TRUQpICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogU3RhdGUgZXJyb3IgKDB4JXgpISBSZXR1cm5pbmcgTTRFUlJfU1RBVEUiLAotICAgICAgICAgICAgcEMtPlN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSBhbnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgaW50ZXJuYWwgc2V0dGluZ3MgbGlzdCAqLwotICAgIE00VlNTM0dQUF9pbnRGcmVlU2V0dGluZ3NMaXN0KHBDKTsKLQotICAgIC8qKgotICAgICogQ29weSB0aGUgdXNlciBzZXR0aW5ncyBpbiBvdXIgY29udGV4dCAqLwotICAgIHBDLT51aUNsaXBOdW1iZXIgPSBwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsKLQotICAgIC8qKgotICAgICogQ29weSB0aGUgY2xpcCBsaXN0ICovCi0gICAgcEMtPnBDbGlwTGlzdCA9Ci0gICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKQotICAgICAgICAqIHBDLT51aUNsaXBOdW1iZXIsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPnBDbGlwTGlzdCIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDbGlwTGlzdCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+U2V0dGluZ3MucENsaXBMaXN0LFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCBwU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzKCYocEMtPnBDbGlwTGlzdFtpXSksCi0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwgTTRPU0FfVFJVRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IGVmZmVjdHMgbGlzdCBSQyAqLwotCi0gICAgLypGQiBidWcgZml4IDE5LjAzLjIwMDggaWYgdGhlIG51bWJlciBvZiBlZmZlY3RzIGlzIDAgLT4gY3Jhc2gqLwotICAgIGlmKCBwU2V0dGluZ3MtPm5iRWZmZWN0cyA+IDAgKQotICAgIHsKLSAgICAgICAgcEMtPm5iRWZmZWN0cyA9IHBTZXR0aW5ncy0+bmJFZmZlY3RzOwotICAgICAgICBwQy0+cEVmZmVjdHNMaXN0ID0gKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncwotICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykgKiBwQy0+bmJFZmZlY3RzLAotICAgICAgICAgICAgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cEVmZmVjdHNMaXN0Iik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBFZmZlY3RzTGlzdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IHVuYWJsZSB0byBhbGxvY2F0ZSBwQy0+cEVmZmVjdHNMaXN0LCByZXR1cm5pbmcgTTRFUlJfQUxMT0MiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPm5iRWZmZWN0czsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopICYocEMtPnBFZmZlY3RzTGlzdFtpXSksCi0gICAgICAgICAgICAgICAgKHZvaWQgKikgJihwU2V0dGluZ3MtPkVmZmVjdHNbaV0pLAotICAgICAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGFjdGl2ZSBlZmZlY3RzIGxpc3QgUkMgKi8KLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdCA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00T1NBX1VJbnQ4KSAqIHBDLT5uYkVmZmVjdHMsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5wQWN0aXZlRWZmZWN0c0xpc3QiKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbGxvY2F0ZSBhY3RpdmUgZWZmZWN0cyBsaXN0ICovCi0gICAgICAgIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxID0KLSAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRPU0FfVUludDgpICogcEMtPm5iRWZmZWN0cywKLSAgICAgICAgICAgIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicEMtPnBBY3RpdmVFZmZlY3RzTGlzdCIpOwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MSkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEMtPm5iRWZmZWN0cyA9IDA7Ci0gICAgICAgIHBDLT5uYkFjdGl2ZUVmZmVjdHMgPSAwOwotICAgICAgICBwQy0+bmJBY3RpdmVFZmZlY3RzMSA9IDA7Ci0gICAgICAgIHBDLT5wRWZmZWN0c0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotICAgIC8qKgotICAgICogVGVzdCB0aGUgY2xpcCBhbmFseXNpcyBkYXRhLCBpZiBpdCBpcyBub3QgcHJvdmlkZWQsIGFuYWx5c2UgdGhlIGNsaXBzIGJ5IG91cnNlbHZlcy4gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBpZiggTTRPU0FfRkFMU0UgPT0gcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5iQW5hbHlzZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IEFuYWx5c2lzIG5vdCBwcm92aWRlZCBieSB0aGUgaW50ZWdyYXRvciAqLwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRBbmFseXNlQ2xpcChwQy0+cENsaXBMaXN0W2ldLnBGaWxlLAotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0uRmlsZVR5cGUsICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVJlYWRQdHIpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfZWRpdEFuYWx5c2VDbGlwIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGNsaXAgY29tcGF0aWJpbGl0eSAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlICE9TTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2hlY2sgYWxsIHRoZSBjbGlwcyBhcmUgY29tcGF0aWJsZSB3aXRoIFZTUyAzR1BQICovCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tDbGlwQ29tcGF0aWJsZVdpdGhWc3NFZGl0aW5nKAotICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDaGVja0NsaXBDb21wYXRpYmxlV2l0aFZzc0VkaXRpbmcoJWQpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBpLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayB0aGUgbWFzdGVyIGNsaXAgdmVyc3VzIGFsbCB0aGUgb3RoZXIgb25lcy4KLSAgICAgICAgKGluY2x1ZGluZyBtYXN0ZXIgY2xpcCB3aXRoIGl0c2VsZiwgZWxzZSB2YXJpYWJsZXMgZm9yIG1hc3RlciBjbGlwCi0gICAgICAgIGFyZSBub3QgcHJvcGVybHkgc2V0dGVkKSAqLwotICAgICAgICBpZihwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlICE9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkoCi0gICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICZwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIC8qIGluIGNhc2Ugb2Ygd2FybmluZyByZWdhcmRpbmcgYXVkaW8gaW5jb21wYXRpYmlsaXR5LAotICAgICAgICAgICAgICAgIGVkaXRpbmcgY29udGludWVzICovCi0gICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfZWRpdENoZWNrQ2xpcENvbXBhdGliaWxpdHkgXAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkKSByZXR1cm5zIDB4JXghIiwgaSwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5iQXVkaW9Jc0NvbXBhdGlibGVXaXRoTWFzdGVyQ2xpcCA9Ci0gICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogU2VhcmNoIGF1ZGlvIHRyYWNrcyB0aGF0IGNhbm5vdCBiZSBlZGl0ZWQgOgotICAgICogICAtIGRlbGV0ZSBhbGwgYXVkaW8gZWZmZWN0cyBmb3IgdGhlIGNsaXAKLSAgICAqICAgLSBpZiBtYXN0ZXIgY2xpcCBpcyBlZGl0YWJsZSBsZXQgdGhlIHRyYW5zaXRpb24KLSAgICAoYmFkIHRyYWNrIHdpbGwgYmUgcmVwbGFjZWQgbGF0ZXIgd2l0aCBzaWxlbmNlKQotICAgICogICAtIGlmIG1hc3RlciBjbGlwIGlzIG5vdCBlZGl0YWJsZSBzd2l0Y2ggdG8gYSBkdW1teSB0cmFuc2l0aW9uIChvbmx5IGNvcHkvcGFzdGUpICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBwQy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYoIE00T1NBX0ZBTFNFID09IHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuYkF1ZGlvSXNFZGl0YWJsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpRng7Ci0KLSAgICAgICAgICAgIGZvciAoIHVpRnggPSAwOyB1aUZ4IDwgcEMtPm5iRWZmZWN0czsgdWlGeCsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQy0+cEVmZmVjdHNMaXN0W3VpRnhdLkF1ZGlvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgICAgICA9IE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX05vbmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCAoIGkgPCAocEMtPnVpQ2xpcE51bWJlciAtIDEpKQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKQotICAgICAgICAgICAgICAgICYmIChNNE9TQV9GQUxTRSA9PSBwQy0+cENsaXBMaXN0W3BTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgdWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy5iQXVkaW9Jc0VkaXRhYmxlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPkF1ZGlvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAgICAgPSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogV2UgYWRkIGEgdHJhbnNpdGlvbiBvZiBkdXJhdGlvbiAwIGF0IHRoZSBlbmQgb2YgdGhlIGxhc3QgY2xpcC4KLSAgICAqIEl0IHdpbGwgc3VwcHJlc3MgYSB3aG9sZSBidW5jaCBhIHRlc3QgbGF0dGVyIGluIHRoZSBwcm9jZXNzaW5nLi4uICovCi0gICAgcEMtPnBUcmFuc2l0aW9uTGlzdCA9IChNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzCi0gICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKQotICAgICAgICAqIChwQy0+dWlDbGlwTnVtYmVyKSwgTTRWU1MzR1BQLCAoTTRPU0FfQ2hhciAqKSJwQy0+cFRyYW5zaXRpb25MaXN0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cFRyYW5zaXRpb25MaXN0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogdW5hYmxlIHRvIGFsbG9jYXRlIHBDLT5TZXR0aW5ncy5wVHJhbnNpdGlvbkxpc3QsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKio8IGNvcHkgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgKHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyIC0gMSk7IGkrKyApCi0gICAgewotICAgICAgICBtZW1jcHkoKHZvaWQgKikgJihwQy0+cFRyYW5zaXRpb25MaXN0W2ldKSwKLSAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0sCi0gICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncykpOwotICAgIH0KLQotICAgIC8qKjwgV2UgZmlsbCB0aGUgbGFzdCAiZHVtbXkiIHRyYW5zaXRpb24gKi8KLSAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUNsaXBOdW1iZXIgLSAxXS51aVRyYW5zaXRpb25EdXJhdGlvbiA9IDA7Ci0gICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDbGlwTnVtYmVyCi0gICAgICAgIC0gMV0uVmlkZW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ2xpcE51bWJlcgotICAgICAgICAtIDFdLkF1ZGlvVHJhbnNpdGlvblR5cGUgPSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZTsKLQotICAgIC8qKgotICAgICogQXZvaWQgd2VpcmQgY2xpcCBzZXR0aW5ncyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgewotICAgICAgICBpZiAocEMtPnBDbGlwTGlzdFtpXS5GaWxlVHlwZSAhPU00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrKCZwQy0+cENsaXBMaXN0W2ldKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogTTRWU1MzR1BQX2ludENsaXBTZXR0aW5nc1Nhbml0eUNoZWNrIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IChwU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYgKHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24gIT0gMCkgewotICAgICAgICAgICAgIGlmIChwQy0+cENsaXBMaXN0W2ldLkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbjsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBpZiAocEMtPnBDbGlwTGlzdFtpKzFdLkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlCZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0gICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaV0uRmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSB7Ci0gICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lIC0gcEMtPnBDbGlwTGlzdFtpXS51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpXS51aUJlZ2luQ3V0VGltZSA9IDA7Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaSsxXS5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgcEMtPnBDbGlwTGlzdFtpKzFdLnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlFbmRDdXRUaW1lIC0gcEMtPnBDbGlwTGlzdFtpKzFdLnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2krMV0udWlCZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTWF4aW11bSB0cmFuc2l0aW9uIGR1cmF0aW9uIGJldHdlZW4gY2xpcCBuIGFuZCBjbGlwIG4rMSBpcyB0aGUgZHVyYXRpb24KLSAgICAgICAgKiBvZiB0aGUgc2hvcnRlc3QgY2xpcCAqLwotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpQzFkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKjwgZHVyYXRpb24gb2YgY2xpcCBuIGlzIHRoZSBlbmQgY3V0IHRpbWUgKi8KLSAgICAgICAgICAgIHVpQzFkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaV0udWlFbmRDdXRUaW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqPCBTdWJzdHJhY3QgYmVnaW4gY3V0ICovCi0gICAgICAgIHVpQzFkdXJhdGlvbiAtPSBwQy0+cENsaXBMaXN0W2ldLnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgIC8qKjwgQ2hlY2sgdGhhdCB0aGUgdHJhbnNpdGlvbiBpcyBzaG9ydGVyIHRoYW4gY2xpcCBuICovCi0gICAgICAgIGlmKCBwQy0+cFRyYW5zaXRpb25MaXN0W2ldLnVpVHJhbnNpdGlvbkR1cmF0aW9uID4gdWlDMWR1cmF0aW9uICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbiA9IHVpQzFkdXJhdGlvbiAtIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2kgKyAxXS51aUVuZEN1dFRpbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aUMyZHVyYXRpb24gPQotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaSArIDFdLkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKio8IGR1cmF0aW9uIG9mIGNsaXAgbisxIGlzIHRoZSBlbmQgY3V0IHRpbWUgKi8KLSAgICAgICAgICAgIHVpQzJkdXJhdGlvbiA9IHBDLT5wQ2xpcExpc3RbaSArIDFdLnVpRW5kQ3V0VGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKjwgU3Vic3RyYWN0IGJlZ2luIGN1dCAqLwotICAgICAgICB1aUMyZHVyYXRpb24gLT0gcEMtPnBDbGlwTGlzdFtpICsgMV0udWlCZWdpbkN1dFRpbWU7Ci0KLSAgICAgICAgLyoqPCBDaGVjayB0aGF0IHRoZSB0cmFuc2l0aW9uIGlzIHNob3J0ZXIgdGhhbiBjbGlwIG4rMSAqLwotICAgICAgICBpZiggcEMtPnBUcmFuc2l0aW9uTGlzdFtpXS51aVRyYW5zaXRpb25EdXJhdGlvbiA+IHVpQzJkdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24gPSB1aUMyZHVyYXRpb24gLSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQXZvaWQgd2VpcmQgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBlcnIgPQotICAgICAgICAgICAgTTRWU1MzR1BQX2ludFRyYW5zaXRpb25TZXR0aW5nc1Nhbml0eUNoZWNrKCZwQy0+cFRyYW5zaXRpb25MaXN0W2ldKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50Q2xpcFNldHRpbmdzU2FuaXR5Q2hlY2sgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayB0aGF0IHR3byB0cmFuc2l0aW9ucyBhcmUgbm90IG92ZXJsYXBwaW5nCi0gICAgICAgICAgKG5vIG92ZXJsYXBwaW5nIHBvc3NpYmxlIGZvciBmaXJzdCBjbGlwKSAqLwotICAgICAgICBpZiggaSA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhlcmUgaXMgYSB0cmFuc2l0aW9uIG92ZXJsYXAgaWYgdGhlIHN1bSBvZiB0aGUgZHVyYXRpb24gb2YKLSAgICAgICAgICAgICAgdHdvIGNvbnNlY3V0aXZlIHRyYW5zaXRpb25zCi0gICAgICAgICAgICAqIGlzIGhpZ2hlciB0aGFuIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2xpcCBpbi1iZXR3ZWVuLiAqLwotICAgICAgICAgICAgaWYoICggcEMtPnBUcmFuc2l0aW9uTGlzdFtpIC0gMV0udWlUcmFuc2l0aW9uRHVyYXRpb24KLSAgICAgICAgICAgICAgICArIHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb24pID49IHVpQzFkdXJhdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE92ZXJsYXBwaW5nIHRyYW5zaXRpb25zIG9uIGNsaXAgJWQsXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9PVkVSTEFQUElOR19UUkFOU0lUSU9OUyIsCi0gICAgICAgICAgICAgICAgICAgIGkpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX09WRVJMQVBQSU5HX1RSQU5TSVRJT05TOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBPdXRwdXQgY2xpcCBkdXJhdGlvbiAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHN1bSBvZiB0aGUgY2xpcCBkdXJhdGlvbiAqLwotICAgICAgICBpZiggMCA9PSBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgICAgcEMtPgotICAgICAgICAgICAgICAgIHBDbGlwTGlzdFsKLSAgICAgICAgICAgICAgICAgICAgaV0uQ2xpcFByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUNsaXBWaWRlb0R1cmF0aW9uOyAvKiBPbmx5IHZpZGVvIHRyYWNrIGR1cmF0aW9uIGlzIGltcG9ydGFudCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgZGV2aWF0aW9uIGlmIGF1ZGlvIHRyYWNrIGlzIGxvbmdlciAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gKz0KLSAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLnVpRW5kQ3V0VGltZTsgLyoqPCBBZGQgZW5kIGN1dCAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcEMtPmV3Yy5pT3V0cHV0RHVyYXRpb24gLT0KLSAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0udWlCZWdpbkN1dFRpbWU7IC8qKjwgUmVtb3ZlIGJlZ2luIGN1dCAqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFJlbW92ZSB0aGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24gKGl0IGlzIGNvdW50ZWQgdHdpY2UpICovCi0gICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uIC09IHBDLT5wVHJhbnNpdGlvbkxpc3RbaV0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0gICAgfQotCi0gICAgLyogR2V0IHZpZGVvIHByb3BlcnRpZXMgZnJvbSBvdXRwdXQgcHJvcGVydGllcyAqLwotCi0gICAgLyogR2V0IG91dHB1dCB3aWR0aCBhbmQgaGVpZ2h0ICovCi0gICAgc3dpdGNoKHBDLT54VlNTLm91dHB1dFZpZGVvU2l6ZSkgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTI4OwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gOTY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDE2MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRQ0lGOgotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMzIwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMjQwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMzUyOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMjg4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1ZHQToKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gNjQwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiArUFIgTFY1ODA3ICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1dWR0E6Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCA9IDgwMDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDQ4MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOVFNDOgotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSA3MjA7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qIC1QUiBMVjU4MDcgKi8KLSAgICAgICAgICAgIC8qICtDUiBHb29nbGUgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNjQwXzM2MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gNjQwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gMzYwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gTTRFTkNPREVSXzg1NF80ODBfV2lkdGg7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMjgwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTI4MDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDcyMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotCi0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gOTYwOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE5MjBfMTA4MDoKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb1dpZHRoID0gMTkyMDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCA9IDEwODg7IC8vIG5lZWQgdG8gYmUgbXVsdGlwbGVzIG9mIDE2Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKiBJZiBvdXRwdXQgdmlkZW8gc2l6ZSBpcyBub3QgZ2l2ZW4sIHdlIHRha2UgUUNJRiBzaXplICovCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBubyBvdXRwdXQgdmlkZW8gc2l6ZSBnaXZlbiwgZGVmYXVsdCB0byBRQ0lGISIpOwotICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGggPSAxNzY7Ci0gICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQgPSAxNDQ7Ci0gICAgICAgICAgICBwQy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rUUNJRjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSAgICAgICAgPSAzMDsKLSAgICBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgID0gMDsKLSAgICAvKiBTZXQgb3V0cHV0IHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsICovCi0gICAgcEMtPmV3Yy5vdXRwdXRWaWRlb1Byb2ZpbGUgPSBwQy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgcEMtPmV3Yy5vdXRwdXRWaWRlb0xldmVsID0gcEMtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbDsKLQotICAgIHN3aXRjaChwQy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCkgewotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjYzOgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUEVHNDoKLSAgICAgICAgICAgIHBDLT5ld2MuVmlkZW9TdHJlYW1UeXBlID0gTTRTWVNfa01QRUdfNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tIMjY0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rSDI2NDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgPSBNNFNZU19rVmlkZW9Vbmtub3duOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBhdWRpbyBwcm9wZXJ0aWVzIG9mIHRoZSBtYXN0ZXIgY2xpcCB0byB0aGUgb3V0cHV0IHByb3BlcnRpZXMgKi8KLSAgICBwQy0+ZXdjLnVpTmJDaGFubmVscyA9Ci0gICAgICAgIHBDLT5wQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLnVpTmJDaGFubmVsczsKLSAgICBwQy0+ZXdjLnVpQXVkaW9CaXRyYXRlID0KLSAgICAgICAgcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcF0uQ2xpcFByb3BlcnRpZXMudWlBdWRpb0JpdHJhdGU7Ci0gICAgcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5ID0gcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPgotICAgICAgICB1aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3k7Ci0gICAgcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplID0KLSAgICAgICAgcEMtPnBDbGlwTGlzdFtwU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcF0uQ2xpcFByb3BlcnRpZXMudWlEZWNvZGVkUGNtU2l6ZTsKLSAgICBwQy0+ZXdjLnNjYWxlX2F1ZGlvID0gcEMtPmV3Yy51aVNhbXBsaW5nRnJlcXVlbmN5IC8gMTAwMC4wOwotCi0gICAgc3dpdGNoKCBwQy0+cENsaXBMaXN0W3BTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwXS5DbGlwUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQU1SX05COgotICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rQU1SOwotICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4ICopTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0ODsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkU7Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9EVVJBVElPTjsKLSAgICAgICAgICAgIHBDLT5iU3VwcG9ydFNpbGVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rQUFDOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tBQUNwbHVzOgotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tlQUFDcGx1czoKLSAgICAgICAgICAgIHBDLT5ld2MuQXVkaW9TdHJlYW1UeXBlID0gTTRTWVNfa0FBQzsKLQotICAgICAgICAgICAgaWYoIHBDLT5ld2MudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDggKilNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfTU9OTzsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpU2lsZW5jZUZyYW1lU2l6ZSA9IE00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9NT05PX1NJWkU7Ci0gICAgICAgICAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCAqKU00VlNTM0dQUF9BQUNfQVVfU0lMRU5DRV9TVEVSRU87Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPQotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQUFDX0FVX1NJTEVOQ0VfU1RFUkVPX1NJWkU7Ci0gICAgICAgICAgICAgICAgcEMtPmJTdXBwb3J0U2lsZW5jZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgMTAyNDsgLyogQUFDIGlzIGFsd2F5cyAxMDI0L0ZyZXEgc2FtcGxlIGR1cmF0aW9uICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tNUDM6Ci0gICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tNUDM7Ci0gICAgICAgICAgICBwQy0+ZXdjLnBTaWxlbmNlRnJhbWVEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uID0gMDsKLSAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZSwgbXAzIGNvcmUgcmVhZGVyIHJldHVybiBhIHRpbWUgaW4gbXMgKi8KLSAgICAgICAgICAgIHBDLT5ld2Muc2NhbGVfYXVkaW8gPSAxLjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tFVlJDOgotICAgICAgICAgICAgcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgPSBNNFNZU19rRVZSQzsKLSAgICAgICAgICAgIHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUgPSAwOwotICAgICAgICAgICAgcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSAxNjA7IC8qIEVWUkMgZnJhbWVzIGFyZSAyMCBtcyBhdCA4MDAwIEh6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFrZXMgaXQgZWFzaWVyIHRvIGZhY3Rvcml6ZSBhbXIgYW5kIGV2cmMgY29kZSkgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSA9IE00U1lTX2tBdWRpb1Vua25vd247Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaTxwQy0+dWlDbGlwTnVtYmVyOyBpKyspIHsKLSAgICAgICAgaWYgKHBDLT5wQ2xpcExpc3RbaV0uYlRyYW5zY29kaW5nUmVxdWlyZWQgPT0gTTRPU0FfRkFMU0UpIHsKLSAgICAgICAgICAgIC8qKiBJZiBub3QgdHJhbnNjb2RlZCBpbiBBbmFseXNpcyBwaGFzZSwgY2hlY2sKLSAgICAgICAgICAgICAqIGlmIHRyYW5zY29kaW5nIHJlcXVpcmVkIG5vdwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlICE9Ci0gICAgICAgICAgICAgICAgICBwQy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCl8fAotICAgICAgICAgICAgICAgICAgKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMudWlWaWRlb1dpZHRoICE9Ci0gICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGgpIHx8Ci0gICAgICAgICAgICAgICAgICAocEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ICE9Ci0gICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KSB8fAotICAgICAgICAgICAgICAgICAgKHBDLT5wQ2xpcExpc3RbaV0uQ2xpcFByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09Ci0gICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0gyNjQpIHx8Ci0gICAgICAgICAgICAgICAgICAocEMtPnBDbGlwTGlzdFtpXS5DbGlwUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rTVBFRzQgJiYKLSAgICAgICAgICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGUgIT0KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlKSkgewotICAgICAgICAgICAgICAgIHBDLT5wQ2xpcExpc3RbaV0uYlRyYW5zY29kaW5nUmVxdWlyZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyoqIElmIGJUcmFuc2NvZGluZ1JlcXVpcmVkIGlzIHRydWUsIGl0IG1lYW5zIHRoZSBjbGlwIGhhcwotICAgICAgICAgICAgICogYmVlbiB0cmFuc2NvZGVkIGluIEFuYWx5c2lzIHBoYXNlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwQy0+cENsaXBMaXN0W2ldLmJUcmFuc2NvZGluZ1JlcXVpcmVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgKiBXZSBwcm9kdWNlIGEgM2dwcCBmaWxlLCB1bmxlc3MgaXQgaXMgbXAzICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tNUDMgPT0gcEMtPgotICAgICAgICBwQ2xpcExpc3RbcFNldHRpbmdzLT51aU1hc3RlckNsaXBdLkNsaXBQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgICAgIG91dHB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMzsKLSAgICBlbHNlCi0gICAgICAgIG91dHB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0KLSAgICAvKioKLSAgICAqIEJld2FyZSwgYSBudWxsIGR1cmF0aW9uIHdvdWxkIGxlYWQgdG8gYSBkaXZpZGUgYnkgemVybyBlcnJvciAoYmV0dGVyIHNhZmUgdGhhbiBzb3JyeS4uLikgKi8KLSAgICBpZiggMCA9PSBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiApCi0gICAgewotICAgICAgICBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbiA9IDE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBPcGVuIGZpcnN0IGNsaXAgKi8KLSAgICBwQy0+dWlDdXJyZW50Q2xpcCA9IDA7Ci0KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICA9IDAuMDsKLSAgICBwQy0+ZXdjLmRPdXRwdXRWaWRDdHMgPSAwLjA7Ci0gICAgcEMtPmV3Yy5kQVRvID0gMC4wOwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAocEMpOwotICAgIC8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciAmJiBlcnIgIT0gTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRG8gdGhlIHZpZGVvIHN0dWZmIGluIDNHUFAgQXVkaW8vVmlkZW8gY2FzZSAqLwotICAgIGlmKCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCA9PSBvdXRwdXRGaWxlVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHRoZSBEZWNvZGVyIFNwZWNpZmljIEluZm8gZm9yIHRoZSBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIHN0cmVhbXMgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKHBDLAotICAgICAgICAgICAgcFNldHRpbmdzLT51aU1hc3RlckNsaXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaSgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbmNyZW1lbnQgZm9yIHRoZSB0cmFuc2l0aW9uIGZpbGUgKi8KLSAgICAgICAgc3dpdGNoKCBwU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9GUFM6Ci0gICAgICAgICAgICAgICAgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uID0gMTAwMC4wIC8gNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDcuNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTBfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDEwLjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDEyLjU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE1X0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAxNS4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMF9GUFM6Ci0gICAgICAgICAgICAgICAgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uID0gMTAwMC4wIC8gMjAuMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjVfRlBTOgotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9IDEwMDAuMCAvIDI1LjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazMwX0ZQUzoKLSAgICAgICAgICAgICAgICBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24gPSAxMDAwLjAgLyAzMC4wOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuKCk6IGludmFsaWQgdmlkZW9GcmFtZVJhdGUgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFIiwKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FTkNPRElOR19GUkFNRV9SQVRFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00U1lTX2tNUEVHXzQgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlBbHBoYTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBNUEVHLTQgY2FzZS4KLSAgICAgICAgICAgICogVGltZSBzY2FsZSBvZiB0aGUgdHJhbnNpdGlvbiBlbmNvZGVyIG11c3QgYmUgdGhlIHNhbWUgdGhhbiB0aGUKLSAgICAgICAgICAgICogdGltZXNjYWxlIG9mIHRoZSBpbnB1dCBmaWxlcy4KLSAgICAgICAgICAgICogU28gdGhlIGZyYW1lIGR1cmF0aW9uIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgdGltZSBzY2FsZSwKLSAgICAgICAgICAgICogYnV0IHdpdGhvdXQgYmVlaW5nIHRvbyBzaG9ydC4KLSAgICAgICAgICAgICogRm9yIHRoYXQsIHdlIG11c3QgY29tcHV0ZSBhbHBoYSAoaW50ZWdlcikgc28gdGhhdDoKLSAgICAgICAgICAgICogICAgICAgICAgICAgKGFscGhhIHggMTAwMCkvRW5jb2RlclRpbWVTY2FsZSA+IE1pbkZyYW1lRHVyYXRpb24KLSAgICAgICAgICAgICoqLwotCi0gICAgICAgICAgICB1aUFscGhhID0gKE00T1NBX1VJbnQzMikoKCBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24KLSAgICAgICAgICAgICAgICAqIHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZSkgLyAxMDAwLjAgKyAwLjUpOwotCi0gICAgICAgICAgICBpZiggdWlBbHBoYSA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICggdWlBbHBoYSAqIDEwMDAuMCkgLyBwQy0+ZXdjLnVpVmlkZW9UaW1lU2NhbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggTTRTWVNfa0gyNjMgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goIHBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIwX0ZQUzoKLSAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbigpOiBpbnZhbGlkIHZpZGVvRnJhbWVSYXRlIGZvciBIMjYzLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEU7Ci0gICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgTVAzIG91dHB1dCBmaWxlICovCi0gICAgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDMgPT0gb3V0cHV0RmlsZVR5cGUgKQotICAgIHsKLSAgICAgICAgTTRSRUFERVJfQnVmZmVyIG1wM3RhZ0J1ZmZlcjsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGUocEMsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdE9wZW46IE00VlNTM0dQUF9pbnRDcmVhdGVNUDNPdXRwdXRGaWxlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBUaGUgSUQzdjIgdGFnIGNvdWxkIGJlIGF0IGFueSBwbGFjZSBpbiB0aGUgbXAzIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFRoZSBtcDMgcmVhZGVyIG9ubHkgY2hlY2tzIGZldyBieXRlcyBpbiB0aGUgYmVnaW5uaW5nIG9mCi0gICAgICAgICAgIHN0cmVhbSB0byBsb29rIGZvciBhIElEM3YyIHRhZyAgKi8KLSAgICAgICAgLyogSXQgbWVhbnMgdGhhdCBpZiB0aGUgSUQzdjIgdGFnIGlzIG5vdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIHRoZSByZWFkZXIgZG8KLSAgICAgICAgYXMgdGhlcmUgaXMgbm8gdGhlc2UgbWV0YWRhdGEgKi8KLQotICAgICAgICAvKiBSZXRyaWV2ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjIgVGFnICovCi0gICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlci0+bV9wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MlRhZywKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmbXAzdGFnQnVmZmVyKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNE1QM1JfZ2V0T3B0aW9uIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBXcml0ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjIgVGFnIGluIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICBpZiggMCAhPSBtcDN0YWdCdWZmZXIubV91aUJ1ZmZlclNpemUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBwQy0+cE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpbXAzdGFnQnVmZmVyLm1fcERhdGEsIG1wM3RhZ0J1ZmZlci5tX3VpQnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGcmVlIGJlZm9yZSB0aGUgZXJyb3IgY2hlY2tpbmcgYW55d2F5ICovCi0gICAgICAgICAgICBmcmVlKG1wM3RhZ0J1ZmZlci5tX3BEYXRhKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEVycm9yIGNoZWNraW5nICovCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBXcml0ZURhdGEoSUQzdjJUYWcpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplID0gMDsKLSAgICAgICAgICAgIG1wM3RhZ0J1ZmZlci5tX3BEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgM0dQUCBvdXRwdXQgZmlsZSAqLwotICAgIGVsc2UgaWYoIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQID09IG91dHB1dEZpbGVUeXBlICkKLSAgICB7Ci0gICAgICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIDExLzEyLzIwMDggQ1IzMjgzIE1NUyB1c2UgY2FzZSBpbiBWaWRlb0FydGlzdDogU2V0IG1heCBvdXRwdXQgZmlsZSBzaXplIGlmIG5lZWRlZCAqLwotICAgICAgICBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUsCi0gICAgICAgICAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCZwQy0+ZXdjLCAmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgICAgIHBDLT5wT3NhRmlsZVdyaXRQdHIsIHBTZXR0aW5ncy0+cE91dHB1dEZpbGUsCi0gICAgICAgICAgICAgICAgcEMtPnBPc2FGaWxlUmVhZFB0ciwgcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSwgMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRPcGVuOiBNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqIERlZmF1bHQgZXJyb3IgY2FzZSAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0T3BlbjogaW52YWxpZCBvdXRwdXRGaWxlVHlwZSA9IDB4JXgsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfT1VUUFVUX0ZJTEVfVFlQRV9FUlJPUiIsCi0gICAgICAgICAgICBvdXRwdXRGaWxlVHlwZSk7Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgTTRWU1MzR1BQX0VSUl9PVVRQVVRfRklMRV9UWVBFX0VSUk9SOyAvKio8IHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgY29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duIHRvIHRoZSB1c2VyICovCi0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0aWFsaXplIHN0YXRlICovCi0gICAgaWYoIE00U1lTX2tNUDMgPT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gdGhlIE1QMyBjYXNlIHdlIHVzZSBhIHNwZWNpYWwgYXVkaW8gc3RhdGUgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIHN0YXJ0IHdpdGggdGhlIHZpZGVvIHByb2Nlc3NpbmcgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJbml0aWFsaXplIHN0YXRlLgotICAgICogVGhlIGZpcnN0IGNsaXAgaXMgaW5kZXBlbmRhbnQgdG8gdGhlICJ2aXJ0dWFsIHByZXZpb3VzIGNsaXBzIiwKLSAgICAqIHNvIGl0J3MgbGlrZSBpZiB3ZSB3aGVyZSBpbiBSZWFkL1dyaXRlIG1vZGUgYmVmb3JlIGl0LiAqLwotICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfUkVBRF9XUklURTsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRPcGVuKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9lZGl0U3RlcCgpCi0gKiBAYnJpZWYgICAgUGVyZm9ybSBvbmUgc3RlcCBvZiBlZGl0aW5nLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgcENvbnRleHQgICAgICAgICAgIChJTikgVlNTIDNHUFAgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgIHBQcm9ncmVzcyAgICAgICAgICAoT1VUKSBQcm9ncmVzcyBwZXJjZW50YWdlICgwIHRvIDEwMCkgb2YgdGhlIGVkaXRpbmcgb3BlcmF0aW9uCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgcENvbnRleHQgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgIFZTUyAzR1BQIGlzIG5vdCBpbiBhbiBhcHByb3ByaWF0ZSBzdGF0ZSBmb3IgdGhpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOiBFZGl0aW9uIGlzIGRvbmUsIHVzZXIgc2hvdWxkIG5vdyBjYWxsCi0gKiAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xvc2UoKQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRTdGVwKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiB1aVByb2dyZXNzQXVkaW8sIHVpUHJvZ3Jlc3NWaWRlbywgdWlQcm9ncmVzczsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0U3RlcCBjYWxsZWQgd2l0aCBwQ29udGV4dD0weCV4IiwgcENvbnRleHQpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNFZTUzNHUFBfZWRpdFN0ZXA6IHBDb250ZXh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcFByb2dyZXNzKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRTdGVwOiBwUHJvZ3Jlc3MgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24gYW5kIHNlbGVjdCBjb3JyZWN0IHByb2Nlc3NpbmcgKi8KLSAgICBzd2l0Y2goIHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFN0YXRlX1ZJREVPOgotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW8ocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRTdGF0ZV9BVURJTzoKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzOgotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzKHBDKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA6Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMocEMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdFN0ZXAoKTogaW52YWxpZCBpbnRlcm5hbCBzdGF0ZSAoMHgleCksIHJldHVybmluZyBNNEVSUl9TVEFURSIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBwcm9ncmVzcy4KLSAgICAqIFdlIGRvIHRoZSBjb21wdXRpbmcgd2l0aCAzMmJpdHMgcHJlY2lzaW9uIGJlY2F1c2UgaW4gc29tZSAodmVyeSkgZXh0cmVtZSBjYXNlLCB3ZSBtYXkgZ2V0Ci0gICAgKiB2YWx1ZXMgaGlnaGVyIHRoYW4gMjU2ICguLi4pICovCi0gICAgdWlQcm9ncmVzc0F1ZGlvID0KLSAgICAgICAgKCAoTTRPU0FfVUludDMyKShwQy0+ZXdjLmRBVG8gKiAxMDApKSAvIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uOwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgdWlQcm9ncmVzc1ZpZGVvID0gKChNNE9TQV9VSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzICogMTAwKSkgLyBwQy0+ZXdjLmlPdXRwdXREdXJhdGlvbjsKLQotICAgIHVpUHJvZ3Jlc3MgPSB1aVByb2dyZXNzQXVkaW8gKyB1aVByb2dyZXNzVmlkZW87Ci0KLSAgICBpZiggKCBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFNZU19rQXVkaW9Vbmtub3duKQotICAgICAgICAmJiAocEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgIT0gTTRTWVNfa1ZpZGVvVW5rbm93bikgKQotICAgICAgICB1aVByb2dyZXNzIC89IDI7Ci0KLSAgICAvKioKLSAgICAqIFNhbml0eSBjaGVjayAqLwotICAgIGlmKCB1aVByb2dyZXNzID4gMTAwICkKLSAgICB7Ci0gICAgICAgICpwUHJvZ3Jlc3MgPSAxMDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgICpwUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDgpdWlQcm9ncmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB0aGUgZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRTdGVwKCk6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsb3NlKCkKLSAqIEBicmllZiAgICBGaW5pc2ggdGhlIFZTUyBlZGl0IG9wZXJhdGlvbi4KLSAqIEBub3RlICAgIFRoZSBvdXRwdXQgM0dQUCBmaWxlIGlzIHJlYWR5IHRvIGJlIHBsYXllZCBhZnRlciB0aGlzIGNhbGwKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgKElOKSBWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogIHBDb250ZXh0IGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgIFZTUyBpcyBub3QgaW4gYW4gYXBwcm9wcmlhdGUgc3RhdGUgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsb3NlKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQgKQotewotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfRVJSIHJldHVybmVkRXJyb3IgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBsYXN0Q1RTOwotCi0gICAgTTRPU0FfVFJBQ0UzXzEoIk00VlNTM0dQUF9lZGl0Q2xvc2UgY2FsbGVkIHdpdGggcENvbnRleHQ9MHgleCIsIHBDb250ZXh0KTsKLQotICAgIC8qKgotICAgICogICAgQ2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCi0gICAgTTRPU0FfREVCVUdfSUYyKChNNE9TQV9OVUxMID09IHBDb250ZXh0KSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbG9zZTogcENvbnRleHQgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBzdGF0ZSBhdXRvbWF0b24uCi0gICAgKiBJbiAidGhlb3J5Iiwgd2Ugc2hvdWxkIG5vdCBhdXRob3JpemUgY2xvc2luZyBpZiB3ZSBhcmUgaW4gQ1JFQVRFRCBzdGF0ZS4KLSAgICAqIEJ1dCBpbiBwcmFjdGljZSwgaW4gY2FzZSB0aGUgb3BlbmluZyBmYWlsZWQsIGl0IG1heSBoYXZlIGJlZW4gcGFydGlhbGx5IGRvbmUuCi0gICAgKiBJbiB0aGF0IGNhc2Ugd2UgaGF2ZSB0byBmcmVlIHNvbWUgb3BlbmVkIHJlc3NvdXJjZXMgYnkgY2FsbGluZyBDbG9zZS4gKi8KLSAgICBpZiggTTRWU1MzR1BQX2tFZGl0U3RhdGVfQ0xPU0VEID09IHBDLT5TdGF0ZSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBXcm9uZyBzdGF0ZSAoMHgleCksIHJldHVybmluZyBNNEVSUl9TVEFURSIsCi0gICAgICAgICAgICBwQy0+U3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBUaGVyZSBtYXkgYmUgYW4gZW5jb2RlciB0byBkZXN0cm95ICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IE00VlNTM0dQUF9lZGl0RGVzdHJveVZpZGVvRW5jb2RlcigpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgLyoqPCBXZSBkbyBub3QgcmV0dXJuIHRoZSBlcnJvciBoZXJlIGJlY2F1c2Ugd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIHJldHVybmVkRXJyb3IgPSBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBpZiggTTRTWVNfa01QMyA9PSBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBNUDMgY2FzZSAqLwotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+Y2xvc2VXcml0ZShwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0KTsKLSAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSBvdXRwdXQgM0dQUCBjbGlwLCBpZiBpdCBoYXMgYmVlbiBvcGVuZWQgKi8KLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBsYXN0IFZpZGVvIENUUyAqLwotICAgICAgICAgICAgbGFzdENUUyA9IHBDLT5ld2MuaU91dHB1dER1cmF0aW9uOwotCi0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhGaWxlRHVyYXRpb24sICZsYXN0Q1RTKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IFNldE9wdGlvbihNNFdSSVRFUl9rTWF4RmlsZUR1cmF0aW9uKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckdsb2JhbEZjdHMtPnBGY3RDbG9zZVdyaXRlKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2VkaXRDbG9zZTogcEZjdENsb3NlV3JpdGUoT1VUKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKio8IFdlIGRvIG5vdCByZXR1cm4gdGhlIGVycm9yIGhlcmUgYmVjYXVzZSB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUgotICAgICAgICAgICAgICAgICAgICA9PSByZXR1cm5lZEVycm9yICkgLyoqPCB3ZSByZXR1cm4gdGhlIGZpcnN0IGVycm9yIHRoYXQgaGFwcGVuZWQgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybmVkRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIG91dHB1dCB2aWRlbyBEU0ksIGlmIGl0IGhhcyBiZWVuIGNyZWF0ZWQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpKTsKLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgb3V0cHV0IGF1ZGlvIERTSSwgaWYgaXQgaGFzIGJlZW4gY3JlYXRlZCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kpOwotICAgICAgICBwQy0+ZXdjLnBBdWRpb091dHB1dERzaSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSBjbGlwMSwgaWYgbmVlZGVkICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBDMSApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocEMtPnBDMSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xvc2U6IE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChDMSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgV2UgZG8gbm90IHJldHVybiB0aGUgZXJyb3IgaGVyZSBiZWNhdXNlIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IKLSAgICAgICAgICAgICAgICA9PSByZXR1cm5lZEVycm9yICkgLyoqPCB3ZSByZXR1cm4gdGhlIGZpcnN0IGVycm9yIHRoYXQgaGFwcGVuZWQgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm5lZEVycm9yID0gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBDLT5wQzEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2xvc2UgY2xpcDIsIGlmIG5lZWRlZCAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQzIgKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQzIpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsb3NlOiBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAoQzIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAvKio8IFdlIGRvIG5vdCByZXR1cm4gdGhlIGVycm9yIGhlcmUgYmVjYXVzZSB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SCi0gICAgICAgICAgICAgICAgPT0gcmV0dXJuZWRFcnJvciApIC8qKjwgd2UgcmV0dXJuIHRoZSBmaXJzdCBlcnJvciB0aGF0IGhhcHBlbmVkICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuZWRFcnJvciA9IGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQy0+cEMyID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEZyZWUgdGhlIHRlbXBvcmFyeSBZVVYgcGxhbmVzICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djFbMF0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2MVswXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYxWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MVsxXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYxWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djFbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYxWzJdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djFbMl0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2MVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djJbMF0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2MlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYyWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2MlsxXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYyWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djJbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYyWzJdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djJbMl0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2MlsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogUkMgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2M1swXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXYzWzBdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djNbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXYzWzFdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djNbMV0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2M1sxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djNbMl0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2M1syXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXYzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBSQyAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT55dXY0WzBdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnl1djRbMF0ucGFjX2RhdGEpOwotICAgICAgICBwQy0+eXV2NFswXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnl1djRbMV0ucGFjX2RhdGEgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+eXV2NFsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBDLT55dXY0WzFdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+eXV2NFsyXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBmcmVlKHBDLT55dXY0WzJdLnBhY19kYXRhKTsKLSAgICAgICAgcEMtPnl1djRbMl0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogUkMgRnJlZSBlZmZlY3RzIGxpc3QgKi8KLSAgICBpZiggcEMtPnBFZmZlY3RzTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGZyZWUocEMtPnBFZmZlY3RzTGlzdCk7Ci0gICAgICAgIHBDLT5wRWZmZWN0c0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogUkMgRnJlZSBhY3RpdmUgZWZmZWN0cyBsaXN0ICovCi0gICAgaWYoIHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QpOwotICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogIEZyZWUgYWN0aXZlIGVmZmVjdHMgbGlzdCAqLwotICAgIGlmKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wQWN0aXZlRWZmZWN0c0xpc3QxKTsKLSAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdDEgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBpZihwQy0+bV9haXJfY29udGV4dCAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICBwQy0+bV9haXJfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIC8qKgotICAgICogVXBkYXRlIHN0YXRlIGF1dG9tYXRvbiAqLwotICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRDbG9zZSgpOiByZXR1cm5pbmcgMHgleCIsIHJldHVybmVkRXJyb3IpOwotICAgIHJldHVybiByZXR1cm5lZEVycm9yOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfZWRpdENsZWFuVXAoKQotICogQGJyaWVmICAgIEZyZWUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBWU1MgZWRpdCBvcGVyYXRpb24uCi0gKiBAbm90ZSAgICBUaGUgY29udGV4dCBpcyBubyBtb3JlIHZhbGlkIGFmdGVyIHRoaXMgY2FsbAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ29udGV4dCBpcyBNNE9TQV9OVUxMIChkZWJ1ZyBvbmx5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2VkaXRDbGVhblVwKCBNNFZTUzNHUFBfRWRpdENvbnRleHQgcENvbnRleHQgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDID0KLSAgICAgICAgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICopcENvbnRleHQ7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2VkaXRDbGVhblVwIGNhbGxlZCB3aXRoIHBDb250ZXh0PTB4JXgiLCBwQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDb250ZXh0ICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBwQ29udGV4dCBpcyBNNE9TQV9OVUxMLCByZXR1cm5pbmcgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDbG9zZSwgaWYgbmVlZGVkLgotICAgICogSW4gInRoZW9yeSIsIHdlIHNob3VsZCBub3QgY2xvc2UgaWYgd2UgYXJlIGluIENSRUFURUQgc3RhdGUuCi0gICAgKiBCdXQgaW4gcHJhY3RpY2UsIGluIGNhc2UgdGhlIG9wZW5pbmcgZmFpbGVkLCBpdCBtYXkgaGF2ZSBiZWVuIHBhcnRpYWxseSBkb25lLgotICAgICogSW4gdGhhdCBjYXNlIHdlIGhhdmUgdG8gZnJlZSBzb21lIG9wZW5lZCByZXNzb3VyY2VzIGJ5IGNhbGxpbmcgQ2xvc2UuICovCi0gICAgaWYoIE00VlNTM0dQUF9rRWRpdFN0YXRlX0NMT1NFRCAhPSBwQy0+U3RhdGUgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBjYWxsaW5nIE00VlNTM0dQUF9lZGl0Q2xvc2UiKTsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2VkaXRDbG9zZShwQyk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcCgpOiBNNFZTUzNHUFBfZWRpdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdmlkZW8gZW5jb2RlciBkdW1teSBBVSAqLwotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5ld2MucER1bW15QXVCdWZmZXIgKQotICAgIHsKLSAgICAgICAgZnJlZShwQy0+ZXdjLnBEdW1teUF1QnVmZmVyKTsKLSAgICAgICAgcEMtPmV3Yy5wRHVtbXlBdUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBBdWRpbyBlbmNvZGVyIGNvbnRleHQgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQgKQotICAgIHsKLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UoCi0gICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfZWRpdENsZWFuVXA6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xvc2UgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCgKLSAgICAgICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9lZGl0Q2xlYW5VcDogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RDbGVhblVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHBDLT5ld2MucEF1ZGlvRW5jQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzaGVsbHMgaW50ZXJmYWNlcyAqLwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsV3JpdGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbEVuY29kZXJzKCZwQy0+U2hlbGxBUEkpOwotICAgIE00VlNTM0dQUF91blJlZ2lzdGVyQWxsUmVhZGVycygmcEMtPlNoZWxsQVBJKTsKLSAgICBNNFZTUzNHUFBfdW5SZWdpc3RlckFsbERlY29kZXJzKCZwQy0+U2hlbGxBUEkpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzZXR0aW5ncyBjb3BpZWQgaW4gdGhlIGludGVybmFsIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfaW50RnJlZVNldHRpbmdzTGlzdChwQyk7Ci0KLSAgICAvKioKLSAgICAqIEZpbmFsbHksIEZyZWUgY29udGV4dCAqLwotICAgIGZyZWUocEMpOwotICAgIHBDID0gTTRPU0FfTlVMTDsKLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2VkaXRDbGVhblVwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNpZmRlZiBXSU4zMgotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX0dldEVycm9yTWVzc2FnZSgpCi0gKiBAYnJpZWYgICAgUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGdpdmVuIGVycm9yIGNvZGUKLSAqIEBub3RlICAgIFRoZSBpbnB1dCBzdHJpbmcgbXVzdCBiZSBhbHJlYWR5IGFsbG9jYXRlZCAoYW5kIGxvbmcgZW5vdWdoISkKLSAqIEBwYXJhbSAgICBlcnIgICAgICAgICAgICAgICAgKElOKSBFcnJvciBjb2RlIHRvIGdldCB0aGUgZGVzY3JpcHRpb24gZnJvbQotICogQHBhcmFtICAgIHNNZXNzYWdlICAgICAgICAoSU4vT1VUKSBBbGxvY2F0ZWQgc3RyaW5nIGluIHdoaWNoIHRoZSBkZXNjcmlwdGlvbiB3aWxsIGJlIGNvcGllZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgSW5wdXQgZXJyb3IgaXMgZnJvbSB0aGUgVlNTM0dQUCBtb2R1bGUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOklucHV0IGVycm9yIGlzIG5vdCBmcm9tIHRoZSBWU1MzR1BQIG1vZHVsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNFZTUzNHUFBfR2V0RXJyb3JNZXNzYWdlKCBNNE9TQV9FUlIgZXJyLCBNNE9TQV9DaGFyICpzTWVzc2FnZSApCi17Ci0gICAgc3dpdGNoKCBlcnIgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfRURJVElOR19ET05FIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfRU5EX09GX0FVRElPX01JWElORyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0VORF9PRl9FWFRSQUNUX1BJQ1RVUkU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0VORF9PRl9FWFRSQUNUX1BJQ1RVUkUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0ZJTEVfVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9GSUxFX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlZBTElEX0VGRkVDVF9LSU5EIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfQVVESU9fRUZGRUNUX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19UUkFOU0lUSU9OX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX0FVRElPX1RSQU5TSVRJT05fVFlQRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX0VOQ09ESU5HX0ZSQU1FX1JBVEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRU5DT0RJTkdfRlJBTUVfUkFURSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX0VGRkVDVF9OVUxMOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRVhURVJOQUxfVFJBTlNJVElPTl9OVUxMIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT04iKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRU5EX0NVVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9PVkVSTEFQUElOR19UUkFOU0lUSU9OUzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfT1ZFUkxBUFBJTkdfVFJBTlNJVElPTlMiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlZBTElEXzNHUFBfRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5WQUxJRF8zR1BQX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX1ZJREVPX0ZPUk1BVCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0lOUFVUX0FVRElPX0ZPUk1BVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfQU1SX0VESVRJTkdfVU5TVVBQT1JURUQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FNUl9FRElUSU5HX1VOU1VQUE9SVEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0UiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTlBVVF9BVURJT19BVV9UT09fTEFSR0U6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0NPUlJVUFRFRF9BVToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQ09SUlVQVEVEX0FVIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9WSURFT19GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0gyNjNfUFJPRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9IMjYzX1BST0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX01QRUc0X1BST0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUFJPRklMRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfTVBFRzRfUlZMQzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9NUEVHNF9SVkxDIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19VTlNVUFBPUlRFRF9BVURJT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9FUlJfRURJVElOR19OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX0VSUl9FRElUSU5HX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOVkFMSURfQ0xJUF9BTkFMWVNJU19WRVJTSU9OOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlZBTElEX0NMSVBfQU5BTFlTSVNfVkVSU0lPTiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GT1JNQVQ6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fRlJBTUVfU0laRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0ZSQU1FX1NJWkUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fVElNRV9TQ0FMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX1RJTUVfU0NBTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9JTkNPTVBBVElCTEVfVklERU9fREFUQV9QQVJUSVRJT05JTkc6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX0RBVEFfUEFSVElUSU9OSU5HIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfTVAzX0FTU0VNQkxZOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9NUDNfQVNTRU1CTFkiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU1RSRUFNX1RZUEU6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19TVFJFQU1fVFlQRSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfV0FSX0lOQ09NUEFUSUJMRV9BVURJT19OQl9PRl9DSEFOTkVMUzoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX05CX09GX0NIQU5ORUxTIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9XQVJfSU5DT01QQVRJQkxFX0FVRElPX1NBTVBMSU5HX0ZSRVFVRU5DWToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX1dBUl9JTkNPTVBBVElCTEVfQVVESU9fU0FNUExJTkdfRlJFUVVFTkNZIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1NUUkVBTV9JTl9GSUxFOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9OT19TVVBQT1JURURfU1RSRUFNX0lOX0ZJTEUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9BRERWT0xVTUVfRVFVQUxTX1pFUk86Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0FERFZPTFVNRV9FUVVBTFNfWkVSTyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FERENUU19ISUdIRVJfVEhBTl9WSURFT19EVVJBVElPTjoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQUREQ1RTX0hJR0hFUl9USEFOX1ZJREVPX0RVUkFUSU9OIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfVU5ERUZJTkVEX0FVRElPX1RSQUNLX0ZJTEVfRk9STUFUOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9VTkRFRklORURfQVVESU9fVFJBQ0tfRklMRV9GT1JNQVQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9BRERFRF9BVURJT19TVFJFQU06Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX1VOU1VQUE9SVEVEX0FEREVEX0FVRElPX1NUUkVBTSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FVRElPX01JWElOR19VTlNVUFBPUlRFRDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQVVESU9fTUlYSU5HX1VOU1VQUE9SVEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfRkVBVFVSRV9VTlNVUFBPUlRFRF9XSVRIX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfRVJSX0ZFQVRVUkVfVU5TVVBQT1JURURfV0lUSF9BVURJT19UUkFDSyIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0FVRElPX0NBTk5PVF9CRV9NSVhFRDoKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfQVVESU9fQ0FOTk9UX0JFX01JWEVEIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9FUlJfSU5QVVRfQ0xJUF9JU19OT1RfQV8zR1BQOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9JTlBVVF9DTElQX0lTX05PVF9BXzNHUFAiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX0VSUl9CRUdJTkxPT1BfSElHSEVSX0VORExPT1A6Ci0gICAgICAgICAgICBzdHJjcHkoc01lc3NhZ2UsICJNNFZTUzNHUFBfRVJSX0JFR0lOTE9PUF9ISUdIRVJfRU5ETE9PUCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX0gyNjNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOgotICAgICAgICAgICAgc3RyY3B5KHNNZXNzYWdlLCAiTTRWU1MzR1BQX0VSUl9IMjYzX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfRVJSX05PX1NVUFBPUlRFRF9WSURFT19TVFJFQU1fSU5fRklMRToKLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIk00VlNTM0dQUF9FUlJfTk9fU1VQUE9SVEVEX1ZJREVPX1NUUkVBTV9JTl9GSUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiAvKio8IE5vdCBhIFZTUzNHUFAgZXJyb3IgKi8KLSAgICAgICAgICAgIHN0cmNweShzTWVzc2FnZSwgIiIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKiAgIFNUQVRJQyBGVU5DVElPTlMgICAqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjaygpCi0gKiBAYnJpZWYgICAgU2ltcGxpZnkgdGhlIGdpdmVuIGNsaXAgc2V0dGluZ3MKLSAqIEBub3RlICAgIFRoaXMgZnVuY3Rpb24gbWF5IG1vZGlmeSB0aGUgZ2l2ZW4gc3RydWN0dXJlCi0gKiBAcGFyYW0gICBwQ2xpcCAgICAoSU4vT1VUKSBDbGlwIHNldHRpbmdzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX0VSUl9FWFRFUk5BTF9FRkZFQ1RfTlVMTDoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjaygKLSAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcCApCi17Ci0gICAgTTRPU0FfVUludDggdWlGeDsKLSAgICBNNE9TQV9VSW50MzIKLSAgICAgICAgdWlDbGlwQWN0dWFsRHVyYXRpb247IC8qKjwgdGhlIGNsaXAgZHVyYXRpb24gb25jZSB0aGUgY3V0cyBhcmUgZG9uZSAqLwotICAgIE00T1NBX1VJbnQzMiB1aUR1cmF0aW9uOwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqcEZ4OwotCi0gICAgLyoqCi0gICAgKiBJZiBiZWdpbiBjdXQgaXMgdG9vIGZhciwgcmV0dXJuIGFuIGVycm9yICovCi0gICAgdWlEdXJhdGlvbiA9IHBDbGlwLT5DbGlwUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLQotICAgIGlmKCBwQ2xpcC0+dWlCZWdpbkN1dFRpbWUgPiB1aUR1cmF0aW9uICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjazogJWQgPiAlZCxcCi0gICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRFVSQVRJT04iLAotICAgICAgICAgICAgcENsaXAtPnVpQmVnaW5DdXRUaW1lLCB1aUR1cmF0aW9uKTsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0RVUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICogSWYgZW5kIGN1dCBpcyB0b28gZmFyLCBzZXQgdG8gemVybyAoaXQgbWVhbnMgbm8gZW5kIGN1dCkgKi8KLSAgICBpZiggcENsaXAtPnVpRW5kQ3V0VGltZSA+IHVpRHVyYXRpb24gKQotICAgIHsKLSAgICAgICAgcENsaXAtPnVpRW5kQ3V0VGltZSA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDb21wdXRlIGFjdHVhbCBjbGlwIGR1cmF0aW9uIChvbmNlIGN1dHMgYXJlIGRvbmUpICovCi0gICAgaWYoIDAgPT0gcENsaXAtPnVpRW5kQ3V0VGltZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBObyBlbmQgY3V0ICovCi0gICAgICAgIHVpQ2xpcEFjdHVhbER1cmF0aW9uID0gdWlEdXJhdGlvbiAtIHBDbGlwLT51aUJlZ2luQ3V0VGltZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoIHBDbGlwLT51aUJlZ2luQ3V0VGltZSA+PSBwQ2xpcC0+dWlFbmRDdXRUaW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDbGlwU2V0dGluZ3NTYW5pdHlDaGVjazogJWQgPiAlZCxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfQkVHSU5fQ1VUX0xBUkdFUl9USEFOX0VORF9DVVQiLAotICAgICAgICAgICAgICAgIHBDbGlwLT51aUJlZ2luQ3V0VGltZSwgcENsaXAtPnVpRW5kQ3V0VGltZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9CRUdJTl9DVVRfTEFSR0VSX1RIQU5fRU5EX0NVVDsKLSAgICAgICAgfQotICAgICAgICB1aUNsaXBBY3R1YWxEdXJhdGlvbiA9IHBDbGlwLT51aUVuZEN1dFRpbWUgLSBwQ2xpcC0+dWlCZWdpbkN1dFRpbWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRUcmFuc2l0aW9uU2V0dGluZ3NTYW5pdHlDaGVjaygpCi0gKiBAYnJpZWYgICAgU2ltcGxpZnkgdGhlIGdpdmVuIHRyYW5zaXRpb24gc2V0dGluZ3MKLSAqIEBub3RlICAgICBUaGlzIGZ1bmN0aW9uIG1heSBtb2RpZnkgdGhlIGdpdmVuIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBUcmFuc2l0aW9uICAgIChJTi9PVVQpIFRyYW5zaXRpb24gc2V0dGluZ3MKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFZTUzNHUFBfRVJSX0VYVEVSTkFMX1RSQU5TSVRJT05fTlVMTDoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50VHJhbnNpdGlvblNldHRpbmdzU2FuaXR5Q2hlY2soCi0gICAgTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqcFRyYW5zaXRpb24gKQotewotICAgIC8qKgotICAgICogTm8gdHJhbnNpdGlvbiAqLwotICAgIGlmKCAwID09IHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiApCi0gICAgewotICAgICAgICBwVHJhbnNpdGlvbi0+VmlkZW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgICAgICBwVHJhbnNpdGlvbi0+QXVkaW9UcmFuc2l0aW9uVHlwZSA9IE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Ob25lOwotICAgIH0KLSAgICBlbHNlIGlmKCAoIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Ob25lCi0gICAgICAgID09IHBUcmFuc2l0aW9uLT5WaWRlb1RyYW5zaXRpb25UeXBlKQotICAgICAgICAmJiAoTTRWU1MzR1BQX2tBdWRpb1RyYW5zaXRpb25UeXBlX05vbmUKLSAgICAgICAgPT0gcFRyYW5zaXRpb24tPkF1ZGlvVHJhbnNpdGlvblR5cGUpICkKLSAgICB7Ci0gICAgICAgIHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBleHRlcm5hbCB0cmFuc2l0aW9uIGZ1bmN0aW9uIGlzIHNldCAqLwotICAgIGlmKCAoIHBUcmFuc2l0aW9uLT5WaWRlb1RyYW5zaXRpb25UeXBlCi0gICAgICAgID49IE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCkKLSAgICAgICAgJiYgKE00T1NBX05VTEwgPT0gcFRyYW5zaXRpb24tPkV4dFZpZGVvVHJhbnNpdGlvbkZjdCkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRVhURVJOQUxfVFJBTlNJVElPTl9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IG1pbmltYWwgdHJhbnNpdGlvbiBkdXJhdGlvbiAqLwotICAgIGlmKCAoIHBUcmFuc2l0aW9uLT51aVRyYW5zaXRpb25EdXJhdGlvbiA+IDApCi0gICAgICAgICYmIChwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24KLSAgICAgICAgPCBNNFZTUzNHUFBfTUlOSU1BTF9UUkFOU0lUSU9OX0RVUkFUSU9OKSApCi0gICAgewotICAgICAgICBwVHJhbnNpdGlvbi0+dWlUcmFuc2l0aW9uRHVyYXRpb24gPQotICAgICAgICAgICAgTTRWU1MzR1BQX01JTklNQUxfVFJBTlNJVElPTl9EVVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRGcmVlU2V0dGluZ3NMaXN0KCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBzZXR0aW5ncyBjb3BpZWQgaW4gdGhlIGludGVybmFsIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50RnJlZVNldHRpbmdzTGlzdCgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBzZXR0aW5ncyBsaXN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBDbGlwTGlzdCApCi0gICAgewotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHBDLT51aUNsaXBOdW1iZXI7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0RnJlZUNsaXBTZXR0aW5ncygmKHBDLT5wQ2xpcExpc3RbaV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZyZWUocEMtPnBDbGlwTGlzdCk7Ci0gICAgICAgIHBDLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICogRnJlZSB0aGUgdHJhbnNpdGlvbiBsaXN0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPnBUcmFuc2l0aW9uTGlzdCApCi0gICAgewotICAgICAgICBmcmVlKHBDLT5wVHJhbnNpdGlvbkxpc3QpOwotICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q3JlYXRlTVAzT3V0cHV0RmlsZSgpCi0gKiBAYnJpZWYgICAgICAgIENyZWF0ZXMgYW5kIHByZXBhcmUgdGhlIG91dHB1dCBNUCBmaWxlCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGUoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBPdXRwdXRGaWxlICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgZXJyID0KLSAgICAgICAgcEMtPnBPc2FGaWxlV3JpdFB0ci0+b3BlbldyaXRlKCZwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBwT3V0cHV0RmlsZSwKLSAgICAgICAgTTRPU0Ffa0ZpbGVXcml0ZSk7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZU1QM091dHB1dEZpbGU6IFdyaXRlT3BlbiByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgpCi0gKiBAYnJpZWYgICBDcmVhdGVzIGFuZCBwcmVwYXJlIHRoZSBvdXRwdXQgTVAzIGZpbGUKLSAqIEBub3RlICAgIENyZWF0ZXMgdGhlIHdyaXRlciwgQ3JlYXRlcyB0aGUgb3V0cHV0IGZpbGUsIEFkZHMgdGhlIHN0cmVhbXMsCi0gICAgICAgICAgIFJlYWRpZXMgdGhlIHdyaXRpbmcgcHJvY2VzcwotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUgotTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlKCBNNFZTUzNHUFBfRW5jb2RlV3JpdGVDb250ZXh0ICpwQ19ld2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlV3JpdGVyUG9pbnRlciAqcE9zYUZpbGVXcml0UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciAqcE9zYUZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBUZW1wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgbWF4T3V0cHV0RmlsZVNpemUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpVmVyc2lvbjsKLSAgICBNNFNZU19TdHJlYW1JRFZhbHVlIHRlbXA7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSBjYWxsZWQgd2l0aCBwQ19ld2M9MHgleCwgcE91dHB1dEZpbGU9MHgleCIsCi0gICAgICAgIHBDX2V3YywgcE91dHB1dEZpbGUpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENfZXdjKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiBwQ19ld2MgaXMgTTRPU0FfTlVMTCIpOwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwT3V0cHV0RmlsZSksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogcE91dHB1dEZpbGUgaXMgTTRPU0FfTlVMTCIpOwotCi0gICAgLyogU2V0IHdyaXRlciAqLwotICAgIGVyciA9Ci0gICAgICAgIE00VlNTM0dQUF9zZXRDdXJyZW50V3JpdGVyKHBDX1NoZWxsQVBJLCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCk7Ci0gICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RPcGVuKCZwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBwT3V0cHV0RmlsZSwgcE9zYUZpbGVXcml0UHRyLCBwVGVtcEZpbGUsIHBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdE9wZW4gcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSBzaWduYXR1cmUgb3B0aW9uIG9mIHRoZSB3cml0ZXIgKi8KLSAgICBlcnIgPQotICAgICAgICBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24ocENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfa0VtYmVkZGVkU3RyaW5nLCAoTTRPU0FfRGF0YU9wdGlvbikiTlhQLVNXIDogVlNTICAgICIpOwotCi0gICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmICgoKE00T1NBX1VJbnQzMilNNEVSUl9CQURfT1BUSU9OX0lEKQotICAgICAgICAhPSBlcnIpICkgLyogdGhpcyBvcHRpb24gbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSBzb21lIHdyaXRlcnMgKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rRW1iZWRkZWRTdHJpbmcpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKjExLzEyLzIwMDggQ1IzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3Q6Ci0gICAgU2V0IHRoZSBtYXggb3V0cHV0IGZpbGUgc2l6ZSBvcHRpb24gaW4gdGhlIHdyaXRlciBzbyB0aGF0IHRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlCi0gICAgc21hbGxlciB0aGFuIHRoZSBnaXZlbiBmaWxlIHNpemUgbGltaXRhdGlvbiovCi0gICAgaWYoIG1heE91dHB1dEZpbGVTaXplID4gMCApCi0gICAgewotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgTTRXUklURVJfa01heEZpbGVTaXplLCAmbWF4T3V0cHV0RmlsZVNpemUpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHdyaXRlciBzZXQgb3B0aW9uIE00V1JJVEVSX2tNYXhGaWxlU2l6ZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIHZlcnNpb24gb3B0aW9uIG9mIHRoZSB3cml0ZXIgKi8KLSAgICB1aVZlcnNpb24gPQotICAgICAgICAoTTRWSURFT0VESVRJTkdfVkVSU0lPTl9NQUpPUiAqIDEwMCArIE00VklERU9FRElUSU5HX1ZFUlNJT05fTUlOT1IgKiAxMAotICAgICAgICArIE00VklERU9FRElUSU5HX1ZFUlNJT05fUkVWSVNJT04pOwotICAgIGVyciA9Ci0gICAgICAgIHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICBNNFdSSVRFUl9rRW1iZWRkZWRWZXJzaW9uLCAoTTRPU0FfRGF0YU9wdGlvbikgJnVpVmVyc2lvbik7Ci0KLSAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKCgoTTRPU0FfVUludDMyKU00RVJSX0JBRF9PUFRJT05fSUQpCi0gICAgICAgICE9IGVycikgKSAvKiB0aGlzIG9wdGlvbiBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHNvbWUgd3JpdGVycyAqLwotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tFbWJlZGRlZFZlcnNpb24pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiggTTRTWVNfa1ZpZGVvVW5rbm93biAhPSBwQ19ld2MtPlZpZGVvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBTZXQgdGhlIHZpZGVvIHN0cmVhbSBwcm9wZXJ0aWVzICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLmhlaWdodCA9IHBDX2V3Yy0+dWlWaWRlb0hlaWdodDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8ud2lkdGggPSBwQ19ld2MtPnVpVmlkZW9XaWR0aDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uZnBzID0KLSAgICAgICAgICAgIDAuMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uSGVhZGVyLnBCdWYgPQotICAgICAgICAgICAgcENfZXdjLT5wVmlkZW9PdXRwdXREc2k7IC8qKjwgUHJldmlvdXNseSBjb21wdXRlZCBvdXRwdXQgRFNJICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW1JbmZvLkhlYWRlci5TaXplID0gcENfZXdjLT4KLSAgICAgICAgICAgIHVpVmlkZW9PdXRwdXREc2lTaXplOyAvKio8IFByZXZpb3VzbHkgY29tcHV0ZWQgb3V0cHV0IERTSSBzaXplICovCi0KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5zdHJlYW1UeXBlID0gcENfZXdjLT5WaWRlb1N0cmVhbVR5cGU7Ci0KLSAgICAgICAgc3dpdGNoKCBwQ19ld2MtPlZpZGVvU3RyZWFtVHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa01QRUdfNDoKLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0gyNjM6Ci0gICAgICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgICAgIC8qKjwgV2UgSEFWRSB0byBwdXQgYSB2YWx1ZSBoZXJlLi4uICovCi0gICAgICAgICAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5hdmVyYWdlQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+dWlWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5tYXhCaXRyYXRlID0gcENfZXdjLT51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTogdW5rbm93biBpbnB1dCB2aWRlbyBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfVklERU9fRk9STUFUISIsCi0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+VmlkZW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9WSURFT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLnN0cmVhbUlEID0gTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQ7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0udGltZVNjYWxlID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0ucHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9TdHJlYW0uZHVyYXRpb24gPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLQotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgIHNpemVvZihNNFdSSVRFUl9TdHJlYW1WaWRlb0luZm9zKTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbS5kZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyMzIpICYocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8pOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFkZCB0aGUgdmlkZW8gc3RyZWFtICovCi0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbSgKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsICZwQ19ld2MtPldyaXRlclZpZGVvU3RyZWFtKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdEFkZFN0cmVhbSh2aWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgQVUgcHJvcGVydGllcyBmb3IgdmlkZW8gc3RyZWFtICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5hdHRyaWJ1dGUgPSBBVV9SQVA7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5DVFMgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUuRFRTID0gMDsgICAgLyoqIFJlc2V0IHRpbWUgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLmZyYWcgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQ19ld2MtPldyaXRlclZpZGVvQVUubmJGcmFnID0gMDsgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyVmlkZW9BVS5zaXplID0gMDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJWaWRlb0FVLnN0cmVhbSA9ICYocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IHZpZGVvIEFVIHNpemUgKi8KLSAgICAgICAgcENfZXdjLT51aVZpZGVvTWF4QXVTaXplID0gKE00T1NBX1VJbnQzMikoMS41RgotICAgICAgICAgICAgKihNNE9TQV9GbG9hdCkocENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8ud2lkdGgKLSAgICAgICAgICAgICogcENfZXdjLT5Xcml0ZXJWaWRlb1N0cmVhbUluZm8uaGVpZ2h0KQotICAgICAgICAgICAgKiBNNFZTUzNHUFBfVklERU9fTUlOX0NPTVBSRVNTSU9OX1JBVElPKTsKLSAgICAgICAgdGVtcC5zdHJlYW1JRCA9IE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lEOwotICAgICAgICB0ZW1wLnZhbHVlID0gcENfZXdjLT51aVZpZGVvTWF4QXVTaXplOwotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LCAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhBVVNpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJnRlbXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIFNldCB0aGUgd3JpdGVyIG1heCB2aWRlbyBjaHVuayBzaXplICovCi0gICAgICAgIHRlbXAuc3RyZWFtSUQgPSBNNFZTUzNHUFBfV1JJVEVSX1ZJREVPX1NUUkVBTV9JRDsKLSAgICAgICAgdGVtcC52YWx1ZSA9IChNNE9TQV9VSW50MzIpKHBDX2V3Yy0+dWlWaWRlb01heEF1U2l6ZSBcCi0gICAgICAgICAgICAqIE00VlNTM0dQUF9WSURFT19BVV9TSVpFX1RPX0NIVU5DS19TSVpFX1JBVElPKTsgLyoqPCBmcm9tIG1heCBBVSBzaXplIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggQ2h1bmNrIHNpemUgKi8KLSAgICAgICAgZXJyID0gcENfU2hlbGxBUEktPnBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgcENfZXdjLT5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heENodW5ja1NpemUsCi0gICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJnRlbXApOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlM0dQUE91dHB1dEZpbGU6XAotICAgICAgICAgICAgICAgIHBXcml0ZXJHbG9iYWxGY3RzLT5wRmN0U2V0T3B0aW9uKE00V1JJVEVSX2tNYXhBVVNpemUsIHZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBNNFNZU19rQXVkaW9Vbmtub3duICE9IHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIE00V1JJVEVSX1N0cmVhbUF1ZGlvSW5mb3Mgc3RyZWFtQXVkaW9JbmZvOwotCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYlNhbXBsZXNQZXJTZWMgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYkJpdHNQZXJTYW1wbGUgPSAwOyAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0gICAgICAgIHN0cmVhbUF1ZGlvSW5mby5uYkNoYW5uZWxzID0gMTsgICAgICAvKio8IHVudXNlZCBieSBvdXIgc2hlbGwgd3JpdGVyICovCi0KLSAgICAgICAgaWYoIHBDX2V3Yy0+cEF1ZGlvT3V0cHV0RHNpICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJZiB3ZSBjb3B5IHRoZSBzdHJlYW0gZnJvbSB0aGUgaW5wdXQsIHdlIGNvcHkgaXRzIERTSSAqLwotICAgICAgICAgICAgc3RyZWFtQXVkaW9JbmZvLkhlYWRlci5TaXplID0gcENfZXdjLT51aUF1ZGlvT3V0cHV0RHNpU2l6ZTsKLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIucEJ1ZiA9IHBDX2V3Yy0+cEF1ZGlvT3V0cHV0RHNpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogV3JpdGVyIHdpbGwgcHV0IGEgZGVmYXVsdCBEU0kgKi8KLSAgICAgICAgICAgIHN0cmVhbUF1ZGlvSW5mby5IZWFkZXIuU2l6ZSA9IDA7Ci0gICAgICAgICAgICBzdHJlYW1BdWRpb0luZm8uSGVhZGVyLnBCdWYgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5zdHJlYW1JRCA9IE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lEOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnN0cmVhbVR5cGUgPSBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbS5kdXJhdGlvbiA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAwOyAvKio8IE5vdCB1c2VkIGJ5IHRoZSBzaGVsbC9jb3JlIHdyaXRlciAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtSW5mby5uYlNhbXBsZXNQZXJTZWMgPQotICAgICAgICAgICAgcENfZXdjLT51aVNhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLnRpbWVTY2FsZSA9IHBDX2V3Yy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbUluZm8ubmJDaGFubmVscyA9Ci0gICAgICAgICAgICAoTTRPU0FfVUludDE2KXBDX2V3Yy0+dWlOYkNoYW5uZWxzOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtSW5mby5uYkJpdHNQZXJTYW1wbGUgPQotICAgICAgICAgICAgMDsgLyoqPCBOb3QgdXNlZCBieSB0aGUgc2hlbGwvY29yZSB3cml0ZXIgKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgdGhlIGF1ZGlvIHN0cmVhbSAqLwotICAgICAgICBzd2l0Y2goIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAwOyAvKio8IEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBzaGVsbCwgdGhlIERTSSBpcyB0YWtlbiBpbnRvIGFjY291bnQgaW5zdGVhZCAqLwotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa0FBQzoKLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLmF2ZXJhZ2VCaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLm1heEJpdHJhdGUgPSBwQ19ld2MtPnVpQXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0uYXZlcmFnZUJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAwOyAvKio8IEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBzaGVsbCwgdGhlIERTSSBpcyB0YWtlbiBpbnRvIGFjY291bnQgaW5zdGVhZCAqLwotICAgICAgICAgICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9TdHJlYW0ubWF4Qml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIDA7IC8qKjwgTm90IHVzZWQgYnkgdGhlIHNoZWxsL2NvcmUgd3JpdGVyICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRTWVNfa01QMzogLyoqPCB0aGVyZSBjYW4ndCBiZSBNUDMgdHJhY2sgaW4gM0dQUCBmaWxlIC0+IGVycm9yICovCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOiB1bmtub3duIG91dHB1dCBhdWRpbyBmb3JtYXQgKDB4JXgpLFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfVU5TVVBQT1JURURfSU5QVVRfQVVESU9fRk9STUFUISIsCi0gICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9VTlNVUFBPUlRFRF9JTlBVVF9BVURJT19GT1JNQVQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBPdXIgd3JpdGVyIHNoZWxsIGludGVyZmFjZSBpcyBhIGxpdHRsZSB0cmlja3k6IHdlIHB1dCBNNFdSSVRFUl9TdHJlYW1BdWRpb0luZm9zCi0gICAgICAgIGluIHRoZSBEU0kgcG9pbnRlci4uLiAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtLmRlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgKE00T1NBX01lbUFkZHIzMikgJnN0cmVhbUF1ZGlvSW5mbzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBMaW5rIHRoZSBBVSBhbmQgdGhlIHN0cmVhbSAqLwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUuc3RyZWFtID0gJihwQ19ld2MtPldyaXRlckF1ZGlvU3RyZWFtKTsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLnNpemUgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgIC1wQ19ld2MtPmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsgLyoqIFJlc2V0IHRpbWUgKi8KLSAgICAgICAgcENfZXdjLT5Xcml0ZXJBdWRpb0FVLkRUUyA9IDA7Ci0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5hdHRyaWJ1dGUgPSAwOwotICAgICAgICBwQ19ld2MtPldyaXRlckF1ZGlvQVUubmJGcmFnID0gMDsgLyoqIE5vIGZyYWdtZW50ICovCi0gICAgICAgIHBDX2V3Yy0+V3JpdGVyQXVkaW9BVS5mcmFnID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oCi0gICAgICAgICAgICBwQ19ld2MtPnAzZ3BXcml0ZXJDb250ZXh0LCAmcENfZXdjLT5Xcml0ZXJBdWRpb1N0cmVhbSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RBZGRTdHJlYW0oYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IGF1ZGlvIEFVIHNpemUgKi8KLSAgICAgICAgcENfZXdjLT51aUF1ZGlvTWF4QXVTaXplID0gTTRWU1MzR1BQX0FVRElPX01BWF9BVV9TSVpFOwotICAgICAgICB0ZW1wLnN0cmVhbUlEID0gTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQ7Ci0gICAgICAgIHRlbXAudmFsdWUgPSBwQ19ld2MtPnVpQXVkaW9NYXhBdVNpemU7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsIChNNE9TQV9VSW50MzIpTTRXUklURVJfa01heEFVU2l6ZSwKLSAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmdGVtcCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICAgICAgcFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTZXRPcHRpb24oTTRXUklURVJfa01heEFVU2l6ZSwgYXVkaW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSB3cml0ZXIgbWF4IGF1ZGlvIGNodW5jayBzaXplICovCi0gICAgICAgIHRlbXAuc3RyZWFtSUQgPSBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRDsKLSAgICAgICAgdGVtcC52YWx1ZSA9IE00VlNTM0dQUF9BVURJT19NQVhfQ0hVTkNLX1NJWkU7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAoTTRPU0FfVUludDMyKU00V1JJVEVSX2tNYXhDaHVuY2tTaXplLAotICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pICZ0ZW1wKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENyZWF0ZTNHUFBPdXRwdXRGaWxlOlwKLSAgICAgICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFNldE9wdGlvbihNNFdSSVRFUl9rTWF4QVVTaXplLCBhdWRpbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEFsbCBzdHJlYW1zIGFkZGVkLCB3ZSdyZSBub3cgcmVhZHkgdG8gd3JpdGUgKi8KLSAgICBlcnIgPSBwQ19TaGVsbEFQSS0+cFdyaXRlckdsb2JhbEZjdHMtPnBGY3RTdGFydFdyaXRpbmcoCi0gICAgICAgIHBDX2V3Yy0+cDNncFdyaXRlckNvbnRleHQpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZTpcCi0gICAgICAgICAgICBwV3JpdGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0V3JpdGluZygpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDcmVhdGUzR1BQT3V0cHV0RmlsZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiAgTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCkKLSAqIEBicmllZiAgICBHZW5lcmF0ZSBhIEgyNjMgb3IgTVBFRy00IGRlY29kZXIgc3BlY2lmaWMgaW5mbyBjb21wYXRpYmxlIHdpdGggYWxsIGlucHV0IHZpZGVvCi0gKiAgICAgICAgICAgIHRyYWNrcy4gQ29weSBhdWRpbyBkc2kgZnJvbSBtYXN0ZXIgY2xpcC4KLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aU1hc3RlckNsaXAgKQotewotICAgIE00T1NBX0ludDMyIGlSZXN5bmNoTWFya2VyRHNpSW5kZXg7Ci0gICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUZvckRzaTsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwOwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIERlY0NvbmZpZ0luZm87Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSBkdW1teVNpemU7Ci0gICAgTTRPU0FfQm9vbCBiR2V0RFNpRnJvbUVuY29kZXIgPSBNNE9TQV9GQUxTRTsKLQotICAgIE00RU5DT0RFUl9IZWFkZXIgKmVuY0hlYWRlcjsKLSAgICBNNFNZU19TdHJlYW1JRG1lbUFkZHIgc3RyZWFtSGVhZGVyOwotCi0gICAgcFN0cmVhbUZvckRzaSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXAgPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgKiBIMjYzIGNhc2UgKi8KLSAgICBpZiggTTRTWVNfa0gyNjMgPT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSDI2MyBvdXRwdXQgRFNJIGlzIGFsd2F5cyA3IGJ5dGVzICovCi0gICAgICAgIHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUgPSA3OwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSA9Ci0gICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHBDLT5ld2MudWlWaWRlb091dHB1dERzaVNpemUsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5ld2MucFZpZGVvT3V0cHV0RHNpIChIMjYzKSIpOwotCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaSgpOlwKLSAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgcFZpZGVvT3V0cHV0RHNpIChIMjYzKSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiAoV2Ugb3ZlcnJpZGUgdGhlIGlucHV0IHZlbmRvciBpbmZvLgotICAgICAgICAqIEF0IGxlYXN0IHdlIGtub3cgdGhhdCBub3RoaW5nIHNwZWNpYWwgd2lsbCBiZSB0cmllZCB3aXRoIFBITFAtc3RhbXBlZAotICAgICAgICAgIGVkaXRlZCBzdHJlYW1zLi4uKSAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVswXSA9ICdQJzsKLSAgICAgICAgcEMtPmV3Yy5wVmlkZW9PdXRwdXREc2lbMV0gPSAnSCc7Ci0gICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpWzJdID0gJ0wnOwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVszXSA9ICdQJzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBEZWNvZGVyIHZlcnNpb24gaXMgMCAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs0XSA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogTGV2ZWwgaXMgdGhlIHNpeHRoIGJ5dGUgaW4gdGhlIERTSSAqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs1XSA9IHBDLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUHJvZmlsZSBpcyB0aGUgc2V2ZW50aCBieXRlIGluIHRoZSBEU0kqLwotICAgICAgICBwQy0+ZXdjLnBWaWRlb091dHB1dERzaVs2XSA9IHBDLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE1QRUctNCBjYXNlICovCi0gICAgZWxzZSBpZiggTTRTWVNfa01QRUdfNCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSB8fAotICAgICAgICBNNFNZU19rSDI2NCA9PSBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSkgewotCi0gICAgICAgIC8qIEZvciBNUEVHNCBhbmQgSC4yNjQgZW5jb2RlciBjYXNlCi0gICAgICAgICogRmV0Y2ggdGhlIERTSSBmcm9tIHRoZSBzaGVsbCB2aWRlbyBlbmNvZGVyLCBhbmQgZmVlZCBpdCB0byB0aGUgd3JpdGVyIGJlZm9yZQotICAgICAgICBjbG9zaW5nIGl0LiAqLwotCi0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTogZ2V0IERTSSBmb3IgSDI2NCBzdHJlYW0iKTsKLQotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTogcEMtPmV3Yy5wRW5jQ29udGV4dCBpcyBOVUxMIik7Ci0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+ZXdjLnBFbmNDb250ZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0R2V0T3B0aW9uKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQsIE00RU5DT0RFUl9rT3B0aW9uSURfRW5jb2RlckhlYWRlciwKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmVuY0hlYWRlcik7Ci0KLSAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSB8fCAoTTRPU0FfTlVMTCA9PSBlbmNIZWFkZXItPnBCdWYpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIGZhaWxlZCB0byBnZXQgdGhlIGVuY29kZXIgaGVhZGVyIChlcnIgMHgleCkiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOiBlbmNIZWFkZXItPnBCdWY9MHgleCwgc2l6ZT0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5wQnVmLCBlbmNIZWFkZXItPlNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICAgICAgIHNlbmQgRFNJIGZvciB2aWRlbyBzdHJlYW0gdG8gM0dQIHdyaXRlciIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhbmQgY29weSB0aGUgbmV3IERTSSAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MucFZpZGVvT3V0cHV0RHNpID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhlbmNIZWFkZXItPlNpemUsIE00VlNTM0dQUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicEMtPmV3Yy5wVmlkZW9PdXRwdXREc2kgKEgyNjQpIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+ZXdjLnBWaWRlb091dHB1dERzaSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIHBWaWRlb091dHB1dERzaSwgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvT3V0cHV0RHNpU2l6ZSA9IChNNE9TQV9VSW50MTYpZW5jSGVhZGVyLT5TaXplOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MucFZpZGVvT3V0cHV0RHNpLCAodm9pZCAqKWVuY0hlYWRlci0+cEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgZW5jSGVhZGVyLT5TaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIgcmV0dXJuZWQgZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpOlwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0IGlzIE5VTEwsIGNhbm5vdCBnZXQgdGhlIERTSSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcFN0cmVhbUZvckRzaSA9IE00T1NBX05VTEw7Ci0gICAgcENsaXAgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogQ29tcHV0ZSBBdWRpbyBEU0kgKi8KLSAgICBpZiggTTRTWVNfa0F1ZGlvVW5rbm93biAhPSBwQy0+ZXdjLkF1ZGlvU3RyZWFtVHlwZSApCi0gICAgewotICAgICAgICBpZiggdWlNYXN0ZXJDbGlwID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDbGlwIGlzIGFscmVhZHkgb3BlbmVkICovCi0gICAgICAgICAgICBwU3RyZWFtRm9yRHNpID0gJihwQy0+cEMxLT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBXZSBjYW4gdXNlIHRoZSBmYXN0IG9wZW4gbW9kZSB0byBnZXQgdGhlIERTSSAqLwotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBJbml0KCZwQ2xpcCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEluaXQoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwQ2xpcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcChwQ2xpcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwT3BlbihwQ2xpcCwgJnBDLT5wQ2xpcExpc3RbdWlNYXN0ZXJDbGlwXSwKLSAgICAgICAgICAgICAgICBNNE9TQV9GQUxTRSwgTTRPU0FfVFJVRSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2k6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcE9wZW4oKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXApOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBTdHJlYW1Gb3JEc2kgPSAmKHBDbGlwLT5wQXVkaW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEFsbG9jYXRlIGFuZCBjb3B5IHRoZSBuZXcgRFNJICovCi0gICAgICAgIHBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpID0gKE00T1NBX01lbUFkZHI4KU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIHBTdHJlYW1Gb3JEc2ktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICBNNFZTUzNHUFAsIChNNE9TQV9DaGFyICopInBDLT5ld2MucEF1ZGlvT3V0cHV0RHNpIik7Ci0KLSAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPmV3Yy5wQXVkaW9PdXRwdXREc2kgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENvbXB1dGVPdXRwdXRWaWRlb0FuZEF1ZGlvRHNpKCk6XAotICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBwQXVkaW9PdXRwdXREc2ksIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5ld2MudWlBdWRpb091dHB1dERzaVNpemUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQxNilwU3RyZWFtRm9yRHNpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLnBBdWRpb091dHB1dERzaSwKLSAgICAgICAgICAgICh2b2lkICopcFN0cmVhbUZvckRzaS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgIHBDLT5ld2MudWlBdWRpb091dHB1dERzaVNpemUpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIElmIGEgY2xpcCBoYXMgYmVlbiB0ZW1wb3JhcmlseSBvcGVuZWQgdG8gZ2V0IGl0cyBEU0ksIGNsb3NlIGl0ICovCi0gICAgICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDbGlwICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDbGlwKTsKLQotICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0VmlkZW9BbmRBdWRpb0RzaTpcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwQ2xlYW5VcCgpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dFZpZGVvQW5kQXVkaW9Ec2koKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoKQotICogQGJyaWVmICAgIFN3aXRjaCBmcm9tIHRoZSBjdXJyZW50IGNsaXAgdG8gdGhlIG5leHQgb25lCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKAotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBDLT5wQzEgKQotICAgIHsKLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUpIHsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMICE9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSkgewotICAgICAgICAgICAgICAgIGZyZWUocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUpOwotICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsb3NlIHRoZSBjdXJyZW50IGZpcnN0IGNsaXAgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKHBDLT5wQzEpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcDogTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKEMxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqICBpbmNyZW1lbnQgY2xpcCBjb3VudGVyICovCi0gICAgICAgIHBDLT51aUN1cnJlbnRDbGlwKys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIHRoZSBsYXN0IGNsaXAgKi8KLSAgICBpZiggcEMtPnVpQ3VycmVudENsaXAgPj0gcEMtPnVpQ2xpcE51bWJlciApCi0gICAgewotICAgICAgICBwQy0+cEMxID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfRklOSVNIRUQ7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXA6XAotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbG9zZShDMSkgcmV0dXJucyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSIpOwotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBJZiB0aGUgbmV4dCBjbGlwIGhhcyBhbHJlYWR5IGJlIG9wZW5lZCwgc2V0IGl0IGFzIGZpcnN0IGNsaXAgKi8KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+cEMyICkKLSAgICB7Ci0gICAgICAgIHBDLT5wQzEgPSBwQy0+cEMyOwotICAgICAgICBpZihNNE9TQV9OVUxMICE9IHBDLT5wQzItPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSA9IHBDLT5wQzItPm1fcFByZVJlc2l6ZUZyYW1lOwotICAgICAgICB9Ci0gICAgICAgIHBDLT5wQzIgPSBNNE9TQV9OVUxMOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IHBDLT5iQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0OwotICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLSAgICAvKioKLSAgICAqIGVsc2Ugb3BlbiBpdCAqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRPcGVuQ2xpcChwQywgJnBDLT5wQzEsCi0gICAgICAgICAgICAmcEMtPnBDbGlwTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0pOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcDogTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgc2Vjb25kIGNsaXAgaGFzIG5vdCBiZWVuIG9wZW5lZCB5ZXQsCi0gICAgICAgICAgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGhhcyBiZWVuIG5vIHRyYW5zaXRpb24uCi0gICAgICAgICogU28gYm90aCBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIHRpbWVzIGFyZSBPSy4KLSAgICAgICAgKiBTbyB3ZSBjYW4gc2V0IGJvdGggdmlkZW8yIGFuZCBhdWRpbyBvZmZzZXRzICovCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogQWRkIGN1cnJlbnQgdmlkZW8gb3V0cHV0IENUUyB0byB0aGUgY2xpcCB2aWRlbyBvZmZzZXQgKi8KLQotICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICBwQy0+cEMxLT5pVm9mZnNldCArPSAoTTRPU0FfVUludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotICAgICAgICAvKioKLSAgICAgICAgKiBBZGQgY3VycmVudCBhdWRpbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIGF1ZGlvIG9mZnNldCAqLwotICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCArPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMikocEMtPmV3Yy5kQVRvICogcEMtPmV3Yy5zY2FsZV9hdWRpbyArIDAuNSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogMjAwNS0wMy0yNDogQnVnRml4IGZvciBhdWRpby12aWRlbyBzeW5jaHJvOgotICAgICAgICAqIFRoZXJlIG1heSBiZSBhIHBvcnRpb24gb2YgdGhlIGR1cmF0aW9uIG9mIGFuIGF1ZGlvIEFVIG9mIGRlc3luY2hybyBhdCBlYWNoIGFzc2VtYmx5LgotICAgICAgICAqIEl0IGxlYWRzIHRvIGFuIGF1ZGlibGUgZGVzeW5jaHJvIHdoZW4gdGhlcmUgYXJlIGEgbG90IG9mIGNsaXBzIGFzc2VtYmxlZC4KLSAgICAgICAgKiBUaGlzIGJ1ZyBmaXggYWxsb3dzIHRvIHJlc3luY2ggdGhlIGF1ZGlvIHRyYWNrIHdoZW4gdGhlIGRlbHRhIGlzIGhpZ2hlcgotICAgICAgICAqIHRoYW4gb25lIGF1ZGlvIEFVIGR1cmF0aW9uLgotICAgICAgICAqIFdlIFN0ZXAgb25lIEFVIGluIHRoZSBzZWNvbmQgY2xpcCBhbmQgd2UgY2hhbmdlIHRoZSBhdWRpbyBvZmZzZXQgYWNjb3JkaW5nbHkuICovCi0gICAgICAgIGlmKCAoIHBDLT5wQzEtPmlBb2Zmc2V0Ci0gICAgICAgICAgICAtIChNNE9TQV9JbnQzMikocEMtPnBDMS0+aVZvZmZzZXQgKnBDLT5wQzEtPnNjYWxlX2F1ZGlvICsgMC41KSkKLSAgICAgICAgPiBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBZHZhbmNlIG9uZSBBTVIgZnJhbWUgKi8KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXA6XAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVwZGF0ZSBhdWRpbyBvZmZzZXQgYWNjb3JkaW5nbHkqLwotICAgICAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgLT0gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEluaXQgc3RhcnRpbmcgc3RhdGUgZm9yIHRoaXMgY2xpcCBwcm9jZXNzaW5nICovCi0gICAgaWYoIE00U1lTX2tNUDMgPT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogSW4gdGhlIE1QMyBjYXNlIHdlIHVzZSBhIHNwZWNpYWwgYXVkaW8gc3RhdGUgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfTVAzX0pVTVA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIHN0YXJ0IHdpdGggdGhlIHZpZGVvIHByb2Nlc3NpbmcgKi8KLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0KLSAgICAgICAgaWYoIHBDLT5Wc3RhdGUgIT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogaWYgbm90IGEgdHJhbnNpdGlvbiB0aGVuIHJlc2V0IHByZXZpb3VzIHZpZGVvIHN0YXRlICovCi0gICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9SRUFEX1dSSVRFOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIFRoZSBmbGFncyBhcmUgc2V0IHRvIGZhbHNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgY2xpcCAqLwotICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgLyogUkM6IHRvIGtub3cgd2hlbiBhIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi0gICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVA7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbygpCi0gKiBAYnJpZWYgICAgRG8gd2hhdCB0byBkbyB3aGVuIHRoZSBlbmQgb2YgYSBjbGlwIHZpZGVvIHRyYWNrIGlzIHJlYWNoZWQKLSAqIEBub3RlICAgIElmIHRoZXJlIGlzIGF1ZGlvIG9uIHRoZSBjdXJyZW50IGNsaXAsIHByb2Nlc3MgaXQsIGVsc2Ugc3dpdGNoIHRvIHRoZSBuZXh0IGNsaXAKLSAqIEBwYXJhbSAgIHBDICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogVmlkZW8gaXMgZG9uZSBmb3IgdGhpcyBjbGlwLCBub3cgd2UgZG8gdGhlIGF1ZGlvICovCi0gICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfQVVESU87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENsaXAgZG9uZSwgZG8gdGhlIG5leHQgb25lICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTd2l0Y2hUb05leHRDbGlwKHBDKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZlZpZGVvOiBNNFZTUzNHUFBfaW50U3dpdGNoVG9OZXh0Q2xpcCgpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8oKQotICogQGJyaWVmICAgIERvIHdoYXQgdG8gZG8gd2hlbiB0aGUgZW5kIG9mIGEgY2xpcCBhdWRpbyB0cmFjayBpcyByZWFjaGVkCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIENsaXAgZG9uZSwgZG8gdGhlIG5leHQgb25lICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAocEMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbzogTTRWU1MzR1BQX2ludFN3aXRjaFRvTmV4dENsaXAoKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFN0YXJ0IHdpdGggdGhlIHZpZGVvICovCi0gICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgcEMtPlN0YXRlID0gTTRWU1MzR1BQX2tFZGl0U3RhdGVfVklERU87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8oKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludE9wZW5DbGlwKCkKLSAqIEBicmllZiAgICBPcGVuIG5leHQgY2xpcAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRPcGVuQ2xpcCggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKiogaENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDbGlwU2V0dGluZ3MgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsgLyoqPCBzaG9ydGN1dCAqLwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwQ2xpcFByb3BlcnRpZXMgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX0ludDMyIGlDdHM7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICBNNE9TQV9UUkFDRTJfMSgiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBcIiVzXCIiLAotICAgICAgICAoTTRPU0FfQ2hhciAqKXBDbGlwU2V0dGluZ3MtPnBGaWxlKTsKLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSW5pdChoQ2xpcCwgcEMtPnBPc2FGaWxlUmVhZFB0cik7Ci0KLSAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBNNFZTUzNHUFBfaW50Q2xpcEluaXQoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgaWYoICpoQ2xpcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBDbGVhblVwKCpoQ2xpcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNldCBzaG9ydGN1dCAqLwotICAgIHBDbGlwID0gKmhDbGlwOwotCi0gICAgaWYgKHBDbGlwU2V0dGluZ3MtPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCApIHsKLSAgICAgICAgcENsaXBQcm9wZXJ0aWVzID0gJnBDbGlwU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzOwotICAgICAgICBwQ2xpcC0+cFNldHRpbmdzID0gcENsaXBTZXR0aW5nczsKLSAgICAgICAgcENsaXAtPmlFbmRUaW1lID0gcENsaXBTZXR0aW5ncy0+dWlFbmRDdXRUaW1lOwotICAgIH0KLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwT3BlbihwQ2xpcCwgcENsaXBTZXR0aW5ncywKLSAgICAgICAgICAgICAgTTRPU0FfRkFMU0UsIE00T1NBX0ZBTFNFLCBNNE9TQV9GQUxTRSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IFwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwT3BlbigpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcENsZWFuVXAocENsaXApOwotICAgICAgICAqaENsaXAgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKSB7Ci0gICAgICAgIHBDbGlwUHJvcGVydGllcyA9ICZwQ2xpcC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvcHkgY29tbW9uICdzaWxlbmNlIGZyYW1lIHN0dWZmJyB0byBDbGlwQ29udGV4dCAqLwotICAgIHBDbGlwLT51aVNpbGVuY2VQY21TaXplID0gcEMtPmV3Yy51aVNpbGVuY2VQY21TaXplOwotICAgIHBDbGlwLT5wU2lsZW5jZUZyYW1lRGF0YSA9IHBDLT5ld2MucFNpbGVuY2VGcmFtZURhdGE7Ci0gICAgcENsaXAtPnVpU2lsZW5jZUZyYW1lU2l6ZSA9IHBDLT5ld2MudWlTaWxlbmNlRnJhbWVTaXplOwotICAgIHBDbGlwLT5pU2lsZW5jZUZyYW1lRHVyYXRpb24gPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICBwQ2xpcC0+c2NhbGVfYXVkaW8gPSBwQy0+ZXdjLnNjYWxlX2F1ZGlvOwotCi0gICAgcENsaXAtPmlBdWRpb0ZyYW1lQ3RzID0gLXBDbGlwLT5pU2lsZW5jZUZyYW1lRHVyYXRpb247IC8qIFJlc2V0IHRpbWUgKi8KLQotICAgIC8qKgotICAgICogSWYgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG91dHB1dCBhdWRpbyBmb3JtYXQsCi0gICAgKiB3ZSByZW1vdmUgaXQuIFNvIGl0IHdpbGwgYmUgcmVwbGFjZWQgYnkgc2lsZW5jZSAqLwotICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQ2xpcFByb3BlcnRpZXMtPmJBdWRpb0lzQ29tcGF0aWJsZVdpdGhNYXN0ZXJDbGlwICkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRDbGlwRGVsZXRlQXVkaW9UcmFjayhwQ2xpcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBBY3R1YWwgYmVnaW4gY3V0ICovCi0gICAgaWYoIDAgPT0gcENsaXBTZXR0aW5ncy0+dWlCZWdpbkN1dFRpbWUgKQotICAgIHsKLSAgICAgICAgcENsaXAtPmlWb2Zmc2V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBb2Zmc2V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0ID0gMDsKLSAgICAgICAgcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZihwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSnVtcCB0aGUgdmlkZW8gdG8gdGhlIHRhcmdldCBiZWdpbiBjdXQgdG8gZ2V0IHRoZSBhY3R1YWwgYmVnaW4gY3V0IHZhbHVlICovCi0gICAgICAgICAgICBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQgPQotICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQ2xpcFNldHRpbmdzLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgIGlDdHMgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEp1bXAocENsaXAtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcENsaXAtPnBWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludE9wZW5DbGlwOiBtX3BGY3RKdW1wKFYpIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVcGRhdGUgY2xpcCBvZmZzZXQgd2l0aCB0aGUgdmlkZW8gYmVnaW4gY3V0ICovCi0gICAgICAgICAgICBwQ2xpcC0+aVZvZmZzZXQgPSAtcENsaXAtPmlBY3R1YWxWaWRlb0JlZ2luQ3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogSnVtcCB0aGUgYXVkaW8gdG8gdGhlIHZpZGVvIGFjdHVhbCBiZWdpbiBjdXQgKi8KLSAgICAgICAgICAgIGlmKCBNNFZJREVPRURJVElOR19rTVAzICE9IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+aUFjdHVhbEF1ZGlvQmVnaW5DdXQgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0gICAgICAgICAgICAgICAgaUN0cyA9IChNNE9TQV9JbnQzMikocENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0Ci0gICAgICAgICAgICAgICAgICAgICogcENsaXAtPnNjYWxlX2F1ZGlvICsgMC41KTsKLQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocENsaXAsICZpQ3RzKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQoQSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjbGlwIG9mZnNldCB3aXRoIHRoZSBhdWRpbyBiZWdpbiBjdXQgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcC0+aUFvZmZzZXQgPSAtaUN0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEZvciB0aGUgTVAzLCB0aGUganVtcCBpcyBub3QgZG9uZSBiZWNhdXNlIG9mIHRoZSBWQlIsCi0gICAgICAgICAgICAgICAgICBpdCBjb3VsZCBiZSBub3QgZW5vdWdoIGFjY3VyYXRlICovCi0gICAgICAgICAgICAgICAgcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKXBDbGlwU2V0dGluZ3MtPnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoIE00U1lTX2tWaWRlb1Vua25vd24gIT0gcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgaWYgKChwQ2xpcFNldHRpbmdzLT5GaWxlVHlwZSAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKSkgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogUmVhZCB0aGUgZmlyc3QgVmlkZW8gQVUgb2YgdGhlIGNsaXAgKi8KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSgKLSAgICAgICAgICAgICAgICBwQ2xpcC0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIgKilwQ2xpcC0+cFZpZGVvU3RyZWFtLCAmcENsaXAtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICBpZiggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2UgKGFscmVhZHkhKSByZWFjaCB0aGUgZW5kIG9mIHRoZSBjbGlwLCB3ZSBmaWx0ZXIgdGhlIGVycm9yLgotICAgICAgICAgICAgICAgICogSXQgd2lsbCBiZSBjb3JyZWN0bHkgbWFuYWdlZCBhdCB0aGUgZmlyc3Qgc3RlcC4gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50T3BlbkNsaXA6IFwKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoKSByZXR1cm5zIDB4JXghIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvV2lkdGggID0gcENsaXBQcm9wZXJ0aWVzLT51aVN0aWxsUGljV2lkdGg7Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQgPSBwQ2xpcFByb3BlcnRpZXMtPnVpU3RpbGxQaWNIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLyogc3RhdGUgY2hlY2sgbm90IHRvIGFsbG9jYXRlIGJ1ZmZlciBkdXJpbmcgc2F2ZSBzdGFydCAqLwotCi0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogVmlkZW8gcmVzaXplIG1hbmFnZW1lbnQgICAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKioKLSAgICAgICAgKiBJZiB0aGUgaW5wdXQgY2xpcCBpcyBhIHJvdGF0ZSB2aWRlbyBvciB0aGUgb3V0cHV0IHJlc29sdXRpb24gaXMgZGlmZmVyZW50Ci0gICAgICAgICogZnJvbSB0aGUgaW5wdXQgcmVzb2x1dGlvbiwgdGhlbiB0aGUgdmlkZW8gZnJhbWUgbmVlZHMgdG8gYmUgcm90YXRlZAotICAgICAgICAqIG9yIHJlc2l6ZWQsIGZvcmNlIHRvIHJlc2l6ZSBtb2RlICovCi0gICAgICAgIGlmICgoKE00T1NBX1VJbnQzMilwQy0+ZXdjLnVpVmlkZW9XaWR0aCAhPQotICAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9XaWR0aCkgfHwKLSAgICAgICAgICAgICgoTTRPU0FfVUludDMyKXBDLT5ld2MudWlWaWRlb0hlaWdodCAhPQotICAgICAgICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnVpVmlkZW9IZWlnaHQpIHx8Ci0gICAgICAgICAgICBwQ2xpcFByb3BlcnRpZXMtPnZpZGVvUm90YXRpb25EZWdyZWVzICE9IDApIHsKLQotICAgICAgICAgICAgaWYgKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIHZpZGVvIHBsYW5lIHRoYXQgd2lsbAotICAgICAgICAgICAgICAgICAgcmVjZWl2ZSB0aGUgZGVjb2RlZCBpbWFnZSBiZWZvcmUgcmVzaXppbmcgKi8KLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWUgPQotICAgICAgICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWU1MzR1BQLAotICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicFByZVJlc2l6ZUZyYW1lIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBZIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGggID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvV2lkdGg7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXBQcm9wZXJ0aWVzLT51aVZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3N0cmlkZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOwotCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jICgKLSAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9zdHJpZGUgKiBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgTTRNQ1MsIChNNE9TQV9DaGFyICopIm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNE1DU19pbnRQcmVwYXJlVmlkZW9FbmNvZGVyKCk6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuYWJsZSB0byBhbGxvY2F0ZSBtX3BQcmVSZXNpemVGcmFtZVswXS5wYWNfZGF0YSIpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBVIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfd2lkdGggID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV9oZWlnaHQgPj4gMTsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsKLQotICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyAoCi0gICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfc3RyaWRlICogcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzFdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIE00TUNTLCAoTTRPU0FfQ2hhciAqKSJtX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSIpOwotICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRNQ1NfaW50UHJlcGFyZVZpZGVvRW5jb2RlcigpOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmFibGUgdG8gYWxsb2NhdGUgbV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEiKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFsbG9jYXRlIHRoZSBWIHBsYW5lICovCi0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGggPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfc3RyaWRlID0KLSAgICAgICAgICAgICAgICAgICAgcENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzJdLnVfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEgPQotICAgICAgICAgICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgKAotICAgICAgICAgICAgICAgICAgIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X3N0cmlkZSAqIHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZVsyXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICBNNE1DUywgKE00T1NBX0NoYXIgKikibV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEiKTsKLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TUNTX2ludFByZXBhcmVWaWRlb0VuY29kZXIoKTogXAotICAgICAgICAgICAgICAgICAgICAgICAgdW5hYmxlIHRvIGFsbG9jYXRlIG1fcFByZVJlc2l6ZUZyYW1lWzJdLnBhY19kYXRhIik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocENsaXAtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwQ2xpcC0+bV9wUHJlUmVzaXplRnJhbWVbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBDbGlwLT5tX3BQcmVSZXNpemVGcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBUaGUgdmlkZW8gaXMgY3VycmVudGx5IGluIHJlYWRpbmcgbW9kZSAqLwotICAgICAgICBwQ2xpcC0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgIH0KLQotICAgIGlmKCAoIE00U1lTX2tBdWRpb1Vua25vd24gIT0gcEMtPmV3Yy5BdWRpb1N0cmVhbVR5cGUpCi0gICAgICAgICYmIChNNFZJREVPRURJVElOR19rTVAzICE9IHBDbGlwUHJvcGVydGllcy0+QXVkaW9TdHJlYW1UeXBlKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBSZWFkIHRoZSBmaXJzdCBBdWRpbyBBVSBvZiB0aGUgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcCk7Ci0KLSAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBUaGUgYXVkaW8gaXMgY3VycmVudGx5IGluIHJlYWRpbmcgbW9kZSAqLwotICAgICAgICBwQ2xpcC0+QXN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludE9wZW5DbGlwKCk6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSICBNNFZTUzNHUFBfaW50Q29tcHV0ZU91dHB1dEF2ZXJhZ2VWaWRlb0JpdHJhdGUoKQotICogQGJyaWVmICAgIEF2ZXJhZ2UgYml0cmF0ZSBvZiB0aGUgb3V0cHV0IGZpbGUsIGNvbXB1dGVkIGZyb20gaW5wdXQgYml0cmF0ZXMsCi0gKiAgICAgICAgICBkdXJhdGlvbnMsIHRyYW5zaXRpb25zIGFuZCBjdXRzLgotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDb21wdXRlT3V0cHV0QXZlcmFnZVZpZGVvQml0cmF0ZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKnBDU18wLCAqcENTXzEsICpwQ1NfMjsKLSAgICBNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICpwVDAsICpwVDI7Ci0gICAgTTRPU0FfSW50MzIgaTsKLQotICAgIE00T1NBX1VJbnQzMiB0MF9kdXJhdGlvbiwgdDJfZHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIHQwX2JpdHJhdGUsIHQyX2JpdHJhdGU7Ci0gICAgTTRPU0FfVUludDMyIGMxX2R1cmF0aW9uOwotCi0gICAgTTRPU0FfVUludDMyIHRvdGFsX2R1cmF0aW9uOwotICAgIE00T1NBX1VJbnQzMiB0b3RhbF9iaXRzdW07Ci0KLSAgICB0b3RhbF9kdXJhdGlvbiA9IDA7Ci0gICAgdG90YWxfYml0c3VtID0gMDsKLQotICAgIC8qIExvb3Agb24gdGhlIG51bWJlciBvZiBjbGlwcyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgcEMtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIHBDU18xID0gJnBDLT5wQ2xpcExpc3RbaV07Ci0KLSAgICAgICAgdDBfZHVyYXRpb24gPSAwOwotICAgICAgICB0MF9iaXRyYXRlID0gcENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlOwotICAgICAgICB0Ml9kdXJhdGlvbiA9IDA7Ci0gICAgICAgIHQyX2JpdHJhdGUgPSBwQ1NfMS0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0KLSAgICAgICAgLyogVHJhbnNpdGlvbiB3aXRoIHRoZSBwcmV2aW91cyBjbGlwICovCi0gICAgICAgIGlmKCBpID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDU18wID0gJnBDLT5wQ2xpcExpc3RbaSAtIDFdOwotICAgICAgICAgICAgcFQwID0gJnBDLT5wVHJhbnNpdGlvbkxpc3RbaSAtIDFdOwotCi0gICAgICAgICAgICBpZiggcFQwLT5WaWRlb1RyYW5zaXRpb25UeXBlCi0gICAgICAgICAgICAgICAgIT0gTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHQwX2R1cmF0aW9uID0gcFQwLT51aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgIGlmKCBwQ1NfMC0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGUgPiB0MF9iaXRyYXRlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQwX2JpdHJhdGUgPSBwQ1NfMC0+Q2xpcFByb3BlcnRpZXMudWlWaWRlb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogVHJhbnNpdGlvbiB3aXRoIHRoZSBuZXh0IGNsaXAgKi8KLSAgICAgICAgaWYoIGkgPCBwQy0+dWlDbGlwTnVtYmVyIC0gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDU18yID0gJnBDLT5wQ2xpcExpc3RbaSArIDFdOwotICAgICAgICAgICAgcFQyID0gJnBDLT5wVHJhbnNpdGlvbkxpc3RbaV07Ci0KLSAgICAgICAgICAgIGlmKCBwVDItPlZpZGVvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAhPSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfTm9uZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdDJfZHVyYXRpb24gPSBwVDItPnVpVHJhbnNpdGlvbkR1cmF0aW9uOwotCi0gICAgICAgICAgICAgICAgaWYoIHBDU18yLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZSA+IHQyX2JpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdDJfYml0cmF0ZSA9IHBDU18yLT5DbGlwUHJvcGVydGllcy51aVZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDaGVjayBmb3IgY3V0IHRpbWVzICovCi0gICAgICAgIGlmKCBwQ1NfMS0+dWlFbmRDdXRUaW1lID4gMCApCi0gICAgICAgICAgICBjMV9kdXJhdGlvbiA9IHBDU18xLT51aUVuZEN1dFRpbWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGMxX2R1cmF0aW9uID0gcENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0KLSAgICAgICAgaWYoIHBDU18xLT51aUJlZ2luQ3V0VGltZSA+IDAgKQotICAgICAgICAgICAgYzFfZHVyYXRpb24gLT0gcENTXzEtPnVpQmVnaW5DdXRUaW1lOwotCi0gICAgICAgIGMxX2R1cmF0aW9uIC09IHQwX2R1cmF0aW9uICsgdDJfZHVyYXRpb247Ci0KLSAgICAgICAgLyogQ29tcHV0ZSBiaXRzdW0gYW5kIGR1cmF0aW9uICovCi0gICAgICAgIHRvdGFsX2R1cmF0aW9uICs9IGMxX2R1cmF0aW9uICsgdDBfZHVyYXRpb24gLyAyICsgdDJfZHVyYXRpb24gLyAyOwotCi0gICAgICAgIHRvdGFsX2JpdHN1bSArPQotICAgICAgICAgICAgYzFfZHVyYXRpb24gKiAocENTXzEtPkNsaXBQcm9wZXJ0aWVzLnVpVmlkZW9CaXRyYXRlIC8gMTAwMCkKLSAgICAgICAgICAgICsgKHQwX2JpdHJhdGUgLyAxMDAwKSAqIHQwX2R1cmF0aW9uIC8gMgotICAgICAgICAgICAgKyAodDJfYml0cmF0ZSAvIDEwMDApICogdDJfZHVyYXRpb24gLyAyOwotICAgIH0KLQotICAgIHBDLT5ld2MudWlWaWRlb0JpdHJhdGUgPSAoIHRvdGFsX2JpdHN1bSAvIHRvdGFsX2R1cmF0aW9uKSAqIDEwMDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX0VkaXRBdWRpby5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdEF1ZGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0Njg4M2QuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdEF1ZGlvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNFZTUzNHUFBfRWRpdEF1ZGlvLmMKLSAqIEBicmllZiAgICBWaWRlbyBTdHVkaW8gU2VydmljZSAzR1BQIGVkaXQgQVBJIGltcGxlbWVudGF0aW9uLgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0vKioKLSAqIE91ciBoZWFkZXIgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0vKioKLSAqIE9TQUwgaGVhZGVycyAqLwotI2luY2x1ZGUgIk00T1NBX01lbW9yeS5oIiAvKio8IE9TQUwgbWVtb3J5IG1hbmFnZW1lbnQgKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIiAgLyoqPCBPU0FMIGRlYnVnIG1hbmFnZW1lbnQgKi8KLQotI2RlZmluZSBQV1JfRlhQX0ZSQUNUX01BWCAgICAgICAgICAgICgzMjc2OCkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXRpYyBsb2NhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRDaGVja0F1ZGlvRWZmZWN0cyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX1VJbnQ4IHVpQ2xpcE51bWJlciApOwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdCggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9VSW50OCB1aUNsaXAxb3JDbGlwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplICk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDLCBNNE9TQV9JbnQxNiAqcFBDTWRhdGExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDE2ICpwUENNZGF0YTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpUENNc2l6ZSApOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMoKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGp1bXBpbmcgcHJvY2Vzc2luZyBmb3IgdGhlIE1QMyBjbGlwLgotICogQG5vdGUgICAgT24gb25lIHN0ZXAsIHRoZSBqdW1wIG9mIHNldmVyYWwgQVUgaXMgZG9uZQotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdEp1bXBNUDMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwID0gcEMtPnBDMTsgLyoqPCBzaG9ydGN1dCAqLwotICAgIE00T1NBX0ludDMyIEp1bXBDdHM7Ci0KLSAgICBKdW1wQ3RzID0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0OwotCi0gICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChwQ2xpcCwgJkp1bXBDdHMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRPcGVuQ2xpcDogTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChBKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYoIEp1bXBDdHMgPj0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0ICkKLSAgICB7Ci0gICAgICAgIHBDLT5TdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFN0YXRlX01QMzsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgY2xpcCBvZmZzZXQgd2l0aCB0aGUgYXVkaW8gYmVnaW4gY3V0ICovCi0gICAgICAgIHBDbGlwLT5pQW9mZnNldCA9IC1KdW1wQ3RzOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFRoZSBhdWRpbyBpcyBjdXJyZW50bHkgaW4gcmVhZGluZyBtb2RlICovCi0gICAgICAgIHBDbGlwLT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0gICAgfQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcgZm9yIHRoZSBNUDMgY2xpcAotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwID0gcEMtPnBDMTsgLyoqPCBzaG9ydGN1dCAqLwotCi0gICAgLyoqCi0gICAgKiBDb3B5IHRoZSBpbnB1dCBBVSB0byB0aGUgb3V0cHV0IEFVICovCi0gICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIHBDbGlwLT5wQXVkaW9GcmFtZVB0ciwgKE00T1NBX1VJbnQzMilwQ2xpcC0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQ2xpcCk7Ci0KLSAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLCAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBVcGRhdGUgY3VycmVudCB0aW1lICh0bz10YytUKSAqLwotICAgICAgICBwQy0+ZXdjLmRBVG8gPQotICAgICAgICAgICAgKCBwQ2xpcC0+aUF1ZGlvRnJhbWVDdHMgKyBwQ2xpcC0+aUFvZmZzZXQpIC8gcENsaXAtPnNjYWxlX2F1ZGlvOwotCi0gICAgICAgIGlmKCAoTTRPU0FfSW50MzIpKHBDbGlwLT5pQXVkaW9GcmFtZUN0cyAvIHBDbGlwLT5zY2FsZV9hdWRpbyArIDAuNSkKLSAgICAgICAgICAgID49IHBDbGlwLT5pRW5kVGltZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00UkVBREVSX0J1ZmZlciBtcDN0YWdCdWZmZXI7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGUgZHVyYXRpb24gaXMgYmV0dGVyIHJlc3BlY3RlZCBpZiB0aGUgZmlyc3QgQVUgYW5kIGxhc3QgQVUgYXJlIGJvdGggYWJvdmUKLSAgICAgICAgICAgIHRoZSBjdXQgdGltZSAqLwotICAgICAgICAgICAgZXJyID0gcEMtPnBPc2FGaWxlV3JpdFB0ci0+d3JpdGVEYXRhKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgcENsaXAtPnBBdWRpb0ZyYW1lUHRyLAotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpcENsaXAtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAvKiBUaGUgSUQzdjEgdGFnIGlzIGFsd2F5cyBhdCB0aGUgZW5kIG9mIHRoZSBtcDMgZmlsZSBzbyB0aGUgZW5kIG9mIHRoZSBjdXR0aW5nCi0gICAgICAgICAgICBwcm9jZXNzIGlzIHdhaXRlZCAqLwotICAgICAgICAgICAgLyogYmVmb3JlIHdyaXRpbmcgdGhlIG1ldGFkYXRhIGluIHRoZSBvdXRwdXQgZmlsZSovCi0KLSAgICAgICAgICAgIC8qIFJldHJpZXZlIHRoZSBkYXRhIG9mIHRoZSBJRDN2MSBUYWcgKi8KLSAgICAgICAgICAgIGVyciA9IHBDbGlwLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICBwQ2xpcC0+cFJlYWRlckNvbnRleHQsIE00UkVBREVSX2tPcHRpb25JRF9NcDNJZDN2MVRhZywKLSAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJm1wM3RhZ0J1ZmZlcik7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDM6IE00TVAzUl9nZXRPcHRpb24gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBXcml0ZSB0aGUgZGF0YSBvZiB0aGUgSUQzdjEgVGFnIGluIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgICAgICAgICAgaWYoIDAgIT0gbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEocEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KW1wM3RhZ0J1ZmZlci5tX3BEYXRhLCBtcDN0YWdCdWZmZXIubV91aUJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRnJlZSBiZWZvcmUgdGhlIGVycm9yIGNoZWNraW5nIGFueXdheSAqLwotICAgICAgICAgICAgICAgIGZyZWUobXAzdGFnQnVmZmVyLm1fcERhdGEpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFcnJvciBjaGVja2luZyAqLwotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDM6XAotICAgICAgICAgICAgICAgICAgICAgICAgcE9zYUZpbGVXcml0UHRyLT53cml0ZURhdGEoSUQzdjFUYWcpIHJldHVybnMgMHgleCIsICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbXAzdGFnQnVmZmVyLm1fdWlCdWZmZXJTaXplID0gMDsKLSAgICAgICAgICAgICAgICBtcDN0YWdCdWZmZXIubV9wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFRoZSBFbmQgQ3V0IGhhcyBiZWVuIHJlYWNoZWQgKi8KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyhwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBNUDMgOiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpICYmIChNNE9TQV9GQUxTRQotICAgICAgICAgICAgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSkgKSAvKio8IFJlYWNoZWQgZW5kIG9mIGNsaXAgKi8KLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvKAotICAgICAgICAgICAgICAgIHBDKTsgLyoqPCBDbGlwIGRvbmUsIGRvIHRoZSBuZXh0IG9uZSAqLwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwTVAzOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKQotICogQGJyaWVmICAgIE9uZSBzdGVwIG9mIGF1ZGlvIHByb2Nlc3NpbmcKLSAqIEBwYXJhbSAgIHBDICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBpbnQzMl90IGF1VGltZVN0YW1wID0gLTE7Ci0KLSAgICBNNEVOQ09ERVJfQXVkaW9CdWZmZXIgcEVuY0luQnVmZmVyOyAgLyoqPCBFbmNvZGVyIGlucHV0IGJ1ZmZlciBmb3IgYXBpICovCi0gICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyIHBFbmNPdXRCdWZmZXI7IC8qKjwgRW5jb2RlciBvdXRwdXQgYnVmZmVyIGZvciBhcGkgKi8KLSAgICBNNE9TQV9UaW1lCi0gICAgICAgIGZyYW1lVGltZURlbHRhOyAvKio8IER1cmF0aW9uIG9mIHRoZSBlbmNvZGVkICh0aGVuIHdyaXR0ZW4pIGRhdGEgKi8KLSAgICBNNE9TQV9Cb29sIGJTdG9wQXVkaW87Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIHJlYWNoZWQgZW5kIGN1dCAqLwotICAgIGlmKCAoIHBDLT5ld2MuZEFUbyAtIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8gKyAwLjUpCi0gICAgICAgID49IHBDLT5wQzEtPmlFbmRUaW1lICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEF1ZGlvIGlzIGRvbmUgZm9yIHRoaXMgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8ocEMpOwotCi0gICAgICAgIC8qIFJDOiB0byBrbm93IHdoZW4gYSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgJiYgZXJyICE9IE00VlNTM0dQUF9XQVJfU1dJVENIX0NMSVAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZBdWRpbyByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogQ2hlY2sgQXVkaW8gTW9kZSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IG91dHB1dCBDVFMgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoCi0gICAgICAgIHBDKTsgLyoqPCBUaGlzIGZ1bmN0aW9uIGNoYW5nZSB0aGUgcEMtPkFzdGF0ZSB2YXJpYWJsZSEgKi8KLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTJfMygiICBBVURJTyBzdGVwIDogZEFUbyA9ICVmICBzdGF0ZSA9ICVkICBvZmZzZXQgPSAlbGQiLAotICAgICAgICBwQy0+ZXdjLmRBVG8sIHBDLT5Bc3RhdGUsIHBDLT5wQzEtPmlBb2Zmc2V0KTsKLQotICAgIGJTdG9wQXVkaW8gPSBNNE9TQV9GQUxTRTsKLQotICAgIHN3aXRjaCggcEMtPkFzdGF0ZSApCi0gICAgewotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgUkVBRF9XUklURSBNT0RFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfUkVBRF9XUklURToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8gUkVBRF9XUklURSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICBSRUFEX1dSSVRFOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENvbXB1dGUgb3V0cHV0IGF1ZGlvIENUUyAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgPQotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyArIHBDLT5wQzEtPmlBb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBCWlpaIGJ1ZyBmaXggKHJlYWQtd3JpdGUgY2FzZSk6Ci0gICAgICAgICAgICAgICAgKiBSZXBsYWNlIHRoZSBmaXJzdCBBTVIgQVUgb2YgdGhlIHN0cmVhbSB3aXRoIGEgc2lsZW5jZSBBVS4KLSAgICAgICAgICAgICAgICAqIEl0IHJlbW92ZXMgYW5ub3lpbmcgIkJaWloiIGF1ZGlvIGdsaXRjaC4KLSAgICAgICAgICAgICAgICAqIEl0IGlzIG5vdCBuZWVkZWQgaWYgdGhlcmUgaXMgYSBiZWdpbiBjdXQuCi0gICAgICAgICAgICAgICAgKiBJdCBpcyBub3QgbmVlZGVkIGZvciB0aGUgZmlyc3QgY2xpcC4KLSAgICAgICAgICAgICAgICAqIEJlY2F1c2Ugb2YgYW5vdGhlciBidWdmaXggKDIwMDUtMDMtMjQpLCB0aGUgZmlyc3QgQVUgd3JpdHRlbiBtYXkgYmUKLSAgICAgICAgICAgICAgICAqIHRoZSBzZWNvbmQgb25lIHdoaWNoIENUUyBpcyAyMC4gSGVuY2UgdGhlIGN0czwyMSB0ZXN0LgotICAgICAgICAgICAgICAgICogKHRoZSBCWlpaIGVmZmVjdCBvY2N1cnMgZXZlbiB3aXRoIHRoZSBzZWNvbmQgQVUhKSAqLwotICAgICAgICAgICAgICAgIGlmKCAoIE00T1NBX0ZBTFNFID09IHBDLT5wQzEtPmJGaXJzdEF1V3JpdHRlbikKLSAgICAgICAgICAgICAgICAgICAgJiYgKDAgIT0gcEMtPnVpQ3VycmVudENsaXApICYmIChwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cwotICAgICAgICAgICAgICAgICAgICA8IChwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbiArIDEpKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBDb3B5IGEgc2lsZW5jZSBBVSB0byB0aGUgb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSwgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiQSAjIyMjIHNpbGVuY2UgQVUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggKE00T1NBX1VJbnQzMilwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplCi0gICAgICAgICAgICAgICAgICAgIDwgcEMtPmV3Yy51aUF1ZGlvTWF4QXVTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcHkgdGhlIGlucHV0IEFVIHRvIHRoZSBvdXRwdXQgQVUgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMilwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPnBBdWRpb0ZyYW1lUHRyLCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBSRUFEX1dSSVRFOiBBVSBzaXplIGdyZWF0ZXIgdGhhbiBNYXhBdVNpemUgXAotICAgICAgICAgICAgICAgICAgICAgICAgKCVkPiVkKSEgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5QVVRfQVVESU9fQVVfVE9PX0xBUkdFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUsIHBDLT5ld2MudWlBdWRpb01heEF1U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOUFVUX0FVRElPX0FVX1RPT19MQVJHRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFRoaXMgYm9vbGVhbiBpcyBvbmx5IHVzZWQgdG8gZml4IHRoZSBCWlogYnVnLi4uICovCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+YkZpcnN0QXVXcml0dGVuID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKCJCIC0tLS0gd3JpdGUgOiBjdHMgID0gJWxkIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qMTEvMTIvMjAwOCBDUiAzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3QKLSAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRXQVJfV1JJVEVSX1NUT1BfUkVRIGlzIHJldHVybmVkIHdoZW4gdGhlIHRhcmdldGVkIG91dHB1dCBmaWxlCi0gICAgICAgICAgICAgICAgICAgIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLAotICAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogRmlsZSB3YXMgY3V0IHRvIGF2b2lkIG92ZXJzaXplIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURfV1JJVEU6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXVkaW8gaXMgbm93IGluIHJlYWQgbW9kZSAodGhlcmUgbWF5IGJlIGEgImlmKHN0YXR1cyE9UkVBRCkiIGhlcmUsCi0gICAgICAgICAgICAgICAgYnV0IGl0IGlzIHJlbW92ZWQgZm9yIG9wdGltaXphdGlvbikgKi8KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5Bc3RhdHVzID0gTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQ7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1IoZXJyKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogUkVBRF9XUklURTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjdXJyZW50IHRpbWUgKHRvPXRjK1QpICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZEFUbyA9ICggcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEMxLT5pQW9mZnNldCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW87Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggTTRXQVJfTk9fTU9SRV9BVSA9PSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoTTRPU0FfRkFMU0UgPT0gcEMtPmJTdXBwb3J0U2lsZW5jZSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogSWYgb3V0cHV0IGlzIG90aGVyIHRoYW4gQU1SIG9yIEFBQwotICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gRVZSQyx3ZSBjYW4ndCB3cml0ZSBzaWxlbmNlIGludG8gaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFNvIHdlIHNpbXBseSBlbmQgaGVyZS4qLwotICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3BBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgICAgICAvKnwgREVDT0RFX0VOQ09ERSBNT0RFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfREVDT0RFX0VOQ09ERToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8gREVDT0RFX0VOQ09ERSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBBVSB0byB3cml0ZSBpbnRvICovCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsIE00VlNTM0dQUF9XUklURVJfQVVESU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVKTsKLQotICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHdlIHdlcmUgcmVhZGluZyB0aGUgY2xpcCwgd2UgbXVzdCBqdW1wIGEgZmV3IEFVIGJhY2t3YXJkIHRvIGRlY29kZS9lbmNvZGUKLSAgICAgICAgICAgICAgICAod2l0aG91dCB3cml0aW5nIHJlc3VsdCkgZnJvbSB0aGF0IHBvaW50LiAqLwotICAgICAgICAgICAgICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfUkVBRCA9PSBwQy0+cEMxLT5Bc3RhdHVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIGlUYXJnZXRDdHMsIGlDdXJyZW50Q3RzOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBwQy0+cEMxLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlBdWRpb0ZyYW1lQ3RzICkgLyoqPGRvbid0IHRyeSB0byBwcmUtZGVjb2RlIGlmIGNsaXAgaXMgYXQgaXRzIGJlZ2lubmluZy4gKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEp1bXAgYSBmZXcgQVVzIGJhY2t3YXJkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpQ3VycmVudEN0cyA9IHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzOwotICAgICAgICAgICAgICAgICAgICAgICAgaVRhcmdldEN0cyA9IGlDdXJyZW50Q3RzIC0gTTRWU1MzR1BQX05CX0FVX1BSRUZFVENICi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlUYXJnZXRDdHMgPCAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVGFyZ2V0Q3RzID0gMDsgLyoqPCBTYW5pdHkgY2hlY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBKdW1wQXVkaW9BdChwQy0+cEMxLCAmaVRhcmdldEN0cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMSk7IC8qKjwgcmVhZCBBVSB3aGVyZSB3ZSBqdW1wZWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkQgLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREUtcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcFJlYWROZXh0QXVkaW9GcmFtZShhKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRGVjb2RlL2VuY29kZSB1cCB0byB0aGUgd2FudGVkIHBvc2l0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgPCBpQ3VycmVudEN0cyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShwQy0+cEMxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogREVDT0RFX0VOQ09ERS1wcmVmZXRjaDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJFICoqKiogcHJlLWVuY29kZSIpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIFBDTSBhdWRpbyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBFbmNJbkJ1ZmZlciwgJnBFbmNPdXRCdWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbygpOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvL2lmKDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0pCi0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBBdWRpb0ZyYW1lUHRyID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aW1lc3RhbXAgb2YgbGFzdCByZWFkIEFVCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+U2hlbGxBUEkubV9wQXVkaW9EZWNvZGVyLT5tX3BGY3RHZXRPcHRpb25BdWRpb0RlYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cEF1ZGlvRGVjQ3R4dCwgTTRBRF9rT3B0aW9uSURfQXVDVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKSAmYXVUaW1lU3RhbXApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1VGltZVN0YW1wID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBhdWRpbyB0aW1lc3RhbXAgcmV0dXJuZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00V0FSX0lOVkFMSURfVElNRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyA9IGF1VGltZVN0YW1wOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBBdWRpbyBpcyBub3cgT0sgZm9yIGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkFzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5wQXVkaW9GcmFtZVB0ciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGltZXN0YW1wIG9mIGxhc3QgcmVhZCBBVQotICAgICAgICAgICAgICAgIHBDLT5wQzEtPlNoZWxsQVBJLm1fcEF1ZGlvRGVjb2Rlci0+bV9wRmN0R2V0T3B0aW9uQXVkaW9EZWMoCi0gICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBBdWRpb0RlY0N0eHQsIE00QURfa09wdGlvbklEX0F1Q1RTLAotICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbikgJmF1VGltZVN0YW1wKTsKLQotICAgICAgICAgICAgICAgIGlmIChhdVRpbWVTdGFtcCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IGludmFsaWQgYXVkaW8gXAotICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wIHJldHVybmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFdBUl9JTlZBTElEX1RJTUU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgPSBhdVRpbWVTdGFtcDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID49IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QocEMsIDEsIChNNE9TQV9JbnQxNgotICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRFbmRBdWRpb0VmZmVjdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDb21wdXRlIG91dHB1dCBhdWRpbyBDVFMgKi8KLSAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgKyBwQy0+cEMxLT5pQW9mZnNldDsKLQotICAgICAgICAgICAgICAgIC8qIE1heSBoYXBwZW4gd2l0aCBjb3JydXB0ZWQgaW5wdXQgZmlsZXMgKHdoaWNoIGhhdmUgc3R0cyBlbnRyaWVzIG5vdAotICAgICAgICAgICAgICAgIG11bHRpcGxlIG9mIFNpbGVuY2VGcmFtZUR1cmF0aW9uKSAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIDwgMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEJaWlogYnVnIGZpeCAoZGVjb2RlLWVuY29kZSBjYXNlKToKLSAgICAgICAgICAgICAgICAqIChZZXMsIHRoZSBCenogYnVnIG1heSBhbHNvIG9jY3VyIHdoZW4gd2UgcmUtZW5jb2RlLiBJdCBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgKiAgb2NjdXIgYXQgdGhlIGRlY29kZSBiZWZvcmUgdGhlIGVuY29kZSwgYnV0IGF0IHRoZSBwbGF5YmFjayEpCi0gICAgICAgICAgICAgICAgKiBSZXBsYWNlIHRoZSBmaXJzdCBBTVIgQVUgb2YgdGhlIGVuY29kZWQgc3RyZWFtIHdpdGggYSBzaWxlbmNlIEFVLgotICAgICAgICAgICAgICAgICogSXQgcmVtb3ZlcyBhbm5veWluZyAiQlpaWiIgYXVkaW8gZ2xpdGNoLgotICAgICAgICAgICAgICAgICogSXQgaXMgbm90IG5lZWRlZCBpZiB0aGVyZSBpcyBhIGJlZ2luIGN1dC4KLSAgICAgICAgICAgICAgICAqIEl0IGlzIG5vdCBuZWVkZWQgZm9yIHRoZSBmaXJzdCBjbGlwLgotICAgICAgICAgICAgICAgICogQmVjYXVzZSBvZiBhbm90aGVyIGJ1Z2ZpeCAoMjAwNS0wMy0yNCksIHRoZSBmaXJzdCBBVSB3cml0dGVuIG1heSBiZQotICAgICAgICAgICAgICAgICogdGhlIHNlY29uZCBvbmUgd2hpY2ggQ1RTIGlzIDIwLiBIZW5jZSB0aGUgY3RzPDIxIHRlc3QuCi0gICAgICAgICAgICAgICAgKiAodGhlIEJaWlogZWZmZWN0IG9jY3VycyBldmVuIHdpdGggdGhlIHNlY29uZCBBVSEpICovCi0gICAgICAgICAgICAgICAgaWYoICggTTRPU0FfRkFMU0UgPT0gcEMtPnBDMS0+YkZpcnN0QXVXcml0dGVuKQotICAgICAgICAgICAgICAgICAgICAmJiAoMCAhPSBwQy0+dWlDdXJyZW50Q2xpcCkgJiYgKHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzCi0gICAgICAgICAgICAgICAgICAgIDwgKHBDLT5ld2MuaVNpbGVuY2VGcmFtZUR1cmF0aW9uICsgMSkpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvcHkgYSBzaWxlbmNlIEFNUiBBVSB0byB0aGUgb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPmV3Yy5wU2lsZW5jZUZyYW1lRGF0YSwgcEMtPmV3Yy51aVNpbGVuY2VGcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRyAjIyMjIHNpbGVuY2UgQVUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBmaWx0ZXJlZCBQQ00gYXVkaW8gZGlyZWN0bHkgaW50byB0aGUgb3V0cHV0IEFVICovCi0KLSAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVGltZSBpbiBtcyBmcm9tIGRhdGEgc2l6ZSwgYmVjYXVzZSBpdCBpcyBQQ00xNiBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+ZXdjLnVpTmJDaGFubmVsczsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiSCArKysrIGVuY29kZSBBVSIpOwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0gICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgKiBPTVggQXVkaW8gZGVjIHNoZWxsIGRvZXMgaW50ZXJuYWwgYnVmZmVyaW5nIGFuZCBoZW5jZSBkb2VzIG5vdCByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgYSBQQ00gYnVmZmVyIGZvciBldmVyeSBkZWNvZGVTdGVwIGNhbGwuKgotICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAwICE9IHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdICkKLSAgICAgICAgICAgICAgICAgICAgewotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRW5jSW5CdWZmZXIsICZwRW5jT3V0QnVmZmVyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBTZXQgQVUgc2l6ZSAqLwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWwotICAgICAgICAgICAgICAgICAgICAgICAgMF07IC8qKjwgR2V0IHRoZSBzaXplIG9mIGVuY29kZWQgZGF0YSAqLwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVGhpcyBib29sZWFuIGlzIG9ubHkgdXNlZCB0byBmaXggdGhlIEJaWiBidWcuLi4gKi8KLSAgICAgICAgICAgICAgICBwQy0+cEMxLT5iRmlyc3RBdVdyaXR0ZW4gPSBNNE9TQV9UUlVFOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkkgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgLyBwQy0+ZXdjLnNjYWxlX2F1ZGlvKSwKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJBdWRpb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBXcml0ZSB0aGUgQVUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyQXVkaW9BVSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoxMS8xMi8yMDA4IENSIDMyODMgTU1TIHVzZSBjYXNlIGZvciBWaWRlb0FydGlzdAotICAgICAgICAgICAgICAgICAgICB0aGUgd2FybmluZyBNNFdBUl9XUklURVJfU1RPUF9SRVEgaXMgcmV0dXJuZWQgd2hlbiB0aGUgdGFyZ2V0ZWQgb3V0cHV0IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLAotICAgICAgICAgICAgICAgICAgICAgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRXQVJfV1JJVEVSX1NUT1BfUkVRID09IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogRmlsZSB3YXMgY3V0IHRvIGF2b2lkIG92ZXJzaXplIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVhZCB0aGUgbmV4dCBhdWRpbyBmcmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzMoIkogLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogVXBkYXRlIGN1cnJlbnQgdGltZSAodG89dGMrVCkgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kQVRvID0gKCBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0cyArIHBDLT5wQzEtPmlBb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbzsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBNNFdBUl9OT19NT1JFX0FVID09IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChNNE9TQV9GQUxTRSA9PSBwQy0+YlN1cHBvcnRTaWxlbmNlKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBvdXRwdXQgaXMgb3RoZXIgdGhhbiBBTVIgb3IgQUFDCi0gICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBFVlJDLHdlIGNhbid0IHdyaXRlIHNpbGVuY2UgaW50byBpdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogU28gd2Ugc2ltcGx5IGVuZCBoZXJlLiovCi0gICAgICAgICAgICAgICAgICAgICAgICBiU3RvcEF1ZGlvID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBUUkFOU0lUSU9OIE1PREUgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0QXVkaW9TdGF0ZV9UUkFOU0lUSU9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbyBUUkFOU0lUSU9OIik7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wU3RhcnRBVSgKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwgTTRWU1MzR1BQX1dSSVRFUl9BVURJT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2Ugd2VyZSByZWFkaW5nIHRoZSBjbGlwLCB3ZSBtdXN0IGp1bXAgYSBmZXcgQVUgYmFja3dhcmQgdG8gZGVjb2RlL2VuY29kZQotICAgICAgICAgICAgICAgICh3aXRob3V0IHdyaXRpbmcgcmVzdWx0KSBmcm9tIHRoYXQgcG9pbnQuICovCi0gICAgICAgICAgICAgICAgaWYoIE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEID09IHBDLT5wQzEtPkFzdGF0dXMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MzIgaVRhcmdldEN0cywgaUN1cnJlbnRDdHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIDAKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IHBDLT5wQzEtPgotICAgICAgICAgICAgICAgICAgICAgICAgaUF1ZGlvRnJhbWVDdHMgKSAvKio8ZG9uJ3QgdHJ5IHRvIHByZS1kZWNvZGUgaWYgY2xpcCBpcyBhdCBpdHMgYmVnaW5uaW5nLiovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBKdW1wIGEgZmV3IEFVcyBiYWNrd2FyZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaUN1cnJlbnRDdHMgPSBwQy0+cEMxLT5pQXVkaW9GcmFtZUN0czsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlUYXJnZXRDdHMgPSBpQ3VycmVudEN0cyAtIE00VlNTM0dQUF9OQl9BVV9QUkVGRVRDSAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb247Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpVGFyZ2V0Q3RzIDwgMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRhcmdldEN0cyA9IDA7IC8qKjwgU2FuaXR5IGNoZWNrICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwSnVtcEF1ZGlvQXQocEMtPnBDMSwgJmlUYXJnZXRDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT04tcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50Q2xpcEp1bXBBdWRpb0F0IHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEpOyAvKio8IHJlYWQgQVUgd2hlcmUgd2UganVtcGVkICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJLIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUFvZmZzZXQgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoYSkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIERlY29kZS9lbmNvZGUgdXAgdG8gdGhlIHdhbnRlZCBwb3NpdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIDwgaUN1cnJlbnRDdHMgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT04tcHJlZmV0Y2g6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogW01vbm9dIG9yIFtTdGVyZW8gaW50ZXJsZWF2ZWRdIDogYWxsIGlzIGluIG9uZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyWzFdID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jSW5CdWZmZXIucFRhYmxlQnVmZmVyU2l6ZVsxXSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGluIG1zIGZyb20gZGF0YSBzaXplLCBiZWNhdXNlIGl0IGlzIFBDTTE2IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVRpbWVEZWx0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdIC8gc2l6ZW9mKHNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHBDLT5ld2MudWlOYkNoYW5uZWxzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBQcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwQy0+ZXdjLldyaXRlckF1ZGlvQVUuZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKCJMICoqKiogcHJlLWVuY29kZSIpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEVuY29kZSB0aGUgUENNIGF1ZGlvICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5TaGVsbEFQSS5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0ZXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvKCk6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RlcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk0gLi4uLiByZWFkICA6IGN0cyAgPSAlLjBmICsgJS4wZiBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzIC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnVpQXVkaW9GcmFtZVNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX0VSUl9JU19FUlJPUihlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OLXByZWZldGNoOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKGIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBBdWRpbyBpcyBub3cgT0sgZm9yIGRlY29kaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkFzdGF0dXMgPSBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBmaXJzdCBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShDMSkgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBEZWNvZGUgdGhlIHNlY29uZCBpbnB1dCBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlQ3VycmVudEF1ZGlvRnJhbWUocEMtPnBDMik7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBEZWNvZGVDdXJyZW50QXVkaW9GcmFtZShDMikgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBib3RoIGNsaXBzIGRlY29kZWQgdGhlIHNhbWUgYW1vdW50IG9mIFBDTSBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZQotICAgICAgICAgICAgICAgICAgICAhPSBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiRVJSIDogQXVkaW9UcmFuc2l0aW9uOiBib3RoIGNsaXBzIEFVIG11c3QgaGF2ZSB0aGUgc2FtZSBkZWNvZGVkXAotICAgICAgICAgICAgICAgICAgICAgICAgUENNIHNpemUhIHBjMSBzaXplPTB4JXgsIHBDMiBzaXplID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgICAgICAvKk9NWCBBdWRpbyBkZWNvZGVyIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICogT01YIEF1ZGlvIGRlYyBzaGVsbCBkb2VzIGludGVybmFsIGJ1ZmZlcmluZyBhbmQgaGVuY2UgZG9lcyBub3QgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAgICAgKiBTbyBQQ00gYnVmZmVyIHNpemVzIG1pZ2h0IGJlIDAgb3IgZGlmZmVyZW50IGZvciBjbGlwMSBhbmQgY2xpcDIuCi0gICAgICAgICAgICAgICAgICAgICogU28gbm8gbmVlZCB0byByZXR1cm4gZXJyb3IgaW4gdGhpcyBjYXNlICovCi0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86ICwgcGMxIEF1ZEJ1ZmYgc2l6ZT0weCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQzIgQXVkQnVmZiBzaXplID0gMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERURfUENNX1NJWkVfSVNTVUU7Ci0KLSNlbmRpZiAvLyBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGF1ZGlvIGVmZmVjdCBvbiBjbGlwMSAqLwotICAgICAgICAgICAgICAgIGlmKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID49IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QocEMsIDEsIChNNE9TQV9JbnQxNgotICAgICAgICAgICAgICAgICAgICAgICAgKilwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KEMxKSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgYXVkaW8gZWZmZWN0IG9uIGNsaXAyICovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5pQ2xpcDJBY3RpdmVFZmZlY3QgPj0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdChwQywgMiwgKE00T1NBX0ludDE2Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKXBDLT5wQzItPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5BdWRpb0RlY0J1ZmZlck91dC5tX2J1ZmZlclNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5QXVkaW9FZmZlY3QoQzIpIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSB0cmFuc2l0aW9uIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb24ocEMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQxNiAqKXBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQxNiAqKXBDLT5wQzItPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPkF1ZGlvRGVjQnVmZmVyT3V0Lm1fYnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBbTW9ub10gb3IgW1N0ZXJlbyBpbnRlcmxlYXZlZF0gOiBhbGwgaXMgaW4gb25lIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMF0gPQotICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5BdWRpb0RlY0J1ZmZlck91dC5tX2RhdGFBZGRyZXNzOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzBdID0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+QXVkaW9EZWNCdWZmZXJPdXQubV9idWZmZXJTaXplOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJbMV0gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBFbmNJbkJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWzFdID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIFRpbWUgaW4gbXMgZnJvbSBkYXRhIHNpemUsIGJlY2F1c2UgaXQgaXMgUENNMTYgc2FtcGxlcyAqLwotICAgICAgICAgICAgICAgIGZyYW1lVGltZURlbHRhID0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gLyBzaXplb2Yoc2hvcnQpCi0gICAgICAgICAgICAgICAgICAgIC8gcEMtPmV3Yy51aU5iQ2hhbm5lbHM7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHBFbmNPdXRCdWZmZXIucFRhYmxlQnVmZmVyWzBdID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX01lbUFkZHI4KXBDLT5ld2MuV3JpdGVyQXVkaW9BVS5kYXRhQWRkcmVzczsKLSAgICAgICAgICAgICAgICBwRW5jT3V0QnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gPSAwOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIk4gKioqKiBibGVuZCBBVXMiKTsKLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgIC8qT01YIEF1ZGlvIGRlY29kZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAqIE9NWCBBdWRpbyBkZWMgc2hlbGwgZG9lcyBpbnRlcm5hbCBidWZmZXJpbmcgYW5kIGhlbmNlIGRvZXMgbm90IHJldHVybgotICAgICAgICAgICAgICAgIGEgUENNIGJ1ZmZlciBmb3IgZXZlcnkgZGVjb2RlU3RlcCBjYWxsLioKLSAgICAgICAgICAgICAgICAqIFNvIFBDTSBidWZmZXIgc2l6ZXMgbWlnaHQgYmUgMC4gSW4gdGhpcyBjYXNlIGRvbm90IGNhbGwgZW5jb2RlIFN0ZXAqLwotCi0gICAgICAgICAgICAgICAgaWYoIDAgIT0gcEVuY0luQnVmZmVyLnBUYWJsZUJ1ZmZlclNpemVbMF0gKQotICAgICAgICAgICAgICAgIHsKLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBQQ00gYXVkaW8gKi8KLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wQXVkaW9FbmNDdHh0LCAmcEVuY0luQnVmZmVyLCAmcEVuY091dEJ1ZmZlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW8oKTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGVwIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFNldCBBVSBjdHMgYW5kIHNpemUgKi8KLQotICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5zaXplID0gcEVuY091dEJ1ZmZlci5wVGFibGVCdWZmZXJTaXplWwotICAgICAgICAgICAgICAgICAgICAwXTsgLyoqPCBHZXQgdGhlIHNpemUgb2YgZW5jb2RlZCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyQXVkaW9BVS5DVFMgKz0gZnJhbWVUaW1lRGVsdGE7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIk8gLS0tLSB3cml0ZSA6IGN0cyAgPSAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLldyaXRlckF1ZGlvQVUuQ1RTIC8gcEMtPmV3Yy5zY2FsZV9hdWRpbyksCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlckF1ZGlvQVUuc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogV3JpdGUgdGhlIEFVICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBQcm9jZXNzQVUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LCBNNFZTUzNHUFBfV1JJVEVSX0FVRElPX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+ZXdjLldyaXRlckF1ZGlvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qMTEvMTIvMjAwOCBDUiAzMjgzIE1NUyB1c2UgY2FzZSBmb3IgVmlkZW9BcnRpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIHNpemUgaXMgcmVhY2hlZAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCx0aGUgd2FybmluZyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORQotICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBSZWFkIHRoZSBuZXh0IGF1ZGlvIGZyYW1lICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzEpOwotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJQIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICUuMGYgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmlBb2Zmc2V0IC8gcEMtPnBDMS0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT51aUF1ZGlvRnJhbWVTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKEMxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0VSUiBzZWNvbmRhcnlFcnJvcjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjdXJyZW50IHRpbWUgKHRvPXRjK1QpICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRBVG8gPSAoIHBDLT5wQzEtPmlBdWRpb0ZyYW1lQ3RzICsgcEMtPnBDMS0+aUFvZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwQy0+cEMxLT5zY2FsZV9hdWRpbzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFJlYWQgdGhlIG5leHQgYXVkaW8gZnJhbWUgaW4gdGhlIHNlY29uZCBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlFcnJvciA9IE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lKHBDLT5wQzIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiUSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5pQXVkaW9GcmFtZUN0cyAvIHBDLT5wQzItPnNjYWxlX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzItPmlBb2Zmc2V0IC8gcEMtPnBDMi0+c2NhbGVfYXVkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE9TQV9FUlJfSVNfRVJST1Ioc2Vjb25kYXJ5RXJyb3IpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUoQzIpIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlFcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggKCBNNFdBUl9OT19NT1JFX0FVID09IGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoTTRXQVJfTk9fTU9SRV9BVSA9PSBzZWNvbmRhcnlFcnJvcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKE00T1NBX0ZBTFNFID09IHBDLT5iU3VwcG9ydFNpbGVuY2UpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIElmIG91dHB1dCBpcyBvdGhlciB0aGFuIEFNUiBvciBBQUMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIEVWUkMsd2UgY2FuJ3Qgd3JpdGUgc2lsZW5jZSBpbnRvIGl0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU28gd2Ugc2ltcGx5IGVuZCBoZXJlLiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3BBdWRpbyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX18gKi8KLSAgICAgICAgICAgIC8qfCAgICAgICAgICAgIHwqLwotICAgICAgICAgICAgLyp8IEVSUk9SIENBU0UgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX198Ki8KLQotICAgICAgICBkZWZhdWx0OgotCi0gICAgICAgICAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwQXVkaW86IGludmFsaWQgaW50ZXJuYWwgc3RhdGUgKDB4JXgpLCBcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5URVJOQUxfU1RBVEUiLAotICAgICAgICAgICAgICAgIHBDLT5Bc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5URVJOQUxfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBhcmUgZm9yY2VkIHRvIHN0b3AgYXVkaW8gKi8KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBiU3RvcEF1ZGlvICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIEF1ZGlvIGlzIGRvbmUgZm9yIHRoaXMgY2xpcCAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mQXVkaW8ocEMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBBdWRpbzogTTRWU1MzR1BQX2ludFJlYWNoZWRFbmRPZkF1ZGlvIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcEF1ZGlvOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tBdWRpb01vZGUoKQotICogQGJyaWVmICAgIENoZWNrIHdoaWNoIGF1ZGlvIHByb2Nlc3MgbW9kZSB3ZSBtdXN0IHVzZSwgZGVwZW5kaW5nIG9uIHRoZSBvdXRwdXQgQ1RTLgotICogQHBhcmFtICAgcEMgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIGNvbnN0IE00T1NBX0ludDMyIFREID0gcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgIHVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uOyAvKio8IFRyYW5zaXRpb24gZHVyYXRpb24gKi8KLQotICAgIGNvbnN0IE00VlNTM0dQUF9FZGl0QXVkaW9TdGF0ZSBwcmV2aW91c0FzdGF0ZSA9IHBDLT5Bc3RhdGU7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIENsaXAxIGlzIG9uIGl0cyBiZWdpbiBjdXQsIG9yIGluIGl0cyBiZWdpbiBlZmZlY3Qgb3IgZW5kIGVmZmVjdCB6b25lICovCi0gICAgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKHBDLCAxKTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgaWYgd2UgYXJlIGluIHRoZSB0cmFuc2l0aW9uIHdpdGggbmV4dCBjbGlwICovCi0gICAgaWYoICggVEQgPiAwKSAmJiAoKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gLSBwQy0+cEMxLT5pQW9mZnNldAotICAgICAgICAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvICsgMC41KSA+PSAocEMtPnBDMS0+aUVuZFRpbWUgLSBURCkpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTjsKLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBEbyB3ZSBlbnRlciB0aGUgdHJhbnNpdGlvbiBzZWN0aW9uID8gKi8KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTiAhPSBwcmV2aW91c0FzdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcGVuIHNlY29uZCBjbGlwIGZvciB0cmFuc2l0aW9uLCBpZiBub3QgeWV0IG9wZW5lZCAqLwotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDMiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludE9wZW5DbGlwKHBDLCAmcEMtPnBDMiwKLSAgICAgICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcEMtPnVpQ3VycmVudENsaXAgKyAxXSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlOiBNNFZTUzNHUFBfaW50T3BlbkNsaXAoKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJbiBjYXNlIG9mIHNob3J0IHRyYW5zaXRpb24gYW5kIGJhZCBsdWNrICguLi4pLCB0aGVyZSBtYXkgYmUgbm8gdmlkZW8gQVUKLSAgICAgICAgICAgICAgICAqIGluIHRoZSB0cmFuc2l0aW9uLiBJbiB0aGF0IGNhc2UsIHRoZSBzZWNvbmQgY2xpcCBoYXMgbm90IGJlZW4gb3BlbmVkLgotICAgICAgICAgICAgICAgICogU28gd2UgbXVzdCB1cGRhdGUgdGhlIHZpZGVvIG9mZnNldCBoZXJlLiAqLwotICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgLyoqPCBBZGQgY3VycmVudCB2aWRlbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIG9mZnNldCAqLwotICAgICAgICAgICAgICAgIHBDLT5wQzItPmlWb2Zmc2V0ICs9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBBZGQgY3VycmVudCBhdWRpbyBvdXRwdXQgQ1RTIHRvIHRoZSBjbGlwIG9mZnNldAotICAgICAgICAgICAgKiAodmlkZW8gb2Zmc2V0IGhhcyBhbHJlYWR5IGJlZW4gc2V0IHdoZW4gZG9pbmcgdGhlIHZpZGVvIHRyYW5zaXRpb24pICovCi0gICAgICAgICAgICBwQy0+cEMyLT5pQW9mZnNldCArPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKHBDLT5ld2MuZEFUbyAqIHBDLT5ld2Muc2NhbGVfYXVkaW8gKyAwLjUpOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogMjAwNS0wMy0yNDogQnVnRml4IGZvciBhdWRpby12aWRlbyBzeW5jaHJvOgotICAgICAgICAgICAgKiBUaGVyZSBtYXkgYmUgYSBwb3J0aW9uIG9mIHRoZSBkdXJhdGlvbiBvZiBhbiBhdWRpbyBBVSBvZiBkZXN5bmNocm8gYXQgZWFjaCBhc3NlbWJseS4KLSAgICAgICAgICAgICogSXQgbGVhZHMgdG8gYW4gYXVkaWJsZSBkZXN5bmNocm8gd2hlbiB0aGVyZSBhcmUgYSBsb3Qgb2YgY2xpcHMgYXNzZW1ibGVkLgotICAgICAgICAgICAgKiBUaGlzIGJ1ZyBmaXggYWxsb3dzIHRvIHJlc3luY2ggdGhlIGF1ZGlvIHRyYWNrIHdoZW4gdGhlIGRlbHRhIGlzIGhpZ2hlcgotICAgICAgICAgICAgKiB0aGFuIG9uZSBhdWRpbyBBVSBkdXJhdGlvbi4KLSAgICAgICAgICAgICogV2UgU3RlcCBvbmUgQVUgaW4gdGhlIHNlY29uZCBjbGlwIGFuZCB3ZSBjaGFuZ2UgdGhlIGF1ZGlvIG9mZnNldCBhY2NvcmRpbmdseS4gKi8KLSAgICAgICAgICAgIGlmKCAoIHBDLT5wQzItPmlBb2Zmc2V0Ci0gICAgICAgICAgICAgICAgLSAoTTRPU0FfSW50MzIpKHBDLT5wQzItPmlWb2Zmc2V0ICpwQy0+cEMyLT5zY2FsZV9hdWRpbyArIDAuNSkpCi0gICAgICAgICAgICAgICAgICAgID4gcEMtPmV3Yy5pU2lsZW5jZUZyYW1lRHVyYXRpb24gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQWR2YW5jZSBvbmUgQU1SIGZyYW1lICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBSZWFkTmV4dEF1ZGlvRnJhbWUocEMtPnBDMik7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiWiAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlLjBmIFsgMHgleCBdIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+aUF1ZGlvRnJhbWVDdHMgLyBwQy0+cEMyLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+aUFvZmZzZXQgLyBwQy0+cEMyLT5zY2FsZV9hdWRpbywKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMi0+dWlBdWRpb0ZyYW1lU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTRPU0FfRVJSX0lTX0VSUk9SKGVycikgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrQXVkaW9Nb2RlOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRDbGlwUmVhZE5leHRBdWRpb0ZyYW1lIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVcGRhdGUgYXVkaW8gb2Zmc2V0IGFjY29yZGluZ2x5Ki8KLSAgICAgICAgICAgICAgICBwQy0+cEMyLT5pQW9mZnNldCAtPSBwQy0+ZXdjLmlTaWxlbmNlRnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENoZWNrIGJlZ2luIGFuZCBlbmQgZWZmZWN0cyBmb3IgY2xpcDIgKi8KLSAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKHBDLCAyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgYXJlIG5vdCBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgaWYgY3VycmVudCBtb2RlIGlzIFJlYWQvV3JpdGUgb3IgRGVjb2RlL0VuY29kZSAqLwotICAgICAgICBpZiggcEMtPmlDbGlwMUFjdGl2ZUVmZmVjdCA+PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPkFzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfREVDT0RFX0VOQ09ERTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDLT5Bc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGNyZWF0ZS9kZXN0cm95IGFuIGVuY29kZXIgKi8KLSAgICBpZiggKCBNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEUgPT0gcHJldmlvdXNBc3RhdGUpCi0gICAgICAgICYmIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgIChNNFZTUzNHUFBfa0VkaXRBdWRpb1N0YXRlX1JFQURfV1JJVEUgIT0gcEMtPkFzdGF0ZSkgKSAvKio8IGVuY29kZSBtb2RlICovCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdWlBdWRpb0JpdHJhdGU7Ci0KLSAgICAgICAgLyogQ29tcHV0ZSBtYXggYml0cmF0ZSBkZXBlbmRpbmcgb24gaW5wdXQgZmlsZXMgYml0cmF0ZXMgYW5kIHRyYW5zaXRpb25zICovCi0gICAgICAgIGlmKCBwQy0+QXN0YXRlID09IE00VlNTM0dQUF9rRWRpdEF1ZGlvU3RhdGVfVFJBTlNJVElPTiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIE1heCBvZiB0aGUgdHdvIGJsZW5kZWQgZmlsZXMgKi8KLSAgICAgICAgICAgIGlmKCBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPiBwQy0+cEMyLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlICkKLSAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgcEMtPnBDMi0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aUF1ZGlvQml0cmF0ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNhbWUgYXMgaW5wdXQgZmlsZSAqLwotICAgICAgICAgICAgdWlBdWRpb0JpdHJhdGUgPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpQXVkaW9CaXRyYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ3JlYXRlIHRoZSBlbmNvZGVyICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDcmVhdGVBdWRpb0VuY29kZXIoJnBDLT5ld2MsICZwQy0+U2hlbGxBUEksCi0gICAgICAgICAgICB1aUF1ZGlvQml0cmF0ZSk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZTogTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyKCkgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRDaGVja0F1ZGlvTW9kZSgpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKCkKLSAqIEBicmllZiAgICBDaGVjayB3aGljaCBhdWRpbyBlZmZlY3QgbXVzdCBiZSBhcHBsaWVkIGF0IHRoZSBjdXJyZW50IHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrQXVkaW9FZmZlY3RzKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwQywgTTRPU0FfVUludDggdWlDbGlwTnVtYmVyICkKLXsKLSAgICBNNE9TQV9VSW50OCB1aUNsaXBJbmRleDsKLSAgICBNNE9TQV9VSW50OCB1aUZ4SW5kZXg7Ci0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNE9TQV9JbnQzMiBCQywgRUM7Ci0gICAgTTRPU0FfSW50OCAqcGlDbGlwQWN0aXZlRWZmZWN0OwotICAgIE00T1NBX0ludDMyIHQ7Ci0KLSAgICBpZiggMSA9PSB1aUNsaXBOdW1iZXIgKQotICAgIHsKLSAgICAgICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcDsKLSAgICAgICAgcENsaXAgPSBwQy0+cEMxOwotICAgICAgICBwaUNsaXBBY3RpdmVFZmZlY3QgPSAmKHBDLT5pQ2xpcDFBY3RpdmVFZmZlY3QpOwotICAgIH0KLSAgICBlbHNlIC8qKjwgKDIgPT0gdWlDbGlwTnVtYmVyKSAqLwotICAgIHsKLSAgICAgICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcCArIDE7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcGlDbGlwQWN0aXZlRWZmZWN0ID0gJihwQy0+aUNsaXAyQWN0aXZlRWZmZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIFNob3J0Y3V0cyBmb3IgY29kZSByZWFkYWJpbGl0eSAqLwotICAgIEJDID0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0OwotICAgIEVDID0gcENsaXAtPmlFbmRUaW1lOwotCi0gICAgLyoqCi0gICAgQ2hhbmdlIHRoZSBhYnNvbHV0IHRpbWUgdG8gY2xpcCByZWxhdGVkIHRpbWUKLSAgICAgUkMgdCA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kQVRvIC0gcENsaXAtPmlBb2Zmc2V0L3BDbGlwLT5zY2FsZV9hdWRpbyArIDAuNSk7Ci0gICAgPCByb3VuZGluZyAqLzsKLSAgICB0ID0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8vKi0gcENsaXAtPmlBb2Zmc2V0L3BDbGlwLT5zY2FsZV9hdWRpbyovCi0gICAgICAgICsgMC41KTsgLyoqPCByb3VuZGluZyAqLwotICAgIDsKLQotICAgIC8qKgotICAgICogRGVmYXVsdDogbm8gZWZmZWN0IGFjdGl2ZSAqLwotICAgICpwaUNsaXBBY3RpdmVFZmZlY3QgPSAtMTsKLQotICAgIC8qKgotICAgICogQ2hlY2sgdGhlIHRocmVlIGVmZmVjdHMgKi8KLSAgICAvLyBSQyAgICBmb3IgKHVpRnhJbmRleD0wOyB1aUZ4SW5kZXg8cEMtPnBDbGlwTGlzdFt1aUNsaXBJbmRleF0ubmJFZmZlY3RzOyB1aUZ4SW5kZXgrKykKLSAgICBmb3IgKCB1aUZ4SW5kZXggPSAwOyB1aUZ4SW5kZXggPCBwQy0+bmJFZmZlY3RzOyB1aUZ4SW5kZXgrKyApCi0gICAgewotICAgICAgICAvKiogU2hvcnRjdXQsIHJldmVyc2Ugb3JkZXIgYmVjYXVzZSBvZiBwcmlvcml0eSBiZXR3ZWVuIGVmZmVjdHMKLSAgICAgICAgKCBFbmRFZmZlY3QgYWx3YXlzIGNsZWFuICkgKi8KLSAgICAgICAgcEZ4ID0gJihwQy0+cEVmZmVjdHNMaXN0W3BDLT5uYkVmZmVjdHMgLSAxIC0gdWlGeEluZGV4XSk7Ci0KLSAgICAgICAgaWYoIE00VlNTM0dQUF9rQXVkaW9FZmZlY3RUeXBlX05vbmUgIT0gcEZ4LT5BdWRpb0VmZmVjdFR5cGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYWN0dWFsbHkgYSB2aWRlbyBlZmZlY3QgKi8KLSAgICAgICAgICAgIGlmKCAoIHQgPj0gKE00T1NBX0ludDMyKSgvKkJDICsqL3BGeC0+dWlTdGFydFRpbWUpKQotICAgICAgICAgICAgICAgICYmIC8qKjwgQXJlIHdlIGFmdGVyIHRoZSBzdGFydCB0aW1lIG9mIHRoZSBlZmZlY3Q/ICovCi0gICAgICAgICAgICAgICAgKHQgPCAoTTRPU0FfSW50MzIpKC8qQkMgKyovcEZ4LT51aVN0YXJ0VGltZSArIHBGeC0+Ci0gICAgICAgICAgICAgICAgdWlEdXJhdGlvbikpICkgLyoqPCBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBhY3RpdmUgZWZmZWN0ICovCi0gICAgICAgICAgICAgICAgKnBpQ2xpcEFjdGl2ZUVmZmVjdCA9IHBDLT5uYkVmZmVjdHMgLSAxIC0gdWlGeEluZGV4OwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBUaGUgZmlyc3QgZWZmZWN0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSwgdGhlbiB0aGUgc2Vjb25kIG9uZSwKLSAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHRoaXJzIG9uZS4KLSAgICAgICAgICAgICAgICAqIEhlbmNlLCBhcyBzb29uIGFzIHdlIGZvdW5kIGFuIGFjdGl2ZSBlZmZlY3QsIHdlIGNhbiBnZXQgb3V0IG9mIHRoaXMgbG9vcCAqLwotICAgICAgICAgICAgICAgIHVpRnhJbmRleCA9IHBDLT5uYkVmZmVjdHM7IC8qKiBnZXQgb3V0IG9mIHRoZSBmb3IgbG9vcCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEJ1Z2ZpeDogVGhlIGR1cmF0aW9uIG9mIHRoZSBlbmQgZWZmZWN0IGhhcyBiZWVuIHNldCBhY2NvcmRpbmcgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VkIGNsaXAgZHVyYXRpb24uCi0gICAgICAgICAgICAqIElmIHRoZSBhbm5vdW5jZWQgZHVyYXRpb24gaXMgc21hbGxlciB0aGFuIHRoZSByZWFsIG9uZSwgdGhlIGVuZCBlZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgICB3b24ndCBiZSBhcHBsaWVkIGF0Ci0gICAgICAgICAgICAqIHRoZSB2ZXJ5IGVuZCBvZiB0aGUgY2xpcC4gVG8gc29sdmUgdGhpcyBpc3N1ZSB3ZSBmb3JjZSB0aGUgZW5kIGVmZmVjdC4gKi8KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdCgpCi0gKiBAYnJpZWYgICAgQXBwbHkgYXVkaW8gZWZmZWN0IHRvIHBQQ01kYXRhCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgIChJTi9PVVQpIEludGVybmFsIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgdWlDbGlwMW9yQ2xpcDIgICAgKElOL09VVCkgMSBmb3IgZmlyc3QgY2xpcCwgMiBmb3Igc2Vjb25kIGNsaXAKLSAqIEBwYXJhbSAgICBwUENNZGF0YSAgICAoSU4vT1VUKSBJbnB1dCBhbmQgT3V0cHV0IFBDTSBhdWRpbyBkYXRhCi0gKiBAcGFyYW0gICAgdWlQQ01zaXplICAgIChJTikgICAgIFNpemUgb2YgcFBDTWRhdGEKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0KCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX1VJbnQ4IHVpQ2xpcDFvckNsaXAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQxNiAqcFBDTWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVBDTXNpemUgKQotewotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7Ci0gICAgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5nczsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNE9TQV9JbnQzMgotICAgICAgICBpMzJzYW1wbGU7IC8qKjwgd2Ugd2lsbCBjYXN0IGVhY2ggSW50MTYgc2FtcGxlIGludG8gdGhpcyBJbnQzMiB2YXJpYWJsZSAqLwotICAgIE00T1NBX0ludDMyIGlQb3M7Ci0gICAgTTRPU0FfSW50MzIgaUR1cjsKLQotICAgIE00T1NBX0RFQlVHX0lGMigoIDEgIT0gdWlDbGlwMW9yQ2xpcDIpICYmICgyICE9IHVpQ2xpcDFvckNsaXAyKSwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiTTRWU1MzR1BQX2ludEJlZ2luQXVkaW9FZmZlY3Q6IHVpQ2xpcDFvckNsaXAyIGludmFsaWQiKTsKLQotICAgIGlmKCAxID09IHVpQ2xpcDFvckNsaXAyICkKLSAgICB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMTsKLSAgICAgICAgcENsaXBTZXR0aW5ncyA9ICYocEMtPnBDbGlwTGlzdFtwQy0+Ci0gICAgICAgICAgICB1aUN1cnJlbnRDbGlwXSk7IC8qKjwgR2V0IGEgc2hvcnRjdXQgdG8gdGhlIGNsaXAgc2V0dGluZ3MgKi8KLSAgICAgICAgLy8gUkMgICAgICAgIHBGeCA9ICYocENsaXBTZXR0aW5ncy0+RWZmZWN0c1twQy0+aUNsaXAxQWN0aXZlRWZmZWN0XSk7LyoqPCBHZXQgYSBzaG9ydGN1dAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBwRnggPSAmKHBDLT4KLSAgICAgICAgICAgIHBFZmZlY3RzTGlzdFtwQy0+Ci0gICAgICAgICAgICBpQ2xpcDFBY3RpdmVFZmZlY3RdKTsgLyoqPCBHZXQgYSBzaG9ydGN1dCB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBNNE9TQV9ERUJVR19JRjIoKCBwQy0+aUNsaXAxQWN0aXZlRWZmZWN0IDwgMCkKLSAgICAgICAgICAgIHx8IChwQy0+aUNsaXAxQWN0aXZlRWZmZWN0ID4gMiksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogaUNsaXAxQWN0aXZlRWZmZWN0IGludmFsaWQiKTsKLSAgICB9Ci0gICAgZWxzZSAvKio8IGlmICgyPT11aUNsaXAxb3JDbGlwMikgKi8KLSAgICB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcENsaXBTZXR0aW5ncyA9ICYocEMtPnBDbGlwTGlzdFtwQy0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgKyAxXSk7IC8qKjwgR2V0IGEgc2hvcnRjdXQgdG8gdGhlIGNsaXAgc2V0dGluZ3MgKi8KLSAgICAgICAgLy8gUkMgICAgICAgIHBGeCA9ICYocENsaXBTZXR0aW5ncy0+RWZmZWN0c1twQy0+aUNsaXAyQWN0aXZlRWZmZWN0XSk7LyoqPCBHZXQgYSBzaG9ydGN1dAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBwRnggPSAmKHBDLT4KLSAgICAgICAgICAgIHBFZmZlY3RzTGlzdFtwQy0+Ci0gICAgICAgICAgICBpQ2xpcDJBY3RpdmVFZmZlY3RdKTsgLyoqPCBHZXQgYSBzaG9ydGN1dCB0byB0aGUgYWN0aXZlIGVmZmVjdCAqLwotICAgICAgICBNNE9TQV9ERUJVR19JRjIoKCBwQy0+aUNsaXAyQWN0aXZlRWZmZWN0IDwgMCkKLSAgICAgICAgICAgIHx8IChwQy0+aUNsaXAyQWN0aXZlRWZmZWN0ID4gMiksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogaUNsaXAyQWN0aXZlRWZmZWN0IGludmFsaWQiKTsKLSAgICB9Ci0KLSAgICBpRHVyID0gKE00T1NBX0ludDMyKXBGeC0+dWlEdXJhdGlvbjsKLQotICAgIC8qKgotICAgICogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICBpUG9zID0KLSAgICAgICAgKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8gKyAwLjUgLSBwQ2xpcC0+aUFvZmZzZXQgLyBwQ2xpcC0+c2NhbGVfYXVkaW8pCi0gICAgICAgIC0gcENsaXAtPmlBY3R1YWxBdWRpb0JlZ2luQ3V0IC0gcEZ4LT51aVN0YXJ0VGltZTsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrICovCi0gICAgaWYoIGlQb3MgPiBpRHVyICkKLSAgICB7Ci0gICAgICAgIGlQb3MgPSBpRHVyOwotICAgIH0KLSAgICBlbHNlIGlmKCBpUG9zIDwgMCApCi0gICAgewotICAgICAgICBpUG9zID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIEF0IHRoaXMgcG9pbnQsIGlQb3MgaXMgdGhlIGVmZmVjdCBwcm9ncmVzcywgaW4gYSAwIHRvIGlEdXIgYmFzZSAqLwotICAgIHN3aXRjaCggcEZ4LT5BdWRpb0VmZmVjdFR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvRWZmZWN0VHlwZV9GYWRlSW46Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcmlnaW5hbCBzYW1wbGVzIGFyZSBzaWduZWQgMTZiaXRzLgotICAgICAgICAgICAgKiBXZSBjb252ZXJ0IGl0IHRvIHNpZ25lZCAzMmJpdHMgYW5kIG11bHRpcGx5IGl0IGJ5IGlQb3MuCi0gICAgICAgICAgICAqIFNvIHdlIG11c3QgYXNzdXJlIHRoYXQgaVBvcyBpcyBub3QgaGlnaGVyIHRoYXQgMTZiaXRzIG1heC4KLSAgICAgICAgICAgICogaVBvcyBtYXggdmFsdWUgaXMgaUR1ciwgc28gd2UgdGVzdCBpRHVyLiAqLwotICAgICAgICAgICAgd2hpbGUoIGlEdXIgPiBQV1JfRlhQX0ZSQUNUX01BWCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaUR1ciA+Pj0KLSAgICAgICAgICAgICAgICAgICAgMjsgLyoqPCBkaXZpZGUgYnkgMiB3b3VsZCBiZSBtb3JlIGxvZ2ljYWwgKGluc3RlYWQgb2YgNCksCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3ZSBoYXZlIGVub3VnaCBkeW5hbWljLi4pICovCi0gICAgICAgICAgICAgICAgaVBvcyA+Pj0gMjsgLyoqPCBpZGVtICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBGcm9tIGJ1ZmZlciBzaXplIChieXRlcykgdG8gbnVtYmVyIG9mIHNhbXBsZSAoaW50MTYpOiBkaXZpZGUgYnkgdHdvICovCi0gICAgICAgICAgICB1aVBDTXNpemUgPj49IDE7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBMb29wIG9uIHNhbXBsZXMgKi8KLSAgICAgICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKSAvKio8IGRlY3JlbWVudGluZyB0byBvcHRpbWl6ZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMnNhbXBsZSA9ICpwUENNZGF0YTsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgKj0gaVBvczsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgLz0gaUR1cjsKLSAgICAgICAgICAgICAgICAqcFBDTWRhdGErKyA9IChNNE9TQV9JbnQxNilpMzJzYW1wbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tBdWRpb0VmZmVjdFR5cGVfRmFkZU91dDoKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIHN3aXRjaCBmcm9tIDAtPkR1ciB0byBEdXItPjAgaW4gb3JkZXIgdG8gZG8gZmFkZU9VVCBpbnN0ZWFkIG9mIGZhZGVJTiAqLwotICAgICAgICAgICAgaVBvcyA9IGlEdXIgLSBpUG9zOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogT3JpZ2luYWwgc2FtcGxlcyBhcmUgc2lnbmVkIDE2Yml0cy4KLSAgICAgICAgICAgICogV2UgY29udmVydCBpdCB0byBzaWduZWQgMzJiaXRzIGFuZCBtdWx0aXBseSBpdCBieSBpUG9zLgotICAgICAgICAgICAgKiBTbyB3ZSBtdXN0IGFzc3VyZSB0aGF0IGlQb3MgaXMgbm90IGhpZ2hlciB0aGF0IDE2Yml0cyBtYXguCi0gICAgICAgICAgICAqIGlQb3MgbWF4IHZhbHVlIGlzIGlEdXIsIHNvIHdlIHRlc3QgaUR1ci4gKi8KLSAgICAgICAgICAgIHdoaWxlKCBpRHVyID4gUFdSX0ZYUF9GUkFDVF9NQVggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlEdXIgPj49Ci0gICAgICAgICAgICAgICAgICAgIDI7IC8qKjwgZGl2aWRlIGJ5IDIgd291bGQgYmUgbW9yZSBsb2dpY2FsIChpbnN0ZWFkIG9mIDQpLAotICAgICAgICAgICAgICAgICAgICAgICBidXQgd2UgaGF2ZSBlbm91Z2ggZHluYW1pYy4uKSAqLwotICAgICAgICAgICAgICAgIGlQb3MgPj49IDI7IC8qKjwgaWRlbSAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRnJvbSBidWZmZXIgc2l6ZSAoYnl0ZXMpIHRvIG51bWJlciBvZiBzYW1wbGUgKGludDE2KTogZGl2aWRlIGJ5IHR3byAqLwotICAgICAgICAgICAgdWlQQ01zaXplID4+PSAxOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogTG9vcCBvbiBzYW1wbGVzLCBhcHBseSB0aGUgZmFkZSBmYWN0b3Igb24gZWFjaCAqLwotICAgICAgICAgICAgd2hpbGUoIHVpUENNc2l6ZS0tID4gMCApIC8qKjwgZGVjcmVtZW50aW5nIGNvdW50ZXIgdG8gb3B0aW1pemUgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUgPSAqcFBDTWRhdGE7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlICo9IGlQb3M7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlIC89IGlEdXI7Ci0gICAgICAgICAgICAgICAgKnBQQ01kYXRhKysgPSAoTTRPU0FfSW50MTYpaTMyc2FtcGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseUF1ZGlvRWZmZWN0OiB1bmtub3duIGF1ZGlvIGVmZmVjdCB0eXBlICgweCV4KSxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19FRkZFQ1RfVFlQRSIsCi0gICAgICAgICAgICAgICAgcEZ4LT5BdWRpb0VmZmVjdFR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19FRkZFQ1RfVFlQRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXBwbHlBdWRpb0VmZmVjdDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgdHJhbnNpdGlvbiBlZmZlY3QgdG8gdHdvIFBDTSBidWZmZXIKLSAqIEBub3RlICAgIFRoZSByZXN1bHQgb2YgdGhlIHRyYW5zaXRpb24gaXMgcHV0IGluIHRoZSBmaXJzdCBidWZmZXIuCi0gKiAgICAgICAgICBJIGtub3cgaXQncyBub3QgYmVhdXRpZnVsLCBidXQgaXQgZml0cyBteSBjdXJyZW50IG5lZWRzLCBhbmQgaXQncyBlZmZpY2llbnQhCi0gKiAgICAgICAgICBTbyB3aHkgYm90aGVyIHdpdGggYSB0aGlyZCBvdXRwdXQgYnVmZmVyPwotICogQHBhcmFtICAgcEMgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwUENNZGF0YTEgICAgKElOL09VVCkgRmlyc3QgaW5wdXQgYW5kIE91dHB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHBQQ01kYXRhMiAgICAoSU4pIFNlY29uZCBpbnB1dCBQQ00gYXVkaW8gZGF0YQotICogQHBhcmFtICAgIHVpUENNc2l6ZSAgICAoSU4pIFNpemUgb2YgYm90aCBQQ00gYnVmZmVycwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgICAgICAgICAgICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbiggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEMsIE00T1NBX0ludDE2ICpwUENNZGF0YTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfSW50MTYgKnBQQ01kYXRhMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlQQ01zaXplICkKLXsKLSAgICBNNE9TQV9JbnQzMiBpMzJzYW1wbGUxLAotICAgICAgICBpMzJzYW1wbGUyOyAvKio8IHdlIHdpbGwgY2FzdCBlYWNoIEludDE2IHNhbXBsZSBpbnRvIHRoaXMgSW50MzIgdmFyaWFibGUgKi8KLSAgICBNNE9TQV9JbnQzMiBpUG9zMSwgaVBvczI7Ci0gICAgTTRPU0FfSW50MzIgaUR1ciA9IChNNE9TQV9JbnQzMilwQy0+Ci0gICAgICAgIHBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBlbmQgY3V0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICBpUG9zMSA9IHBDLT5wQzEtPmlFbmRUaW1lIC0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRBVG8KLSAgICAgICAgKyAwLjUgLSBwQy0+cEMxLT5pQW9mZnNldCAvIHBDLT5wQzEtPnNjYWxlX2F1ZGlvKTsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrICovCi0gICAgaWYoIGlQb3MxID4gaUR1ciApCi0gICAgewotICAgICAgICBpUG9zMSA9IGlEdXI7Ci0gICAgfQotICAgIGVsc2UgaWYoIGlQb3MxIDwgMCApCi0gICAgewotICAgICAgICBpUG9zMSA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQb3NpdGlvbiBvZiBzZWNvbmQgY2xpcCBpbiB0aGUgdHJhbnNpdGlvbiAqLwotICAgIGlQb3MyID0gaUR1ciAtIGlQb3MxOwotCi0gICAgLyoqCi0gICAgKiBBdCB0aGlzIHBvaW50LCBpUG9zMiBpcyB0aGUgdHJhbnNpdGlvbiBwcm9ncmVzcywgaW4gYSAwIHRvIGlEdXIgYmFzZS4KLSAgICAqIGlQb3MxIGlzIHRoZSB0cmFuc2l0aW9uIHByb2dyZXNzLCBpbiBhIGlEVXIgdG8gMCBiYXNlLiAqLwotICAgIHN3aXRjaCggcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uQXVkaW9UcmFuc2l0aW9uVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rQXVkaW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGU6Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBPcmlnaW5hbCBzYW1wbGVzIGFyZSBzaWduZWQgMTZiaXRzLgotICAgICAgICAgICAgKiBXZSBjb252ZXJ0IGl0IHRvIHNpZ25lZCAzMmJpdHMgYW5kIG11bHRpcGx5IGl0IGJ5IGlQb3MuCi0gICAgICAgICAgICAqIFNvIHdlIG11c3QgYXNzdXJlIHRoYXQgaVBvcyBpcyBub3QgaGlnaGVyIHRoYXQgMTZiaXRzIG1heC4KLSAgICAgICAgICAgICogaVBvcyBtYXggdmFsdWUgaXMgaUR1ciwgc28gd2UgdGVzdCBpRHVyLiAqLwotICAgICAgICAgICAgd2hpbGUoIGlEdXIgPiBQV1JfRlhQX0ZSQUNUX01BWCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaUR1ciA+Pj0KLSAgICAgICAgICAgICAgICAgICAgMjsgLyoqPCBkaXZpZGUgYnkgMiB3b3VsZCBiZSBtb3JlIGxvZ2ljYWwgKGluc3RlYWQgb2YgNCksCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3ZSBoYXZlIGVub3VnaCBkeW5hbWljLi4pICovCi0gICAgICAgICAgICAgICAgaVBvczEgPj49IDI7IC8qKjwgaWRlbSAqLwotICAgICAgICAgICAgICAgIGlQb3MyID4+PSAyOyAvKio8IGlkZW0gKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEZyb20gYnVmZmVyIHNpemUgKGJ5dGVzKSB0byBudW1iZXIgb2Ygc2FtcGxlIChpbnQxNik6IGRpdmlkZSBieSB0d28gKi8KLSAgICAgICAgICAgIHVpUENNc2l6ZSA+Pj0gMTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIExvb3Agb24gc2FtcGxlcywgYXBwbHkgdGhlIGZhZGUgZmFjdG9yIG9uIGVhY2ggKi8KLSAgICAgICAgICAgIHdoaWxlKCB1aVBDTXNpemUtLSA+IDAgKSAvKio8IGRlY3JlbWVudGluZyBjb3VudGVyIHRvIG9wdGltaXplICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyc2FtcGxlMSA9ICpwUENNZGF0YTE7IC8qKjwgR2V0IGNsaXAxIHNhbXBsZSAqLwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTEgKj0gaVBvczE7ICAgICAvKio8IG11bHRpcGx5IGJ5IGZhZGUgbnVtZXJhdG9yICovCi0gICAgICAgICAgICAgICAgaTMyc2FtcGxlMSAvPSBpRHVyOyAgICAgIC8qKjwgZGl2aWRlIGJ5IGZhZGUgZGVub21pbmF0b3IgKi8KLQotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTIgPSAqcFBDTWRhdGEyOyAvKio8IEdldCBjbGlwMiBzYW1wbGUgKi8KLSAgICAgICAgICAgICAgICBpMzJzYW1wbGUyICo9IGlQb3MyOyAgICAgLyoqPCBtdWx0aXBseSBieSBmYWRlIG51bWVyYXRvciAqLwotICAgICAgICAgICAgICAgIGkzMnNhbXBsZTIgLz0gaUR1cjsgICAgICAvKio8IGRpdmlkZSBieSBmYWRlIGRlbm9taW5hdG9yICovCi0KLSAgICAgICAgICAgICAgICAqcFBDTWRhdGExKysgPSAoTTRPU0FfSW50MTYpKGkzMnNhbXBsZTEKLSAgICAgICAgICAgICAgICAgICAgKyBpMzJzYW1wbGUyKTsgLyoqPCBtaXggdGhlIHR3byBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgcFBDTWRhdGEyKys7IC8qKjwgZG9uJ3QgZm9yZ2V0IHRvIGluY3JlbWVudCB0aGUgc2Vjb25kIGJ1ZmZlciAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0F1ZGlvVHJhbnNpdGlvblR5cGVfTm9uZToKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBUaGlzIGlzIGEgc3R1cGlkLW5vbiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgTm9uZSB0cmFuc2l0aW9uLi4uCi0gICAgICAgICAgICAqIFdlIGNvcHkgdGhlIFBDTSBmcmFtZXMgKi8KLSAgICAgICAgICAgIGlmKCBpUG9zMSA8IChpRHVyID4+IDEpICkgLyoqPCBzZWNvbmQgaGFsZiBvZiB0cmFuc2l0aW9uICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBQQ00gdG8gdGhlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUENNZGF0YTEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcFBDTWRhdGEyLCB1aVBDTXNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIHRoZSBvdXRwdXQgbXVzdCBiZSBwdXQgaW4gdGhlIGZpcnN0IGJ1ZmZlci4KLSAgICAgICAgICAgICogRm9yIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSBub24tdHJhbnNpdGlvbiBpdCdzIGFscmVhZHkgdGhlIGNhc2UhCi0gICAgICAgICAgICAqIFNvIHdlIGhhdmUgbm90aGluZyB0byBkbyBoZXJlLi4uCi0gICAgICAgICAgICAqLwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBdWRpb1RyYW5zaXRpb246IHVua25vd24gdHJhbnNpdGlvbiB0eXBlICgweCV4KSxcCi0gICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEUiLAotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLkF1ZGlvVHJhbnNpdGlvblR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9BVURJT19UUkFOU0lUSU9OX1RZUEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEF1ZGlvVHJhbnNpdGlvbjogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgUmVzZXQgdGhlIGF1ZGlvIGVuY29kZXIgKENyZWF0ZSBpdCBpZiBuZWVkZWQpCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZUF1ZGlvRW5jb2RlciggTTRWU1MzR1BQX0VuY29kZVdyaXRlQ29udGV4dCAqcENfZXdjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNDdHh0ICpwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aUF1ZGlvQml0cmF0ZSApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICogSWYgYW4gZW5jb2RlciBhbHJlYWR5IGV4aXN0LCB3ZSBkZXN0cm95IGl0ICovCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcENfZXdjLT5wQXVkaW9FbmNDdHh0ICkKLSAgICB7Ci0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKAotICAgICAgICAgICAgcENfZXdjLT5wQXVkaW9FbmNDdHh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOiBwQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qKjwgZG9uJ3QgcmV0dXJuLCB3ZSBzdGlsbCBoYXZlIHN0dWZmIHRvIGZyZWUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFuVXAoCi0gICAgICAgICAgICBwQ19ld2MtPnBBdWRpb0VuY0N0eHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW5VcCByZXR1cm5zIDB4JXgiLCAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBkb24ndCByZXR1cm4sIHdlIHN0aWxsIGhhdmUgc3R1ZmYgdG8gZnJlZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcENfZXdjLT5wQXVkaW9FbmNDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENyZWF0ZXMgYSBuZXcgZW5jb2RlciAgKi8KLSAgICBzd2l0Y2goIHBDX2V3Yy0+QXVkaW9TdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgICAgICAvL0VWUkMKLSAgICAgICAgICAgIC8vICAgICAgICBjYXNlIE00U1lTX2tFVlJDOgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX3NldEN1cnJlbnRBdWRpb0VuY29kZXIoJnBDLT5TaGVsbEFQSSwKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb1N0cmVhbVR5cGUpOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tFVlJDOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rODAwMEh6OwotICAgICAgICAgICAgLy8gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSBNNEVOQ09ERVJfa01vbm87Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IE00VlNTM0dQUF9FVlJDX0RFRkFVTFRfQklUUkFURTsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQU1SOgotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FNUk5COwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQ2hhbm5lbE51bSA9IE00RU5DT0RFUl9rTW9ubzsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IE00VlNTM0dQUF9BTVJfREVGQVVMVF9CSVRSQVRFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BbXJTSUQgPSBNNEVOQ09ERVJfa0Ftck5vU0lEOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rQUFDOgotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudEF1ZGlvRW5jb2RlcihwQ19TaGVsbEFQSSwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICBNNEVSUl9DSEVDS19SRVRVUk4oZXJyKTsKLQotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5Gb3JtYXQgPSBNNEVOQ09ERVJfa0FBQzsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQ19ld2MtPnVpU2FtcGxpbmdGcmVxdWVuY3kgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgODAwMDoKLSAgICAgICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5GcmVxdWVuY3kgPSBNNEVOQ09ERVJfazgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDE2MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMTYwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDIyMDUwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjIwNTBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDI0MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMjQwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDMyMDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rMzIwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDQ0MTAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDQxMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDQ4MDAwOgotICAgICAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkZyZXF1ZW5jeSA9IE00RU5DT0RFUl9rNDgwMDBIejsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlQXVkaW9FbmNvZGVyOiBpbnZhbGlkIGlucHV0IEFBQyBzYW1wbGluZyBmcmVxdWVuY3lcCi0gICAgICAgICAgICAgICAgICAgICAgICAoJWQgSHopLCByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9BVURJT19ERUNPREVSX0lOSVRfRkFJTEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDX2V3Yy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0FVRElPX0RFQ09ERVJfSU5JVF9GQUlMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkNoYW5uZWxOdW0gPSAocENfZXdjLT51aU5iQ2hhbm5lbHMgPT0gMSkKLSAgICAgICAgICAgICAgICA/IE00RU5DT0RFUl9rTW9ubyA6IE00RU5DT0RFUl9rU3RlcmVvOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5SZWd1bGF0aW9uID0KLSAgICAgICAgICAgICAgICBNNEVOQ09ERVJfa0FhY1JlZ3VsTm9uZTsgLy9NNEVOQ09ERVJfa0FhY0JpdFJlc2Vydm9pcgotICAgICAgICAgICAgLyogdW51c2VkICovCi0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJJUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iTVMgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuU3BlY2lmUGFyYW0uQWFjUGFyYW0uYlBOUyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5TcGVjaWZQYXJhbS5BYWNQYXJhbS5iVE5TID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAvKiBUT0RPIGNoYW5nZSBpbnRvIGhpZ2hzcGVlZCBhc2FwICovCi0gICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLlNwZWNpZlBhcmFtLkFhY1BhcmFtLmJIaWdoU3BlZWQgPQotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFOwotCi0gICAgICAgICAgICAvKiBRdWFudGlmeSB2YWx1ZSAoY2VpbCBvbmUpICovCi0gICAgICAgICAgICBpZiggdWlBdWRpb0JpdHJhdGUgPD0gMTYwMDAgKQotICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IDE2MDAwOwotCi0gICAgICAgICAgICBlbHNlIGlmKCB1aUF1ZGlvQml0cmF0ZSA8PSAyNDAwMCApCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gMjQwMDA7Ci0KLSAgICAgICAgICAgIGVsc2UgaWYoIHVpQXVkaW9CaXRyYXRlIDw9IDMyMDAwICkKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSAzMjAwMDsKLQotICAgICAgICAgICAgZWxzZSBpZiggdWlBdWRpb0JpdHJhdGUgPD0gNDgwMDAgKQotICAgICAgICAgICAgICAgIHBDX2V3Yy0+QXVkaW9FbmNQYXJhbXMuQml0cmF0ZSA9IDQ4MDAwOwotCi0gICAgICAgICAgICBlbHNlIGlmKCB1aUF1ZGlvQml0cmF0ZSA8PSA2NDAwMCApCi0gICAgICAgICAgICAgICAgcENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlID0gNjQwMDA7Ci0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSA5NjAwMDsKLQotICAgICAgICAgICAgLyogU3BlY2lhbCByZXF1aXJlbWVudCBvZiBvdXIgZW5jb2RlciAqLwotICAgICAgICAgICAgaWYoICggcENfZXdjLT51aU5iQ2hhbm5lbHMgPT0gMikKLSAgICAgICAgICAgICAgICAmJiAocENfZXdjLT5BdWRpb0VuY1BhcmFtcy5CaXRyYXRlIDwgMzIwMDApICkKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLkJpdHJhdGUgPSAzMjAwMDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6IFVuZGVmaW5lZCBvdXRwdXQgYXVkaW8gZm9ybWF0ICglZCksXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0VESVRJTkdfVU5TVVBQT1JURURfQVVESU9fRk9STUFUIiwKLSAgICAgICAgICAgICAgICBwQ19ld2MtPkF1ZGlvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX0FVRElPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXNlIHRoZSBhdWRpbyBlbmNvZGVyICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICBNNE9TQV9UUkFDRTNfMSgKLSAgICAgICAgIk00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcjpcCi0gICAgICAgIHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCBjYWxsZWQgd2l0aCB1c2VyZGF0YSAweCV4IiwKLSAgICAgICAgcENfU2hlbGxBUEktPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEpOwotICAgIGVyciA9IHBDX1NoZWxsQVBJLT5wQXVkaW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDX2V3Yy0+cEF1ZGlvRW5jQ3R4dCwKLSAgICAgICAgcENfU2hlbGxBUEktPnBDdXJyZW50QXVkaW9FbmNvZGVyVXNlckRhdGEpOwotCi0jZWxzZQotCi0gICAgZXJyID0gcENfU2hlbGxBUEktPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCgmcENfZXdjLT5wQXVkaW9FbmNDdHh0LAotICAgICAgICBNNE9TQV9OVUxMIC8qIG5vIEhXIGVuY29kZXIgKi8pOwotCi0jZW5kaWYKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50UmVzZXRBdWRpb0VuY29kZXI6IHBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBPcGVuIHRoZSBhdWRpbyBlbmNvZGVyICovCi0gICAgZXJyID0gcENfU2hlbGxBUEktPnBBdWRpb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbihwQ19ld2MtPnBBdWRpb0VuY0N0eHQsCi0gICAgICAgICZwQ19ld2MtPkF1ZGlvRW5jUGFyYW1zLCAmcENfZXdjLT5wQXVkaW9FbmNEU0ksCi0gICAgICAgIE00T1NBX05VTEwgLyogbm8gZ3JhYmJpbmcgKi8pOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRSZXNldEF1ZGlvRW5jb2RlcjogcEF1ZGlvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFJlc2V0QXVkaW9FbmNvZGVyOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfRWRpdFZpZGVvLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0VmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjE5ZjQxMi4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000VlNTM0dQUF9FZGl0VmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM5NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgIE00VlNTM0dQUF9FZGl0VmlkZW8uYwotICogQGJyaWVmICAgIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIDNHUFAgZWRpdCBBUEkgaW1wbGVtZW50YXRpb24uCi0gKiBAbm90ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jdW5kZWYgTTRPU0FfVFJBQ0VfTEVWRUwKLSNkZWZpbmUgTTRPU0FfVFJBQ0VfTEVWRUwgMQotCi0vKioqKioqKioqKioqKioqKi8KLS8qKiogSW5jbHVkZXMgKioqLwotLyoqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0vKioKLSAqIE91ciBoZWFkZXIgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsVHlwZXMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxGdW5jdGlvbnMuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxDb25maWcuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXJyb3JDb2Rlcy5oIgotCi0vLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotLyoqCi0gKiBPU0FMIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIgLyoqPCBPU0FMIG1lbW9yeSBtYW5hZ2VtZW50ICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIgIC8qKjwgT1NBTCBkZWJ1ZyBtYW5hZ2VtZW50ICovCi0KLS8qKgotICogY29tcG9uZW50IGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRWRkxfdHJhbnNpdGlvbi5oIiAvKio8IHZpZGVvIGVmZmVjdHMgKi8KLQotLypmb3IgdHJhbnNpdGlvbiBiZWhhdmlvdXIqLwotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJNNEFJUl9BUEkuaCIKLSNpbmNsdWRlICJNNFZTUzNHUFBfRXh0ZW5kZWRfQVBJLmgiCi0vKiogRGV0ZXJtaW5lIGFic29sdXRlIHZhbHVlIG9mIGEuICovCi0jZGVmaW5lIE00eFZTU19BQlMoYSkgKCAoIChhKSA8ICgwKSApID8gKC0oYSkpIDogKGEpICkKLSNkZWZpbmUgWV9QTEFORV9CT1JERVJfVkFMVUUgICAgMHgwMAotI2RlZmluZSBVX1BMQU5FX0JPUkRFUl9WQUxVRSAgICAweDgwCi0jZGVmaW5lIFZfUExBTkVfQk9SREVSX1ZBTFVFICAgIDB4ODAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFN0YXRpYyBsb2NhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSgKLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkCi1NNFZTUzNHUFBfaW50Q2hlY2tWaWRlb0VmZmVjdHMoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50OCB1aUNsaXBOdW1iZXIgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoCi0gICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwgTTRPU0FfQm9vbCBiU2tpcEZyYW1pbmdFZmZlY3QpOwotCi1zdGF0aWMgTTRPU0FfRVJSCi1NNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQgKTsKLQotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRVcGRhdGVUaW1lSW5mbyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQgKnBBVSApOwotc3RhdGljIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludFNldEgyNjNUaW1lQ291bnRlciggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggdWlDdHMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlDdHNTZWMgKTsKLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnBDdHNTZWMgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVdpZHRoLCBNNE9TQV9VSW50MzIgdWlIZWlnaHQgKTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoCi0gICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVJbiwgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCk7Ci1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUoCi0gICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLAotICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW5wbGFuZSwKLSAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcE91dHBsYW5lKTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OCAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0KTsKLXN0YXRpYyBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfTWVkaWFUaW1lIHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiSXNDbGlwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Um90YXRlVmlkZW8oTTRWSUZJX0ltYWdlUGxhbmUqIHBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcm90YXRpb25EZWdyZWUpOwotCi1zdGF0aWMgTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLQotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvKCkKLSAqIEBicmllZiAgICBPbmUgc3RlcCBvZiB2aWRlbyBwcm9jZXNzaW5nCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfSW50MzIgaUN0cywgaU5leHRDdHM7Ci0gICAgTTRFTkNPREVSX0ZyYW1lTW9kZSBGcmFtZU1vZGU7Ci0gICAgTTRPU0FfQm9vbCBiU2tpcEZyYW1lOwotICAgIE00T1NBX1VJbnQxNiBvZmZzZXQ7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB3ZSByZWFjaGVkIGVuZCBjdXQuIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcKLSAgICAgKiB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgKi8KLSAgICBpZiAoICgoTTRPU0FfSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBDLT5wQzEtPmlWb2Zmc2V0Ci0gICAgICAgICsgcEMtPmlJbk91dFRpbWVPZmZzZXQpID49IHBDLT5wQzEtPmlFbmRUaW1lICkKLSAgICB7Ci0gICAgICAgIC8qIFJlLWFkanVzdCB2aWRlbyB0byBwcmVjaXNlIGN1dCB0aW1lICovCi0gICAgICAgIHBDLT5pSW5PdXRUaW1lT2Zmc2V0ID0gKChNNE9TQV9JbnQzMikocEMtPmV3Yy5kSW5wdXRWaWRDdHMpKQotICAgICAgICAgICAgLSBwQy0+cEMxLT5pVm9mZnNldCArIHBDLT5pSW5PdXRUaW1lT2Zmc2V0IC0gcEMtPnBDMS0+aUVuZFRpbWU7Ci0gICAgICAgIGlmICggcEMtPmlJbk91dFRpbWVPZmZzZXQgPCAwICkgewotICAgICAgICAgICAgcEMtPmlJbk91dFRpbWVPZmZzZXQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVmlkZW8gaXMgZG9uZSBmb3IgdGhpcyBjbGlwICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZWFjaGVkRW5kT2ZWaWRlbyhwQyk7Ci0KLSAgICAgICAgLyogUkM6IHRvIGtub3cgd2hlbiBhIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkICovCi0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVyciAmJiBlcnIgIT0gTTRWU1MzR1BQX1dBUl9TV0lUQ0hfQ0xJUCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBNNFZTUzNHUFBfaW50UmVhY2hlZEVuZE9mVmlkZW8gcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBEb24ndCBjaGFuZ2UgdGhlIHN0YXRlcyBpZiB3ZSBhcmUgaW4gZGVjb2RlVXBUbygpICovCi0gICAgaWYgKCAoTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAhPSBwQy0+cEMxLT5Wc3RhdHVzKQotICAgICAgICAmJiAoKCBwQy0+cEMyID09IE00T1NBX05VTEwpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPICE9IHBDLT5wQzItPlZzdGF0dXMpKSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBDaGVjayBWaWRlbyBNb2RlLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgb3V0cHV0IENUUyAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUoCi0gICAgICAgICAgICBwQyk7IC8qKjwgVGhpcyBmdW5jdGlvbiBjaGFuZ2UgdGhlIHBDLT5Wc3RhdGUgdmFyaWFibGUhICovCi0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgc3dpdGNoKCBwQy0+VnN0YXRlICkKLSAgICB7Ci0gICAgICAgIC8qIF9fX19fX19fX19fX19fX19fICovCi0gICAgICAgIC8qfCAgICAgICAgICAgICAgICAgfCovCi0gICAgICAgIC8qfCBSRUFEX1dSSVRFIE1PREUgfCovCi0gICAgICAgIC8qfF9fX19fX19fX19fX19fX19ffCovCi0KLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU6Ci0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvIFJFQURfV1JJVEUiKTsKLQotICAgICAgICAgICAgICAgIGJTa2lwRnJhbWUgPSBNNE9TQV9GQUxTRTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSWYgd2Ugd2VyZSBkZWNvZGluZyB0aGUgY2xpcCwgd2UgbXVzdCBqdW1wIHRvIGJlIHN1cmUKLSAgICAgICAgICAgICAgICAqIHRvIGdldCB0byB0aGUgZ29vZCBwb3NpdGlvbi4gKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX1JFQUQgIT0gcEMtPnBDMS0+VnN0YXR1cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBKdW1wIHRvIHRhcmdldCB2aWRlbyB0aW1lICh0YyA9IHRvLVQpICovCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBpQ3RzID0gKE00T1NBX0ludDMyKShwQy0+ZXdjLmRJbnB1dFZpZEN0cykgLSBwQy0+cEMxLT5pVm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wUmVhZGVyLT5tX3BGY3RKdW1wKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQzEtPnBWaWRlb1N0cmVhbSwgJmlDdHMpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRF9XUklURTogbV9wUmVhZGVyLT5tX3BGY3RKdW1wKFYxKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciAqKXBDLT5wQzEtPnBWaWRlb1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+cEMxLT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggKCBNNE5PX0VSUk9SICE9IGVycikgJiYgKE00V0FSX05PX01PUkVfQVUgIT0gZXJyKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRF9XUklURTogbV9wUmVhZGVyLT5tX3BGY3RHZXROZXh0QXUgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiQSAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+VmlkZW9BVS5tX0NUUywgcEMtPnBDMS0+aVZvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBmcmFtZSBoYXMgYmVlbiBhbHJlYWR5IHdyaXR0ZW4gaW4gQkVHSU4gQ1VUIHN0ZXAgLT4gc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcEMtPnBDMS0+VmlkZW9BVS5tX0NUUyA9PSBpQ3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwQy0+cEMxLT5pVmlkZW9SZW5kZXJDdHMgPj0gaUN0cyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWUgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogVGhpcyBmcmFtZSBoYXMgYmVlbiBhbHJlYWR5IHdyaXR0ZW4gaW4gQkVHSU4gQ1VUIHN0ZXAgLT4gc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIHBDLT5Wc3RhdGUgPT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQpCi0gICAgICAgICAgICAgICAgICAgICYmIChwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTCi0gICAgICAgICAgICAgICAgICAgICsgcEMtPnBDMS0+aVZvZmZzZXQgPD0gcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUykgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZSA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBSZW1lbWJlciB0aGUgY2xpcCByZWFkaW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgcEMtPnBDMS0+VnN0YXR1cyA9IE00VlNTM0dQUF9rQ2xpcFN0YXR1c19SRUFEOwotICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgLy8gUm91bmRpbmcgaXMgdG8gY29tcGVuc2F0ZSByZWFkZXIgaW1wcmVjaXNpb24gKG1fQ1RTIGlzIGFjdHVhbGx5IGFuIGludGVnZXIpCi0gICAgICAgICAgICAgICAgaUN0cyA9ICgoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpIC0gcEMtPnBDMS0+aVZvZmZzZXQgLSAxOwotICAgICAgICAgICAgICAgIGlOZXh0Q3RzID0gaUN0cyArICgoTTRPU0FfSW50MzIpcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uKSArIDE7Ci0gICAgICAgICAgICAgICAgLyogQXZvaWQgdG8gd3JpdGUgYSBsYXN0IGZyYW1lIG9mIGR1cmF0aW9uIDAgKi8KLSAgICAgICAgICAgICAgICBpZiggaU5leHRDdHMgPiBwQy0+cEMxLT5pRW5kVGltZSApCi0gICAgICAgICAgICAgICAgICAgIGlOZXh0Q3RzID0gcEMtPnBDMS0+aUVuZFRpbWU7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIHRoZSBBVSBpcyBnb29kIHRvIGJlIHdyaXR0ZW4sIHdyaXRlIGl0LCBlbHNlIGp1c3Qgc2tpcCBpdCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIE00T1NBX0ZBTFNFID09IGJTa2lwRnJhbWUpCi0gICAgICAgICAgICAgICAgICAgICYmICgoIHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPj0gaUN0cykKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPCBpTmV4dEN0cykKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDLT5wQzEtPlZpZGVvQVUubV9zaXplID4gMCkpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgb3V0cHV0IEFVIHRvIHdyaXRlIGludG8gKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPlNoZWxsQVBJLnBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnAzZ3BXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dSSVRFUl9WSURFT19TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFJFQURfV1JJVEU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXcml0ZXJEYXRhRmN0cy0+cFN0YXJ0QVUoVmlkZW8pIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogQ29weSB0aGUgaW5wdXQgQVUgdG8gdGhlIG91dHB1dCBBVSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLldyaXRlclZpZGVvQVUuYXR0cmlidXRlID0gcEMtPnBDMS0+VmlkZW9BVS5tX2F0dHJpYnV0ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUyA9IChNNE9TQV9UaW1lKXBDLT5wQzEtPlZpZGVvQVUubV9DVFMgKwotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1RpbWUpcEMtPnBDMS0+aVZvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICs9IHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgLyogZm9yIGguMjY0IHN0cmVhbSBkbyBub3QgcmVhZCB0aGUgMXN0IDQgYnl0ZXMgYXMgdGhleSBhcmUgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3JzICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+cEMxLT5wVmlkZW9TdHJlYW0tPm1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YyApCi0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSA0OwotCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5zaXplID0gcEMtPnBDMS0+VmlkZW9BVS5tX3NpemUgLSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSA+IHBDLT5ld2MudWlWaWRlb01heEF1U2l6ZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogUkVBRF9XUklURTogQVUgc2l6ZSBncmVhdGVyIHRoYW5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEF1U2l6ZSAoJWQ+JWQpISByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlBVVF9WSURFT19BVV9UT09fTEFSR0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuV3JpdGVyVmlkZW9BVS5zaXplLCBwQy0+ZXdjLnVpVmlkZW9NYXhBdVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfSU5QVVRfVklERU9fQVVfVE9PX0xBUkdFOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikocEMtPnBDMS0+VmlkZW9BVS5tX2RhdGFBZGRyZXNzICsgb2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+ZXdjLldyaXRlclZpZGVvQVUuc2l6ZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSB0aW1lIGluZm8gZm9yIHRoZSBDb3VudGVyIFRpbWUgU3lzdGVtIHRvIGJlIGVxdWFsIHRvIHRoZSBiaXQKLSAgICAgICAgICAgICAgICAgICAgLXN0cmVhbSB0aW1lKi8KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFVwZGF0ZVRpbWVJbmZvKHBDLCAmcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVKTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzIoIkIgLS0tLSB3cml0ZSA6IGN0cyAgPSAlbHUgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLkNUUywgcEMtPmV3Yy5Xcml0ZXJWaWRlb0FVLnNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIFdyaXRlIHRoZSBBVSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKAotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5wM2dwV3JpdGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5ld2MuV3JpdGVyVmlkZW9BVSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHdhcm5pbmcgTTRXQVJfV1JJVEVSX1NUT1BfUkVRIGlzIHJldHVybmVkIHdoZW4gdGhlIHRhcmdldGVkIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgc2l6ZSBpcyByZWFjaGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgZWRpdGluZyBpcyB0aGVuIGZpbmlzaGVkLCB0aGUgd2FybmluZyBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORQotICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogUmVhZCBuZXh0IEFVIGZvciBuZXh0IHN0ZXAgKi8KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wUmVhZGVyRGF0YUl0LT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wUmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBDMS0+cFZpZGVvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBDLT5wQzEtPlZpZGVvQVUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIE00Tk9fRVJST1IgIT0gZXJyKSAmJiAoTTRXQVJfTk9fTU9SRV9BVSAhPSBlcnIpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBSRUFEX1dSSVRFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8zKCJDIC4uLi4gcmVhZCAgOiBjdHMgID0gJS4wZiArICVsZCBbIDB4JXggXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5WaWRlb0FVLm1fQ1RTLCBwQy0+cEMxLT5pVm9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRGVjaWRlIHdldGhlciB0byByZWFkIG9yIHRvIGluY3JlbWVudCB0aW1lIGluY3JlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggKCBwQy0+cEMxLT5WaWRlb0FVLm1fc2l6ZSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBDLT5wQzEtPlZpZGVvQVUubV9DVFMgPj0gaU5leHRDdHMpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypJbmNyZW1lbnQgdGltZSBieSB0aGUgZW5jb2RpbmcgcGVyaW9kIChOT19NT1JFX0FVIG9yIHJlYWRlciBpbiBhZHZhbmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzICs9IHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU3dpdGNoIChmcm9tIEFGVEVSX0NVVCkgdG8gbm9ybWFsIG1vZGUgYmVjYXVzZSB0aW1lIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBubyBtb3JlIGZyb3plbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIG90aGVyIGNhc2VzIChyZWFkZXIgbGF0ZSksIGp1c3QgbGV0IHRoZSByZWFkZXIgY2F0Y2ggdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRWVG8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFJlYWRlckRhdGFJdC0+bV9wRmN0R2V0TmV4dEF1KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBSZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyICopcEMtPnBDMS0+cFZpZGVvU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQy0+cEMxLT5WaWRlb0FVKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggTTROT19FUlJPUiAhPSBlcnIpICYmIChNNFdBUl9OT19NT1JFX0FVICE9IGVycikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFJFQURfV1JJVEU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZWFkZXJEYXRhSXQtPm1fcEZjdEdldE5leHRBdSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMygiRCAuLi4uIHJlYWQgIDogY3RzICA9ICUuMGYgKyAlbGQgWyAweCV4IF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9DVFMsIHBDLT5wQzEtPmlWb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPlZpZGVvQVUubV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBERUNPREVfRU5DT0RFIE1PREUgfCovCi0gICAgICAgICAgICAvKnwgICBCRUdJTl9DVVQgTU9ERSAgIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgICAgICBjYXNlIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERToKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvIERFQ09ERV9FTkNPREUgLyBCRUdJTl9DVVQiKTsKLQotICAgICAgICAgICAgaWYgKChwQy0+cEMxLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpICYmCi0gICAgICAgICAgICAgICAgKE00T1NBX0ZBTFNFID09Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBTZXR0aW5ncy0+Q2xpcFByb3BlcnRpZXMuYlNldEltYWdlRGF0YSkpIHsKLQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4KHBDLCBwQy0+cEMxKTsKLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4IGVycj0leCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSB2aWRlbyB1cCB0byB0aGUgdGFyZ2V0IHRpbWUKLSAgICAgICAgICAgICAgICAod2lsbCBqdW1wIHRvIHRoZSBwcmV2aW91cyBSQVAgaWYgbmVlZGVkICkgKi8KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRDbGlwRGVjb2RlVmlkZW9VcFRvQ3RzKHBDLT5wQzEsIChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cyk7Ci0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBERUNPREVfRU5DT0RFOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnREZWNvZGVWaWRlb1VwVG9DdHMgcmV0dXJucyBlcnI9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIElmIHRoZSBkZWNvZGluZyBpcyBub3QgY29tcGxldGVkLCBkbyBvbmUgbW9yZSBzdGVwIHdpdGggdGltZSBmcm96ZW4gKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMxLT5Wc3RhdHVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogUmVzZXQgdGhlIHZpZGVvIHByZS1wcm9jZXNzaW5nIGVycm9yIGJlZm9yZSBjYWxsaW5nIHRoZSBlbmNvZGVyICovCi0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IE00Tk9fRVJST1I7Ci0KLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTJfMCgiRSArKysrIGVuY29kZSBBVSIpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmNvZGUgdGhlIGZyYW1lKHJlbmRlcmluZyxmaWx0ZXJpbmcgYW5kIHdyaXRpbmcgd2lsbCBiZSBkb25lCi0gICAgICAgICAgICAgICAgIGluIGVuY29kZXIgY2FsbGJhY2tzKSovCi0gICAgICAgICAgICAgICAgaWYoIHBDLT5Wc3RhdGUgPT0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgKQotICAgICAgICAgICAgICAgICAgICBGcmFtZU1vZGUgPSBNNEVOQ09ERVJfa0lGcmFtZTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIEZyYW1lTW9kZSA9IE00RU5DT0RFUl9rTm9ybWFsRnJhbWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZShwQy0+ZXdjLnBFbmNDb250ZXh0LCBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgIHBDLT5ld2MuZElucHV0VmlkQ3RzLCBGcmFtZU1vZGUpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgd2UgaGFkIGEgVlBQIGVycm9yLi4uICovCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gcEMtPmV3Yy5WcHBFcnJvciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSwgcmV0dXJuaW5nIFZwcEVycj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAhPSBwQy0+ZXdjLlZwcEVycm9yICkKLSAgICAgICAgICAgICAgICAgICAgewotI2VuZGlmIC8vTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwQy0+ZXdjLlZwcEVycm9yOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL000VlNTX1NVUFBPUlRfT01YX0NPREVDUwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIC8qKjwgLi4ub3IgYW4gZW5jb2RlciBlcnJvciAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoICgoTTRPU0FfVUludDMyKU00RVJSX0FMTE9DKSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IERFQ09ERV9FTkNPREU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfRU5DT0RFUl9BQ0NFU19VTklUX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgZmlsZSBzaXplIGlzIHJlYWNoZWQKLSAgICAgICAgICAgICAgICAgICAgVGhlIGVkaXRpbmcgaXMgdGhlbiBmaW5pc2hlZCwgdGhlIHdhcm5pbmcgTTRWU1MzR1BQX1dBUl9FRElUSU5HX0RPTkUKLSAgICAgICAgICAgICAgICAgICAgaXMgcmV0dXJuZWQqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBNNFdBUl9XUklURVJfU1RPUF9SRVEgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBGaWxlIHdhcyBjdXQgdG8gYXZvaWQgb3ZlcnNpemUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogREVDT0RFX0VOQ09ERTpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RFbmNvZGUgcmV0dXJucyAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogSW5jcmVtZW50IHRpbWUgYnkgdGhlIGVuY29kaW5nIHBlcmlvZCAoZm9yIGJlZ2luIGN1dCwgZG8gbm90IGluY3JlbWVudCB0byBub3QKLSAgICAgICAgICAgICAgICBsb29zZSBQLWZyYW1lcykgKi8KLSAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFID09IHBDLT5Wc3RhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5kSW5wdXRWaWRDdHMgKz0gcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBfX19fX19fX19fX19fX19fXyAqLwotICAgICAgICAgICAgLyp8ICAgICAgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBUUkFOU0lUSU9OIE1PREUgfCovCi0gICAgICAgICAgICAvKnxfX19fX19fX19fX19fX19fX3wqLwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9UUkFOU0lUSU9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbyBUUkFOU0lUSU9OIik7Ci0KLSAgICAgICAgICAgICAgICAvKiBEb24ndCBkZWNvZGUgbW9yZSB0aGFuIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgIGlmKCAhKCggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyAhPSBwQy0+cEMxLT5Wc3RhdHVzKQotICAgICAgICAgICAgICAgICAgICAmJiAoTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMyLT5Wc3RhdHVzKSkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRGVjb2RlIHRoZSBjbGlwMSB2aWRlbyB1cCB0byB0aGUgdGFyZ2V0IHRpbWUKLSAgICAgICAgICAgICAgICAgICAgKHdpbGwganVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGlmIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FSR0I4ODg4KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0ZBTFNFID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iU2V0SW1hZ2VEYXRhKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50U2V0WXV2NDIwUGxhbmVGcm9tQVJHQjg4OChwQywgcEMtPnBDMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4IGVycj0leCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q2xpcERlY29kZVZpZGVvVXBUb0N0cyhwQy0+cEMxLAotICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludERlY29kZVZpZGVvVXBUb0N0cyhDMSkgcmV0dXJucyBlcnI9MHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGUgZGVjb2RpbmcgaXMgbm90IGNvbXBsZXRlZCwgZG8gb25lIG1vcmUgc3RlcCB3aXRoIHRpbWUgZnJvemVuICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPID09IHBDLT5wQzEtPlZzdGF0dXMgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIERvbid0IGRlY29kZSBtb3JlIHRoYW4gbmVlZGVkICovCi0gICAgICAgICAgICAgICAgaWYoICEoKCBNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPICE9IHBDLT5wQzItPlZzdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICYmIChNNFZTUzNHUFBfa0NsaXBTdGF0dXNfREVDT0RFX1VQX1RPID09IHBDLT5wQzEtPlZzdGF0dXMpKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBEZWNvZGUgdGhlIGNsaXAyIHZpZGVvIHVwIHRvIHRoZSB0YXJnZXQgdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgKHdpbGwganVtcCB0byB0aGUgcHJldmlvdXMgUkFQIGlmIG5lZWRlZCkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwQy0+cEMyLT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9GQUxTRSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMyLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLmJTZXRJbWFnZURhdGEpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRTZXRZdXY0MjBQbGFuZUZyb21BUkdCODg4KHBDLCBwQy0+cEMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFNldFl1djQyMFBsYW5lRnJvbUFSR0I4ODggZXJyPSV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENsaXBEZWNvZGVWaWRlb1VwVG9DdHMocEMtPnBDMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHMpOwotICAgICAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IFRSQU5TSVRJT046XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnREZWNvZGVWaWRlb1VwVG9DdHMoQzIpIHJldHVybnMgZXJyPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGRlY29kaW5nIGlzIG5vdCBjb21wbGV0ZWQsIGRvIG9uZSBtb3JlIHN0ZXAgd2l0aCB0aW1lIGZyb3plbiAqLwotICAgICAgICAgICAgICAgICAgICBpZiggTTRWU1MzR1BQX2tDbGlwU3RhdHVzX0RFQ09ERV9VUF9UTyA9PSBwQy0+cEMyLT5Wc3RhdHVzICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFJlc2V0IHRoZSB2aWRlbyBwcmUtcHJvY2Vzc2luZyBlcnJvciBiZWZvcmUgY2FsbGluZyB0aGUgZW5jb2RlciAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBNNE5PX0VSUk9SOwotCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UyXzAoIkYgKioqKiBibGVuZCBBVXMiKTsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogRW5jb2RlIHRoZSBmcmFtZSAocmVuZGVyaW5nLCBmaWx0ZXJpbmcgYW5kIHdyaXRpbmcgd2lsbCBiZSBkb25lCi0gICAgICAgICAgICAgICAgaW4gZW5jb2RlciBjYWxsYmFja3MgKi8KLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZShwQy0+ZXdjLnBFbmNDb250ZXh0LCBNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cywgTTRFTkNPREVSX2tOb3JtYWxGcmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIElmIGVuY29kZSByZXR1cm5zIGEgcHJvY2VzcyBmcmFtZSBlcnJvciwgaXQgaXMgbGlrZWx5IHRvIGJlIGEgVlBQIGVycm9yICovCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gcEMtPmV3Yy5WcHBFcnJvciApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogVFJBTlNJVElPTjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSwgcmV0dXJuaW5nIFZwcEVycj0weCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IpOwotI2lmZGVmIE00VlNTX1NVUFBPUlRfT01YX0NPREVDUwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBNNFdBUl9WSURFT1JFTkRFUkVSX05PX05FV19GUkFNRSAhPSBwQy0+ZXdjLlZwcEVycm9yICkKLSAgICAgICAgICAgICAgICAgICAgewotCi0jZW5kaWYgLy9NNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBDLT5ld2MuVnBwRXJyb3I7Ci0jaWZkZWYgTTRWU1NfU1VQUE9SVF9PTVhfQ09ERUNTCi0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLy9NNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggTTROT19FUlJPUiAhPSBlcnIgKSAvKio8IC4uLm9yIGFuIGVuY29kZXIgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAoKE00T1NBX1VJbnQzMilNNEVSUl9BTExPQykgPT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9FTkNPREVSX0FDQ0VTX1VOSVRfRVJST1IiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0VOQ09ERVJfQUNDRVNfVU5JVF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHRoZSB3YXJuaW5nIE00V0FSX1dSSVRFUl9TVE9QX1JFUSBpcyByZXR1cm5lZCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgIGZpbGUgc2l6ZSBpcyByZWFjaGVkCi0gICAgICAgICAgICAgICAgICAgIFRoZSBlZGl0aW5nIGlzIHRoZW4gZmluaXNoZWQsIHRoZSB3YXJuaW5nIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FIGlzCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIE00V0FSX1dSSVRFUl9TVE9QX1JFUSA9PSBlcnIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IEZpbGUgd2FzIGN1dCB0byBhdm9pZCBvdmVyc2l6ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRFZGl0U3RlcFZpZGVvOiBUUkFOU0lUSU9OOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEVuY29kZSByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBJbmNyZW1lbnQgdGltZSBieSB0aGUgZW5jb2RpbmcgcGVyaW9kICovCi0gICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLmRJbnB1dFZpZEN0cyArPSBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogX19fX19fX19fX19fICovCi0gICAgICAgICAgICAvKnwgICAgICAgICAgICB8Ki8KLSAgICAgICAgICAgIC8qfCBFUlJPUiBDQVNFIHwqLwotICAgICAgICAgICAgLyp8X19fX19fX19fX19ffCovCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50RWRpdFN0ZXBWaWRlbzogaW52YWxpZCBpbnRlcm5hbCBzdGF0ZSAoMHgleCksXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFIiwKLSAgICAgICAgICAgICAgICBwQy0+VnN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVEVSTkFMX1NUQVRFOwotICAgIH0KLQotICAgIC8qKgotICAgICogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEVkaXRTdGVwVmlkZW86IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZSgpCi0gKiBAYnJpZWYgICAgQ2hlY2sgd2hpY2ggdmlkZW8gcHJvY2VzcyBtb2RlIHdlIG11c3QgdXNlLCBkZXBlbmRpbmcgb24gdGhlIG91dHB1dCBDVFMuCi0gKiBAcGFyYW0gICBwQyAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGUoCi0gICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgY29uc3QgTTRPU0FfSW50MzIgIHQgPSAoTTRPU0FfSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgLyoqPCBUcmFuc2l0aW9uIGR1cmF0aW9uICovCi0gICAgY29uc3QgTTRPU0FfSW50MzIgVEQgPSBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT51aUN1cnJlbnRDbGlwXS51aVRyYW5zaXRpb25EdXJhdGlvbjsKLQotICAgIE00T1NBX0ludDMyIGlUbXA7Ci0KLSAgICBjb25zdCBNNFZTUzNHUFBfRWRpdFZpZGVvU3RhdGUgcHJldmlvdXNWc3RhdGUgPSBwQy0+VnN0YXRlOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiBDbGlwMSBpcyBvbiBpdHMgYmVnaW4gY3V0LCBvciBpbiBhbiBlZmZlY3Qgem9uZSAqLwotICAgIE00VlNTM0dQUF9pbnRDaGVja1ZpZGVvRWZmZWN0cyhwQywgMSk7Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGFyZSBpbiB0aGUgdHJhbnNpdGlvbiB3aXRoIG5leHQgY2xpcCAqLwotICAgIGlmKCAoIFREID4gMCkgJiYgKCggdCAtIHBDLT5wQzEtPmlWb2Zmc2V0KSA+PSAocEMtPnBDMS0+aUVuZFRpbWUgLSBURCkpICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdlIGFyZSBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTjsKLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfVFJVRTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBPcGVuIHNlY29uZCBjbGlwIGZvciB0cmFuc2l0aW9uLCBpZiBub3QgeWV0IG9wZW5lZCAqLwotICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBwQy0+cEMyICkKLSAgICAgICAgewotICAgICAgICAgICAgcEMtPnBDMS0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRPcGVuQ2xpcChwQywgJnBDLT5wQzIsCi0gICAgICAgICAgICAgICAgJnBDLT5wQ2xpcExpc3RbcEMtPnVpQ3VycmVudENsaXAgKyAxXSk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9lZGl0T3BlbkNsaXAgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEFkZCBjdXJyZW50IHZpZGVvIG91dHB1dCBDVFMgdG8gdGhlIGNsaXAgb2Zmc2V0Ci0gICAgICAgICAgICAqIChhdWRpbyBvdXRwdXQgQ1RTIGlzIG5vdCB5ZXQgYXQgdGhlIHRyYW5zaXRpb24sIHNvIGF1ZGlvCi0gICAgICAgICAgICAqICBvZmZzZXQgY2FuJ3QgYmUgdXBkYXRlZCB5ZXQpLiAqLwotICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgIHBDLT5wQzItPmlWb2Zmc2V0ICs9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAyMDA1LTAzLTI0OiBCdWdGaXggZm9yIGF1ZGlvLXZpZGVvIHN5bmNocm86Ci0gICAgICAgICAgICAqIFVwZGF0ZSB0cmFuc2l0aW9uIGR1cmF0aW9uIGR1ZSB0byB0aGUgYWN0dWFsIHZpZGVvIHRyYW5zaXRpb24gYmVnaW5uaW5nIHRpbWUuCi0gICAgICAgICAgICAqIEl0IHdpbGwgYXZvaWQgZGVzeW5jaHJvbml6YXRpb24gd2hlbiBkb2luZyB0aGUgYXVkaW8gdHJhbnNpdGlvbi4gKi8KLSAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgIGlUbXAgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKVwKLSAgICAgICAgICAgICAtIChwQy0+cEMxLT5pRW5kVGltZSAtIFREICsgcEMtPnBDMS0+aVZvZmZzZXQpOwotICAgICAgICAgICAgaWYgKGlUbXAgPCAoTTRPU0FfSW50MzIpcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb24pCi0gICAgICAgICAgICAvKio8IFRlc3QgaW4gY2FzZSBvZiBhIHZlcnkgc2hvcnQgdHJhbnNpdGlvbiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPgotICAgICAgICAgICAgICAgICAgICB1aUN1cnJlbnRDbGlwXS51aVRyYW5zaXRpb25EdXJhdGlvbiAtPSBpVG1wOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBEb24ndCBmb3JnZXQgdG8gYWxzbyBjb3JyZWN0IHRoZSB0b3RhbCBkdXJhdGlvbiB1c2VkIGZvciB0aGUgcHJvZ3Jlc3MgYmFyCi0gICAgICAgICAgICAgICAgKiAoaXQgd2FzIGNvbXB1dGVkIHdpdGggdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gZHVyYXRpb24pLiAqLwotICAgICAgICAgICAgICAgIHBDLT5ld2MuaU91dHB1dER1cmF0aW9uICs9IGlUbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKio8IE5vICJlbHNlIiBoZXJlIGJlY2F1c2UgaXQncyBoYXJkIHByZWRpY3QgdGhlIGVmZmVjdCBvZiAwIGR1cmF0aW9uIHRyYW5zaXRpb24uLi4qLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ2hlY2sgZWZmZWN0cyBmb3IgY2xpcDIgKi8KLSAgICAgICAgTTRWU1MzR1BQX2ludENoZWNrVmlkZW9FZmZlY3RzKHBDLCAyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogV2UgYXJlIG5vdCBpbiBhIHRyYW5zaXRpb24gKi8KLSAgICAgICAgcEMtPmJUcmFuc2l0aW9uRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyogSWYgdGhlcmUgaXMgYW4gZWZmZWN0IHdlIGdvIHRvIGRlY29kZS9lbmNvZGUgbW9kZSAqLwotICAgICAgICBpZigocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHx8IChwQy0+bmJBY3RpdmVFZmZlY3RzMSA+IDApIHx8Ci0gICAgICAgICAgICAocEMtPnBDMS0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgfHwKLSAgICAgICAgICAgIChwQy0+cEMxLT5wU2V0dGluZ3MtPmJUcmFuc2NvZGluZ1JlcXVpcmVkID09IE00T1NBX1RSVUUpKSB7Ci0gICAgICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFOwotICAgICAgICB9Ci0gICAgICAgIC8qIFdlIGRvIGEgYmVnaW4gY3V0LCBleGNlcHQgaWYgYWxyZWFkeSBkb25lICh0aW1lIGlzIG5vdCBwcm9ncmVzc2luZyBiZWNhdXNlIHdlIHdhbnQKLSAgICAgICAgdG8gY2F0Y2ggYWxsIFAtZnJhbWVzIGFmdGVyIHRoZSBjdXQpICovCi0gICAgICAgIGVsc2UgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJDbGlwMUF0QmVnaW5DdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgewotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0RFQ09ERV9FTkNPREU7Ci0gICAgICAgICAgICAgICAgcEMtPmJFbmNvZGVUaWxsRW9GID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiggKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0JFR0lOX0NVVCA9PSBwcmV2aW91c1ZzdGF0ZSkKLSAgICAgICAgICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpICkgewotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQkVHSU5fQ1VUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIEVsc2Ugd2UgYXJlIGluIGRlZmF1bHQgY29weS9wYXN0ZSBtb2RlICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoICggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgICAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUID09IHByZXZpb3VzVnN0YXRlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfQUZURVJfQ1VUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgY3VycmVudEJpdHJhdGU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAgICAgICAgICAgICAvKiBEbyB3ZSBuZWVkIHRvIHJlZW5jb2RlIHRoZSB2aWRlbyB0byBkb3duZ3JhZGUgdGhlIGJpdHJhdGUgb3Igbm90ID8gKi8KLSAgICAgICAgICAgICAgICAvKiBMZXQncyBjb21wdXRlIHRoZSBjaXJyZW50IGJpdHJhdGUgb2YgdGhlIGN1cnJlbnQgZWRpdGVkIGNsaXAgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BSZWFkZXItPm1fcEZjdEdldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFJlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlLCAmY3VycmVudEJpdHJhdGUpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDaGVja1ZpZGVvTW9kZTpcCi0gICAgICAgICAgICAgICAgICAgICAgICBFcnJvciB3aGVuIGdldHRpbmcgbmV4dCBiaXRyYXRlIG9mIGVkaXRlZCBjbGlwOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogUmVtb3ZlIGF1ZGlvIGJpdHJhdGUgKi8KLSAgICAgICAgICAgICAgICBjdXJyZW50Qml0cmF0ZSAtPSAxMjIwMDsKLQotICAgICAgICAgICAgICAgIC8qIFRlc3QgaWYgd2UgZ28gaW50byBjb3B5L3Bhc3RlIG1vZGUgb3IgaW50byBkZWNvZGUvZW5jb2RlIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBpZiggY3VycmVudEJpdHJhdGUgPiBwQy0+dWlNTVNWaWRlb0JpdHJhdGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPlZzdGF0ZSA9IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCEoKHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID09IE00T1NBX1RSVUUpICYmCi0gICAgICAgICAgICAgICAgICAgIChwQy0+VnN0YXRlID09IE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSkpICYmCi0gICAgICAgICAgICAgICAgICAgIHBDLT5iRW5jb2RlVGlsbEVvRiA9PSBNNE9TQV9GQUxTRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUZXN0IGlmIHdlIGdvIGludG8gY29weS9wYXN0ZSBtb2RlIG9yIGludG8gZGVjb2RlL2VuY29kZSBtb2RlCi0gICAgICAgICAgICAgICAgICogSWYgYW4gZXh0ZXJuYWwgZWZmZWN0IGhhcyBiZWVuIGFwcGxpZWQgb24gdGhlIGN1cnJlbnQgY2xpcAotICAgICAgICAgICAgICAgICAqIHRoZW4gY29udGludWUgdG8gYmUgaW4gZGVjb2RlL2VuY29kZSBtb2RlIHRpbGwgZW5kIG9mCi0gICAgICAgICAgICAgICAgICogY2xpcCB0byBhdm9pZCBILjI2NCBkaXN0b3J0aW9uLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHBDLT5Wc3RhdGUgPSBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENoZWNrIGlmIHdlIGNyZWF0ZSBhbiBlbmNvZGVyICovCi0gICAgaWYoICggKCBNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1JFQURfV1JJVEUgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX0FGVEVSX0NVVAotICAgICAgICA9PSBwcmV2aW91c1ZzdGF0ZSkpIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgICYmICgoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9PSBwQy0+VnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcEMtPlZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTgotICAgICAgICA9PSBwQy0+VnN0YXRlKSkgLyoqPCBlbmNvZGUgbW9kZSAqLwotICAgICAgICAmJiBwQy0+YklzTU1TID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENyZWF0ZSB0aGUgZW5jb2RlciwgaWYgbm90IGNyZWF0ZWQgYWxyZWFkeSovCi0gICAgICAgIGlmIChwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9PSBNNFZTUzNHUFBfa05vRW5jb2RlcikgewotICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcihwQyk7Ci0KLSAgICAgICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIgXAotICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyAweCV4ISIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKCBwQy0+YklzTU1TID09IE00T1NBX1RSVUUgJiYgcEMtPmV3Yy5wRW5jQ29udGV4dCA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIENyZWF0ZSB0aGUgZW5jb2RlciAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyKHBDKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludENoZWNrVmlkZW9Nb2RlOiBNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBXaGVuIHdlIGdvIGZyb20gZmlsdGVyaW5nIHRvIHJlYWQvd3JpdGUsIHdlIG11c3QgYWN0IGxpa2UgYSBiZWdpbiBjdXQsCi0gICAgKiBiZWNhdXNlIHRoZSBsYXN0IGZpbHRlcmVkIGltYWdlIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgb3JpZ2luYWwgaW1hZ2UuICovCi0gICAgZWxzZSBpZiggKCAoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfREVDT0RFX0VOQ09ERSA9PSBwcmV2aW91c1ZzdGF0ZSkKLSAgICAgICAgfHwgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfVFJBTlNJVElPTgotICAgICAgICA9PSBwcmV2aW91c1ZzdGF0ZSkpIC8qKjwgZW5jb2RlIG1vZGUgKi8KLSAgICAgICAgJiYgKE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURSA9PSBwQy0+VnN0YXRlKSAvKio8IHJlYWQgbW9kZSAqLwotICAgICAgICAmJiAocEMtPmJFbmNvZGVUaWxsRW9GID09IE00T1NBX0ZBTFNFKSApCi0gICAgewotICAgICAgICBwQy0+VnN0YXRlID0gTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBkZXN0cm95IGFuIGVuY29kZXIgKi8KLSAgICBlbHNlIGlmKCAoICggTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9ERUNPREVfRU5DT0RFID09IHByZXZpb3VzVnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9CRUdJTl9DVVQgPT0gcHJldmlvdXNWc3RhdGUpCi0gICAgICAgIHx8IChNNFZTUzNHUFBfa0VkaXRWaWRlb1N0YXRlX1RSQU5TSVRJT04KLSAgICAgICAgPT0gcHJldmlvdXNWc3RhdGUpKSAvKio8IGVuY29kZSBtb2RlICovCi0gICAgICAgICYmICgoIE00VlNTM0dQUF9rRWRpdFZpZGVvU3RhdGVfUkVBRF9XUklURSA9PSBwQy0+VnN0YXRlKQotICAgICAgICB8fCAoTTRWU1MzR1BQX2tFZGl0VmlkZW9TdGF0ZV9BRlRFUl9DVVQKLSAgICAgICAgPT0gcEMtPlZzdGF0ZSkpIC8qKjwgcmVhZCBtb2RlICovCi0gICAgICAgICYmIHBDLT5iSXNNTVMgPT0gTTRPU0FfRkFMU0UgKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICogRGVzdHJveSB0aGUgcHJldmlvdXNseSBjcmVhdGVkIGVuY29kZXIgKi8KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXIocEMpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBSZXR1cm4gd2l0aCBubyBlcnJvciAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50Q2hlY2tWaWRlb01vZGU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50U3RhcnRBVSgpCi0gKiBAYnJpZWYgICAgU3RhcnRBVSB3cml0ZXItbGlrZSBpbnRlcmZhY2UgdXNlZCBmb3IgdGhlIFZTUyAzR1BQIG9ubHkKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQ6IChJTikgSXQgaXMgdGhlIFZTUyAzR1BQIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBzdHJlYW1JRDogKElOKSBJZCBvZiB0aGUgc3RyZWFtIHRvIHdoaWNoIHRoZSBBY2Nlc3MgVW5pdCBpcyByZWxhdGVkLgotICogQHBhcmFtICAgIHBBVTogICAgICAoSU4vT1VUKSBBY2Nlc3MgVW5pdCB0byBiZSBwcmVwYXJlZC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTdGFydEFVKCBNNFdSSVRFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0ICpwQVUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRPU0FfVUludDMyIHVpTWF4QXVTaXplOwotCi0gICAgLyoqCi0gICAgKiBHaXZlbiBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBWU1MzR1BQIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLQotICAgIC8qKgotICAgICogR2V0IHRoZSBvdXRwdXQgQVUgdG8gd3JpdGUgaW50byAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCBwQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRTdGFydEFVOiBwV3JpdGVyRGF0YUZjdHMtPnBTdGFydEFVKFZpZGVvKSByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFN0YXJ0QVU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50UHJvY2Vzc0FVKCkKLSAqIEBicmllZiAgICBQcm9jZXNzQVUgd3JpdGVyLWxpa2UgaW50ZXJmYWNlIHVzZWQgZm9yIHRoZSBWU1MgM0dQUCBvbmx5Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0OiAoSU4pIEl0IGlzIHRoZSBWU1MgM0dQUCBjb250ZXh0IGluIG91ciBjYXNlCi0gKiBAcGFyYW0gICAgc3RyZWFtSUQ6IChJTikgSWQgb2YgdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgQWNjZXNzIFVuaXQgaXMgcmVsYXRlZC4KLSAqIEBwYXJhbSAgICBwQVU6ICAgICAgKElOL09VVCkgQWNjZXNzIFVuaXQgdG8gYmUgd3JpdHRlbgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiB0aGVyZSBpcyBubyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFByb2Nlc3NBVSggTTRXUklURVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlELCBNNFNZU19BY2Nlc3NVbml0ICpwQVUgKQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAqIEdpdmVuIGNvbnRleHQgaXMgYWN0dWFsbHkgdGhlIFZTUzNHUFAgY29udGV4dCAqLwotICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyA9Ci0gICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBDb250ZXh0OwotCi0gICAgLyoqCi0gICAgKiBGaXggdGhlIGVuY29kZWQgQVUgdGltZSAqLwotICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgcEMtPmV3Yy5kT3V0cHV0VmlkQ3RzID0gcEFVLT5DVFM7Ci0gICAgLyoqCi0gICAgKiBVcGRhdGUgdGltZSBpbmZvIGZvciB0aGUgQ291bnRlciBUaW1lIFN5c3RlbSB0byBiZSBlcXVhbCB0byB0aGUgYml0LXN0cmVhbSB0aW1lICovCi0gICAgTTRWU1MzR1BQX2ludFVwZGF0ZVRpbWVJbmZvKHBDLCBwQVUpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgQVUgKi8KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFdyaXRlckRhdGFGY3RzLT5wUHJvY2Vzc0FVKHBDLT5ld2MucDNncFdyaXRlckNvbnRleHQsCi0gICAgICAgIE00VlNTM0dQUF9XUklURVJfVklERU9fU1RSRUFNX0lELCBwQVUpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRQcm9jZXNzQVU6IHBXcml0ZXJEYXRhRmN0cy0+cFByb2Nlc3NBVShWaWRlbykgcmV0dXJucyAweCV4ISIsCi0gICAgICAgICAgICBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRQcm9jZXNzQVU6IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRWUFAoKQotICogQGJyaWVmICAgIFdlIGltcGxlbWVudCBvdXIgb3duIFZpZGVvUHJlUHJvY2Vzc2luZyBmdW5jdGlvbgotICogQG5vdGUgICAgSXQgaXMgY2FsbGVkIGJ5IHRoZSB2aWRlbyBlbmNvZGVyCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBWUFAgY29udGV4dCwgd2hpY2ggYWN0dWFsbHkgaXMgdGhlIFZTUyAzR1BQIGNvbnRleHQgaW4gb3VyIGNhc2UKLSAqIEBwYXJhbSAgICBwUGxhbmVJbiAgICAoSU4pCi0gKiBAcGFyYW0gICAgcFBsYW5lT3V0ICAgIChJTi9PVVQpIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMyBwbGFuZXMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIG91dHB1dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50VlBQKCBNNFZQUF9Db250ZXh0IHBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNF9NZWRpYVRpbWUgdHM7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBUbXAgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9JbWFnZVBsYW5lICpwTGFzdERlY29kZWRGcmFtZSA9IE00T1NBX05VTEwgOwotICAgIE00VklGSV9JbWFnZVBsYW5lICpwRGVjb2RlclJlbmRlckZyYW1lID0gTTRPU0FfTlVMTDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwVGVtcDFbM10scFRlbXAyWzNdOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBUZW1wUGxhbmVDbGlwMVszXSxwVGVtcFBsYW5lQ2xpcDJbM107Ci0gICAgTTRPU0FfVUludDMyICBpID0gMCwgeXV2RnJhbWVXaWR0aCA9IDAsIHl1dkZyYW1lSGVpZ2h0ID0gMDsKLSAgICBNNE9TQV9Cb29sIGJTa2lwRnJhbWVFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAvKioKLSAgICAqIFZQUCBjb250ZXh0IGlzIGFjdHVhbGx5IHRoZSBWU1MzR1BQIGNvbnRleHQgKi8KLSAgICBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgPQotICAgICAgICAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKilwQ29udGV4dDsKLQotICAgIG1lbXNldCgodm9pZCAqKXBUZW1wMSwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLSAgICBtZW1zZXQoKHZvaWQgKilwVGVtcDIsIDAsIDMqc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSk7Ci0gICAgbWVtc2V0KCh2b2lkICopcFRlbXBQbGFuZUNsaXAxLCAwLCAzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSkpOwotICAgIG1lbXNldCgodm9pZCAqKXBUZW1wUGxhbmVDbGlwMiwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLQotICAgIC8qKgotICAgICogUmVzZXQgVlBQIGVycm9yIHJlbWVtYmVyZWQgaW4gY29udGV4dCAqLwotICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiBBdCB0aGUgZW5kIG9mIHRoZSBlZGl0aW5nLCB3ZSBtYXkgYmUgY2FsbGVkIHdoZW4gbm8gbW9yZSBjbGlwIGlzIGxvYWRlZC4KLSAgICAqIChiZWNhdXNlIHRvIGNsb3NlIHRoZSBlbmNvZGVyIHByb3Blcmx5IGl0IG11c3QgYmUgc3RlcHBlZCBvbmUgb3IgdHdpY2UuLi4pICovCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcEMtPnBDMSApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXZSBtdXN0IGZpbGwgdGhlIGlucHV0IG9mIHRoZSBlbmNvZGVyIHdpdGggYSBkdW1teSBpbWFnZSwgYmVjYXVzZQotICAgICAgICAqIGVuY29kaW5nIG5vaXNlIGxlYWRzIHRvIGEgaHVnZSB2aWRlbyBBVSwgYW5kIHRodXMgYSB3cml0ZXIgYnVmZmVyIG92ZXJmbG93LiAqLwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVPdXRbMF0ucGFjX2RhdGEsMCwKLSAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3N0cmlkZSAqIHBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZU91dFsxXS5wYWNfZGF0YSwwLAotICAgICAgICAgICAgcFBsYW5lT3V0WzFdLnVfc3RyaWRlICogcFBsYW5lT3V0WzFdLnVfaGVpZ2h0KTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lT3V0WzJdLnBhY19kYXRhLDAsCi0gICAgICAgICAgICBwUGxhbmVPdXRbMl0udV9zdHJpZGUgKiBwUGxhbmVPdXRbMl0udV9oZWlnaHQpOwotCi0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiByZXR1cm5pbmcgTTROT19FUlJPUiAoYWJvcnQpIik7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8qKgotICAgICoqKioqKioqKioqKioqKiogVHJhbnNpdGlvbiBjYXNlICoqKioqKioqKioqKioqKiovCi0gICAgaWYoIE00T1NBX1RSVUUgPT0gcEMtPmJUcmFuc2l0aW9uRWZmZWN0ICkKLSAgICB7Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMSwgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMSkgcmV0dXJucyAweCV4LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsIGVycik7Ci0gICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7IC8qKjwgUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuLi4pICovCi0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAyLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMCgyKSByZXR1cm5zIDB4JXgsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SIiwgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYxLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMykgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYyLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoNCkgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBDLT55dXYzLCBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgIHBDLT5ld2MudWlWaWRlb0hlaWdodCk7Ci0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoMykgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbiB0aGUgY2xpcDEgYmFzZTogdHMgPSB0byAtIE9mZnNldCAqLwotICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICB0cyA9IHBDLT5ld2MuZElucHV0VmlkQ3RzIC0gcEMtPnBDMS0+aVZvZmZzZXQ7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogUmVuZGVyIENsaXAxICovCi0gICAgICAgIGlmKCBwQy0+cEMxLT5pc1JlbmRlckR1cCA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3QocEMsIHBDLT5wQzEsIHRzLCBNNE9TQV9UUlVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBQbGFuZUNsaXAxLCBwVGVtcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXQpOwotICAgICAgICAgICAgaWYgKChNNE5PX0VSUk9SICE9IGVycikgJiYKLSAgICAgICAgICAgICAgICAgKE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FICE9IGVycikpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0IHJldHVybnMgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAvKiogUmV0dXJuIG5vIGVycm9yIHRvIHRoZSBlbmNvZGVyIGNvcmUKLSAgICAgICAgICAgICAgICAgICogZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKHBDLT5wQzEtPmlzUmVuZGVyRHVwID09IE00T1NBX1RSVUUpIHx8Ci0gICAgICAgICAgICAgKE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FID09IGVycikpIHsKLSAgICAgICAgICAgIHBUbXAgPSBwQy0+eXV2MTsKLSAgICAgICAgICAgIGlmIChwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBDb3B5IGxhc3QgZGVjb2RlZCBwbGFuZSB0byBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIChwVG1wWzBdLnVfaGVpZ2h0ICogcFRtcFswXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAocFRtcFsxXS51X2hlaWdodCAqIHBUbXBbMV0udV93aWR0aCkpOwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHBUbXBbMl0udV9oZWlnaHQgKiBwVG1wWzJdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX0VSUl9OT19WQUxJRF9WSURfRlJBTUU7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIkNhbiBub3QgZmluZCBhbiBpbnB1dCBmcmFtZS4gU2V0IGVycm9yIDB4JXggaW4gJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgZXJyLCBfX0ZJTEVfXywgX19MSU5FX18pOwotICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lID0gcFRtcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIENvbXB1dGUgdGhlIHRpbWUgaW4gdGhlIGNsaXAyIGJhc2U6IHRzID0gdG8gLSBPZmZzZXQgKi8KLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgdHMgPSBwQy0+ZXdjLmRJbnB1dFZpZEN0cyAtIHBDLT5wQzItPmlWb2Zmc2V0OwotICAgICAgICAvKioKLSAgICAgICAgKiBSZW5kZXIgQ2xpcDIgKi8KLSAgICAgICAgaWYoIHBDLT5wQzItPmlzUmVuZGVyRHVwID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgewotCi0gICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0KHBDLCBwQy0+cEMyLCB0cywgTTRPU0FfRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFBsYW5lQ2xpcDIsIHBUZW1wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dCk7Ci0gICAgICAgICAgICBpZiAoKE00Tk9fRVJST1IgIT0gZXJyKSAmJgotICAgICAgICAgICAgICAgICAoTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgIT0gZXJyKSkgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3QgcmV0dXJucyAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgIC8qKiBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgKiBlbHNlIGl0IG1heSBsZWFrIGluIHNvbWUgc2l0dWF0aW9ucy4qLwotICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgocEMtPnBDMi0+aXNSZW5kZXJEdXAgPT0gTTRPU0FfVFJVRSkgfHwKLSAgICAgICAgICAgICAoTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUUgPT0gZXJyKSkgewotICAgICAgICAgICAgcFRtcCA9IHBDLT55dXYyOwotICAgICAgICAgICAgaWYgKHBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmUgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIENvcHkgbGFzdCBkZWNvZGVkIHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBbMF0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMi0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHBUbXBbMF0udV9oZWlnaHQgKiBwVG1wWzBdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwVG1wWzFdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIChwVG1wWzFdLnVfaGVpZ2h0ICogcFRtcFsxXS51X3dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcFsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMyLT5sYXN0RGVjb2RlZFBsYW5lWzJdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAocFRtcFsyXS51X2hlaWdodCAqIHBUbXBbMl0udV93aWR0aCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMygiQ2FuIG5vdCBmaW5kIGFuIGlucHV0IGZyYW1lLiBTZXQgZXJyb3IgMHgleCBpbiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICBlcnIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDLT5wQzItPmxhc3REZWNvZGVkUGxhbmUgPSBwVG1wOwotICAgICAgICB9Ci0KLQotICAgICAgICBwVG1wID0gcFBsYW5lT3V0OwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uKHBDLCBwVG1wKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZQUDogTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbiByZXR1cm5zIDB4JXgsXAotICAgICAgICAgICAgICAgIHJldHVybmluZyBNNE5PX0VSUk9SIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgIHJldHVybiAgTTROT19FUlJPUjsgLyoqPCBSZXR1cm4gbm8gZXJyb3IgdG8gdGhlIGVuY29kZXIgY29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxzZSBpdCBtYXkgbGVhayBpbiBzb21lIHNpdHVhdGlvbnMuLi4pICovCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChpPTA7IGkgPCAzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBUZW1wUGxhbmVDbGlwMltpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwVGVtcFBsYW5lQ2xpcDJbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wUGxhbmVDbGlwMltpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHBUZW1wUGxhbmVDbGlwMVtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwVGVtcFBsYW5lQ2xpcDFbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wUGxhbmVDbGlwMVtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwVGVtcDJbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXAyW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcDJbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocFRlbXAxW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wMVtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcFRlbXAxW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAqKioqKioqKioqKioqKioqIE5vIFRyYW5zaXRpb24gY2FzZSAqKioqKioqKioqKioqKioqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiBOTyB0cmFuc2l0aW9uIGNhc2UiKTsKLSAgICAgICAgLyoqCi0gICAgICAgICogQ29tcHV0ZSB0aGUgdGltZSBpbiB0aGUgY2xpcCBiYXNlOiB0cyA9IHRvIC0gT2Zmc2V0ICovCi0gICAgICAgIHRzID0gcEMtPmV3Yy5kSW5wdXRWaWRDdHMgLSBwQy0+cEMxLT5pVm9mZnNldDsKLSAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgLyoqCi0gICAgICAgICogUmVuZGVyICovCi0gICAgICAgIGlmIChwQy0+cEMxLT5pc1JlbmRlckR1cCA9PSBNNE9TQV9GQUxTRSkgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWUFA6IHJlbmRlcmR1cCBmYWxzZSIpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICAgQ2hlY2sgaWYgcmVzaXppbmcgaXMgbmVlZGVkICovCi0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAgICAgICAgIGlmICgocEMtPnBDMS0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+bmJBY3RpdmVFZmZlY3RzID09IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBDMS0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9PSBNNE9TQV9GQUxTRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gcEMtPnBDMS0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVPdXQsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9FbmFibGVZdXZXaXRoRWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKU00T1NBX0ZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSwgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BGY3RSZW5kZXIoKSByZXR1cm5zIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoMCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdW4tcm90YXRlZCBmcmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgeXV2RnJhbWVXaWR0aCA9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB5dXZGcmFtZUhlaWdodCA9IHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludFJvdGF0ZVZpZGVvKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZVZpZGVvKCkgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBJZiB3ZSBkbyBtb2RpZnkgdGhlIGltYWdlLCB3ZSBuZWVkIGFuIGludGVybWVkaWF0ZQotICAgICAgICAgICAgICAgICAgICAqIGltYWdlIHBsYW5lICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwVGVtcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdmlkZW8gZnJhbWUgbmVlZCB0byBiZSByZXNpemVkLCB0aGVuIGFwcGx5IHRoZSBvdmVybGF5IGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZSBmcmFtZSB3YXMgcmVuZGVyZWQgd2l0aCByZW5kZXJpbmcgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICogSGVyZSBza2lwIHRoZSBmcmFtaW5nKG92ZXJsYXkpIGVmZmVjdCB3aGVuIGFwcGx5aW5nIHZpZGVvIEVmZmVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZUVmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLCBwVGVtcDEsIGJTa2lwRnJhbWVFZmZlY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoKSBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lPSBwVGVtcDE7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFByZXBhcmUgb3ZlcmxheSB0ZW1wb3JhcnkgYnVmZmVyIGlmIG92ZXJsYXkgZXhpc3QgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3dpZHRoLCBwUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCwgcmV0dXJuaW5nIE00Tk9fRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBEbyByZW5kZXJpbmcgbW9kZS4gKi8KLSAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpIHsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT54VlNTLk1lZGlhUmVuZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSwgcFRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBBcHBseSBvdmVybGF5IGlmIG92ZXJsYXkgaXMgZXhpc3QgKi8KLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBUbXA7Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheShwQywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIHBUbXApOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KSBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHBDLT5wQzEtPnBTZXR0aW5ncy0+RmlsZVR5cGUgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBwQy0+cEMxLT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3ROb25Db250aWd1b3VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcFRtcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXNldCBvcmlnaW5hbCB3aWR0aCBhbmQgaGVpZ2h0IGZvciByZXNpemUgZnJhbWUgcGxhbmUKLSAgICAgICAgICAgICAgICBpZiAoMCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzICYmCi0gICAgICAgICAgICAgICAgICAgIDE4MCAhPSBwQy0+cEMxLT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludFNldFlVVjQyMFBsYW5lKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2RnJhbWVXaWR0aCwgeXV2RnJhbWVIZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogTk8gcmVzaXplIHJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKiBJZiB3ZSBkbyBtb2RpZnkgdGhlIGltYWdlLCB3ZSBuZWVkIGFuCi0gICAgICAgICAgICAgICAgICAgICAqIGludGVybWVkaWF0ZSBpbWFnZSBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcFRlbXAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZSA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwVG1wID0gcFBsYW5lT3V0OwotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5wQzEtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSGVyZSB3ZSBkbyBub3Qgc2tpcCB0aGUgb3ZlcmxheSBlZmZlY3Qgc2luY2UKLSAgICAgICAgICAgICAgICAgICAgICogb3ZlcmxheSBhbmQgdmlkZW8gZnJhbWUgYXJlIGJvdGggb2Ygc2FtZSByZXNvbHV0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWVFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLHBQbGFuZU91dCxiU2tpcEZyYW1lRWZmZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7Ci0gICAgICAgICAgICBwQy0+cEMxLT5pVmlkZW9SZW5kZXJDdHMgPSAoTTRPU0FfSW50MzIpdHM7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50VlBQOiByZW5kZXJkdXAgdHJ1ZSIpOwotCi0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZSkgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ29weSBsYXN0IGRlY29kZWQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgaWYgKHBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmUgIT0gTTRPU0FfTlVMTCkgewotCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0ICogXAotICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X2hlaWdodCAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZVsxXS51X3dpZHRoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBDLT5wQzEtPmxhc3REZWNvZGVkUGxhbmVbMl0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV9oZWlnaHQgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMl0udV93aWR0aCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9FUlJfTk9fVkFMSURfVklEX0ZSQU1FOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMygiQ2FuIG5vdCBmaW5kIGFuIGlucHV0IGZyYW1lLiBTZXQgZXJyb3IgMHgleCBpbiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgX19GSUxFX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYocEMtPm5iQWN0aXZlRWZmZWN0cyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogSWYgd2UgZG8gbW9kaWZ5IHRoZSBpbWFnZSwgd2UgbmVlZCBhbgotICAgICAgICAgICAgICAgICAgICAqIGludGVybWVkaWF0ZSBpbWFnZSBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5wQzEtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdmlkZW8gZnJhbWUgbmVlZCB0byBiZSByZXNpemVkLCB0aGVuIGFwcGx5IHRoZSBvdmVybGF5IGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAqIHRoZSBmcmFtZSB3YXMgcmVuZGVyZWQgd2l0aCByZW5kZXJpbmcgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgICogSGVyZSBza2lwIHRoZSBmcmFtaW5nKG92ZXJsYXkpIGVmZmVjdCB3aGVuIGFwcGx5aW5nIHZpZGVvIEVmZmVjdC4gKi8KLSAgICAgICAgICAgICAgICAgICAgYlNraXBGcmFtZUVmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+bV9wUHJlUmVzaXplRnJhbWUscFRlbXAxLCBiU2tpcEZyYW1lRWZmZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXJSZW5kZXJGcmFtZT0gcFRlbXAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUgPSBwQy0+cEMxLT5tX3BQcmVSZXNpemVGcmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogUHJlcGFyZSBvdmVybGF5IHRlbXBvcmFyeSBidWZmZXIgaWYgb3ZlcmxheSBleGlzdCAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcDIsIHBDLT5ld2MudWlWaWRlb1dpZHRoLCBwQy0+ZXdjLnVpVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgMHgleCwgcmV0dXJuaW5nIE00Tk9fRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogRG8gcmVuZGVyaW5nIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+cEMxLT5wU2V0dGluZ3MtPnhWU1MuTWVkaWFSZW5kZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUsIHBUbXApOwotICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogQXBwbHkgb3ZlcmxheSBpZiBvdmVybGF5IGlzIGV4aXN0ICovCi0gICAgICAgICAgICAgICAgcFRtcCA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAyLCBwVG1wKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUpIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLnVpVmlkZW9XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIENvcHkgbGFzdCBkZWNvZGVkIHBsYW5lIHRvIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgIGlmIChwQy0+cEMxLT5sYXN0RGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgcExhc3REZWNvZGVkRnJhbWUgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVswXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVswXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzBdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsxXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVsxXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzFdLnVfd2lkdGgpKTsKLQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwTGFzdERlY29kZWRGcmFtZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwTGFzdERlY29kZWRGcmFtZVsyXS51X2hlaWdodCAqIHBMYXN0RGVjb2RlZEZyYW1lWzJdLnVfd2lkdGgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfRVJSX05PX1ZBTElEX1ZJRF9GUkFNRTsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzMoIkNhbiBub3QgZmluZCBhbiBpbnB1dCBmcmFtZS4gU2V0IGVycm9yIDB4JXggaW4gJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBUbXAgPSBwUGxhbmVPdXQ7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5uYkFjdGl2ZUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEhlcmUgd2UgZG8gbm90IHNraXAgdGhlIG92ZXJsYXkgZWZmZWN0IHNpbmNlCi0gICAgICAgICAgICAgICAgICAgICAqIG92ZXJsYXkgYW5kIHZpZGVvIGFyZSBib3RoIG9mIHNhbWUgcmVzb2x1dGlvbiAqLwotICAgICAgICAgICAgICAgICAgICBiU2tpcEZyYW1lRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExhc3REZWNvZGVkRnJhbWUsIHBUbXAsYlNraXBGcmFtZUVmZmVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEMtPnBDMS0+bGFzdERlY29kZWRQbGFuZSA9IHBUbXA7Ci0gICAgICAgIH0KLQotICAgICAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludFZQUDogUmVuZGVyZWQgYXQgQ1RTICUuM2YiLCB0cyk7Ci0KLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocFRlbXAxW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBUZW1wMVtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcFRlbXAxW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwVGVtcDJbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXAyW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwVGVtcDJbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludFZQUDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheSgpCi0gKiBAYnJpZWYgICAgQXBwbHkgdmlkZW8gb3ZlcmxheSBmcm9tIHBQbGFuZUluIHRvIHBQbGFuZU91dAotICogQHBhcmFtICAgIHBDICAgICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcElucHV0UGxhbmVzICAgIChJTikgSW5wdXQgcmF3IFlVVjQyMCBpbWFnZQotICogQHBhcmFtICAgIHBPdXRwdXRQbGFuZXMgICAoSU4vT1VUKSBPdXRwdXQgcmF3IFlVVjQyMCBpbWFnZQotICogQHJldHVybiAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9FUlIKLU00VlNTM0dQUF9pbnRBcHBseVZpZGVvT3ZlcmxheSAoTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkgewotCi0gICAgTTRWU1MzR1BQX0NsaXBDb250ZXh0ICpwQ2xpcDsKLSAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKnBGeDsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLSAgICBNNE9TQV9Eb3VibGUgVmlkZW9FZmZlY3RUaW1lOwotICAgIE00T1NBX0RvdWJsZSBQZXJjZW50YWdlRG9uZTsKLSAgICBNNE9TQV9VSW50OCBOdW1BY3RpdmVFZmZlY3RzID0wOwotICAgIE00T1NBX1VJbnQzMiBDdHMgPSAwOwotICAgIE00T1NBX0ludDMyIG5leHRFZmZlY3RUaW1lOwotICAgIE00T1NBX0ludDMyIHRtcDsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBwQ2xpcCA9IHBDLT5wQzE7Ci0gICAgaWYgKHBDLT5iSXNzZWNvbmRDbGlwID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgTnVtQWN0aXZlRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHMxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE51bUFjdGl2ZUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzOwotICAgIH0KLSAgICBmb3IgKGk9MDsgaTxOdW1BY3RpdmVFZmZlY3RzOyBpKyspIHsKLSAgICAgICAgaWYgKHBDLT5iSXNzZWNvbmRDbGlwID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXV0pOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuICovCi0gICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgVmlkZW9FZmZlY3RUaW1lID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cykgKwotICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLnVpVHJhbnNpdGlvbkR1cmF0aW9uIC0gcEZ4LT51aVN0YXJ0VGltZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0W2ldXSk7Ci0gICAgICAgICAgICAvKiBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZmZlY3Qgd2UgYXJlLCBpbiBjbGlwLWJhc2UgdGltZS4gKi8KLSAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICBWaWRlb0VmZmVjdFRpbWUgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBGeC0+dWlTdGFydFRpbWU7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRG8gdGhlIGZyYW1pbmcob3ZlcmxheSkgZWZmZWN0IG9ubHksCi0gICAgICAgICAqIHNraXAgb3RoZXIgY29sb3IgZWZmZWN0IHdoaWNoIGhhZCBiZWVuIGFwcGxpZWQgKi8KLSAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFRvIGNhbGN1bGF0ZSAlLCBzdWJzdHJhY3QgdGltZUluY3JlbWVudCBiZWNhdXNlIGVmZmVjdCBzaG91bGQgZmluaXNoCi0gICAgICAgICAqIG9uIHRoZSBsYXN0IGZyYW1lIHdoaWNoIGlzIHByZXNlbnRlZCBmcm9tIENUUyA9IGVvZi10aW1lSW5jcmVtZW50IHRpbGwgQ1RTID0gZW9mICovCi0gICAgICAgIFBlcmNlbnRhZ2VEb25lID0gVmlkZW9FZmZlY3RUaW1lIC8gKChNNE9TQV9GbG9hdClwRngtPnVpRHVyYXRpb24pOwotCi0gICAgICAgIGlmIChQZXJjZW50YWdlRG9uZSA8IDAuMCkgewotICAgICAgICAgICAgUGVyY2VudGFnZURvbmUgPSAwLjA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFBlcmNlbnRhZ2VEb25lID4gMS4wKSB7Ci0gICAgICAgICAgICBQZXJjZW50YWdlRG9uZSA9IDEuMDsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgKiBDb21wdXRlIHdoZXJlIHdlIGFyZSBpbiB0aGUgZWZmZWN0IChzY2FsZSBpcyAwLT4xMDAwKSAqLwotICAgICAgICB0bXAgPSAoTTRPU0FfSW50MzIpKFBlcmNlbnRhZ2VEb25lICogMTAwMCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogU2V0IHRoZSBwcm9ncmVzcyBpbmZvIHByb3ZpZGVkIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiAqLwotICAgICAgICBleHRQcm9ncmVzcy51aVByb2dyZXNzID0gKE00T1NBX1VJbnQzMil0bXA7Ci0gICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgIGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgIGV4dFByb2dyZXNzLnVpQ2xpcFRpbWUgPSBleHRQcm9ncmVzcy51aU91dHB1dFRpbWUgLSBwQ2xpcC0+aVZvZmZzZXQ7Ci0gICAgICAgIGV4dFByb2dyZXNzLmJJc0xhc3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgbmV4dEVmZmVjdFRpbWUgPSAoTTRPU0FfSW50MzIpKHBDLT5ld2MuZElucHV0VmlkQ3RzIFwKLSAgICAgICAgICAgICsgcEMtPmRPdXRwdXRGcmFtZUR1cmF0aW9uKTsKLSAgICAgICAgaWYgKG5leHRFZmZlY3RUaW1lID49IChNNE9TQV9JbnQzMikocEZ4LT51aVN0YXJ0VGltZSArIHBGeC0+dWlEdXJhdGlvbikpIHsKLSAgICAgICAgICAgIGV4dFByb2dyZXNzLmJJc0xhc3QgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IHBGeC0+RXh0VmlkZW9FZmZlY3RGY3QocEZ4LT5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0LAotICAgICAgICAgICAgcFBsYW5lSW4sIHBQbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgcEZ4LT5WaWRlb0VmZmVjdFR5cGUgLSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCk7Ci0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5OiBcCi0gICAgICAgICAgICAgICAgRXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5OiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QoKQotICogQGJyaWVmICAgIEFwcGx5IHZpZGVvIGVmZmVjdCBmcm9tIHBQbGFuZUluIHRvIHBQbGFuZU91dAotICogQHBhcmFtICAgcEMgICAgICAgICAgICAgICAgKElOL09VVCkgSW50ZXJuYWwgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICB1aUNsaXAxb3JDbGlwMiAgICAoSU4vT1VUKSAxIGZvciBmaXJzdCBjbGlwLCAyIGZvciBzZWNvbmQgY2xpcAotICogQHBhcmFtICAgIHBJbnB1dFBsYW5lcyAgICAoSU4pIElucHV0IHJhdyBZVVY0MjAgaW1hZ2UKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgIChJTi9PVVQpIE91dHB1dCByYXcgWVVWNDIwIGltYWdlCi0gKiBAcGFyYW0gICAgYlNraXBGcmFtaW5nRWZmZWN0IChJTikgc2tpcCBmcmFtaW5nIGVmZmVjdCBmbGFnCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9FZmZlY3QgKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gICAgTTRPU0FfQm9vbCBiU2tpcEZyYW1pbmdFZmZlY3QpIHsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwOwotICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyAqcEZ4OwotICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzIGV4dFByb2dyZXNzOwotCi0gICAgTTRPU0FfRG91YmxlIFZpZGVvRWZmZWN0VGltZTsKLSAgICBNNE9TQV9Eb3VibGUgUGVyY2VudGFnZURvbmU7Ci0gICAgTTRPU0FfSW50MzIgdG1wOwotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZVRlbXBJbjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lVGVtcE91dDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAgcFRlbXBZdXZQbGFuZVszXTsKLSAgICBNNE9TQV9VSW50OCBpOwotICAgIE00T1NBX1VJbnQ4IE51bUFjdGl2ZUVmZmVjdHMgPTA7Ci0KLQotICAgIHBDbGlwID0gcEMtPnBDMTsKLSAgICBpZiAocEMtPmJJc3NlY29uZENsaXAgPT0gTTRPU0FfVFJVRSkKLSAgICB7Ci0gICAgICAgIE51bUFjdGl2ZUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTnVtQWN0aXZlRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHM7Ci0gICAgfQotCi0gICAgbWVtc2V0KCh2b2lkICopcFRlbXBZdXZQbGFuZSwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLQotICAgIC8qKgotICAgICogQWxsb2NhdGUgdGVtcG9yYXJ5IHBsYW5lIGlmIG5lZWRlZCBSQyAqLwotICAgIGlmIChOdW1BY3RpdmVFZmZlY3RzID4gMSkgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXBZdXZQbGFuZSwgcFBsYW5lT3V0LT51X3dpZHRoLAotICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0LT51X2hlaWdodCk7Ci0KLSAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoNCkgcmV0dXJucyAweCV4LFwKLSAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTROT19FUlJPUiIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHBDLT5ld2MuVnBwRXJyb3IgPSBlcnI7Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICBNNE5PX0VSUk9SOyAvKio8IFJldHVybiBubyBlcnJvciB0byB0aGUgZW5jb2RlciBjb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsc2UgaXQgbWF5IGxlYWsgaW4gc29tZSBzaXR1YXRpb25zLi4uKSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKE51bUFjdGl2ZUVmZmVjdHMgICUgMiA9PSAwKQotICAgIHsKLSAgICAgICAgcFBsYW5lVGVtcEluID0gcFBsYW5lSW47Ci0gICAgICAgIHBQbGFuZVRlbXBPdXQgPSBwVGVtcFl1dlBsYW5lOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwUGxhbmVUZW1wSW4gPSBwUGxhbmVJbjsKLSAgICAgICAgcFBsYW5lVGVtcE91dCA9IHBQbGFuZU91dDsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaTxOdW1BY3RpdmVFZmZlY3RzOyBpKyspCi0gICAgewotICAgICAgICBpZiAocEMtPmJJc3NlY29uZENsaXAgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgewotCi0KLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXV0pOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBob3cgZmFyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWZmZWN0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuICovCi0gICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgVmlkZW9FZmZlY3RUaW1lID0gKChNNE9TQV9JbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0cykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aVRyYW5zaXRpb25EdXJhdGlvbi0gcEZ4LT51aVN0YXJ0VGltZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBGeCA9ICYocEMtPnBFZmZlY3RzTGlzdFtwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0W2ldXSk7Ci0gICAgICAgICAgICAvKiBDb21wdXRlIGhvdyBmYXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBlZmZlY3Qgd2UgYXJlLCBpbiBjbGlwLWJhc2UgdGltZS4gKi8KLSAgICAgICAgICAgIC8vIERlY29ycmVsYXRlIGlucHV0IGFuZCBvdXRwdXQgZW5jb2RpbmcgdGltZXN0YW1wIHRvIGhhbmRsZSBlbmNvZGVyIHByZWZldGNoCi0gICAgICAgICAgICBWaWRlb0VmZmVjdFRpbWUgPSAoKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzKSAtIHBGeC0+dWlTdGFydFRpbWU7Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgLyogVG8gY2FsY3VsYXRlICUsIHN1YnN0cmFjdCB0aW1lSW5jcmVtZW50IGJlY2F1c2UgZWZmZWN0IHNob3VsZCBmaW5pc2ggb24gdGhlIGxhc3QgZnJhbWUqLwotICAgICAgICAvKiB3aGljaCBpcyBwcmVzZW50ZWQgZnJvbSBDVFMgPSBlb2YtdGltZUluY3JlbWVudCB0aWxsIENUUyA9IGVvZiAqLwotICAgICAgICBQZXJjZW50YWdlRG9uZSA9IFZpZGVvRWZmZWN0VGltZQotICAgICAgICAgICAgLyAoKE00T1NBX0Zsb2F0KXBGeC0+dWlEdXJhdGlvbi8qLSBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24qLyk7Ci0KLSAgICAgICAgaWYoIFBlcmNlbnRhZ2VEb25lIDwgMC4wICkKLSAgICAgICAgICAgIFBlcmNlbnRhZ2VEb25lID0gMC4wOwotCi0gICAgICAgIGlmKCBQZXJjZW50YWdlRG9uZSA+IDEuMCApCi0gICAgICAgICAgICBQZXJjZW50YWdlRG9uZSA9IDEuMDsKLQotICAgICAgICBzd2l0Y2goIHBGeC0+VmlkZW9FZmZlY3RUeXBlICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlRnJvbUJsYWNrOgotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogQ29tcHV0ZSB3aGVyZSB3ZSBhcmUgaW4gdGhlIGVmZmVjdCAoc2NhbGUgaXMgMC0+MTAyNCkuICovCi0gICAgICAgICAgICAgICAgdG1wID0gKE00T1NBX0ludDMyKShQZXJjZW50YWdlRG9uZSAqIDEwMjQpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lVGVtcEluLAotICAgICAgICAgICAgICAgICAgICAoTTRWaUNvbUltYWdlUGxhbmUgKilwUGxhbmVUZW1wT3V0LCB0bXAsIE00T1NBX05VTEwpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJucyBlcnJvciAweCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9GYWRlVG9CbGFjazoKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpICovCi0gICAgICAgICAgICAgICAgdG1wID0gKE00T1NBX0ludDMyKSgoIDEuMCAtIFBlcmNlbnRhZ2VEb25lKSAqIDEwMjQpOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lVGVtcEluLAotICAgICAgICAgICAgICAgICAgICAoTTRWaUNvbUltYWdlUGxhbmUgKilwUGxhbmVUZW1wT3V0LCB0bXAsIE00T1NBX05VTEwpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OlwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJucyBlcnJvciAweCV4LFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0xVTUFfRklMVEVSX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiggcEZ4LT5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICAgICAgPj0gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIEN0cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX0ludDMyIG5leHRFZmZlY3RUaW1lOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMDApICovCi0gICAgICAgICAgICAgICAgICAgIHRtcCA9IChNNE9TQV9JbnQzMikoUGVyY2VudGFnZURvbmUgKiAxMDAwKTsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIHByb2dyZXNzIGluZm8gcHJvdmlkZWQgdG8gdGhlIGV4dGVybmFsIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDMyKXRtcDsKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlPdXRwdXRUaW1lID0gKE00T1NBX1VJbnQzMilwQy0+ZXdjLmRJbnB1dFZpZEN0czsKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlDbGlwVGltZSA9IGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSAtIHBDbGlwLT5pVm9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MuYklzTGFzdCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0VGltZSA9IChNNE9TQV9JbnQzMikocEMtPmV3Yy5kSW5wdXRWaWRDdHMgXAotICAgICAgICAgICAgICAgICAgICAgICAgKyBwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZihuZXh0RWZmZWN0VGltZSA+PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUgKyBwRngtPnVpRHVyYXRpb24pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRQcm9ncmVzcy5iSXNMYXN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBIZXJlIHNraXAgdGhlIGZyYW1pbmcgZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgKiBkbyB0aGUgZnJhbWluZyBlZmZlY3QgYWZ0ZXIgYXBwbHkgcmVuZGVyaW5nIG1vZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwRngtPnhWU1MucEZyYW1pbmdCdWZmZXIgIT0gTTRPU0FfTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTa2lwRnJhbWluZ0VmZmVjdCA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFBsYW5lVGVtcE91dFswXS5wYWNfZGF0YSwgcFBsYW5lVGVtcEluWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXBJblswXS51X2hlaWdodCAqIHBQbGFuZVRlbXBJblswXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUGxhbmVUZW1wT3V0WzFdLnBhY19kYXRhLCBwUGxhbmVUZW1wSW5bMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lVGVtcEluWzFdLnVfaGVpZ2h0ICogcFBsYW5lVGVtcEluWzFdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBQbGFuZVRlbXBPdXRbMl0ucGFjX2RhdGEsIHBQbGFuZVRlbXBJblsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmVUZW1wSW5bMl0udV9oZWlnaHQgKiBwUGxhbmVUZW1wSW5bMl0udV93aWR0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHBGeC0+RXh0VmlkZW9FZmZlY3RGY3QocEZ4LT5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZVRlbXBJbiwgcFBsYW5lVGVtcE91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGeC0+VmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDogdW5rbm93biBlZmZlY3QgdHlwZSAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfSU5WQUxJRF9WSURFT19FRkZFQ1RfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRngtPlZpZGVvRWZmZWN0VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fRUZGRUNUX1RZUEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIFJDIFVwZGF0ZXMgcFRlbXBQbGFuZUluIGFuZCBwVGVtcFBsYW5lT3V0IGRlcGVuZGluZyBvbiBjdXJyZW50IGVmZmVjdCAqLwotICAgICAgICBpZiAoKChpICUgMiA9PSAwKSAmJiAoTnVtQWN0aXZlRWZmZWN0cyAgJSAyID09IDApKQotICAgICAgICAgICAgfHwgKChpICUgMiAhPSAwKSAmJiAoTnVtQWN0aXZlRWZmZWN0cyAlIDIgIT0gMCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUGxhbmVUZW1wSW4gPSBwVGVtcFl1dlBsYW5lOwotICAgICAgICAgICAgcFBsYW5lVGVtcE91dCA9IHBQbGFuZU91dDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQbGFuZVRlbXBJbiA9IHBQbGFuZU91dDsKLSAgICAgICAgICAgIHBQbGFuZVRlbXBPdXQgPSBwVGVtcFl1dlBsYW5lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgaWYocFRlbXBZdXZQbGFuZVtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKHBUZW1wWXV2UGxhbmVbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcFRlbXBZdXZQbGFuZVtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdDogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbigpCi0gKiBAYnJpZWYgICAgQXBwbHkgdmlkZW8gdHJhbnNpdGlvbiBlZmZlY3QgcEMxK3BDMi0+cFBsYW5lT3V0Ci0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgICAgICAoSU4vT1VUKSBJbnRlcm5hbCBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgIChJTi9PVVQpIE91dHB1dCByYXcgWVVWNDIwIGltYWdlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgICAgICAgICAgICAgTm8gZXJyb3IKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUgotTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbiggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0ICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00T1NBX0ludDMyIGlQcm9ncmVzczsKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyBleHRQcm9ncmVzczsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lOwotICAgIE00T1NBX0ludDMyIGk7Ci0gICAgY29uc3QgTTRPU0FfSW50MzIgaUR1ciA9IChNNE9TQV9JbnQzMilwQy0+Ci0gICAgICAgIHBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0udWlUcmFuc2l0aW9uRHVyYXRpb247Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgaG93IGZhciBmcm9tIHRoZSBlbmQgY3V0IHdlIGFyZSwgaW4gY2xpcC1iYXNlIHRpbWUuCi0gICAgKiBJdCBpcyBkb25lIHdpdGggaW50ZWdlcnMgYmVjYXVzZSB0aGUgb2Zmc2V0IGFuZCBiZWdpbiBjdXQgaGF2ZSBiZWVuIHJvdW5kZWQgYWxyZWFkeS4gKi8KLSAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoKE00T1NBX0RvdWJsZSlwQy0+cEMxLT5pRW5kVGltZSkgLSBwQy0+ZXdjLmRJbnB1dFZpZEN0cyArCi0gICAgICAgICgoTTRPU0FfRG91YmxlKXBDLT5wQzEtPmlWb2Zmc2V0KTsKLSAgICAvKioKLSAgICAqIFdlIG11c3QgcmVtb3ZlIHRoZSBkdXJhdGlvbiBvZiBvbmUgZnJhbWUsIGVsc2Ugd2Ugd291bGQgYWxtb3N0IG5ldmVyIHJlYWNoIHRoZSBlbmQKLSAgICAqIChJdCdzIGtpbmQgb2YgYSAicGlsZSBhbmQgaW50ZXJ2YWxzIiBpc3N1ZSkuICovCi0gICAgaVByb2dyZXNzIC09IChNNE9TQV9JbnQzMilwQy0+ZE91dHB1dEZyYW1lRHVyYXRpb247Ci0KLSAgICBpZiggaVByb2dyZXNzIDwgMCApIC8qKjwgU2FuaXR5IGNoZWNrcyAqLwotICAgIHsKLSAgICAgICAgaVByb2dyZXNzID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSB0cmFuc2l0aW9uLCBvbiBhIGJhc2UgMTAwMCAqLwotICAgIGlQcm9ncmVzcyA9ICggKCBpRHVyIC0gaVByb2dyZXNzKSAqIDEwMDApIC8gaUR1cjsKLQotICAgIC8qKgotICAgICogU2FuaXR5IGNoZWNrcyAqLwotICAgIGlmKCBpUHJvZ3Jlc3MgPCAwICkKLSAgICB7Ci0gICAgICAgIGlQcm9ncmVzcyA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYoIGlQcm9ncmVzcyA+IDEwMDAgKQotICAgIHsKLSAgICAgICAgaVByb2dyZXNzID0gMTAwMDsKLSAgICB9Ci0KLSAgICBzd2l0Y2goIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlRyYW5zaXRpb25CZWhhdmlvdXIgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZTUzNHUFBfVHJhbnNpdGlvbkJlaGF2aW91cl9TcGVlZFVwOgotICAgICAgICAgICAgaVByb2dyZXNzID0gKCBpUHJvZ3Jlc3MgKiBpUHJvZ3Jlc3MpIC8gMTAwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfTGluZWFyOgotICAgICAgICAgICAgLypkbyBub3RoaW5nKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU3BlZWREb3duOgotICAgICAgICAgICAgaVByb2dyZXNzID0gKE00T1NBX0ludDMyKShzcXJ0KGlQcm9ncmVzcyAqIDEwMDApKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfU2xvd01pZGRsZToKLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoc3FydChpUHJvZ3Jlc3MgKiA1MDApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpUHJvZ3Jlc3MgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKCggKCAoIGlQcm9ncmVzcyAtIDUwMCkgKiAoaVByb2dyZXNzIC0gNTAwKSkKLSAgICAgICAgICAgICAgICAgICAgLyA1MDApICsgNTAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX1RyYW5zaXRpb25CZWhhdmlvdXJfRmFzdE1pZGRsZToKLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlQcm9ncmVzcyA9IChNNE9TQV9JbnQzMikoKCBpUHJvZ3Jlc3MgKiBpUHJvZ3Jlc3MpIC8gNTAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpUHJvZ3Jlc3MgPSAoTTRPU0FfSW50MzIpKHNxcnQoKCBpUHJvZ3Jlc3MgLSA1MDApICogNTAwKSArIDUwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLypkbyBub3RoaW5nKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHN3aXRjaCggcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+dWlDdXJyZW50Q2xpcF0uVmlkZW9UcmFuc2l0aW9uVHlwZSApCi0gICAgewotICAgICAgICBjYXNlIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9Dcm9zc0ZhZGU6Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQXBwbHkgdGhlIHRyYW5zaXRpb24gZWZmZWN0ICovCi0gICAgICAgICAgICBlcnIgPSBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwKE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcEMtPnl1djEsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcEMtPnl1djIsCi0gICAgICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lICopcFBsYW5lT3V0LCBpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbjpcCi0gICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwIHJldHVybnMgZXJyb3IgMHgleCxcCi0gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBNNFZTUzNHUFBfRVJSX1RSQU5TSVRJT05fRklMVEVSX0VSUk9SIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9UUkFOU0lUSU9OX0ZJTFRFUl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX05vbmU6Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVGhpcyBpcyBhIHN0dXBpZC1ub24gb3B0aW1pemVkIHZlcnNpb24gb2YgdGhlIE5vbmUgdHJhbnNpdGlvbi4uLgotICAgICAgICAgICAgKiBXZSBjb3B5IHRoZSBZVVYgZnJhbWUgKi8KLSAgICAgICAgICAgIGlmKCBpUHJvZ3Jlc3MgPCA1MDAgKSAvKio8IGZpcnN0IGhhbGYgb2YgdHJhbnNpdGlvbiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQbGFuZSA9IHBDLT55dXYxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKio8IHNlY29uZCBoYWxmIG9mIHRyYW5zaXRpb24gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGxhbmUgPSBwQy0+eXV2MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBZVVYgZnJhbWVzICovCi0gICAgICAgICAgICBpID0gMzsKLQotICAgICAgICAgICAgd2hpbGUoIGktLSA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZU91dFtpXS5wYWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgKHZvaWQgKilwUGxhbmVbaV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFtpXS51X3N0cmlkZSAqIHBQbGFuZU91dFtpXS51X2hlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYoIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlZpZGVvVHJhbnNpdGlvblR5cGUKLSAgICAgICAgICAgICAgICA+PSBNNFZTUzNHUFBfa1ZpZGVvVHJhbnNpdGlvblR5cGVfRXh0ZXJuYWwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogU2V0IHRoZSBwcm9ncmVzcyBpbmZvIHByb3ZpZGVkIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpUHJvZ3Jlc3MgPSAoTTRPU0FfVUludDMyKWlQcm9ncmVzczsKLSAgICAgICAgICAgICAgICAvLyBEZWNvcnJlbGF0ZSBpbnB1dCBhbmQgb3V0cHV0IGVuY29kaW5nIHRpbWVzdGFtcCB0byBoYW5kbGUgZW5jb2RlciBwcmVmZXRjaAotICAgICAgICAgICAgICAgIGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSA9IChNNE9TQV9VSW50MzIpcEMtPmV3Yy5kSW5wdXRWaWRDdHM7Ci0gICAgICAgICAgICAgICAgZXh0UHJvZ3Jlc3MudWlDbGlwVGltZSA9IGV4dFByb2dyZXNzLnVpT3V0cHV0VGltZSAtIHBDLT5wQzEtPmlWb2Zmc2V0OwotCi0gICAgICAgICAgICAgICAgZXJyID0gcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXBdLkV4dFZpZGVvVHJhbnNpdGlvbkZjdCgKLSAgICAgICAgICAgICAgICAgICAgcEMtPnBUcmFuc2l0aW9uTGlzdFtwQy0+Ci0gICAgICAgICAgICAgICAgICAgIHVpQ3VycmVudENsaXBdLnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0LAotICAgICAgICAgICAgICAgICAgICBwQy0+eXV2MSwgcEMtPnl1djIsIHBQbGFuZU91dCwgJmV4dFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICBwQy0+cFRyYW5zaXRpb25MaXN0W3BDLT4KLSAgICAgICAgICAgICAgICAgICAgdWlDdXJyZW50Q2xpcF0uVmlkZW9UcmFuc2l0aW9uVHlwZQotICAgICAgICAgICAgICAgICAgICAtIE00VlNTM0dQUF9rVmlkZW9UcmFuc2l0aW9uVHlwZV9FeHRlcm5hbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludFZpZGVvVHJhbnNpdGlvbjpcCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCB2aWRlbyB0cmFuc2l0aW9uIGZ1bmN0aW9uIHJldHVybnMgMHgleCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50VmlkZW9UcmFuc2l0aW9uOiB1bmtub3duIHRyYW5zaXRpb24gdHlwZSAoMHgleCksXAotICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9JTlZBTElEX1ZJREVPX1RSQU5TSVRJT05fVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgIHBDLT5wVHJhbnNpdGlvbkxpc3RbcEMtPnVpQ3VycmVudENsaXBdLlZpZGVvVHJhbnNpdGlvblR5cGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfRVJSX0lOVkFMSURfVklERU9fVFJBTlNJVElPTl9UWVBFOwotICAgICAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICogICAgUmV0dXJuICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00VlNTM0dQUF9pbnRWaWRlb1RyYW5zaXRpb246IHJldHVybmluZyBNNE5PX0VSUk9SIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50VXBkYXRlVGltZUluZm8oKQotICogQGJyaWVmICAgIFVwZGF0ZSBiaXQgc3RyZWFtIHRpbWUgaW5mbyBieSBDb3VudGVyIFRpbWUgU3lzdGVtIHRvIGJlIGNvbXBsaWFudCB3aXRoCi0gKiAgICAgICAgICBwbGF5ZXJzIHVzaW5nIGJpdCBzdHJlYW0gdGltZSBpbmZvCi0gKiBAbm90ZSAgICBIMjYzIHVzZXMgYW4gYWJzb2x1dGUgdGltZSBjb3VudGVyIHVubGlrZSBNUEVHNCB3aGljaCB1c2VzIEdyb3VwIE9mIFZvcHMKLSAqICAgICAgICAgIChHT1YsIHNlZSB0aGUgc3RhbmRhcmQpCi0gKiBAcGFyYW0gICBwQyAgICAgICAgICAgICAgICAgICAgKElOL09VVCkgcmV0dXJucyB0aW1lIHVwZGF0ZWQgdmlkZW8gQVUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9mZnNldCBiZXR3ZWVuIHN5c3RlbSBhbmQgdmlkZW8gdGltZSAoTVBFRzQgb25seSkKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGNsaXAgKE1QRUc0IG9ubHkpCi0gKiBAcmV0dXJuICAgIG5vdGhpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRVcGRhdGVUaW1lSW5mbyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00U1lTX0FjY2Vzc1VuaXQgKnBBVSApCi17Ci0gICAgTTRPU0FfVUludDggdWlUbXA7Ci0gICAgTTRPU0FfVUludDMyIHVpQ3RzID0gMDsKLSAgICBNNE9TQV9NZW1BZGRyOCBwVG1wOwotICAgIE00T1NBX1VJbnQzMiB1aUFkZDsKLSAgICBNNE9TQV9VSW50MzIgdWlDdXJyR292OwotICAgIE00T1NBX0ludDggaURpZmY7Ci0KLSAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQgKnBDbGlwQ3R4dCA9IHBDLT5wQzE7Ci0gICAgTTRPU0FfSW50MzIgKnBPZmZzZXQgPSAmKHBDLT5ld2MuaU1wZWc0R292T2Zmc2V0KTsKLQotICAgIC8qKgotICAgICogU2V0IEgyNjMgdGltZSBjb3VudGVyIGZyb20gc3lzdGVtIHRpbWUgKi8KLSAgICBpZiggTTRTWVNfa0gyNjMgPT0gcEFVLT5zdHJlYW0tPnN0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgdWlUbXAgPSAoTTRPU0FfVUludDgpKChNNE9TQV9VSW50MzIpKCAoIHBBVS0+Q1RTICogMzApIC8gMTAwMSArIDAuNSkKLSAgICAgICAgICAgICUgTTRWU1MzR1BQX0VESVRfSDI2M19NT0RVTE9fVElNRSk7Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTZXRIMjYzVGltZUNvdW50ZXIoKE00T1NBX01lbUFkZHI4KShwQVUtPmRhdGFBZGRyZXNzKSwKLSAgICAgICAgICAgIHVpVG1wKTsKLSAgICB9Ci0gICAgLyoKLSAgICAqIFNldCBNUEVHNCBHT1YgdGltZSBjb3VudGVyIHJlZ2FyZGluZyB2aWRlbyBhbmQgc3lzdGVtIHRpbWUgKi8KLSAgICBlbHNlIGlmKCBNNFNZU19rTVBFR180ID09IHBBVS0+c3RyZWFtLT5zdHJlYW1UeXBlICkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICogSWYgR09WLgotICAgICAgICAqIGJld2FyZSBvZiBsaXR0bGUvYmlnIGVuZGlhbiEgKi8KLSAgICAgICAgLyogY29ycmVjdGlvbjogcmVhZCA4IGJpdHMgYmxvY2sgaW5zdGVhZCBvZiBvbmUgMzIgYml0cyBibG9jayAqLwotICAgICAgICBNNE9TQV9VSW50OCAqdGVtcDggPSAoTTRPU0FfVUludDggKikocEFVLT5kYXRhQWRkcmVzcyk7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wMzIgPSAwOwotCi0gICAgICAgIHRlbXAzMiA9ICggMHgwMDAwMDBmZiAmIChNNE9TQV9VSW50MzIpKCp0ZW1wOCkpCi0gICAgICAgICAgICArICgweDAwMDBmZjAwICYgKChNNE9TQV9VSW50MzIpKCoodGVtcDggKyAxKSkpIDw8IDgpCi0gICAgICAgICAgICArICgweDAwZmYwMDAwICYgKChNNE9TQV9VSW50MzIpKCoodGVtcDggKyAyKSkpIDw8IDE2KQotICAgICAgICAgICAgKyAoMHhmZjAwMDAwMCAmICgoTTRPU0FfVUludDMyKSgqKHRlbXA4ICsgMykpKSA8PCAyNCk7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UzXzIoIlJDOiBUZW1wMzI6IDB4JXgsIGRhdGFBZGRyZXNzOiAweCV4XG4iLCB0ZW1wMzIsCi0gICAgICAgICAgICAqKHBBVS0+ZGF0YUFkZHJlc3MpKTsKLQotICAgICAgICBpZiggTTRWU1MzR1BQX0VESVRfR09WX0hFQURFUiA9PSB0ZW1wMzIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVG1wID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKHBBVS0+ZGF0YUFkZHJlc3MKLSAgICAgICAgICAgICAgICArIDEpOyAvKio8IEp1bXAgdG8gdGhlIHRpbWUgY29kZSAoanVzdCBhZnRlciB0aGUgMzIgYml0cyBoZWFkZXIpICovCi0gICAgICAgICAgICB1aUFkZCA9IChNNE9TQV9VSW50MzIpKHBBVS0+Q1RTKSsoICpwT2Zmc2V0KTsKLQotICAgICAgICAgICAgc3dpdGNoKCBwQ2xpcEN0eHQtPmJNcGVnNEdvdlN0YXRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIE00T1NBX0ZBTFNFOiAvKjwgSU5JVCAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWRlbyB0aW1lID0gY2VpbCAoc3lzdGVtIHRpbWUgKyBvZmZzZXQpICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1aUN0cyA9ICggdWlBZGQgKyA5OTkpIC8gMTAwMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0IHVwZGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKCAqcE9mZnNldCkgKz0gKCggdWlDdHMgKiAxMDAwKSAtIHVpQWRkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB2YWx1ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZVNldCA9IHVpQ3RzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGF0ZSB0byAnZmlyc3QnICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPmJNcGVnNEdvdlN0YXRlID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTRPU0FfVFJVRTogLyo8IFVQREFURSAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgY3VycmVudCBHb3YgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdihwVG1wLCAmdWlDdXJyR292KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogdmlkZW8gdGltZSA9IGZsb29yIG9yIGNlaWwgKHN5c3RlbSB0aW1lICsgb2Zmc2V0KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdWlDdHMgPSAodWlBZGQgLyAxMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlEaWZmID0gKE00T1NBX0ludDgpKHVpQ3VyckdvdgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlR2V0IC0gdWlDdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBDbGlwQ3R4dC0+dWlNcGVnNFByZXZHb3ZWYWx1ZVNldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNlaWxpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpRGlmZiA+IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ3RzICs9IChNNE9TQV9VSW50MzIpKGlEaWZmKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mZnNldCB1cGRhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICpwT2Zmc2V0KSArPSAoKCB1aUN0cyAqIDEwMDApIC0gdWlBZGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHZhbHVlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlR2V0ID0gdWlDdXJyR292OwotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT51aU1wZWc0UHJldkdvdlZhbHVlU2V0ID0gdWlDdHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdihwVG1wLCB1aUN0cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludENoZWNrVmlkZW9FZmZlY3RzKCkKLSAqIEBicmllZiAgICBDaGVjayB3aGljaCB2aWRlbyBlZmZlY3QgbXVzdCBiZSBhcHBsaWVkIGF0IHRoZSBjdXJyZW50IHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX1ZvaWQKLU00VlNTM0dQUF9pbnRDaGVja1ZpZGVvRWZmZWN0cyggTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpQ2xpcE51bWJlciApCi17Ci0gICAgTTRPU0FfVUludDggdWlDbGlwSW5kZXg7Ci0gICAgTTRPU0FfVUludDggdWlGeEluZGV4LCBpOwotICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCAqcENsaXA7Ci0gICAgTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICpwRng7Ci0gICAgTTRPU0FfSW50MzIgT2ZmLCBCQywgRUM7Ci0gICAgLy8gRGVjb3JyZWxhdGUgaW5wdXQgYW5kIG91dHB1dCBlbmNvZGluZyB0aW1lc3RhbXAgdG8gaGFuZGxlIGVuY29kZXIgcHJlZmV0Y2gKLSAgICBNNE9TQV9JbnQzMiB0ID0gKE00T1NBX0ludDMyKXBDLT5ld2MuZElucHV0VmlkQ3RzOwotCi0gICAgdWlDbGlwSW5kZXggPSBwQy0+dWlDdXJyZW50Q2xpcDsKLSAgICBpZiAodWlDbGlwTnVtYmVyID09IDEpIHsKLSAgICAgICAgcENsaXAgPSBwQy0+cEMxOwotICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX0ZBTFNFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDbGlwID0gcEMtPnBDMjsKLSAgICAgICAgcEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0gICAgLyoqCi0gICAgKiBTaG9ydGN1dHMgZm9yIGNvZGUgcmVhZGFiaWxpdHkgKi8KLSAgICBPZmYgPSBwQ2xpcC0+aVZvZmZzZXQ7Ci0gICAgQkMgPSBwQ2xpcC0+aUFjdHVhbFZpZGVvQmVnaW5DdXQ7Ci0gICAgRUMgPSBwQ2xpcC0+aUVuZFRpbWU7Ci0KLSAgICBpID0gMDsKLQotICAgIGZvciAoIHVpRnhJbmRleCA9IDA7IHVpRnhJbmRleCA8IHBDLT5uYkVmZmVjdHM7IHVpRnhJbmRleCsrICkKLSAgICB7Ci0gICAgICAgIC8qKiBTaG9ydGN1dCwgcmV2ZXJzZSBvcmRlciBiZWNhdXNlIG9mIHByaW9yaXR5IGJldHdlZW4gZWZmZWN0cyhFbmRFZmZlY3QgYWx3YXlzIGNsZWFuICkqLwotICAgICAgICBwRnggPSAmKHBDLT5wRWZmZWN0c0xpc3RbcEMtPm5iRWZmZWN0cyAtIDEgLSB1aUZ4SW5kZXhdKTsKLQotICAgICAgICBpZiggTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfTm9uZSAhPSBwRngtPlZpZGVvRWZmZWN0VHlwZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBDaGVjayBpZiB0aGVyZSBpcyBhY3R1YWxseSBhIHZpZGVvIGVmZmVjdCAqLwotCi0gICAgICAgICAgICAgaWYodWlDbGlwTnVtYmVyID09MSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBBcmUgd2UgYWZ0ZXIgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIGVmZmVjdD8KLSAgICAgICAgICAgICAgICAgKiBvciBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICggKHQgPj0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHQgPD0gKE00T1NBX0ludDMyKShwRngtPnVpU3RhcnRUaW1lICsgcEZ4LT51aUR1cmF0aW9uKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGFjdGl2ZSBlZmZlY3QocykgKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBBY3RpdmVFZmZlY3RzTGlzdFtpXSA9IHBDLT5uYkVmZmVjdHMtMS11aUZ4SW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjb3VudGVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+YkNsaXAxQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICogRm9yIGFsbCBleHRlcm5hbCBlZmZlY3RzIHNldCB0aGlzIGZsYWcgdG8gdHJ1ZS4gKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEZ4LT5WaWRlb0VmZmVjdFR5cGUgPiBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9FeHRlcm5hbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPm1fYkNsaXBFeHRlcm5hbEhhc1N0YXJ0ZWQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqPCBBcmUgd2UgaW50byB0aGUgZWZmZWN0IGR1cmF0aW9uPyAqLwotICAgICAgICAgICAgICAgIGlmICggKChNNE9TQV9JbnQzMikodCArIHBDLT5wVHJhbnNpdGlvbkxpc3RbdWlDbGlwSW5kZXhdLnVpVHJhbnNpdGlvbkR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICA+PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUpKQotICAgICAgICAgICAgICAgICAgICAmJiAoIChNNE9TQV9JbnQzMikodCArIHBDLT5wVHJhbnNpdGlvbkxpc3RbdWlDbGlwSW5kZXhdLnVpVHJhbnNpdGlvbkR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICA8PSAoTTRPU0FfSW50MzIpKHBGeC0+dWlTdGFydFRpbWUgKyBwRngtPnVpRHVyYXRpb24pKSApIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFNldCB0aGUgYWN0aXZlIGVmZmVjdChzKSAqLwotICAgICAgICAgICAgICAgICAgICBwQy0+cEFjdGl2ZUVmZmVjdHNMaXN0MVtpXSA9IHBDLT5uYkVmZmVjdHMtMS11aUZ4SW5kZXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBjb3VudGVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBGeC0+eFZTUy5wRnJhbWluZ0J1ZmZlciAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+YkNsaXAyQWN0aXZlRnJhbWluZ0VmZmVjdCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIEZvciBhbGwgZXh0ZXJuYWwgZWZmZWN0cyBzZXQgdGhpcyBmbGFnIHRvIHRydWUuICovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBGeC0+VmlkZW9FZmZlY3RUeXBlID4gTTRWU1MzR1BQX2tWaWRlb0VmZmVjdFR5cGVfRXh0ZXJuYWwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX2JDbGlwRXh0ZXJuYWxIYXNTdGFydGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBUaGUgdGhpcmQgZWZmZWN0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eSwgdGhlbiB0aGUgc2Vjb25kIG9uZSwgdGhlbiB0aGUgZmlyc3Qgb25lLgotICAgICAgICAgICAgICAgICAgICAgKiBIZW5jZSwgYXMgc29vbiBhcyB3ZSBmb3VuZCBhbiBhY3RpdmUgZWZmZWN0LCB3ZSBjYW4gZ2V0IG91dCBvZiB0aGlzIGxvb3AgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTRWSURFT0VESVRJTkdfa0gyNjQgIT0KLSAgICAgICAgICAgICAgICAgICAgcEMtPnBDMS0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgTXBlZzQgYW5kIEgyNjMgY2xpcHMsIGZ1bGwgZGVjb2RlIGVuY29kZSBub3QgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fYkNsaXBFeHRlcm5hbEhhc1N0YXJ0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZigxPT11aUNsaXBOdW1iZXIpCi0gICAgewotICAgIC8qKgotICAgICAqIFNhdmUgbnVtYmVyIG9mIGFjdGl2ZSBlZmZlY3RzICovCi0gICAgICAgIHBDLT5uYkFjdGl2ZUVmZmVjdHMgPSBpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+bmJBY3RpdmVFZmZlY3RzMSA9IGk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBDaGFuZ2UgdGhlIGFic29sdXQgdGltZSB0byBjbGlwIHJlbGF0ZWQgdGltZSAqLwotICAgIHQgLT0gT2ZmOwotCi0gICAgLyoqCi0gICAgKiBDaGVjayBpZiB3ZSBhcmUgb24gdGhlIGJlZ2luIGN1dCAoZm9yIGNsaXAxIG9ubHkpICovCi0gICAgaWYoICggMCAhPSBCQykgJiYgKHQgPT0gQkMpICYmICgxID09IHVpQ2xpcE51bWJlcikgKQotICAgIHsKLSAgICAgICAgcEMtPmJDbGlwMUF0QmVnaW5DdXQgPSBNNE9TQV9UUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQy0+YkNsaXAxQXRCZWdpbkN1dCA9IE00T1NBX0ZBTFNFOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgQ3JlYXRlcyB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXIoIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQyApCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNEVOQ09ERVJfQWR2YW5jZWRQYXJhbXMgRW5jUGFyYW1zOwotCi0gICAgLyoqCi0gICAgKiBTaW11bGF0ZSBhIHdyaXRlciBpbnRlcmZhY2Ugd2l0aCBvdXIgc3BlY2lmaWMgZnVuY3Rpb24gKi8KLSAgICBwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UucFByb2Nlc3NBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRQcm9jZXNzQVU7IC8qKjwgVGhpcyBmdW5jdGlvbiBpcyBWU1MgM0dQUCBzcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGZvbGxvdyB0aGUgd3JpdGVyIGludGVyZmFjZSAqLwotICAgIHBDLT5ld2MuT3VyV3JpdGVyRGF0YUludGVyZmFjZS5wU3RhcnRBVSA9Ci0gICAgICAgIE00VlNTM0dQUF9pbnRTdGFydEFVOyAvKio8IFRoaXMgZnVuY3Rpb24gaXMgVlNTIDNHUFAgc3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaXQgZm9sbG93IHRoZSB3cml0ZXIgaW50ZXJmYWNlICovCi0gICAgcEMtPmV3Yy5PdXJXcml0ZXJEYXRhSW50ZXJmYWNlLnBXcml0ZXJDb250ZXh0ID0KLSAgICAgICAgKE00V1JJVEVSX0NvbnRleHQpCi0gICAgICAgIHBDOyAvKio8IFdlIGdpdmUgdGhlIGludGVybmFsIGNvbnRleHQgYXMgd3JpdGVyIGNvbnRleHQgKi8KLQotICAgIC8qKgotICAgICogR2V0IHRoZSBlbmNvZGVyIGludGVyZmFjZSwgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotICAgIGlmKCBNNE9TQV9OVUxMID09IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cyApCi0gICAgewotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfc2V0Q3VycmVudFZpZGVvRW5jb2RlcigmcEMtPlNoZWxsQVBJLAotICAgICAgICAgICAgcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUpOwotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBzZXRDdXJyZW50RW5jb2RlciByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgTTRFUlJfQ0hFQ0tfUkVUVVJOKGVycik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgZW5jb2RlciBzaGVsbCBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBWU1Mgc2V0dGluZ3MgKi8KLQotICAgIC8qIENvbW1vbiBwYXJhbWV0ZXJzICovCi0gICAgRW5jUGFyYW1zLklucHV0Rm9ybWF0ID0gTTRFTkNPREVSX2tJWVVWNDIwOwotICAgIEVuY1BhcmFtcy5GcmFtZVdpZHRoID0gcEMtPmV3Yy51aVZpZGVvV2lkdGg7Ci0gICAgRW5jUGFyYW1zLkZyYW1lSGVpZ2h0ID0gcEMtPmV3Yy51aVZpZGVvSGVpZ2h0OwotICAgIEVuY1BhcmFtcy51aVRpbWVTY2FsZSA9IHBDLT5ld2MudWlWaWRlb1RpbWVTY2FsZTsKLQotICAgIGlmKCBwQy0+YklzTU1TID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0gICAgICAgIC8qIE5vIHN0cmljdCByZWd1bGF0aW9uIGluIHZpZGVvIGVkaXRvciAqLwotICAgICAgICAvKiBCZWNhdXNlIG9mIHRoZSBlZmZlY3RzIGFuZCB0cmFuc2l0aW9ucyB3ZSBzaG91bGQgYWxsb3cgbW9yZSBmbGV4aWJpbGl0eSAqLwotICAgICAgICAvKiBBbHNvIGl0IHByZXZlbnRzIHRvIGRyb3AgaW1wb3J0YW50IGZyYW1lcyAod2l0aCBhIGJhZCByZXN1bHQgb24gc2hlZHVsaW5nIGFuZAotICAgICAgICBibG9jayBlZmZldGNzKSAqLwotICAgICAgICBFbmNQYXJhbXMuYkludGVybmFsUmVndWxhdGlvbiA9IE00T1NBX0ZBTFNFOwotICAgICAgICAvLyBWYXJpYWJsZSBmcmFtZXJhdGUgaXMgbm90IHN1cHBvcnRlZCBieSBTdGFnZUZyaWdodCBlbmNvZGVycwotICAgICAgICBFbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRFTkNPREVSX2szMF9GUFM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIEluIGNhc2Ugb2YgTU1TIG1vZGUsIHdlIG5lZWQgdG8gZW5hYmxlIGJpdHJhdGUgcmVndWxhdGlvbiB0byBiZSBzdXJlICovCi0gICAgICAgIC8qIHRvIHJlYWNoIHRoZSB0YXJnZXRlZCBvdXRwdXQgZmlsZSBzaXplICovCi0gICAgICAgIEVuY1BhcmFtcy5iSW50ZXJuYWxSZWd1bGF0aW9uID0gTTRPU0FfVFJVRTsKLSAgICAgICAgRW5jUGFyYW1zLkZyYW1lUmF0ZSA9IHBDLT5NTVN2aWRlb0ZyYW1lcmF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqIE90aGVyIGVuY29kZXIgc2V0dGluZ3MgKGRlZmF1bHRzKSAqLwotICAgIEVuY1BhcmFtcy51aUhvcml6b250YWxTZWFyY2hSYW5nZSA9IDA7ICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy51aVZlcnRpY2FsU2VhcmNoUmFuZ2UgPSAwOyAgICAgICAvKiB1c2UgZGVmYXVsdCAqLwotICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7ICAvKiBubyBlcnJvciByZXNpbGllbmNlICovCi0gICAgRW5jUGFyYW1zLnVpSVZvcFBlcmlvZCA9IDA7ICAgICAgICAgICAgICAgIC8qIHVzZSBkZWZhdWx0ICovCi0gICAgRW5jUGFyYW1zLnVpTW90aW9uRXN0aW1hdGlvblRvb2xzID0gMDsgICAgIC8qIE00Vl9NT1RJT05fRVNUX1RPT0xTX0FMTCAqLwotICAgIEVuY1BhcmFtcy5iQWNQcmVkaWN0aW9uID0gTTRPU0FfVFJVRTsgICAgICAvKiB1c2UgQUMgcHJlZGljdGlvbiAqLwotICAgIEVuY1BhcmFtcy51aVN0YXJ0aW5nUXVhbnRpemVyVmFsdWUgPSAxMDsgICAvKiBpbml0aWFsIFFQID0gMTAgKi8KLSAgICBFbmNQYXJhbXMuYkRhdGFQYXJ0aXRpb25pbmcgPSBNNE9TQV9GQUxTRTsgLyogbm8gZGF0YSBwYXJ0aXRpb25pbmcgKi8KLQotICAgIC8qKgotICAgICogU2V0IHRoZSB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbCAqLwotICAgIEVuY1BhcmFtcy52aWRlb1Byb2ZpbGUgPSBwQy0+ZXdjLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICBFbmNQYXJhbXMudmlkZW9MZXZlbD0gcEMtPmV3Yy5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgc3dpdGNoICggcEMtPmV3Yy5WaWRlb1N0cmVhbVR5cGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFNZU19rSDI2MzoKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2MzsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFNZU19rTVBFR180OgotCi0gICAgICAgICAgICBFbmNQYXJhbXMuRm9ybWF0ID0gTTRFTkNPREVSX2tNUEVHNDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDg7Ci0gICAgICAgICAgICBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID0gKE00T1NBX1VJbnQ4KSgoIHBDLT5kT3V0cHV0RnJhbWVEdXJhdGlvbgotICAgICAgICAgICAgICAgICogcEMtPmV3Yy51aVZpZGVvVGltZVNjYWxlKSAvIDEwMDAuMCArIDAuNSk7Ci0KLSAgICAgICAgICAgIGlmKCBFbmNQYXJhbXMudWlSYXRlRmFjdG9yID09IDAgKQotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy51aVJhdGVGYWN0b3IgPSAxOyAvKiBkZWZhdWx0ICovCi0KLSAgICAgICAgICAgIGlmKCBNNE9TQV9GQUxTRSA9PSBwQy0+ZXdjLmJWaWRlb0RhdGFQYXJ0aXRpb25pbmcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRXJyb3JSZXNpbGllbmNlID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJEYXRhUGFydGl0aW9uaW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00U1lTX2tIMjY0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IE00U1lTX0gyNjQiKTsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLkZvcm1hdCA9IE00RU5DT0RFUl9rSDI2NDsKLQotICAgICAgICAgICAgRW5jUGFyYW1zLnVpU3RhcnRpbmdRdWFudGl6ZXJWYWx1ZSA9IDEwOwotICAgICAgICAgICAgRW5jUGFyYW1zLnVpUmF0ZUZhY3RvciA9IDE7IC8qIGRlZmF1bHQgKi8KLQotICAgICAgICAgICAgRW5jUGFyYW1zLmJFcnJvclJlc2lsaWVuY2UgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIEVuY1BhcmFtcy5iRGF0YVBhcnRpdGlvbmluZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgLy9FbmNQYXJhbXMuRnJhbWVSYXRlID0gTTRWSURFT0VESVRJTkdfazVfRlBTOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBVbmtub3duIHZpZGVvU3RyZWFtVHlwZSAweCV4IiwKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZpZGVvU3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9FRElUSU5HX1VOU1VQUE9SVEVEX1ZJREVPX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBpZiggcEMtPmJJc01NUyA9PSBNNE9TQV9GQUxTRSApCi0gICAgewotICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBFbmNQYXJhbXMuQml0cmF0ZSA9IHBDLT51aU1NU1ZpZGVvQml0cmF0ZTsgLyogUkMgKi8KLSAgICAgICAgRW5jUGFyYW1zLnVpVGltZVNjYWxlID0gMDsgLyogV2UgbGV0IHRoZSBlbmNvZGVyIGNob29zZSB0aGUgdGltZXNjYWxlICovCi0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IGNhbGxpbmcgZW5jb2RlciBwRmN0SW5pdCIpOwotICAgIC8qKgotICAgICogSW5pdCB0aGUgdmlkZW8gZW5jb2RlciAoYWR2YW5jZWQgc2V0dGluZ3MgdmVyc2lvbiBvZiB0aGUgZW5jb2RlciBPcGVuIGZ1bmN0aW9uKSAqLwotICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdEluaXQoJnBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLk91cldyaXRlckRhdGFJbnRlcmZhY2UsIE00VlNTM0dQUF9pbnRWUFAsIHBDLAotICAgICAgICBwQy0+U2hlbGxBUEkucEN1cnJlbnRWaWRlb0VuY29kZXJFeHRlcm5hbEFQSSwKLSAgICAgICAgcEMtPlNoZWxsQVBJLnBDdXJyZW50VmlkZW9FbmNvZGVyVXNlckRhdGEpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0SW5pdCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludENyZWF0ZVZpZGVvRW5jb2RlcjogY2FsbGluZyBlbmNvZGVyIHBGY3RPcGVuIik7Ci0KLSAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RPcGVuKHBDLT5ld2MucEVuY0NvbnRleHQsCi0gICAgICAgICZwQy0+ZXdjLldyaXRlclZpZGVvQVUsICZFbmNQYXJhbXMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRDcmVhdGVWaWRlb0VuY29kZXI6IHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0T3BlbiByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlclN0b3BwZWQ7Ci0gICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBjYWxsaW5nIGVuY29kZXIgcEZjdFN0YXJ0Iik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCAhPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCApCi0gICAgewotICAgICAgICBlcnIgPSBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdGFydCgKLSAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0YXJ0IHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlclJ1bm5pbmc7Ci0KLSAgICAvKioKLSAgICAqICAgIFJldHVybiAqLwotICAgIE00T1NBX1RSQUNFM18wKCJNNFZTUzNHUFBfaW50Q3JlYXRlVmlkZW9FbmNvZGVyOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50RGVzdHJveVZpZGVvRW5jb2RlcigpCi0gKiBAYnJpZWYgICAgRGVzdHJveSB0aGUgdmlkZW8gZW5jb2RlcgotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyKCBNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqcEMgKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcEMtPmV3Yy5wRW5jQ29udGV4dCApCi0gICAgewotICAgICAgICBpZiggTTRWU1MzR1BQX2tFbmNvZGVyUnVubmluZyA9PSBwQy0+ZXdjLmVuY29kZXJTdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwQy0+U2hlbGxBUEkucFZpZGVvRW5jb2Rlckdsb2JhbEZjdHMtPnBGY3RTdG9wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdFN0b3AoCi0gICAgICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9pbnREZXN0cm95VmlkZW9FbmNvZGVyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0U3RvcCByZXR1cm5zIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEMtPmV3Yy5lbmNvZGVyU3RhdGUgPSBNNFZTUzNHUFBfa0VuY29kZXJTdG9wcGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSGFzIHRoZSBlbmNvZGVyIGFjdHVhbGx5IGJlZW4gb3BlbmVkPyBEb24ndCBjbG9zZSBpdCBpZiB0aGF0J3Mgbm90IHRoZSBjYXNlLiAqLwotICAgICAgICBpZiggTTRWU1MzR1BQX2tFbmNvZGVyU3RvcHBlZCA9PSBwQy0+ZXdjLmVuY29kZXJTdGF0ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlKAotICAgICAgICAgICAgICAgIHBDLT5ld2MucEVuY0NvbnRleHQpOwotCi0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgICAgICBwVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsb3NlIHJldHVybnMgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgLyogV2VsbC4uLiBob3cgdGhlIGhlY2sgZG8geW91IGhhbmRsZSBhIGZhaWxlZCBjbGVhbnVwPyAqLwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rRW5jb2RlckNsb3NlZDsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHBDLT5TaGVsbEFQSS5wVmlkZW9FbmNvZGVyR2xvYmFsRmN0cy0+cEZjdENsZWFudXAoCi0gICAgICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0KTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6XAotICAgICAgICAgICAgICAgIHBWaWRlb0VuY29kZXJHbG9iYWxGY3RzLT5wRmN0Q2xlYW51cCByZXR1cm5zIDB4JXghIiwKLSAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgLyoqPCBXZSBkbyBub3QgcmV0dXJuIHRoZSBlcnJvciBoZXJlIGJlY2F1c2Ugd2Ugc3RpbGwgaGF2ZSBzdHVmZiB0byBmcmVlICovCi0gICAgICAgIH0KLQotICAgICAgICBwQy0+ZXdjLmVuY29kZXJTdGF0ZSA9IE00VlNTM0dQUF9rTm9FbmNvZGVyOwotICAgICAgICAvKioKLSAgICAgICAgKiBSZXNldCB2YXJpYWJsZSAqLwotICAgICAgICBwQy0+ZXdjLnBFbmNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBNNE9TQV9UUkFDRTNfMSgiTTRWU1MzR1BQX2ludERlc3Ryb3lWaWRlb0VuY29kZXI6IHJldHVybmluZyAweCV4IiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludFNldEgyNjNUaW1lQ291bnRlcigpCi0gKiBAYnJpZWYgICAgTW9kaWZ5IHRoZSB0aW1lIGNvdW50ZXIgb2YgdGhlIGdpdmVuIEgyNjMgdmlkZW8gQVUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEF1RGF0YUJ1ZmZlciAgICAoSU4vT1VUKSBIMjYzIFZpZGVvIEFVIHRvIG1vZGlmeQotICogQHBhcmFtICAgIHVpQ3RzICAgICAgICAgICAgKElOKSAgICAgTmV3IHRpbWUgY291bnRlciB2YWx1ZQotICogQHJldHVybiAgICBub3RoaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRIMjYzVGltZUNvdW50ZXIoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IHVpQ3RzICkKLXsKLSAgICAvKgotICAgICogIFRoZSBIMjYzIHRpbWUgY291bnRlciBpcyA4IGJpdHMgbG9jYXRlZCBvbiB0aGUgIngiIGJlbG93OgotICAgICoKLSAgICAqICAgfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfAotICAgICogICAgPz8/Pz8/Pz8gPz8/Pz8/Pz8gPz8/Pz8/eHggeHh4eHh4Pz8KLSAgICAqLwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgMiBiaXRzIG9uIHRoZSB0aGlyZCBieXRlICovCi0gICAgcEF1RGF0YUJ1ZmZlclsyXSA9ICggcEF1RGF0YUJ1ZmZlclsyXSAmIDB4RkMpIHwgKCggdWlDdHMgPj4gNikgJiAweDMpOwotCi0gICAgLyoqCi0gICAgKiBXcml0ZSB0aGUgNiBiaXRzIG9uIHRoZSBmb3VydGggYnl0ZSAqLwotICAgIHBBdURhdGFCdWZmZXJbM10gPSAoICggdWlDdHMgPDwgMikgJiAweEZDKSB8IChwQXVEYXRhQnVmZmVyWzNdICYgMHgzKTsKLQotICAgIHJldHVybjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRTZXRNUEVHNEdvdigpCi0gKiBAYnJpZWYgICAgTW9kaWZ5IHRoZSB0aW1lIGluZm8gZnJvbSBHcm91cCBPZiBWT1AgdmlkZW8gQVUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcEF1RGF0YUJ1ZmZlciAgICAoSU4pICAgIE1QRUc0IFZpZGVvIEFVIHRvIG1vZGlmeQotICogQHBhcmFtICAgIHVpQ3RzU2VjICAgICAgICAgICAgKElOKSAgICAgTmV3IEdPViB0aW1lIGluZm8gaW4gc2Vjb25kIHVuaXQKLSAqIEByZXR1cm4gICAgbm90aGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1zdGF0aWMgTTRPU0FfVm9pZCBNNFZTUzNHUFBfaW50U2V0TVBFRzRHb3YoIE00T1NBX01lbUFkZHI4IHBBdURhdGFCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpQ3RzU2VjICkKLXsKLSAgICAvKgotICAgICogIFRoZSBNUEVHLTQgdGltZSBjb2RlIGxlbmd0aCBpcyAxOCBiaXRzOgotICAgICoKLSAgICAqICAgICBoaCAgICAgbW0gICAgbWFya2VyICAgIHNzCi0gICAgKiAgICB4eHh4eHx4eHggeHh4ICAgICAxICAgIHh4eHggeHggPz8/Pz8/Ci0gICAgKiAgIHwtLS0tLSAtLS18LS0tICAgICAtICAgIC0tLS18LS0gLS0tLS0tfAotICAgICovCi0gICAgTTRPU0FfVUludDggdWlIaDsKLSAgICBNNE9TQV9VSW50OCB1aU1tOwotICAgIE00T1NBX1VJbnQ4IHVpU3M7Ci0gICAgTTRPU0FfVUludDggdWlUbXA7Ci0KLSAgICAvKioKLSAgICAqIFdyaXRlIHRoZSAyIGxhc3QgYml0cyBzcyAqLwotICAgIHVpU3MgPSAoTTRPU0FfVUludDgpKHVpQ3RzU2VjICUgNjApOyAvKio8IG1vZHVsbyBwYXJ0ICovCi0gICAgcEF1RGF0YUJ1ZmZlclsyXSA9ICgoICggdWlTcyAmIDB4MDMpIDw8IDYpIHwgKHBBdURhdGFCdWZmZXJbMl0gJiAweDNGKSk7Ci0KLSAgICBpZiggdWlDdHNTZWMgPCA2MCApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgMyBsYXN0IGJpdHMgb2YgbW0sIHRoZSBtYXJrZXIgYml0ICgweDEwICovCi0gICAgICAgIHBBdURhdGFCdWZmZXJbMV0gPSAoKCAweDEwKSB8ICh1aVNzID4+IDIpKTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBXcml0ZSB0aGUgNSBiaXRzIG9mIGhoIGFuZCAzIG9mIG1tIChvdXQgb2YgNikgKi8KLSAgICAgICAgcEF1RGF0YUJ1ZmZlclswXSA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIFdyaXRlIHRoZSAzIGxhc3QgYml0cyBvZiBtbSwgdGhlIG1hcmtlciBiaXQgKDB4MTAgKi8KLSAgICAgICAgdWlUbXAgPSAoTTRPU0FfVUludDgpKHVpQ3RzU2VjIC8gNjApOyAvKio8IGludGVnZXIgcGFydCAqLwotICAgICAgICB1aU1tID0gKE00T1NBX1VJbnQ4KSh1aVRtcCAlIDYwKTsKLSAgICAgICAgcEF1RGF0YUJ1ZmZlclsxXSA9ICgoIHVpTW0gPDwgNSkgfCAoMHgxMCkgfCAodWlTcyA+PiAyKSk7Ci0KLSAgICAgICAgaWYoIHVpVG1wIDwgNjAgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogV3JpdGUgdGhlIDUgYml0cyBvZiBoaCBhbmQgMyBvZiBtbSAob3V0IG9mIDYpICovCi0gICAgICAgICAgICBwQXVEYXRhQnVmZmVyWzBdID0gKCh1aU1tID4+IDMpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBXcml0ZSB0aGUgNSBiaXRzIG9mIGhoIGFuZCAzIG9mIG1tIChvdXQgb2YgNikgKi8KLSAgICAgICAgICAgIHVpSGggPSAoTTRPU0FfVUludDgpKHVpVG1wIC8gNjApOwotICAgICAgICAgICAgcEF1RGF0YUJ1ZmZlclswXSA9ICgoIHVpSGggPDwgMykgfCAodWlNbSA+PiAzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX1ZvaWQgTTRWU1MzR1BQX2ludEdldE1QRUc0R292KCkKLSAqIEBicmllZiAgICBHZXQgdGhlIHRpbWUgaW5mbyBmcm9tIEdyb3VwIE9mIFZPUCB2aWRlbyBBVQotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQXVEYXRhQnVmZmVyICAgIChJTikgICAgTVBFRzQgVmlkZW8gQVUgdG8gbW9kaWZ5Ci0gKiBAcGFyYW0gICAgcEN0c1NlYyAgICAgICAgICAgIChPVVQpICAgIEN1cnJlbnQgR09WIHRpbWUgaW5mbyBpbiBzZWNvbmQgdW5pdAotICogQHJldHVybiAgICBub3RoaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXN0YXRpYyBNNE9TQV9Wb2lkIE00VlNTM0dQUF9pbnRHZXRNUEVHNEdvdiggTTRPU0FfTWVtQWRkcjggcEF1RGF0YUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgKnBDdHNTZWMgKQotewotICAgIC8qCi0gICAgKiAgVGhlIE1QRUctNCB0aW1lIGNvZGUgbGVuZ3RoIGlzIDE4IGJpdHM6Ci0gICAgKgotICAgICogICAgIGhoICAgICBtbSAgICBtYXJrZXIgICAgc3MKLSAgICAqICAgIHh4eHh4fHh4eCB4eHggICAgIDEgICAgeHh4eCB4eCA/Pz8/Pz8KLSAgICAqICAgfC0tLS0tIC0tLXwtLS0gICAgIC0gICAgLS0tLXwtLSAtLS0tLS18Ci0gICAgKi8KLSAgICBNNE9TQV9VSW50OCB1aUhoOwotICAgIE00T1NBX1VJbnQ4IHVpTW07Ci0gICAgTTRPU0FfVUludDggdWlTczsKLSAgICBNNE9TQV9VSW50OCB1aVRtcDsKLSAgICBNNE9TQV9VSW50MzIgdWlDdHNTZWM7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgc3MgKi8KLSAgICB1aVNzID0gKCggcEF1RGF0YUJ1ZmZlclsyXSAmIDB4QzApID4+IDYpOwotICAgIHVpVG1wID0gKCggcEF1RGF0YUJ1ZmZlclsxXSAmIDB4MEYpIDw8IDIpOwotICAgIHVpQ3RzU2VjID0gdWlTcyArIHVpVG1wOwotCi0gICAgLyoqCi0gICAgKiBSZWFkIG1tICovCi0gICAgdWlNbSA9ICgoIHBBdURhdGFCdWZmZXJbMV0gJiAweEUwKSA+PiA1KTsKLSAgICB1aVRtcCA9ICgoIHBBdURhdGFCdWZmZXJbMF0gJiAweDA3KSA8PCAzKTsKLSAgICB1aU1tID0gdWlNbSArIHVpVG1wOwotICAgIHVpQ3RzU2VjID0gKCB1aU1tICogNjApICsgdWlDdHNTZWM7Ci0KLSAgICAvKioKLSAgICAqIFJlYWQgaGggKi8KLSAgICB1aUhoID0gKCggcEF1RGF0YUJ1ZmZlclswXSAmIDB4RjgpID4+IDMpOwotCi0gICAgaWYoIHVpSGggKQotICAgIHsKLSAgICAgICAgdWlDdHNTZWMgPSAoIHVpSGggKiAzNjAwKSArIHVpQ3RzU2VjOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBpbiBzZWMgKi8KLSAgICAqcEN0c1NlYyA9IHVpQ3RzU2VjOwotCi0gICAgcmV0dXJuOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoKQotICogQGJyaWVmICAgIEFsbG9jYXRlIHRoZSB0aHJlZSBZVVYgNDoyOjAgcGxhbmVzCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBQbGFuZXMgICAgKElOL09VVCkgdmFsaWQgcG9pbnRlciB0byAzIE00VklGSV9JbWFnZVBsYW5lIHN0cnVjdHVyZXMKLSAqIEBwYXJhbSAgICB1aVdpZHRoICAgIChJTikgICAgIEltYWdlIHdpZHRoCi0gKiBAcGFyYW0gICAgdWlIZWlnaHQoSU4pICAgICBJbWFnZSBoZWlnaHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotc3RhdGljIE00T1NBX0VSUiBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAoIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpV2lkdGgsIE00T1NBX1VJbnQzMiB1aUhlaWdodCApCi17Ci0gICAgaWYgKHBQbGFuZXMgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwOiBJbnZhbGlkIHBQbGFuZXMgcG9pbnRlciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLSAgICAvKiBpZiB0aGUgYnVmZmVyIGlzIG5vdCBOVUxMIGFuZCBzYW1lIHNpemUgd2l0aCB0YXJnZXQgc2l6ZSwKLSAgICAgKiBkbyBub3QgbWFsbG9jIGFnYWluKi8KLSAgICBpZiAocFBsYW5lc1swXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMICYmCi0gICAgICAgIHBQbGFuZXNbMF0udV93aWR0aCA9PSB1aVdpZHRoICYmCi0gICAgICAgIHBQbGFuZXNbMF0udV9oZWlnaHQgPT0gdWlIZWlnaHQpIHsKLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0gICAgcFBsYW5lc1swXS51X3dpZHRoID0gdWlXaWR0aDsKLSAgICBwUGxhbmVzWzBdLnVfaGVpZ2h0ID0gdWlIZWlnaHQ7Ci0gICAgcFBsYW5lc1swXS51X3N0cmlkZSA9IHVpV2lkdGg7Ci0gICAgcFBsYW5lc1swXS51X3RvcGxlZnQgPSAwOwotCi0gICAgaWYgKHBQbGFuZXNbMF0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBQbGFuZXNbMF0ucGFjX2RhdGEpOwotICAgICAgICBwUGxhbmVzWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocFBsYW5lc1swXS51X3N0cmlkZQotICAgICAgICAqIHBQbGFuZXNbMF0udV9oZWlnaHQsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFBsYW5lc1swXS5wYWNfZGF0YSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcFBsYW5lc1swXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjA6IHVuYWJsZSB0byBhbGxvY2F0ZSBwUGxhbmVzWzBdLnBhY19kYXRhLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcFBsYW5lc1sxXS51X3dpZHRoID0gcFBsYW5lc1swXS51X3dpZHRoID4+IDE7Ci0gICAgcFBsYW5lc1sxXS51X2hlaWdodCA9IHBQbGFuZXNbMF0udV9oZWlnaHQgPj4gMTsKLSAgICBwUGxhbmVzWzFdLnVfc3RyaWRlID0gcFBsYW5lc1sxXS51X3dpZHRoOwotICAgIHBQbGFuZXNbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBpZiAocFBsYW5lc1sxXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocFBsYW5lc1sxXS5wYWNfZGF0YSk7Ci0gICAgICAgIHBQbGFuZXNbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIH0KLSAgICBwUGxhbmVzWzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhwUGxhbmVzWzFdLnVfc3RyaWRlCi0gICAgICAgICogcFBsYW5lc1sxXS51X2hlaWdodCwgTTRWU1MzR1BQLChNNE9TQV9DaGFyICopICJwUGxhbmVzWzFdLnBhY19kYXRhIik7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwUGxhbmVzWzFdLnBhY19kYXRhICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgIk00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMDogdW5hYmxlIHRvIGFsbG9jYXRlIHBQbGFuZXNbMV0ucGFjX2RhdGEsXAotICAgICAgICAgICAgcmV0dXJuaW5nIE00RVJSX0FMTE9DIik7Ci0gICAgICAgIGZyZWUoKHZvaWQgKilwUGxhbmVzWzBdLnBhY19kYXRhKTsKLSAgICAgICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwUGxhbmVzWzJdLnVfd2lkdGggPSBwUGxhbmVzWzFdLnVfd2lkdGg7Ci0gICAgcFBsYW5lc1syXS51X2hlaWdodCA9IHBQbGFuZXNbMV0udV9oZWlnaHQ7Ci0gICAgcFBsYW5lc1syXS51X3N0cmlkZSA9IHBQbGFuZXNbMl0udV93aWR0aDsKLSAgICBwUGxhbmVzWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgaWYgKHBQbGFuZXNbMl0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBQbGFuZXNbMl0ucGFjX2RhdGEpOwotICAgICAgICBwUGxhbmVzWzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgcFBsYW5lc1syXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDggKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MocFBsYW5lc1syXS51X3N0cmlkZQotICAgICAgICAqIHBQbGFuZXNbMl0udV9oZWlnaHQsIE00VlNTM0dQUCwgKE00T1NBX0NoYXIgKikicFBsYW5lc1syXS5wYWNfZGF0YSIpOwotCi0gICAgaWYoIE00T1NBX05VTEwgPT0gcFBsYW5lc1syXS5wYWNfZGF0YSApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICJNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjA6IHVuYWJsZSB0byBhbGxvY2F0ZSBwUGxhbmVzWzJdLnBhY19kYXRhLFwKLSAgICAgICAgICAgIHJldHVybmluZyBNNEVSUl9BTExPQyIpOwotICAgICAgICBmcmVlKCh2b2lkICopcFBsYW5lc1swXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoKHZvaWQgKilwUGxhbmVzWzFdLnBhY19kYXRhKTsKLSAgICAgICAgcFBsYW5lc1swXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBQbGFuZXNbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgbWVtc2V0KCh2b2lkICopcFBsYW5lc1swXS5wYWNfZGF0YSwgMCwgcFBsYW5lc1swXS51X3N0cmlkZSpwUGxhbmVzWzBdLnVfaGVpZ2h0KTsKLSAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVzWzFdLnBhY19kYXRhLCAwLCBwUGxhbmVzWzFdLnVfc3RyaWRlKnBQbGFuZXNbMV0udV9oZWlnaHQpOwotICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZXNbMl0ucGFjX2RhdGEsIDAsIHBQbGFuZXNbMl0udV9zdHJpZGUqcFBsYW5lc1syXS51X2hlaWdodCk7Ci0gICAgLyoqCi0gICAgKiAgICBSZXR1cm4gKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNNE9TQV9FUlIgTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQpOwotKiBAYnJpZWYgICAgSXQgQ292ZXJ0cyBhbmQgcmVzaXplcyBhIEFSR0I4ODg4IGltYWdlIHRvIFlVVjQyMAotKiBAbm90ZQotKiBAcGFyYW0gICAgcEZpbGVJbiAgICAgICAgIChJTikgVGhlIEFSR0I4ODggaW5wdXQgZmlsZQotKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyICAgIChJTikgUG9pbnRlciBvbiBmaWxlc3lzdGVtIGZ1bmN0aW9ucwotKiBAcGFyYW0gICAgcEltYWdlUGxhbmVzICAgIChJTi9PVVQpIFBvaW50ZXIgb24gWVVWNDIwIG91dHB1dCBwbGFuZXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSR0I4ODg4IGltYWdlICB3aWxsIGJlIGNvbnZlcnRlZCBhbmQgcmVzaXplZCB0byBvdXRwdXQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotKiBAcGFyYW0gd2lkdGggICAgICAgKElOKSB3aWR0aCBvZiB0aGUgQVJHQjg4ODgKLSogQHBhcmFtIGhlaWdodCAgICAgIChJTikgaGVpZ2h0IG9mIHRoZSBBUkdCODg4OAotKiBAcmV0dXJuICAgTTROT19FUlJPUjogTm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX0FMTE9DOiBtZW1vcnkgZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkgewotICAgIE00T1NBX0NvbnRleHQgcEFSR0JJbjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSByZ2JQbGFuZTEgLHJnYlBsYW5lMjsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplX2FyZ2IgPSB3aWR0aCAqIGhlaWdodCAqIDQ7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZV9yZ2I4ODggPSB3aWR0aCAqIGhlaWdodCAqIDM7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwLGo9IDA7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9VSW50OCAqcEFyZ2JQbGFuZSA9Ci0gICAgICAgIChNNE9TQV9VSW50OCopIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiYXJnYiBkYXRhIik7Ci0gICAgaWYgKHBBcmdiUGxhbmUgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjA6IFwKLSAgICAgICAgICAgIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEFSR0IgcGxhbmUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEdldCBmaWxlIHNpemUgKi8KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPm9wZW5SZWFkKCZwQVJHQkluLCBwRmlsZUluLCBNNE9TQV9rRmlsZVJlYWQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgOiBcCi0gICAgICAgICAgICBDYW4gbm90IG9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIscEZpbGVJbiwgZXJyKTsKLSAgICAgICAgZnJlZShwQXJnYlBsYW5lKTsKLSAgICAgICAgcEFyZ2JQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBBcmdiUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgQ2FuIG5vdCByZWFkIEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICBwQXJnYlBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIGVyciA9IHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNFZTUzNHUFBfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBcCi0gICAgICAgICAgICBDYW4gbm90IGNsb3NlIEFSR0I4ODg4ICBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZUluLCBlcnIpOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICBwQXJnYlBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIHJnYlBsYW5lMS5wYWNfZGF0YSA9Ci0gICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfcmdiODg4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIlJHQjg4OCBwbGFuZTEiKTsKLSAgICBpZihyZ2JQbGFuZTEucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmdiIHBsYW5lMSIpOwotICAgICAgICBmcmVlKHBBcmdiUGxhbmUpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgcmdiUGxhbmUxLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgIHJnYlBsYW5lMS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcmdiUGxhbmUxLnVfc3RyaWRlID0gd2lkdGgqMzsKLSAgICByZ2JQbGFuZTEudV90b3BsZWZ0ID0gMDsKLQotCi0gICAgLyoqIFJlbW92ZSB0aGUgYWxwaGEgY2hhbm5lbCAqLwotICAgIGZvciAoaT0wLCBqID0gMDsgaSA8IGZyYW1lU2l6ZV9hcmdiOyBpKyspIHsKLSAgICAgICAgaWYgKChpICUgNCkgPT0gMCkgY29udGludWU7Ci0gICAgICAgIHJnYlBsYW5lMS5wYWNfZGF0YVtqXSA9IHBBcmdiUGxhbmVbaV07Ci0gICAgICAgIGorKzsKLSAgICB9Ci0gICAgZnJlZShwQXJnYlBsYW5lKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHJlc2l6aW5nIGlzIHJlcXVpcmVkIHdpdGggY29sb3IgY29udmVyc2lvbiAqLwotICAgIGlmKHdpZHRoICE9IHBJbWFnZVBsYW5lcy0+dV93aWR0aCB8fCBoZWlnaHQgIT0gcEltYWdlUGxhbmVzLT51X2hlaWdodCkgewotCi0gICAgICAgIGZyYW1lU2l6ZV9yZ2I4ODggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0ICogMzsKLSAgICAgICAgcmdiUGxhbmUyLnBhY19kYXRhID0KLSAgICAgICAgICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmcmFtZVNpemVfcmdiODg4LCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJyZ2IgUGxhbmUyIik7Ci0gICAgICAgIGlmKHJnYlBsYW5lMi5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmdiIHBsYW5lMiIpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIHJnYlBsYW5lMi51X2hlaWdodCA9ICBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICByZ2JQbGFuZTIudV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgcmdiUGxhbmUyLnVfc3RyaWRlID0gcEltYWdlUGxhbmVzLT51X3dpZHRoKjM7Ci0gICAgICAgIHJnYlBsYW5lMi51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgIC8qIFJlc2l6aW5nICovCi0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZ2JQbGFuZTEsICZyZ2JQbGFuZTIpOwotICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3IgcmVzaXppbmcgUkdCODg4IHRvIFJHQjg4ODogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUyLnBhY19kYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKkNvbnZlcnRpbmcgUmVzaXplZCBSR0I4ODggdG8gWVVWNDIwICovCi0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUyLCBwSW1hZ2VQbGFuZXMpOwotICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3IgY29udmVydGluZyBmcm9tIFJHQjg4OCB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gTTRWSUZJX1JHQjg4OHRvWVVWNDIwKE00T1NBX05VTEwsICZyZ2JQbGFuZTEsIHBJbWFnZVBsYW5lcyk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiZXJyb3Igd2hlbiBjb252ZXJ0aW5nIGZyb20gUkdCIHRvIFlVVjogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgfQotY2xlYW51cDoKLSAgICBNNE9TQV9UUkFDRTNfMCgiTTRWU1MzR1BQX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgZXhpdCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlKE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19NZWRpYVJlbmRlcmluZyByZW5kZXJpbmdNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBPdXRwbGFuZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRBSVJfUGFyYW1zIGFpclBhcmFtczsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXNUZW1wWzNdOwotICAgIE00T1NBX1VJbnQzMiBpID0gMDsKLQotICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rQmxhY2tCb3JkZXJzKSB7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRwbGFuZVswXS5wYWNfZGF0YSwgWV9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAocE91dHBsYW5lWzBdLnVfaGVpZ2h0KnBPdXRwbGFuZVswXS51X3N0cmlkZSkpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0cGxhbmVbMV0ucGFjX2RhdGEsIFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgKHBPdXRwbGFuZVsxXS51X2hlaWdodCpwT3V0cGxhbmVbMV0udV9zdHJpZGUpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcE91dHBsYW5lWzJdLnBhY19kYXRhLCBWX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgIChwT3V0cGxhbmVbMl0udV9oZWlnaHQqcE91dHBsYW5lWzJdLnVfc3RyaWRlKSk7Ci0gICAgfQotCi0gICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tSZXNpemluZykgewotICAgICAgICAvKioKLSAgICAgICAgKiBDYWxsIHRoZSByZXNpemUgZmlsdGVyLgotICAgICAgICAqIEZyb20gdGhlIGludGVybWVkaWF0ZSBmcmFtZSB0byB0aGUgZW5jb2RlciBpbWFnZSBwbGFuZSAqLwotICAgICAgICBlcnIgPSBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wbGFuZSwgcE91dHBsYW5lKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgIE00VmlGaWxSZXNpemVCaWxpbmVhcllVVjQyMHRvWVVWNDIwIHJldHVybnMgMHgleCEiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVkgPQotICAgICAgICAgICAgcE91dHBsYW5lWzBdLnBhY19kYXRhICsgcE91dHBsYW5lWzBdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVUgPQotICAgICAgICAgICAgcE91dHBsYW5lWzFdLnBhY19kYXRhICsgcE91dHBsYW5lWzFdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBPdXRQbGFuZVYgPQotICAgICAgICAgICAgcE91dHBsYW5lWzJdLnBhY19kYXRhICsgcE91dHBsYW5lWzJdLnVfdG9wbGVmdDsKLSAgICAgICAgTTRPU0FfVUludDgqIHBJblBsYW5lWSA9IE00T1NBX05VTEw7Ci0gICAgICAgIE00T1NBX1VJbnQ4KiBwSW5QbGFuZVUgPSBNNE9TQV9OVUxMOwotICAgICAgICBNNE9TQV9VSW50OCogcEluUGxhbmVWID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAvKiBUbyBrZWVwIG1lZGlhIGFzcGVjdCByYXRpbyovCi0gICAgICAgIC8qIEluaXRpYWxpemUgQUlSIFBhcmFtcyovCi0gICAgICAgIGFpclBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPSAwOwotICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwSW5wbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcElucGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBPdXRwbGFuZS0+dV93aWR0aDsKLSAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBPdXRwbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIGFpclBhcmFtcy5tX2JPdXRwdXRTdHJpcGUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotCi0gICAgICAgIC8qKgotICAgICAgICBNZWRpYSByZW5kZXJpbmc6IEJsYWNrIGJvcmRlcnMqLwotICAgICAgICBpZiAocmVuZGVyaW5nTW9kZSA9PSBNNHhWU1Nfa0JsYWNrQm9yZGVycykgewotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoID0gcE91dHBsYW5lWzBdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0gcE91dHBsYW5lWzBdLnVfaGVpZ2h0OwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3N0cmlkZSA9IHBPdXRwbGFuZVswXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPSAwOwotCi0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBwT3V0cGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgPSBwT3V0cGxhbmVbMV0udV9oZWlnaHQ7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlID0gcE91dHBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9IHBPdXRwbGFuZVsyXS51X3dpZHRoOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9IHBPdXRwbGFuZVsyXS51X2hlaWdodDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGUgPSBwT3V0cGxhbmVbMl0udV93aWR0aDsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBBbGxvY2F0ZXMgcGxhbiBpbiBsb2NhbCBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0ucGFjX2RhdGEgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggKiBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJwSW1hZ2VQbGFuZVRlbXAgWSIpIDsKLSAgICAgICAgICAgIGlmIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogQWxsb2MgRXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikicEltYWdlUGxhbmVUZW1wIFUiKSA7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IEFsbG9jIEVycm9yIik7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3dpZHRoICogcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikicEltYWdlUGxhbmVUZW1wIFYiKSA7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IEFsbG9jIEVycm9yIik7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBmcmVlKHBJbWFnZVBsYW5lc1RlbXBbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcEluUGxhbmVZID0gcEltYWdlUGxhbmVzVGVtcFswXS5wYWNfZGF0YSA7Ci0gICAgICAgICAgICBwSW5QbGFuZVUgPSBwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhIDsKLSAgICAgICAgICAgIHBJblBsYW5lViA9IHBJbWFnZVBsYW5lc1RlbXBbMl0ucGFjX2RhdGEgOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzBdLnBhY19kYXRhLCBZX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzFdLnBhY19kYXRhLCBVX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNUZW1wWzJdLnBhY19kYXRhLCBWX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfc3RyaWRlKSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHQgPQotICAgICAgICAgICAgICAgIChwSW5wbGFuZS0+dV9oZWlnaHQgKiBwT3V0cGxhbmUtPnVfd2lkdGgpIC9wSW5wbGFuZS0+dV93aWR0aDsKLQotICAgICAgICAgICAgaWYgKGhlaWdodCA8PSBwT3V0cGxhbmUtPnVfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIHRoZSBib3R0b20gc2lkZSAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBPdXRwbGFuZS0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIE51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wICovCi0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMF0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpPj4xKSkgKgotICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMF0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodCA9IGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpICoKLSAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMV0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV9oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpICoKLSAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwT3V0cGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwSW5wbGFuZS0+dV93aWR0aCAqIHBPdXRwbGFuZS0+dV9oZWlnaHQpL3BJbnBsYW5lLT51X2hlaWdodCk7Ci0KLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzVGVtcFswXS51X3dpZHRoIC0KLSAgICAgICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMV0udV93aWR0aCAtCi0gICAgICAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsyXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCAtCi0gICAgICAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfd2lkdGggPSBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogV2lkdGggYW5kIGhlaWdodCBoYXZlIHRvIGJlIGV2ZW4gKi8KLSAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAoYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGggPQotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1RlbXBbMl0udV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFswXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzFdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsxXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wWzJdLnVfaGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzVGVtcFsyXS51X2hlaWdodD4+MSk8PDE7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2hlY2sgdGhhdCB2YWx1ZXMgYXJlIGNvaGVyZW50ICovCi0gICAgICAgICAgICBpZiAoYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID09Ci0gICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkgewotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhaXJQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpIHsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBsYW5lVGVtcCA9IHBJbWFnZVBsYW5lc1RlbXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTWVkaWEgcmVuZGVyaW5nOiBDcm9wcGluZyovCi0gICAgICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE00eFZTU19rQ3JvcHBpbmcpIHsKLSAgICAgICAgICAgIGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwT3V0cGxhbmUtPnVfaGVpZ2h0OwotICAgICAgICAgICAgYWlyUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcE91dHBsYW5lLT51X3dpZHRoOwotICAgICAgICAgICAgaWYgKChhaXJQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA8Ci0gICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAvKiBIZWlnaHQgd2lsbCBiZSBjcm9wcGVkICovCi0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKGFpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgKgotICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMikoKHBJbnBsYW5lLT51X2hlaWdodCAtCi0gICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKT4+MSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIFdpZHRoIHdpbGwgYmUgY3JvcHBlZCAqLwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKGFpclBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCAqCi0gICAgICAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpL2FpclBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpOwotICAgICAgICAgICAgICAgIGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgKGFpclBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICBhaXJQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9JbnQzMikoKE00T1NBX0ludDMyKSgocElucGxhbmUtPnVfd2lkdGggLQotICAgICAgICAgICAgICAgICAgICAgYWlyUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKT4+MSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGxhbmVUZW1wID0gcE91dHBsYW5lOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAqIENhbGwgQUlSIGZ1bmN0aW9ucyAqLwotICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQy0+bV9haXJfY29udGV4dCkgewotICAgICAgICAgICAgZXJyID0gTTRBSVJfY3JlYXRlKCZwQy0+bV9haXJfY29udGV4dCwgTTRBSVJfa1lVVjQyMFApOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgICAgICBNNEFJUl9jcmVhdGUgcmV0dXJuZWQgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKHBDLT5tX2Fpcl9jb250ZXh0LCAmYWlyUGFyYW1zKTsKLSAgICAgICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZTogXAotICAgICAgICAgICAgICAgIEVycm9yIHdoZW4gY29uZmlndXJpbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfZ2V0KHBDLT5tX2Fpcl9jb250ZXh0LCBwSW5wbGFuZSwgcFBsYW5lVGVtcCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGU6IFwKLSAgICAgICAgICAgICAgICBFcnJvciB3aGVuIGdldHRpbmcgQUlSIHBsYW5lOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZ290byBjbGVhblVwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpIHsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPHBPdXRwbGFuZVswXS51X2hlaWdodDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcE91dFBsYW5lWSwgKHZvaWQgKilwSW5QbGFuZVksCi0gICAgICAgICAgICAgICAgICAgICAgICBwT3V0cGxhbmVbMF0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgcEluUGxhbmVZICs9IHBPdXRwbGFuZVswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHBPdXRQbGFuZVkgKz0gcE91dHBsYW5lWzBdLnVfc3RyaWRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpPTA7IGk8cE91dHBsYW5lWzFdLnVfaGVpZ2h0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0UGxhbmVVLCAodm9pZCAqKXBJblBsYW5lVSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwbGFuZVsxXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBwSW5QbGFuZVUgKz0gcE91dHBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgcE91dFBsYW5lVSArPSBwT3V0cGxhbmVbMV0udV9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxwT3V0cGxhbmVbMl0udV9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBPdXRQbGFuZVYsICh2b2lkICopcEluUGxhbmVWLAotICAgICAgICAgICAgICAgICAgICAgICAgcE91dHBsYW5lWzJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgIHBJblBsYW5lViArPSBwT3V0cGxhbmVbMl0udV93aWR0aDsKLSAgICAgICAgICAgICAgICBwT3V0UGxhbmVWICs9IHBPdXRwbGFuZVsyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLWNsZWFuVXA6Ci0gICAgaWYgKHJlbmRlcmluZ01vZGUgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpIHsKLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocEltYWdlUGxhbmVzVGVtcFtpXS5wYWNfZGF0YSAhPSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFNldFl1djQyMFBsYW5lRnJvbUFSR0I4ODggKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcENvbnRleHQqIHBDbGlwQ3R4dCkgewotCi0gICAgTTRPU0FfRVJSIGVycj0gTTROT19FUlJPUjsKLQotICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgWVVWIHBsYW5lCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXYgPQotICAgICAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAoTTRPU0FfQ2hhciopInBQbGFuZVl1diIpOwotCi0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2ID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ID0KLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNIZWlnaHQ7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljV2lkdGg7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV9zdHJpZGUgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfdG9wbGVmdCA9IDA7Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSA9Ci0gICAgIChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ICogcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCAqIDEuNSwKLSAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiaW1hZ2VDbGlwIFlVViBkYXRhIik7Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X2hlaWdodCA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfaGVpZ2h0ID4+MTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3dpZHRoID0gcENsaXBDdHh0LT5wUGxhbmVZdXZbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnVfc3RyaWRlID0gcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV93aWR0aDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKAotICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSArCi0gICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGgpOwotCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV9oZWlnaHQgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV93aWR0aCA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnVfd2lkdGggPj4gMTsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsyXS51X3N0cmlkZSA9IHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzJdLnVfd2lkdGg7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0ucGFjX2RhdGEgKwotICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZbMV0udV9oZWlnaHQgKiBwQ2xpcEN0eHQtPnBQbGFuZVl1dlsxXS51X3dpZHRoKTsKLQotICAgIGVyciA9IE00VlNTM0dQUF9pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwICgKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnBGaWxlLAotICAgICAgICBwQy0+cE9zYUZpbGVSZWFkUHRyLAotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1diwKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNXaWR0aCwKLSAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnVpU3RpbGxQaWNIZWlnaHQpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRoZSBZVVYgZGF0YSB0byB0aGUgZGVjb2RlciB1c2luZyBzZXRvcHRpb24KLSAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uICgKLSAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0RlY1l1dkRhdGEsCi0gICAgICAgIChNNE9TQV9EYXRhT3B0aW9uKXBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy5iU2V0SW1hZ2VEYXRhID0gTTRPU0FfVFJVRTsKLQotICAgIC8vIEFsbG9jYXRlIFl1diBwbGFuZSB3aXRoIGVmZmVjdAotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCA9Ci0gICAgIChNNFZJRklfSW1hZ2VQbGFuZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIqKSJwUGxhbmVZdXZXaXRoRWZmZWN0Iik7Ci0gICAgaWYgKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2KTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA9IHBDLT5ld2MudWlWaWRlb0hlaWdodDsKLSAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA9IHBDLT5ld2MudWlWaWRlb1dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3N0cmlkZSA9IHBDLT5ld2MudWlWaWRlb1dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3RvcGxlZnQgPSAwOwotCi0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhID0KLSAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgcEMtPmV3Yy51aVZpZGVvSGVpZ2h0ICogcEMtPmV3Yy51aVZpZGVvV2lkdGggKiAxLjUsCi0gICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopImltYWdlQ2xpcCBZVVYgZGF0YSIpOwotICAgIGlmIChwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dik7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0KTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X2hlaWdodCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzFdLnVfd2lkdGggPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3N0cmlkZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzBdLnBhY19kYXRhICsKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X3dpZHRoKTsKLQotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X2hlaWdodCA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFswXS51X2hlaWdodCA+PjE7Ci0gICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzJdLnVfd2lkdGggPQotICAgICAgICBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3RbMF0udV93aWR0aCA+PiAxOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3N0cmlkZSA9Ci0gICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3dpZHRoOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS51X3RvcGxlZnQgPSAwOwotICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSgKLSAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0WzFdLnBhY19kYXRhICsKLSAgICAgICAgIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X2hlaWdodCAqIHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdFsxXS51X3dpZHRoKTsKLQotICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Q29udGlndW91cywKLSAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0KTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgZnJlZShwQ2xpcEN0eHQtPnBQbGFuZVl1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUocENsaXBDdHh0LT5wUGxhbmVZdXYpOwotICAgICAgICBmcmVlKHBDbGlwQ3R4dC0+cFBsYW5lWXV2V2l0aEVmZmVjdCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0KE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0ICpwQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9DbGlwQ29udGV4dCogcENsaXBDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRfTWVkaWFUaW1lIHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQm9vbCBiSXNDbGlwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50OCBudW1FZmZlY3RzID0gMDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcERlY29kZXJSZW5kZXJGcmFtZSA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIHl1dkZyYW1lV2lkdGggPSAwLCB5dXZGcmFtZUhlaWdodCA9IDA7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBUbXAgPSBNNE9TQV9OVUxMOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBUZW1wWzNdOwotICAgIE00T1NBX1VJbnQ4IGkgPSAwOwotICAgIE00T1NBX0Jvb2wgYlNraXBGcmFtaW5nRWZmZWN0ID0gTTRPU0FfRkFMU0U7Ci0KLSAgICBtZW1zZXQoKHZvaWQgKilwVGVtcCwgMCwgMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpKTsKLSAgICAvKiBSZXNpemUgb3Igcm90YXRlIGNhc2UgKi8KLSAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lKSB7Ci0gICAgICAgIC8qKgotICAgICAgICAqIElmIHdlIGRvIG1vZGlmeSB0aGUgaW1hZ2UsIHdlIG5lZWQgYW4gaW50ZXJtZWRpYXRlIGltYWdlIHBsYW5lICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMChwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfd2lkdGgsCi0gICAgICAgICAgICBwQ2xpcEN0eHQtPm1fcFByZVJlc2l6ZUZyYW1lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBbGxvY2F0ZVlVVjQyMCByZXR1cm5zIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgIChwQy0+bmJBY3RpdmVFZmZlY3RzID09IDApICYmCi0gICAgICAgICAgICAocENsaXBDdHh0LT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID09IE00T1NBX0ZBTFNFKSkgewotCi0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX0VuYWJsZVl1dldpdGhFZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIpIHsKLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsICZ0cywKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wUGxhbmVZdXZXaXRoRWZmZWN0LCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSA9PQotICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODgpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0U2V0T3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBWaURlY0N0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE00REVDT0RFUl9rT3B0aW9uSURfRW5hYmxlWXV2V2l0aEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pTTRPU0FfRkFMU0UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFJlbmRlcigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LCAmdHMsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWUsIE00T1NBX1RSVUUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgIHJldHVybnMgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSAhPQotICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgewotICAgICAgICAgICAgaWYgKDAgIT0gcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2F2ZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHVuLXJvdGF0ZWQgZnJhbWUKLSAgICAgICAgICAgICAgICB5dXZGcmFtZVdpZHRoID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X3dpZHRoOwotICAgICAgICAgICAgICAgIHl1dkZyYW1lSGVpZ2h0ID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50Um90YXRlVmlkZW8ocENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPkNsaXBQcm9wZXJ0aWVzLnZpZGVvUm90YXRpb25EZWdyZWVzKTsKLSAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZVZpZGVvKCkgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogU2V0IHRoZSBuZXcgdmlkZW8gc2l6ZSBmb3IgdGVtcG9yYXJ5IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShwUmVzaXplUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWVbMF0udV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZVswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYklzQ2xpcDEgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIG51bUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtRWZmZWN0cyA9IHBDLT5uYkFjdGl2ZUVmZmVjdHMxOwotICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBudW1FZmZlY3RzID4gMCkgewotICAgICAgICAgICAgcENsaXBDdHh0LT5iR2V0WXV2RGF0YUZyb21EZWNvZGVyID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIC8qIElmIHZpZGVvIGZyYW1lIG5lZWQgdG8gYmUgcmVzaXplZCBvciByb3RhdGVkLAotICAgICAgICAgICAgICogdGhlbiBhcHBseSB0aGUgb3ZlcmxheSBhZnRlciB0aGUgZnJhbWUgd2FzIHJlbmRlcmVkIHdpdGggcmVuZGVyaW5nIG1vZGUuCi0gICAgICAgICAgICAgKiBIZXJlIHNraXAgdGhlIGZyYW1pbmcob3ZlcmxheSkgZWZmZWN0IHdoZW4gYXBwbHlpbmcgdmlkZW8gRWZmZWN0LiAqLwotICAgICAgICAgICAgYlNraXBGcmFtaW5nRWZmZWN0ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KHBDLAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+bV9wUHJlUmVzaXplRnJhbWUsIHBSZXNpemVQbGFuZSwgYlNraXBGcmFtaW5nRWZmZWN0KTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0KCkgZXJyIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lPSBwUmVzaXplUGxhbmU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lID0gcENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZTsKLSAgICAgICAgfQotICAgICAgICAvKiBEbyByZW5kZXJpbmcgbW9kZSAqLwotICAgICAgICBpZiAoKHBDbGlwQ3R4dC0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9PSBNNE9TQV9UUlVFKSB8fAotICAgICAgICAgICAgKHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5GaWxlVHlwZSAhPQotICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpIHsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDFBY3RpdmVGcmFtaW5nRWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwKHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQbGFuZU91dFswXS51X3dpZHRoLCBwUGxhbmVPdXRbMF0udV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50VlBQOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2ludEFsbG9jYXRlWVVWNDIwIGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEMtPmV3Yy5WcHBFcnJvciA9IGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwVGVtcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwVG1wID0gcEMtPnl1djE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9pbnRBcHBseVJlbmRlcmluZ01vZGUgKHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wU2V0dGluZ3MtPnhWU1MuTWVkaWFSZW5kZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlclJlbmRlckZyYW1lLHBUbXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMkFjdGl2ZUZyYW1pbmdFZmZlY3QgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAocFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lT3V0WzBdLnVfd2lkdGgsIHBQbGFuZU91dFswXS51X2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRWUFA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QWxsb2NhdGVZVVY0MjAgZXJyb3IgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcFRtcCA9IHBUZW1wOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBUbXAgPSBwQy0+eXV2MjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5UmVuZGVyaW5nTW9kZSAocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPnBTZXR0aW5ncy0+eFZTUy5NZWRpYVJlbmRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyUmVuZGVyRnJhbWUscFRtcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlSZW5kZXJpbmdNb2RlIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBUZW1wW2ldLnBhY19kYXRhICE9IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFRlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBbaV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBBcHBseSBvdmVybGF5IGlmIG92ZXJsYXkgZXhpc3QqLwotICAgICAgICAgICAgaWYgKGJJc0NsaXAxID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICBpZiAocEMtPmJDbGlwMUFjdGl2ZUZyYW1pbmdFZmZlY3QgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkocEMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwgcEMtPnl1djEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQ2xpcEN0eHQtPmxhc3REZWNvZGVkUGxhbmUgPSBwQy0+eXV2MTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5iQ2xpcDJBY3RpdmVGcmFtaW5nRWZmZWN0ID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX2ludEFwcGx5VmlkZW9PdmVybGF5KHBDLAotICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsIHBDLT55dXYyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFZQUDogXAotICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb092ZXJsYXkpIGVycm9yIDB4JXggIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBwQy0+ZXdjLlZwcEVycm9yID0gZXJyOwotICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPDM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAocFRlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwVGVtcFtpXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFtpXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwQ2xpcEN0eHQtPmxhc3REZWNvZGVkUGxhbmUgPSBwQ2xpcEN0eHQtPnBQbGFuZVl1dldpdGhFZmZlY3Q7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZnJlZSB0aGUgdGVtcCBidWZmZXIKLSAgICAgICAgZm9yIChpPTA7IGk8MzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocFRlbXBbaV0ucGFjX2RhdGEgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUocFRlbXBbaV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIHBUZW1wW2ldLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocENsaXBDdHh0LT5wU2V0dGluZ3MtPkZpbGVUeXBlID09Ci0gICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkgJiYKLSAgICAgICAgICAgICAocEMtPm5iQWN0aXZlRWZmZWN0cyA9PSAwKSAmJgotICAgICAgICAgICAgIChwQ2xpcEN0eHQtPmJHZXRZdXZEYXRhRnJvbURlY29kZXIgPT0gTTRPU0FfVFJVRSkpIHsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcENsaXBDdHh0LT5TaGVsbEFQSS5tX3BWaWRlb0RlY29kZXItPm1fcEZjdFNldE9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcENsaXBDdHh0LT5wVmlEZWNDdHh0LAotICAgICAgICAgICAgICAgICAgICBNNERFQ09ERVJfa09wdGlvbklEX1l1dldpdGhFZmZlY3ROb25Db250aWd1b3VzLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfRGF0YU9wdGlvbilwQy0+eXV2MSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVyciA9IHBDbGlwQ3R4dC0+U2hlbGxBUEkubV9wVmlkZW9EZWNvZGVyLT5tX3BGY3RTZXRPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgTTRERUNPREVSX2tPcHRpb25JRF9ZdXZXaXRoRWZmZWN0Tm9uQ29udGlndW91cywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0RhdGFPcHRpb24pcEMtPnl1djIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00VlNTM0dQUF9pbnRSZW5kZXJGcmFtZVdpdGhFZmZlY3Q6IFwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCBkZWNvZGVyIHNldE9wdGlvbiBlcnJvciAweCV4ICIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDbGlwQ3R4dC0+YkdldFl1dkRhdGFGcm9tRGVjb2RlciA9IE00T1NBX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzZXQgb3JpZ2luYWwgd2lkdGggYW5kIGhlaWdodCBmb3IgcmVzaXplIGZyYW1lIHBsYW5lCi0gICAgICAgIGlmICgwICE9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcyAmJgotICAgICAgICAgICAgMTgwICE9IHBDbGlwQ3R4dC0+cFNldHRpbmdzLT5DbGlwUHJvcGVydGllcy52aWRlb1JvdGF0aW9uRGVncmVlcykgewotCi0gICAgICAgICAgICBNNFZTUzNHUFBfaW50U2V0WVVWNDIwUGxhbmUocENsaXBDdHh0LT5tX3BQcmVSZXNpemVGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZGcmFtZVdpZHRoLCB5dXZGcmFtZUhlaWdodCk7Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIE5vIHJvdGF0ZSBvciBubyByZXNpemUgY2FzZSovCi0gICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICBudW1FZmZlY3RzID0gcEMtPm5iQWN0aXZlRWZmZWN0czsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bUVmZmVjdHMgPSBwQy0+bmJBY3RpdmVFZmZlY3RzMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG51bUVmZmVjdHMgPiAwKSB7Ci0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgJnRzLCBwUGxhbmVOb1Jlc2l6ZSwgTTRPU0FfVFJVRSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRWU1MzR1BQX2ludFJlbmRlckZyYW1lV2l0aEVmZmVjdDogXAotICAgICAgICAgICAgICAgICAgICBSZW5kZXIgcmV0dXJucyBlcnJvciAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBiU2tpcEZyYW1pbmdFZmZlY3QgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgcEMtPmJJc3NlY29uZENsaXAgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywgcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnl1djEsIGJTa2lwRnJhbWluZ0VmZmVjdCk7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBDLT5iSXNzZWNvbmRDbGlwID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfaW50QXBwbHlWaWRlb0VmZmVjdChwQywgcFBsYW5lTm9SZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnl1djIsIGJTa2lwRnJhbWluZ0VmZmVjdCk7Ci0gICAgICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9pbnRBcHBseVZpZGVvRWZmZWN0IGVycm9yIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIGlmIChiSXNDbGlwMSA9PSBNNE9TQV9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgcFRtcCA9IHBDLT55dXYxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwVG1wID0gcEMtPnl1djI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBwQ2xpcEN0eHQtPlNoZWxsQVBJLm1fcFZpZGVvRGVjb2Rlci0+bV9wRmN0UmVuZGVyKAotICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQ3R4dC0+cFZpRGVjQ3R4dCwgJnRzLCBwVG1wLCBNNE9TQV9UUlVFKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFZTUzNHUFBfaW50UmVuZGVyRnJhbWVXaXRoRWZmZWN0OiBcCi0gICAgICAgICAgICAgICAgICAgIFJlbmRlciByZXR1cm5zIGVycm9yIDB4JXgsIiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcENsaXBDdHh0LT5sYXN0RGVjb2RlZFBsYW5lID0gcFRtcDsKLSAgICAgICAgfQotICAgICAgICBwQ2xpcEN0eHQtPmlWaWRlb1JlbmRlckN0cyA9IChNNE9TQV9JbnQzMil0czsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2ludFJvdGF0ZVZpZGVvKE00VklGSV9JbWFnZVBsYW5lKiBwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHJvdGF0aW9uRGVncmVlKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBvdXRQbGFuZVszXTsKLQotICAgIGlmIChyb3RhdGlvbkRlZ3JlZSAhPSAxODApIHsKLSAgICAgICAgLy8gU3dhcCB3aWR0aCBhbmQgaGVpZ2h0IG9mIGluIHBsYW5lCi0gICAgICAgIG91dFBsYW5lWzBdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodDsKLSAgICAgICAgb3V0UGxhbmVbMF0udV9oZWlnaHQgPSBwUGxhbmVJblswXS51X3dpZHRoOwotICAgICAgICBvdXRQbGFuZVswXS51X3N0cmlkZSA9IG91dFBsYW5lWzBdLnVfd2lkdGg7Ci0gICAgICAgIG91dFBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIG91dFBsYW5lWzBdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgKG91dFBsYW5lWzBdLnVfc3RyaWRlKm91dFBsYW5lWzBdLnVfaGVpZ2h0KSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIm91dCBZIHBsYW5lIGZvciByb3RhdGlvbiIpKTsKLSAgICAgICAgaWYgKG91dFBsYW5lWzBdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIG91dFBsYW5lWzFdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodC8yOwotICAgICAgICBvdXRQbGFuZVsxXS51X2hlaWdodCA9IHBQbGFuZUluWzBdLnVfd2lkdGgvMjsKLSAgICAgICAgb3V0UGxhbmVbMV0udV9zdHJpZGUgPSBvdXRQbGFuZVsxXS51X3dpZHRoOwotICAgICAgICBvdXRQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBvdXRQbGFuZVsxXS5wYWNfZGF0YSA9IChNNE9TQV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIChvdXRQbGFuZVsxXS51X3N0cmlkZSpvdXRQbGFuZVsxXS51X2hlaWdodCksIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciopKCJvdXQgVSBwbGFuZSBmb3Igcm90YXRpb24iKSk7Ci0gICAgICAgIGlmIChvdXRQbGFuZVsxXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgICAgICBmcmVlKCh2b2lkICopb3V0UGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0UGxhbmVbMl0udV93aWR0aCA9IHBQbGFuZUluWzBdLnVfaGVpZ2h0LzI7Ci0gICAgICAgIG91dFBsYW5lWzJdLnVfaGVpZ2h0ID0gcFBsYW5lSW5bMF0udV93aWR0aC8yOwotICAgICAgICBvdXRQbGFuZVsyXS51X3N0cmlkZSA9IG91dFBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgICAgIG91dFBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIG91dFBsYW5lWzJdLnBhY19kYXRhID0gKE00T1NBX1VJbnQ4ICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgKG91dFBsYW5lWzJdLnVfc3RyaWRlKm91dFBsYW5lWzJdLnVfaGVpZ2h0KSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIm91dCBWIHBsYW5lIGZvciByb3RhdGlvbiIpKTsKLSAgICAgICAgaWYgKG91dFBsYW5lWzJdLnBhY19kYXRhID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgICAgIGZyZWUoKHZvaWQgKilvdXRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKCh2b2lkICopb3V0UGxhbmVbMV0ucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoKHJvdGF0aW9uRGVncmVlKSB7Ci0gICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICBNNFZJRklfUm90YXRlOTBSaWdodFlVVjQyMHRvWVVWNDIwKE00T1NBX05VTEwsIHBQbGFuZUluLCBvdXRQbGFuZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgIC8vIEluIHBsYW5lIHJvdGF0aW9uLCBzbyBwbGFuZU91dCA9IHBsYW5lSW4KLSAgICAgICAgICAgIE00VklGSV9Sb3RhdGUxODBZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCBwUGxhbmVJbiwgcFBsYW5lSW4pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyNzA6Ci0gICAgICAgICAgICBNNFZJRklfUm90YXRlOTBMZWZ0WVVWNDIwdG9ZVVY0MjAoTTRPU0FfTlVMTCwgcFBsYW5lSW4sIG91dFBsYW5lKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiaW52YWxpZCByb3RhdGlvbiBwYXJhbSAlZCIsIChpbnQpcm90YXRpb25EZWdyZWUpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHJvdGF0aW9uRGVncmVlICE9IDE4MCkgewotICAgICAgICBtZW1zZXQoKHZvaWQgKilwUGxhbmVJblswXS5wYWNfZGF0YSwgMCwKLSAgICAgICAgICAgIChwUGxhbmVJblswXS51X3dpZHRoKnBQbGFuZUluWzBdLnVfaGVpZ2h0KSk7Ci0gICAgICAgIG1lbXNldCgodm9pZCAqKXBQbGFuZUluWzFdLnBhY19kYXRhLCAwLAotICAgICAgICAgICAgKHBQbGFuZUluWzFdLnVfd2lkdGgqcFBsYW5lSW5bMV0udV9oZWlnaHQpKTsKLSAgICAgICAgbWVtc2V0KCh2b2lkICopcFBsYW5lSW5bMl0ucGFjX2RhdGEsIDAsCi0gICAgICAgICAgICAocFBsYW5lSW5bMl0udV93aWR0aCpwUGxhbmVJblsyXS51X2hlaWdodCkpOwotICAgICAgICAvLyBDb3B5IFksIFUgYW5kIFYgcGxhbmVzCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQbGFuZUluWzBdLnBhY19kYXRhLCAodm9pZCAqKW91dFBsYW5lWzBdLnBhY19kYXRhLAotICAgICAgICAgICAgKHBQbGFuZUluWzBdLnVfd2lkdGgqcFBsYW5lSW5bMF0udV9oZWlnaHQpKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcFBsYW5lSW5bMV0ucGFjX2RhdGEsICh2b2lkICopb3V0UGxhbmVbMV0ucGFjX2RhdGEsCi0gICAgICAgICAgICAocFBsYW5lSW5bMV0udV93aWR0aCpwUGxhbmVJblsxXS51X2hlaWdodCkpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGxhbmVJblsyXS5wYWNfZGF0YSwgKHZvaWQgKilvdXRQbGFuZVsyXS5wYWNfZGF0YSwKLSAgICAgICAgICAgIChwUGxhbmVJblsyXS51X3dpZHRoKnBQbGFuZUluWzJdLnVfaGVpZ2h0KSk7Ci0KLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzFdLnBhY19kYXRhKTsKLSAgICAgICAgZnJlZSgodm9pZCAqKW91dFBsYW5lWzJdLnBhY19kYXRhKTsKLQotICAgICAgICAvLyBTd2FwIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbiBwbGFuZQotICAgICAgICB1aW50MzJfdCB0ZW1wID0gMDsKLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzBdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzBdLnVfd2lkdGggPSBwUGxhbmVJblswXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMF0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblswXS51X3N0cmlkZSA9IHBQbGFuZUluWzBdLnVfd2lkdGg7Ci0KLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzFdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzFdLnVfd2lkdGggPSBwUGxhbmVJblsxXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMV0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblsxXS51X3N0cmlkZSA9IHBQbGFuZUluWzFdLnVfd2lkdGg7Ci0KLSAgICAgICAgdGVtcCA9IHBQbGFuZUluWzJdLnVfd2lkdGg7Ci0gICAgICAgIHBQbGFuZUluWzJdLnVfd2lkdGggPSBwUGxhbmVJblsyXS51X2hlaWdodDsKLSAgICAgICAgcFBsYW5lSW5bMl0udV9oZWlnaHQgPSB0ZW1wOwotICAgICAgICBwUGxhbmVJblsyXS51X3N0cmlkZSA9IHBQbGFuZUluWzJdLnVfd2lkdGg7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIE00VlNTM0dQUF9pbnRTZXRZVVY0MjBQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLCBNNE9TQV9VSW50MzIgaGVpZ2h0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGlmIChwbGFuZUluID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk5VTEwgaW4gcGxhbmUsIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgcGxhbmVJblswXS51X3dpZHRoID0gd2lkdGg7Ci0gICAgcGxhbmVJblswXS51X2hlaWdodCA9IGhlaWdodDsKLSAgICBwbGFuZUluWzBdLnVfc3RyaWRlID0gcGxhbmVJblswXS51X3dpZHRoOwotCi0gICAgcGxhbmVJblsxXS51X3dpZHRoID0gd2lkdGgvMjsKLSAgICBwbGFuZUluWzFdLnVfaGVpZ2h0ID0gaGVpZ2h0LzI7Ci0gICAgcGxhbmVJblsxXS51X3N0cmlkZSA9IHBsYW5lSW5bMV0udV93aWR0aDsKLQotICAgIHBsYW5lSW5bMl0udV93aWR0aCA9IHdpZHRoLzI7Ci0gICAgcGxhbmVJblsyXS51X2hlaWdodCA9IGhlaWdodC8yOwotICAgIHBsYW5lSW5bMl0udV9zdHJpZGUgPSBwbGFuZUluWzFdLnVfd2lkdGg7Ci0KLSAgICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9NNFZTUzNHUFBfTWVkaWFBbmRDb2RlY1N1YnNjcmlwdGlvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMzBmNzA1Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDQ2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTRWU1MzR1BQX01lZGlhQW5kQ29kZWNTdWJzY3JpcHRpb24uYwotICogQGJyaWVmICAgIE1lZGlhIHJlYWRlcnMgYW5kIGNvZGVjcyBzdWJzY3JpcHRpb24KLSAqIEBub3RlICAgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBzdWJzY3JpcHRpb24gb2Ygc3VwcG9ydGVkIG1lZGlhCi0gKiAgICAgICAgICAgIHJlYWRlcnMgYW5kIGRlY29kZXJzIGZvciB0aGUgVlNTLiBQb3RlbnRpYWwgc3VwcG9ydCBjYW4KLSAqICAgICAgICAgICAgYmUgYWN0aXZhdGVkIG9yIGRlLWFjdGl2YXRlZAotICogICAgICAgICAgICB1c2luZyBjb21waWxhdGlvbiBmbGFncyBzZXQgaW4gdGhlIHByb2plY3RzIHNldHRpbmdzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSAiTlhQU1dfQ29tcGlsZXJTd2l0Y2hlcy5oIgotCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00VlNTM0dQUF9JbnRlcm5hbFR5cGVzLmgiICAgICAgICAgICAgICAgIC8qKjwgSW5jbHVkZSBmb3IgVlNTIHNwZWNpZmljIHR5cGVzICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0ludGVybmFsRnVuY3Rpb25zLmgiICAgICAgICAgICAgLyoqPCBSZWdpc3RyYXRpb24gbW9kdWxlICovCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICByZWFkZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLS8qIFJlYWRlciByZWdpc3RyYXRpb24gOiBhdCBsZWFzdCBvbmUgcmVhZGVyIG11c3QgYmUgZGVmaW5lZCAqLwotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl8zR1AKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0jaWZuZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMwotI2lmbmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00KLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9BVURFQ19OVUxMCi0jZXJyb3IgIm5vIHJlYWRlciByZWdpc3RlcmVkIgotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTCAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX1BDTSAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX01QMyAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUiAqLwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUCAqLwotCi0vKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBNUEVHNCBkZWNvZGVyICovCi0jaWYgIWRlZmluZWQoTTRWU1NfU1VQUE9SVF9WSURFQ18zR1ApICYmICFkZWZpbmVkKE00VlNTX0VOQUJMRV9FWFRFUk5BTF9ERUNPREVSUykKLSNlcnJvciAiV2FpdCwgd2hhdD8iCi0vKiAiSGV5LCB0aGlzIGlzIHRoZSBWU1MzR1BQIHNwZWFraW5nLiBQcmF5IHRlbGwsIGhvdyB0aGUgaGVjayBkbyB5b3UgZXhwZWN0IG1lIHRvIGJlIGFibGUgdG8gZG8KLWFueSBlZGl0aW5nIHdpdGhvdXQgYSBidWlsdC1pbiB2aWRlbyBkZWNvZGVyLCBub3IgdGhlIHBvc3NpYmlsaXR5IHRvIHJlY2VpdmUgYW4gZXh0ZXJuYWwgb25lPyEKLVNlcmlvdXNseSwgSSdkIGxvdmUgdG8ga25vdy4iICovCi0jZW5kaWYKLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCByZWFkZXIgdG8gc3Vic2NyaWJlICovCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3IzZ3BSZWFkZXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX0FNUgotI2luY2x1ZGUgIk00UkVBREVSX0Ftci5oIgotI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JNcDNSZWFkZXIuaCIKLSNlbmRpZgotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSX1BDTQotI2luY2x1ZGUgIk00UkVBREVSX1BjbS5oIgotI2VuZGlmCi0KLQotLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0vKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgYXVkaW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyLmgiCi0jaW5jbHVkZSAiTTRERUNPREVSX051bGwuaCIKLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX05VTEwKLSNpbmNsdWRlICJNNEFEX051bGwuaCIKLSNlbmRpZgotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLS8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0vKiBXcml0ZXIgcmVnaXN0cmF0aW9uIDogYXQgbGVhc3Qgb25lIHdyaXRlciBtdXN0IGJlIGRlZmluZWQgKi8KLS8vI2lmbmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIKLSNpZm5kZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotI2Vycm9yICJubyB3cml0ZXIgcmVnaXN0ZXJlZCIKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQICovCi0vLyNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIgKi8KLQotLyogSW5jbHVkZSBmaWxlcyBmb3IgZWFjaCB3cml0ZXIgdG8gc3Vic2NyaWJlICovCi0vLyNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl9BTVIKLS8qZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl9BTVJfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi1NNFdSSVRFUl9HbG9iYWxJbnRlcmZhY2UqKiBTcmNHbG9iYWxJbnRlcmZhY2UsCi1NNFdSSVRFUl9EYXRhSW50ZXJmYWNlKiogU3JjRGF0YUludGVyZmFjZSk7Ki8KLS8vI2VuZGlmCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9XUklURVJfM0dQUAotZXh0ZXJuIE00T1NBX0VSUiBNNFdSSVRFUl8zR1BfZ2V0SW50ZXJmYWNlcyggTTRXUklURVJfT3V0cHV0RmlsZVR5cGUqIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00V1JJVEVSX0dsb2JhbEludGVyZmFjZSoqIFNyY0dsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSoqIFNyY0RhdGFJbnRlcmZhY2UpOwotI2VuZGlmCi0KLS8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0vKnwgIHZpZGVvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLS8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaCIKLQotCi0vKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLS8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotLyp8ICBhdWRpbyBlbmNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0vKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotCi0jZGVmaW5lIE00RVJSX0NIRUNLX05VTExfUkVUVVJOX1ZBTFVFKHJldHZhbCwgcG9pbnRlcikgaWYgKChwb2ludGVyKSA9PSBNNE9TQV9OVUxMKVwKLSAgICByZXR1cm4gKChNNE9TQV9FUlIpKHJldHZhbCkpOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZTUzNHUFBfU3Vic2NyaWJlTWVkaWFBbmRDb2RlYygpCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIHJlYWRlciwgZGVjb2RlcnMsIHdyaXRlcnMgYW5kIGVuY29kZXJzCi0gKiAgICAgICAgICBpbiB0aGUgVlNTLgotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgKElOKSBFeGVjdXRpb24gY29udGV4dC4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgIHBDb250ZXh0IGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjKE00VlNTM0dQUF9NZWRpYUFuZENvZGVjQ3R4dCAqcENvbnRleHQpCi17Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNFJFQURFUl9NZWRpYVR5cGUgICAgICAgICAgcmVhZGVyTWVkaWFUeXBlOwotICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSogICBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UqICAgICBwUmVhZGVyRGF0YUludGVyZmFjZTsKLQotICAgIE00V1JJVEVSX091dHB1dEZpbGVUeXBlICAgICB3cml0ZXJNZWRpYVR5cGU7Ci0gICAgTTRXUklURVJfR2xvYmFsSW50ZXJmYWNlKiAgIHBXcml0ZXJHbG9iYWxJbnRlcmZhY2U7Ci0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgIHBXcml0ZXJEYXRhSW50ZXJmYWNlOwotCi0gICAgTTRBRF9UeXBlICAgICAgICAgICAgICAgICAgIGF1ZGlvRGVjb2RlclR5cGU7Ci0gICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0ICAgICAgIGF1ZGlvQ29kZWNUeXBlOwotICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSogcEF1ZGlvQ29kZWNJbnRlcmZhY2U7Ci0gICAgTTRBRF9JbnRlcmZhY2UqICAgICAgICAgICAgIHBBdWRpb0RlY29kZXJJbnRlcmZhY2U7Ci0KLSAgICBNNERFQ09ERVJfVmlkZW9UeXBlICAgICAgICAgdmlkZW9EZWNvZGVyVHlwZTsKLSAgICBNNEVOQ09ERVJfRm9ybWF0ICAgICAgICAgICAgdmlkZW9Db2RlY1R5cGU7Ci0gICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSogIHBWaWRlb0NvZGVjSW50ZXJmYWNlOwotICAgIE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSogICBwVmlkZW9EZWNvZGVySW50ZXJmYWNlOwotCi0gICAgTTRFUlJfQ0hFQ0tfTlVMTF9SRVRVUk5fVkFMVUUoTTRFUlJfUEFSQU1FVEVSLCBwQ29udGV4dCk7Ci0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICByZWFkZXIgc3Vic2NyaXB0aW9uICB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIDNHUCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfUkVBREVSXzNHUAotICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSggJnJlYWRlck1lZGlhVHlwZSwgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl8zR1AgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLCBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciAzR1AgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfM0dQICovCi0KLSAgICAvKiAtLS0gQU1SIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SCi0gICAgZXJyID0gTTRSRUFERVJfQU1SX2dldEludGVyZmFjZXMoICZyZWFkZXJNZWRpYVR5cGUsICZwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAmcFJlYWRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFJFQURFUl9BTVIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyUmVhZGVyKCBwQ29udGV4dCwgcmVhZGVyTWVkaWFUeXBlLCBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBBTVIgcmVhZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9SRUFERVJfQU1SICovCi0KLSAgICAvKiAtLS0gTVAzIC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9SRUFERVJfTVAzCi0gICAgZXJyID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlKCAmcmVhZGVyTWVkaWFUeXBlLCAmcFJlYWRlckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX01QMyBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIE1QMyByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9NUDMgKi8KLQotICAgIC8qIC0tLSBQQ00gLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00KLSAgICBlcnIgPSBNNFJFQURFUl9QQ01fZ2V0SW50ZXJmYWNlcyggJnJlYWRlck1lZGlhVHlwZSwgJnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgICZwUmVhZGVyRGF0YUludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00UkVBREVSX1BDTSBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJSZWFkZXIoIHBDb250ZXh0LCByZWFkZXJNZWRpYVR5cGUsIHBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIHBSZWFkZXJEYXRhSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIFBDTSByZWFkZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1JFQURFUl9QQ00gKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZGVjb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0ICYgSDI2MyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfVklERUNfM0dQCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KCZ2aWRlb0RlY29kZXJUeXBlLCAoTTRPU0FfVm9pZCAqKSZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX01QRUc0IGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRGVjb2RlciggcENvbnRleHQsIHZpZGVvRGVjb2RlclR5cGUsIHBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgTVBFRzQgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfVklERUNfM0dQICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1ZJREVPX0FWQwotICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9IMjY0KCZ2aWRlb0RlY29kZXJUeXBlLCAoTTRPU0FfVm9pZCAqKSZwVmlkZW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRERUNPREVSX0gyNjQgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKCBwQ29udGV4dCwgdmlkZW9EZWNvZGVyVHlwZSwgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBIMjY0IGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX1ZJREVDXzNHUCAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9WSURFQ19OVUxMCi0gICAgZXJyID0gTTRERUNPREVSX05VTExfZ2V0SW50ZXJmYWNlKAotICAgICAgICAgICAgICAmdmlkZW9EZWNvZGVyVHlwZSwgJnBWaWRlb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRWRCBOVUxMIERlY29kZXIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyVmlkZW9EZWNvZGVyKAotICAgICAgICAgICAgICBwQ29udGV4dCwgdmlkZW9EZWNvZGVyVHlwZSwgcFZpZGVvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBcCi0gICAgICAgIGNhbid0IHJlZ2lzdGVyIHZpZGVvIE5VTEwgZGVjb2RlciIpOwotI2VuZGlmCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovCi0gICAgLyp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCovCi0gICAgLyp8ICBhdWRpbyBkZWNvZGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCovCi0KLSAgICAvKiAtLS0gQU1STkIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX0FNUk5CCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKCZhdWRpb0RlY29kZXJUeXBlLCAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00IEFNUk5CIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQU1STkIgZGVjb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfQU1STkIgKi8KLQotICAgIC8qIC0tLSBBQUMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0FVREVDX0FBQwotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BQUMoJmF1ZGlvRGVjb2RlclR5cGUsICZwQXVkaW9EZWNvZGVySW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTQgQUFDIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgQUFDIGRlY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0FVREVDX0FBQyAqLwotCi0gICAgLyogLS0tIE1QMyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTVAzCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QMygmYXVkaW9EZWNvZGVyVHlwZSwgJnBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNCBNUDMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9EZWNvZGVyKCBwQ29udGV4dCwgYXVkaW9EZWNvZGVyVHlwZSwgcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciBNUDMgZGVjb2RlciIpOwotI2VuZGlmICAvKiBNNFZTU19TVVBQT1JUX0FVREVDX01QMyAqLwotCi0KLSAgICAvKiAtLS0gTlVMTCAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTAotICAgIGVyciA9IE00QURfTlVMTF9nZXRJbnRlcmZhY2UoICZhdWRpb0RlY29kZXJUeXBlLCAmcEF1ZGlvRGVjb2RlckludGVyZmFjZSk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00QUQgTlVMTCBEZWNvZGVyIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlckF1ZGlvRGVjb2RlciggcENvbnRleHQsIGF1ZGlvRGVjb2RlclR5cGUsIHBBdWRpb0RlY29kZXJJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgRVZSQyBkZWNvZGVyIik7Ci0jZW5kaWYgIC8qIE00VlNTX1NVUFBPUlRfQVVERUNfTlVMTCAqLwotCi0gICAgLyogX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgd3JpdGVyIHN1YnNjcmlwdGlvbiAgfCovCi0gICAgLyp8X19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotCi0gICAgLyogLS0tIDNHUFAgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX1dSSVRFUl8zR1BQCi0gICAgLyogcmV0cmlldmVzIHRoZSAzR1BQIHdyaXRlciBtZWRpYSB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gTTRXUklURVJfM0dQX2dldEludGVyZmFjZXMoICZ3cml0ZXJNZWRpYVR5cGUsICZwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICAmcFdyaXRlckRhdGFJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNFdSSVRFUl8zR1AgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyV3JpdGVyKCBwQ29udGV4dCwgd3JpdGVyTWVkaWFUeXBlLCBwV3JpdGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciAzR1BQIHdyaXRlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfV1JJVEVSXzNHUFAgKi8KLQotICAgIC8qIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAqLwotICAgIC8qfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwqLwotICAgIC8qfCAgdmlkZW8gZW5jb2RlciBzdWJzY3JpcHRpb24gIHwqLwotICAgIC8qfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wqLwotCi0gICAgLyogLS0tIE1QRUc0IC0tLSAqLwotCi0jaWZkZWYgTTRWU1NfU1VQUE9SVF9FTkNPREVSX01QRUc0Ci0gICAgLyogcmV0cmlldmVzIHRoZSBNUEVHNCBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9NUEVHNCBpbnRlcmZhY2UgYWxsb2NhdGlvbiBlcnJvciIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlcnIgPSBNNFZTUzNHUFBfcmVnaXN0ZXJWaWRlb0VuY29kZXIoIHBDb250ZXh0LCB2aWRlb0NvZGVjVHlwZSwgcFZpZGVvQ29kZWNJbnRlcmZhY2UpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoZXJyICE9IE00Tk9fRVJST1IpLCBlcnIsCi0gICAgICAgICJNNFZTUzNHUFBfc3Vic2NyaWJlTWVkaWFBbmRDb2RlYzogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gTVBFRzQgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9NUEVHNCAqLwotCi0gICAgLyogLS0tIEgyNjMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjMgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00TVA0RV9IMjYzIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLCBwVmlkZW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciB2aWRlbyBIMjYzIGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfTVBFRzQgKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BVkMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEgyNjQgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoJnZpZGVvQ29kZWNUeXBlLCAmcFZpZGVvQ29kZWNJbnRlcmZhY2UsCi0gICAgICAgICBNNEVOQ09ERVJfT1BFTl9BRFZBTkNFRCk7Ci0gICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBNNEgyNjRFIGludGVyZmFjZSBhbGxvY2F0aW9uIGVycm9yIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGVyciA9IE00VlNTM0dQUF9yZWdpc3RlclZpZGVvRW5jb2RlciggcENvbnRleHQsIHZpZGVvQ29kZWNUeXBlLCBwVmlkZW9Db2RlY0ludGVyZmFjZSk7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChlcnIgIT0gTTROT19FUlJPUiksIGVyciwKLSAgICAgICAgIk00VlNTM0dQUF9zdWJzY3JpYmVNZWRpYUFuZENvZGVjOiBjYW4ndCByZWdpc3RlciB2aWRlbyBIMjY0IGVuY29kZXIiKTsKLSNlbmRpZiAvKiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQVZDICovCi0KLSAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gKi8KLSAgICAvKnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ki8KLSAgICAvKnwgIGF1ZGlvIGVuY29kZXIgc3Vic2NyaXB0aW9uICB8Ki8KLSAgICAvKnxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ki8KLQotICAgIC8qIC0tLSBBTVIgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfQU1SCi0gICAgLyogcmV0cmlldmVzIHRoZSBBTVIgZW5jb2RlciB0eXBlIGFuZCBwb2ludGVyIHRvIGZ1bmN0aW9ucyovCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKCZhdWRpb0NvZGVjVHlwZSwgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBTVIgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFNUiBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FNUiAqLwotCi0gICAgLyogLS0tIEFBQyAtLS0gKi8KLQotI2lmZGVmIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9BQUMKLSAgICAvKiByZXRyaWV2ZXMgdGhlIEFBQyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKCZhdWRpb0NvZGVjVHlwZSwgJnBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTRBQUMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEFBQyBlbmNvZGVyIik7Ci0jZW5kaWYgLyogTTRWU1NfU1VQUE9SVF9FTkNPREVSX0FBQyAqLwotCi0gICAgLyogLS0tIEVWUkMgLS0tICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX0VOQ09ERVJfRVZSQwotICAgIC8qIHJldHJpZXZlcyB0aGUgRVZSQyBlbmNvZGVyIHR5cGUgYW5kIHBvaW50ZXIgdG8gZnVuY3Rpb25zKi8KLSAgICBlcnIgPSBNNEVWUkNfZ2V0SW50ZXJmYWNlcyggJmF1ZGlvQ29kZWNUeXBlLCAmcEF1ZGlvQ29kZWNJbnRlcmZhY2UpOwotICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNEVWUkMgaW50ZXJmYWNlIGFsbG9jYXRpb24gZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gTTRWU1MzR1BQX3JlZ2lzdGVyQXVkaW9FbmNvZGVyKCBwQ29udGV4dCwgYXVkaW9Db2RlY1R5cGUsIHBBdWRpb0NvZGVjSW50ZXJmYWNlKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKGVyciAhPSBNNE5PX0VSUk9SKSwgZXJyLAotICAgICAgICAiTTRWU1MzR1BQX3N1YnNjcmliZU1lZGlhQW5kQ29kZWM6IGNhbid0IHJlZ2lzdGVyIGF1ZGlvIEVWUkMgZW5jb2RlciIpOwotI2VuZGlmIC8qIE00VlNTX1NVUFBPUlRfRU5DT0RFUl9FVlJDICovCi0KLSNpZmRlZiBNNFZTU19TVVBQT1JUX09NWF9DT0RFQ1MKLSAgICBwQ29udGV4dC0+YkFsbG93RnJlZWluZ09NWENvZGVjSW50ZXJmYWNlID0gTTRPU0FfVFJVRTsgICAvKiB3aGVuIE5YUCBTVyBjb2RlY3MgYXJlIHJlZ2lzdGVyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGFsbG93IHVucmVnaXN0cmF0aW9uKi8KLSNlbmRpZgotCi0KLSAgICByZXR1cm4gZXJyOwotfQotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19BUEkuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX0FQSS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZjU0MTBiLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX0FQSS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgTTR4VlNTX0FQSS5jCi0gKiBAYnJpZWYgICAgQVBJIG9mIGVYdGVuZGVkIFZpZGVvIFN0dWRpbyBTZXJ2aWNlIChWaWRlbyBTdHVkaW8gMi4xKQotICogQG5vdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0vKioKLSAqIE9TQUwgbWFpbiB0eXBlcyBhbmQgZXJyb3JzICoqKi8KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0Vycm9yLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRPU0FfRmlsZVdyaXRlci5oIgotI2luY2x1ZGUgIk00T1NBX0NvcmVJRC5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0vLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0jaW5jbHVkZSAiTTRFTkNPREVSX2NvbW1vbi5oIgotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oIgotCi0vKioKLSAqIFZTUyAzR1BQIEFQSSBkZWZpbml0aW9uICovCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioKLUJlZ2luIG9mIHhWU1MgQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJNNHhWU1NfQVBJLmgiCi0jaW5jbHVkZSAiTTR4VlNTX0ludGVybmFsLmgiCi0KLS8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX0luaXQoTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00eFZTU19Jbml0UGFyYW1zKiBwUGFyYW1zKQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSB4VlNTCi0gKiBAbm90ZSAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIHhWU1MgZWRpdCBvcGVyYXRpb24gKGFsbG9jYXRlcyBhbiBleGVjdXRpb24gY29udGV4dCkuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKE9VVCkgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQgdG8gYWxsb2NhdGUKLSAqIEBwYXJhbSAgICBwYXJhbXMgICAgICAgICAgICAgICAgKElOKSBQYXJhbWV0ZXJzIG1hbmRhdG9yeSBmb3IgeFZTUwotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLU00T1NBX0VSUiBNNHhWU1NfSW5pdCggTTRPU0FfQ29udGV4dCAqcENvbnRleHQsIE00eFZTU19Jbml0UGFyYW1zICpwUGFyYW1zICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0OwotICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwLCBpOwotCi0gICAgaWYoIHBQYXJhbXMgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUGFyYW1ldGVyIHN0cnVjdHVyZSBmb3IgTTR4VlNTX0luaXQgZnVuY3Rpb24gaXMgTlVMTCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIGlmKCBwUGFyYW1zLT5wRmlsZVJlYWRQdHIgPT0gTTRPU0FfTlVMTAotICAgICAgICB8fCBwUGFyYW1zLT5wRmlsZVdyaXRlUHRyID09IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAicEZpbGVSZWFkUHRyIG9yIHBGaWxlV3JpdGVQdHIgaW4gTTR4VlNTX0luaXRQYXJhbXMgc3RydWN0dXJlIGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19Db250ZXh0KSwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgeFZTUyBsYXllciIpOwotCi0gICAgaWYoIHhWU1NfY29udGV4dCA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19Jbml0Iik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIGZpbGUgcmVhZC93cml0ZSBmdW5jdGlvbnMgcG9pbnRlcnMgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciA9IHBQYXJhbXMtPnBGaWxlUmVhZFB0cjsKLSAgICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIgPSBwUGFyYW1zLT5wRmlsZVdyaXRlUHRyOwotCi0gICAgLypVVEYgQ29udmVyc2lvbiBzdXBwb3J0OiBjb3B5IGNvbnZlcnNpb24gZnVuY3Rpb25zIHBvaW50ZXJzIGFuZCBhbGxvY2F0ZSB0aGUgdGVtcG9yYXJ5Ci0gICAgIGJ1ZmZlciovCi0gICAgaWYoIHBQYXJhbXMtPnBDb252RnJvbVVURjhGY3QgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBpZiggcFBhcmFtcy0+cENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCA9Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cENvbnZGcm9tVVRGOEZjdDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgPQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBDb252VG9VVEY4RmN0OwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSA9Ci0gICAgICAgICAgICAgICAgVVRGX0NPTlZFUlNJT05fQlVGRkVSX1NJWkU7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoVVRGX0NPTlZFUlNJT05fQlVGRkVSX1NJWkUKLSAgICAgICAgICAgICAgICAqIHNpemVvZihNNE9TQV9VSW50OCksCi0gICAgICAgICAgICAgICAgTTRWQSwgKE00T1NBX0NoYXIgKikiTTR4VlNTX0luaXQ6IFVURiBjb252ZXJzaW9uIGJ1ZmZlciIpOwotCi0gICAgICAgICAgICBpZiggTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgID09IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX0luaXQ6IG9uZSBVVEYgY29udmVyc2lvbiBwb2ludGVyIGlzIG51bGwgYW5kIHRoZSBvdGhlclwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBudWxsIik7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0Lm1fVGVtcE91dENvbnZlcnNpb25TaXplID0gMDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgPQotICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICBpZiggcFBhcmFtcy0+cFRlbXBQYXRoICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgLypObyBuZWVkIHRvIGNvbnZlcnQgaW50byBVVEY4IGFzIGFsbCBpbnB1dCBvZiB4VlNTIGFyZSBpbiBVVEY4Ci0gICAgICAgICh0aGUgY29udmVyc2lvbiBjdXN0b21lciBmb3JtYXQgaW50byBVVEY4Ci0gICAgICAgIGlzIGRvbmUgaW4gVkEvVkFMKSovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHN0cmxlbihwUGFyYW1zLT5wVGVtcFBhdGgpICsgMSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MgUGF0aCBmb3IgdGVtcG9yYXJ5IGZpbGVzIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCAodm9pZCAqKXBQYXJhbXMtPnBUZW1wUGF0aCwKLSAgICAgICAgICAgIHN0cmxlbihwUGFyYW1zLT5wVGVtcFBhdGgpICsgMSk7Ci0gICAgICAgIC8qIFRPRE86IENoZWNrIHRoYXQgbm8gcHJldmlvdXMgeFZTUyB0ZW1wb3JhcnkgZmlsZXMgYXJlIHByZXNlbnQgPyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiUGF0aCBmb3IgdGVtcG9yYXJ5IGZpbGVzIGlzIE5VTEwiKTsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQpOwotICAgICAgICB4VlNTX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzID0KLSAgICAgICAgKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9FZGl0U2V0dGluZ3MpLAotICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb3B5IG9mIFZTUyBzdHJ1Y3R1cmUiKTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19Jbml0Iik7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICAgICAgeFZTU19jb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8qIEluaXRpYWxpemUgcG9pbnRlcnMgaW4gcFNldHRpbmdzICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOyAvKiBSQyAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBUaGlzIGlzIHVzZWQgdG8ga25vdyBpZiB0aGUgdXNlciBoYXMgYWRkZWQgb3IgcmVtb3ZlZCBzb21lIG1lZGlhcyAqLwotICAgIHhWU1NfY29udGV4dC0+cHJldmlvdXNDbGlwTnVtYmVyID0gMDsKLQotICAgIC8qICJTdGF0ZSBtYWNoaW5lIiAqLwotICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPSAwOwotICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBJbml0aWFsaXplIFB0bzNHUFAgYW5kIE1DUyBsaXN0cyAqLwotICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9IE00T1NBX05VTEw7Ci0KLSAgICB4VlNTX2NvbnRleHQtPnRlbXBGaWxlSW5kZXggPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgPSAwOwotCi0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IDA7Ci0KLSAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotCi0gICAgLypGQjogaW5pdGlhbGl6ZSB0byBhdm9pZCBjcmFzaCB3aGVuIGVycm9yIGR1cmluZyB0aGUgZWRpdGluZyovCi0gICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0KLSAgICAvKiBJbml0aWFsaXplIHN0YXRlIGlmIGFsbCBpbml0aWFsaXphdGlvbnMgYXJlIGNvcnJlY3RzICovCi0gICAgeFZTU19jb250ZXh0LT5tX3N0YXRlID0gTTR4VlNTX2tTdGF0ZUluaXRpYWxpemVkOwotCi0gICAgLyogaW5pdGlhbGl6ZSBNQ1MgY29udGV4dCovCi0gICAgeFZTU19jb250ZXh0LT5wTUNTX0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgKnBDb250ZXh0ID0geFZTU19jb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBnaXZlbiBlZGl0aW5nIHN0cnVjdHVyZSBpbiBvcmRlciB0bwotICogICAgICAgICAgICAgICAgbWluaW1pemUgdGhlIHRyYW5zY29kaW5nIHRpbWUuCi0gKiBAbm90ZSAgICAgICAgVGhlIHhWU1MgYW5hbHlzZXMgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBpZiBuZWVkZWQsIGNoYW5nZXMgdGhlCi0gKiAgICAgICAgICAgICAgICBvdXRwdXQgcGFyYW1ldGVycyAoVmlkZW8gY29kZWMsIHZpZGVvIHNpemUsIGF1ZGlvIGNvZGVjLAotICogICAgICAgICAgICAgICAgYXVkaW8gbmIgb2YgY2hhbm5lbHMpIHRvIG1pbmltaXplIHRoZSB0cmFuc2NvZGluZyB0aW1lLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChPVVQpIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0IHRvIGFsbG9jYXRlCi0gKiBAcGFyYW0gICAgcFNldHRpbmdzICAgICAgICAgICAgKElOKSBFZGl0aW9uIHNldHRpbmdzIChhbGxvY2F0ZWQgYnkgdGhlIHVzZXIpCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6ICAgICAgICBNZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUoIE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJREVPRURJVElOR19DbGlwUHJvcGVydGllcyBmaWxlUHJvcGVydGllczsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX0Jvb2wgYkF1ZGlvVHJhbnNpdGlvbiA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYklzQkdNUmVwbGFjZSA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgYkZvdW5kOwotICAgIE00T1NBX1VJbnQzMiB2aWRlb0NvbmZpZ1s5XSA9Ci0gICAgewotICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi0gICAgfTsKLSAgICAvKiogSW5kZXggPC0+IFZpZGVvIGNvbmZpZyAqKi8KLSAgICAvKiAwOiAgICAgICAgSDI2MyAgU1FDSUYgICAgICAgICovCi0gICAgLyogMTogICAgICAgIEgyNjMgIFFDSUYgICAgICAgICovCi0gICAgLyogMjogICAgICAgIEgyNjMgIENJRiAgICAgICAgKi8KLSAgICAvKiAzOiAgICAgICAgTVBFRzQgU1FDSUYgICAgICAgICovCi0gICAgLyogNDogICAgICAgIE1QRUc0IFFRVkdBICAgICAgICAqLwotICAgIC8qIDU6ICAgICAgICBNUEVHNCBRQ0lGICAgICAgICAqLwotICAgIC8qIDY6ICAgICAgICBNUEVHNCBRVkdBICAgICAgICAqLwotICAgIC8qIDc6ICAgICAgICBNUEVHNCBDSUYgICAgICAgICovCi0gICAgLyogODogICAgICAgIE1QRUc0IFZHQSAgICAgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBNNE9TQV9VSW50MzIgYXVkaW9Db25maWdbM10gPQotICAgIHsKLSAgICAgICAgMCwgMCwgMAotICAgIH07Ci0gICAgLyoqIEluZGV4IDwtPiBBdWRpbyBjb25maWcgKiovCi0gICAgLyogMDogICAgQU1SICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIDE6ICAgIEFBQyAgICAxNmtIeiBtb25vICAgICAgICAqLwotICAgIC8qIDI6ICAgIEFBQyAxNmtIeiBzdGVyZW8gICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgXAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZU9wZW5lZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19SZWR1Y2VUcmFuc2NvZGUgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBudW1iZXIgb2YgY2xpcHMgKi8KLSAgICBpZiggcFNldHRpbmdzLT51aUNsaXBOdW1iZXIgPT0gMCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGhlIG51bWJlciBvZiBpbnB1dCBjbGlwIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgISIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGEgYmFja2dyb3VuZCBtdXNpYywgYW5kIGlmIGl0cyBhdWRpbyB3aWxsIHJlcGxhY2UgaW5wdXQgY2xpcCBhdWRpbyAqLwotICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgaWYoIHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lID09IDEwMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJJc0JHTVJlcGxhY2UgPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogUGFyc2UgYWxsIGNsaXBzLCBhbmQgZ2l2ZSBvY2N1cmVuY2VzIG9mIGVhY2ggY29tYmluYXRpb24gKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgLyogV2UgaWdub3JlIEpQRyBpbnB1dCBmaWxlcyBhcyB0aGV5IGFyZSBhbHdheXMgdHJhbnNjb2RlZCAqLwotICAgICAgICBpZiggcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IDA7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmQ29udmVydGVkU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19SZWR1Y2VUcmFuc2NvZGU6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBFbmQgb2YgdGhlIHV0ZiBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBjb252ZXJ0ZWQgcGF0aCovCi0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKHhWU1NfY29udGV4dCwgcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICZmaWxlUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIC8vZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgIC8vICAgICAmZmlsZVByb3BlcnRpZXMpOwotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlID8gKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBDaGVjayBiZXN0IHZpZGVvIHNldHRpbmdzICovCi0gICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDEyOAotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gOTYgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbMF0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSBcCi0gICAgICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzNdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDE2MAotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gMTIwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKCBmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSBcCi0gICAgICAgICAgICAgICAgICAgIHx8IChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0gyNjQpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzRdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMudWlWaWRlb1dpZHRoID09IDE3NgotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9IZWlnaHQgPT0gMTQ0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjYzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvQ29uZmlnWzFdICs9IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcFZpZGVvRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoICggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tNUEVHNCkgXAotICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1s1XSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAzMjAKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDI0MCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoICggZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkgXAotICAgICAgICAgICAgICAgICAgICB8fCAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tIMjY0KSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1s2XSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9XaWR0aCA9PSAzNTIKLSAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy51aVZpZGVvSGVpZ2h0ID09IDI4OCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2MyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlb0NvbmZpZ1syXSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBWaWRlb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCAoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbN10gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy51aVZpZGVvV2lkdGggPT0gNjQwCi0gICAgICAgICAgICAgICAgJiYgZmlsZVByb3BlcnRpZXMudWlWaWRlb0hlaWdodCA9PSA0ODAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoIGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpIFwKLSAgICAgICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rSDI2NCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9Db25maWdbOF0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwVmlkZW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIGEgQkdNIHRoYXQgcmVwbGFjZXMgZXhpc3RpbmcgYXVkaW8gdHJhY2ssIHdlIGRvIG5vdCBjYXJlIGFib3V0Ci0gICAgICAgICAgICBhdWRpbyB0cmFjayBhcyBpdCB3aWxsIGJlIHJlcGxhY2VkICovCi0gICAgICAgICAgICAvKiBJZiBub3QsIHdlIHRyeSB0byBtaW5pbWl6ZSBhdWRpbyByZWVuY29kaW5nICovCi0gICAgICAgICAgICBpZiggYklzQkdNUmVwbGFjZSA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDE2MDAwICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAxICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Db25maWdbMV0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy51aVNhbXBsaW5nRnJlcXVlbmN5ID09IDE2MDAwICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQcm9wZXJ0aWVzLnVpTmJDaGFubmVscyA9PSAyICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Db25maWdbMl0gKz0gZmlsZVByb3BlcnRpZXMudWlDbGlwQXVkaW9EdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FNUl9OQiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhdWRpb0NvbmZpZ1swXSArPSBmaWxlUHJvcGVydGllcy51aUNsaXBBdWRpb0R1cmF0aW9uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmQgYmVzdCBvdXRwdXQgdmlkZW8gZm9ybWF0ICh0aGUgbW9zdCBvY2N1cmluZyBjb21iaW5hdGlvbikgKi8KLSAgICBqID0gMDsKLSAgICBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgOTsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCB2aWRlb0NvbmZpZ1tpXSA+PSB2aWRlb0NvbmZpZ1tqXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGogPSBpOwotICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBiRm91bmQgKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBqICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tIMjYzOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rU1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rSDI2MzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa0NJRjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KQotICAgICAgICAgICAgICAgICAgICA/IE00VklERU9FRElUSU5HX2tNUEVHNCA6IE00VklERU9FRElUSU5HX2tIMjY0OwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPSBNNFZJREVPRURJVElOR19rU1FDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rTVBFRzQgOiBNNFZJREVPRURJVElOR19rSDI2NDsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1FRVkdBOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tRQ0lGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tRVkdBOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rTVBFRzQpCi0gICAgICAgICAgICAgICAgICAgID8gTTRWSURFT0VESVRJTkdfa01QRUc0IDogTTRWSURFT0VESVRJTkdfa0gyNjQ7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9IE00VklERU9FRElUSU5HX2tDSUY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgICAgICAgICAgPyBNNFZJREVPRURJVElOR19rTVBFRzQgOiBNNFZJREVPRURJVElOR19rSDI2NDsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0gTTRWSURFT0VESVRJTkdfa1ZHQTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEZpbmQgYmVzdCBvdXRwdXQgYXVkaW8gZm9ybWF0ICh0aGUgbW9zdCBvY2N1cmluZyBjb21iaW5hdGlvbikgKi8KLSAgICBqID0gMDsKLSAgICBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgMzsgaSsrICkKLSAgICB7Ci0gICAgICAgIGlmKCBhdWRpb0NvbmZpZ1tpXSA+PSBhdWRpb0NvbmZpZ1tqXSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGogPSBpOwotICAgICAgICAgICAgYkZvdW5kID0gTTRPU0FfVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCBiRm91bmQgKQotICAgIHsKLSAgICAgICAgc3dpdGNoKCBqICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPSBNNFZJREVPRURJVElOR19rQUFDOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TZW5kQ29tbWFuZChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncykKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBnaXZlcyB0byB0aGUgeFZTUyBhbiBlZGl0aW5nIHN0cnVjdHVyZQotICogQG5vdGUgICAgICAgIFRoZSB4VlNTIGFuYWx5c2VzIHRoaXMgc3RydWN0dXJlLCBhbmQgcHJlcGFyZSBlZGl0aW9uCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIE00eFZTU19Jbml0LCBhZnRlcgotICogICAgICAgICAgICAgICAgTTR4VlNTX0Nsb3NlQ29tbWFuZCwgb3IgYWZ0ZXIgTTR4VlNTX1ByZXZpZXdTdG9wLgotICogICAgICAgICAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIHVudGlsCi0gKiAgICAgICAgICAgICAgICBpdCByZXR1cm5zIGFub3RoZXIgZXJyb3IgdGhhbiBNNE5PX0VSUk9SLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBwU2V0dGluZ3MgICAgICAgICAgICAoSU4pIEVkaXRpb24gc2V0dGluZ3MgKGFsbG9jYXRlZCBieSB0aGUgdXNlcikKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1NlbmRDb21tYW5kKCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwU2V0dGluZ3MgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX1VJbnQ4IG5iT2ZTYW1lQ2xpcCA9IDA7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9Cb29sIGlzTmV3QkdNID0gTTRPU0FfVFJVRTsKLSAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgKnBQdG8zR1BQX2xhc3QgPSBNNE9TQV9OVUxMOwotICAgIE00eFZTU19NQ1NfcGFyYW1zICpwTUNTX2xhc3QgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiB3aWR0aCwgaGVpZ2h0LCBzYW1wbGluZ0ZyZXE7Ci0gICAgTTRPU0FfQm9vbCBiSXNUcmFuc2NvZGluZyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0ludDMyIHRvdGFsRHVyYXRpb247Ci0gICAgTTRPU0FfVUludDMyIG91dHB1dFNhbXBsaW5nRnJlcXVlbmN5ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgbGVuZ3RoID0gMDsKLSAgICBNNE9TQV9JbnQ4IG1hc3RlckNsaXAgPSAtMTsKLQotICAgIGkgPSAwOwotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgXAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPm1fc3RhdGUgIT0gTTR4VlNTX2tTdGF0ZU9wZW5lZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJCYWQgc3RhdGUgd2hlbiBjYWxsaW5nIE00eFZTU19TZW5kQ29tbWFuZCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIFN0YXRlIGlzIGJhY2sgdG8gaW5pdGlhbGl6ZWQgdG8gYWxsb3cgY2FsbCBvZiBjbGVhbnVwIGZ1bmN0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKi8KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQ7Ci0KLSAgICAvKiBDaGVjayBpZiBhIHByZXZpb3VzIHNlbmRDb21tYW5kIGhhcyBiZWVuIGNhbGxlZCAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPnByZXZpb3VzQ2xpcE51bWJlciAhPSAwICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBwQ21wUmVzdWx0ID0gMDsKLQotICAgICAgICAvKiBDb21wYXJlIEJHTSBpbnB1dCAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgXAotICAgICAgICAgICAgJiYgcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0KLSAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIGF1ZGlvIG91dHB1dCBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZCAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9PQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBJdCBtZWFucyB0aGF0IEJHTSBpcyB0aGUgc2FtZSBhcyBiZWZvcmUsIHNvLCBubyBuZWVkIHRvIHJlZGVjb2RlIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIkJHTSBpcyB0aGUgc2FtZSBhcyBiZWZvcmUsIG5vdGhpbmcgdG8gZGVjb2RlIik7Ci0gICAgICAgICAgICAgICAgICAgIGlzTmV3QkdNID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdW5hbGxvY2F0ZSBQQ00gcHJldmlldyBmaWxlIHBhdGggaW4gaW50ZXJuYWwgY29udGV4dCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdW5hbGxvY2F0ZSBQQ00gcHJldmlldyBmaWxlIHBhdGggaW4gaW50ZXJuYWwgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgb3V0cHV0IHNldHRpbmdzIGhhdmUgY2hhbmdlZCAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWwKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgIT0gcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAhPSBwU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubwotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEKLSAgICAgICAgICAgICE9IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb1NhbXBsRnJlcSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIGl0IGlzIHRoZSBjYXNlLCB3ZSBjYW4ndCByZXVzZSBhbHJlYWR5IHRyYW5zY29kZWQvY29udmVydGVkIGZpbGVzICovCi0gICAgICAgICAgICAvKiBzbywgd2UgZGVsZXRlIHRoZXNlIGZpbGVzIGFuZCByZW1vdmUgdGhlbSBmcm9tIGNoYWluZWQgbGlzdCAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyAqcFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0OwotICAgICAgICAgICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyAqcFBhcmFtc19zYXV2OwotCi0gICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZUluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlVGVtcCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0jaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZVRlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfc2F1djsKLSAgICAgICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19iZ20gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBIZXJlLCB3ZSBkbyBub3QgZGVsZXRlIEJHTSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+aXNCR00gIT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZU91dCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVUZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3NhdXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfYmdtID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qUFIgUDRNRTAwMDAzMTgyIGluaXRpYWxpemUgdGhpcyBwb2ludGVyIGJlY2F1c2UgdGhlIGZvbGxvd2luZyBwYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgd2lsbCBiZSBkZWFsbG9jYXRlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcyAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcFBhcmFtcy0+aXNCR00gIT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19iZ20tPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtc19iZ207Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBNYXliZSBuZWVkIHRvIGltcGxlbWVudCBmcmFtZXJhdGUgY2hhbmdpbmcgKi8KLSAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogVW5hbGxvY2F0ZSBwcmV2aW91cyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgTTR4VlNTX2ZyZWVTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyk7Ci0KLSAgICAgICAgLypVbmFsbG9jYXRlIG91dHB1dCBmaWxlIHBhdGgqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gMDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBDbGlwcyByZWdpc3RlcmluZwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBDb3B5IHNldHRpbmdzIGZyb20gdXNlciBnaXZlbiBzdHJ1Y3R1cmUgdG8gb3VyICJsb2NhbCIgc3RydWN0dXJlICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdCA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vID0gcFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm87Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgLyp4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlOyovCi0gICAgLypGQjogVkFMIENSIFA0TUUwMDAwMzA3NgotICAgIFRoZSBvdXRwdXQgdmlkZW8gYW5kIGF1ZGlvIGJpdHJhdGUgYXJlIGdpdmVuIGJ5IHRoZSB1c2VyIGluIHRoZSBlZGl0aW9uIHNldHRpbmdzIHN0cnVjdHVyZSovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5QVFZvbExldmVsID0gcFNldHRpbmdzLT5QVFZvbExldmVsOwotCi0gICAgLypGQjogYnVnIGZpeCBpZiB0aGUgb3V0cHV0IHBhdGggaXMgZ2l2ZW4gaW4gTTR4VlNTX3NlbmRDb21tYW5kKi8KLQotICAgIGlmKCBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgcFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID4gMCApCi0gICAgewotICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBPdXRwdXRGaWxlOwotICAgICAgICAvKkFzIGFsbCBpbnB1dHMgb2YgdGhlIHhWU1MgYXJlIGluIFVURjgsIGNvbnZlcnQgdGhlIG91dHB1dCBmaWxlIHBhdGggaW50byB0aGUKLSAgICAgICAgY3VzdG9tZXIgZm9ybWF0Ki8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwU2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU2VuZENvbW1hbmQ6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBsZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyBcCi0gICAgICAgICAgICAocFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplICsgMSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIm91dHB1dCBmaWxlIHBhdGgiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlLAotICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSArIDEpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IHBTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSAwOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gcFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyID0gcFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlID0gcFNldHRpbmdzLT52aWRlb0ZyYW1lUmF0ZTsKLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0KLSAgICAgICAgMDsgLyogV2l0aCBWU1MgMi4wLCB0aGlzIG5ldyBwYXJhbSBpcyBtYW5kYXRvcnkgKi8KLSAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCA9Ci0gICAgICAgIHBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdDsgLyogQ1IgdGV4dCBoYW5kbGluZyAqLwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplID0KLSAgICAgICAgcFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplOwotCi0gICAgaWYoIHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSAhPSAwIFwKLSAgICAgICAgJiYgcFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ICE9IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19TZW5kQ29tbWFuZDogSW1wb3NzaWJsZSB0byBsaW1pdCBmaWxlXAotICAgICAgICAgICAgICAgICAgICAgICBzaXplIHdpdGggb3RoZXIgYXVkaW8gb3V0cHV0IHRoYW4gQUFDIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotICAgIHhWU1NfY29udGV4dC0+bmJTdGVwVG90YWwgPSAwOwotICAgIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXAgPSAwOwotCi0gICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ICE9IE00VklERU9FRElUSU5HX2tNUEVHNAotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAhPSBNNFZJREVPRURJVElOR19rSDI2MwotICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdAotICAgICAgICAhPSBNNFZJREVPRURJVElOR19rSDI2NCApCi0gICAgewotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICBNNFZJREVPRURJVElOR19rTm9uZVZpZGVvOwotICAgIH0KLQotICAgIC8qIEdldCBvdXRwdXQgd2lkdGgvaGVpZ2h0ICovCi0gICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICB3aWR0aCA9IDEyODsKLSAgICAgICAgICAgIGhlaWdodCA9IDk2OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgICAgICB3aWR0aCA9IDE2MDsKLSAgICAgICAgICAgIGhlaWdodCA9IDEyMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICB3aWR0aCA9IDE3NjsKLSAgICAgICAgICAgIGhlaWdodCA9IDE0NDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FWR0E6Ci0gICAgICAgICAgICB3aWR0aCA9IDMyMDsKLSAgICAgICAgICAgIGhlaWdodCA9IDI0MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgIHdpZHRoID0gMzUyOwotICAgICAgICAgICAgaGVpZ2h0ID0gMjg4OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rVkdBOgotICAgICAgICAgICAgd2lkdGggPSA2NDA7Ci0gICAgICAgICAgICBoZWlnaHQgPSA0ODA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qICtQUiBMVjU4MDcgKi8KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQToKLSAgICAgICAgICAgIHdpZHRoID0gODAwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rTlRTQzoKLSAgICAgICAgICAgIHdpZHRoID0gNzIwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKiAtUFIgTFY1ODA3ICovCi0gICAgICAgICAgICAvKiArQ1IgR29vZ2xlICovCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgICAgICB3aWR0aCA9IDY0MDsKLSAgICAgICAgICAgIGhlaWdodCA9IDM2MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazg1NF80ODA6Ci0KLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLQotICAgICAgICAgICAgd2lkdGggPSBNNEVOQ09ERVJfODU0XzQ4MF9XaWR0aDsKLQotICAgICAgICAgICAgaGVpZ2h0ID0gNDgwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgICAgICB3aWR0aCA9IDEyODA7Ci0gICAgICAgICAgICBoZWlnaHQgPSA3MjA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMDgwXzcyMDoKLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IGVuY29kZXJzIHJlcXVpcmUgJTE2IHJlc29sdXRpb24KLSAgICAgICAgICAgIHdpZHRoID0gTTRFTkNPREVSXzEwODBfNzIwX1dpZHRoOwotICAgICAgICAgICAgaGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgICAgIHdpZHRoID0gOTYwOwotICAgICAgICAgICAgaGVpZ2h0ID0gNzIwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTkyMF8xMDgwOgotICAgICAgICAgICAgd2lkdGggPSAxOTIwOwotICAgICAgICAgICAgaGVpZ2h0ID0gTTRFTkNPREVSXzE5MjBfMTA4MF9IZWlnaHQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogLUNSIEdvb2dsZSAqLwotICAgICAgICBkZWZhdWx0OiAvKiBJZiBvdXRwdXQgdmlkZW8gc2l6ZSBpcyBub3QgZ2l2ZW4sIHdlIHRha2UgUUNJRiBzaXplICovCi0gICAgICAgICAgICB3aWR0aCA9IDE3NjsKLSAgICAgICAgICAgIGhlaWdodCA9IDE0NDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa1FDSUY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBHZXQgb3V0cHV0IFNhbXBsaW5nIGZyZXF1ZW5jeSAqLwotICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rODAwMF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA4MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMTYwMDBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMTYwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syMjA1MF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAyMjA1MDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI0MDAwX0FTRjoKLSAgICAgICAgICAgIHNhbXBsaW5nRnJlcSA9IDI0MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMzIwMDBfQVNGOgotICAgICAgICAgICAgc2FtcGxpbmdGcmVxID0gMzIwMDA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA0NDEwMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazQ4MDAwX0FTRjoKLSAgICAgICAgICAgIHNhbXBsaW5nRnJlcSA9IDQ4MDAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQU1SX05CICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSA4MDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAxNjAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogQWxsb2NhdGUgY2xpcC90cmFuc2l0aW9ucyBpZiBjbGlwIG51bWJlciBpcyBub3QgbnVsbCAuLi4gKi8KLSAgICBpZiggMCA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgKQotICAgIHsKLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QpKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPQotICAgICAgICAgICAgKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKiogKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyBcCi0gICAgICAgICAgICAoc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikqeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MsIGNvcHkgb2YgcENsaXBMaXN0Iik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAvKiBTZXQgY2xpcCBsaXN0IHRvIE5VTEwgKi8KLSAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdCwwLAotICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikKLSAgICAgICAgICAgICp4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA+IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0KLSAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncyAqKiApIFwKLSAgICAgICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKikgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICooeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSBcCi0gICAgICAgICAgICAgICAgInhWU1MsIGNvcHkgb2YgcFRyYW5zaXRpb25MaXN0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogU2V0IHRyYW5zaXRpb24gbGlzdCB0byBOVUxMICovCi0gICAgICAgICAgICBtZW1zZXQoCi0gICAgICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0LDAsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKikKLSAgICAgICAgICAgICAgICAqKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIgLSAxKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBlbHNlLCB0aGVyZSBpcyBhIHBiIGluIHRoZSBpbnB1dCBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gY2xpcCBpbiB0aGlzIHNldHRpbmdzIGxpc3QgISEiKTsKLSAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgIC8qKi8KLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBSQyBBbGxvY2F0ZSBlZmZlY3RzIHNldHRpbmdzICovCi0gICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0cyA9IHBTZXR0aW5ncy0+bmJFZmZlY3RzOwotCi0gICAgaWYoIDAgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+bmJFZmZlY3RzICkKLSAgICB7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAotICAgICAgICAgICAgKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5uYkVmZmVjdHMgKiBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImVmZmVjdHMgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHMgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICAvKkZCIGJ1ZyBmaXggMTkuMDMuMjAwODogdGhlc2UgcG9pbnRlcnMgd2VyZSBub3QgaW5pdGlhbGl6ZWQgLT4gY3Jhc2ggd2hlbiBmcmVlKi8KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+bmJFZmZlY3RzOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggPQotICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyID0KLSAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqLwotICAgIH0KLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnRhcmdldGVkVGltZXNjYWxlID09IDAgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHBUYXJnZXRlZFRpbWVTY2FsZSA9IDA7Ci0KLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2V0VGFyZ2V0ZWRUaW1lU2NhbGUoeFZTU19jb250ZXh0LCBwU2V0dGluZ3MsCi0gICAgICAgICAgICAmcFRhcmdldGVkVGltZVNjYWxlKTsKLQotICAgICAgICBpZiggTTROT19FUlJPUiAhPSBlcnIgfHwgcFRhcmdldGVkVGltZVNjYWxlID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IHBUYXJnZXRlZFRpbWVTY2FsZTsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRvdGFsIGR1cmF0aW9uIHZhcmlhYmxlICovCi0gICAgdG90YWxEdXJhdGlvbiA9IDA7Ci0KLSAgICAvKiBQYXJzaW5nIGxpc3Qgb2YgY2xpcHMgZ2l2ZW4gYnkgYXBwbGljYXRpb24sIGFuZCBwcmVwYXJlIGFuYWx5emluZyAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrICkKLSAgICB7Ci0gICAgICAgIC8qIEFsbG9jYXRlIGN1cnJlbnQgY2xpcCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jIFwKLSAgICAgICAgICAgIChzaXplb2YoTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyksIE00VlMsIChNNE9TQV9DaGFyICopImNsaXAgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29weSBjbGlwIHNldHRpbmdzIGZyb20gZ2l2ZW4gc3RydWN0dXJlIHRvIG91ciB4VlNTX2NvbnRleHQgc3RydWN0dXJlICovCi0gICAgICAgIGVyciA9Ci0gICAgICAgICAgICBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0sCi0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwgTTRPU0FfVFJVRSk7Ci0KLSAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncyByZXR1cm4gZXJyb3IgMHgleCIsCi0gICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAvKiovCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgLyogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgIGlmKCBpIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0KLSAgICAgICAgICAgICAgICAoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncwotICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzKSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJ0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0sCi0gICAgICAgICAgICAgICAgc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpKTsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgZXh0ZXJuYWwgZWZmZWN0IGNvbnRleHQgdG8gTlVMTCwgdG8ga25vdyBpZiBpbnB1dCBqcGcgaGFzIGFscmVhZHkgYmVlbgotICAgICAgICAgICAgZGVjb2RlZCBvciBub3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT5WaWRlb1RyYW5zaXRpb25UeXBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdHJhbnNpdGlvbiB0eXBlIGlzIGFscGhhIG1hZ2ljLCB3ZSBuZWVkIHRvIGRlY29kZSBpbnB1dCBmaWxlICovCi0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfQWxwaGFNYWdpYzoKLSAgICAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgb3VyIGFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSB0byBoYXZlIGEgY29weSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgb25lICovCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MgXAotICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihNNHhWU1NfQWxwaGFNYWdpY1NldHRpbmdzKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIklucHV0IEFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENvcHkgZGF0YSBmcm9tIHRoZSBwcm92aWRlZCBhbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUgdG91IG91cgotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPiBcCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19BbHBoYU1hZ2ljU2V0dGluZ3MpKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBvdXIgYWxwaGEgbWFnaWMgaW5wdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGggPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3RybGVuKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4gXAotICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+cEFscGhhRmlsZVBhdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICArIDEpLCBNNFZTLCAoTTRPU0FfQ2hhciAqKSJBbHBoYSBtYWdpYyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPnBBbHBoYUZpbGVQYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENvcHkgZGF0YSBmcm9tIHRoZSBwcm92aWRlZCBhbHBoYSBtYWdpYyBmaWxlbmFtZSB0byBvdXIgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfY2hyTkNvcHkoCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLCBzdHJsZW4oCi0gICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoKSArIDEpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIFBhcnNlIGFsbCB0cmFuc2l0aW9uIHRvIGtub3cgaWYgdGhlIGlucHV0IGpwZyBoYXMgYWxyZWFkeSBiZWVuIGRlY29kZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCBpOyBqKysgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtqXS0+VmlkZW9UcmFuc2l0aW9uVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLCAoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2pdLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYU1hZ2ljU2V0dGluZ3MtPnBBbHBoYUZpbGVQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFscGhhU2V0dGluZ3M7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHBoYSBtYWdpYyBzZXR0aW5ncyBzdHJ1Y3R1cmUgMSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5wUGxhbmUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzICopKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2pdLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSktPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBsYW5lOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MudHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+YmxlbmRpbmdQZXJjZW50ID4gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhTWFnaWNTZXR0aW5ncy0+YmxlbmRpbmdQZXJjZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAxMDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZGluZ1BlcmNlbnQpICogMjU1IC8gMjAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTZXR0aW5ncy0+YmxlbmRpbmd0aHJlc2hvbGQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MtPmlzcmV2ZXJzZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT5pc3JldmVyc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoYXQgdGhlIGlucHV0IGpwZyBmaWxlIGZvciBhbHBoYSBtYWdpYyBoYXMgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVlbiBkZWNvZGVkIC0+IG5vIG5lZGQgdG8gZGVjb2RlIGl0IGFnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfQWxwaGFNYWdpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhlIGpwZyBoYXMgbm90IGJlZW4gZGVjb2RlZCB5ZXQgLi4uICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0Ci0gICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKm91dHB1dFBsYW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyAqYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOiBnZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aF9BUkdCODg4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT53aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBoZWlnaHRfQVJHQjg4OCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+aGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUcmFuc2l0aW9uTGlzdE00eFZTU19TZW5kQ29tbWFuZCB3aWR0aCBTdGF0ZSBpcyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhfQVJHQjg4OCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRyYW5zaXRpb25MaXN0TTR4VlNTX1NlbmRDb21tYW5kIGhlaWdodCEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodF9BUkdCODg4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmUgPSAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdXRwdXQgcGxhbmUgZm9yIEFscGhhIG1hZ2ljIHRyYW5zaXRpb24iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG91dHB1dFBsYW5lID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV93aWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0udV9zdHJpZGUgPSB3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKCggd2lkdGggKiBoZWlnaHQgKiAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jIGZvciB0aGUgQWxwaGEgbWFnaWMgcGFjX2RhdGEgb3V0cHV0IFlVViIpOwotICAgICAgICAgICAgICAgICAgICAgICAgOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggb3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShvdXRwdXRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzFdLnVfd2lkdGggPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMV0udV9oZWlnaHQgPSBoZWlnaHQgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzFdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsxXS51X3N0cmlkZSA9IHdpZHRoID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsxXS5wYWNfZGF0YSA9IG91dHB1dFBsYW5lWzBdLnBhY19kYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRwdXRQbGFuZVswXS51X3dpZHRoICogb3V0cHV0UGxhbmVbMF0udV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsyXS51X3dpZHRoID0gd2lkdGggPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lWzJdLnVfaGVpZ2h0ID0gaGVpZ2h0ID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMl0udV9zdHJpZGUgPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMl0ucGFjX2RhdGEgPSBvdXRwdXRQbGFuZVsxXS5wYWNfZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0UGxhbmVbMV0udV93aWR0aCAqIG91dHB1dFBsYW5lWzFdLnVfaGVpZ2h0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFNYWdpY1NldHRpbmdzLT5wQWxwaGFGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IHBDb252RnJvbVVURjhGY3QgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgRW5kIG9mIHRoZSBjb252ZXJzaW9uLCB1c2UgdGhlIGRlY29kZWQgcGF0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOiBjb252ZXJ0ICsgcmVzaXppbmcgZnJvbSBBUkdCODg4OCB0byB5dXY0MjAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCBvdXRwdXRQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aF9BUkdCODg4LCBoZWlnaHRfQVJHQjg4OCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShvdXRwdXRQbGFuZVswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGxhbmVbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUob3V0cHV0UGxhbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBkZWNvZGluZyBhbHBoYSBtYWdpYyBKUEVHOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhbHBoYSBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICopIkFscGhhIG1hZ2ljIHNldHRpbmdzIHN0cnVjdHVyZSAyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhbHBoYVNldHRpbmdzID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhU2V0dGluZ3MtPnBQbGFuZSA9IG91dHB1dFBsYW5lOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50ID4gMCAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZGluZ1BlcmNlbnQgPD0gMTAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmdQZXJjZW50KSAqIDI1NSAvIDIwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5ibGVuZGluZ3RocmVzaG9sZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVNldHRpbmdzLT5pc3JldmVyc2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzcmV2ZXJzZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGFscGhhU2V0dGluZ3MtPmJsZW5kaW5ndGhyZXNob2xkID09IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWaWRlb1RyYW5zaXRpb25GY3QgPSBNNHhWU1NfQWxwaGFNYWdpYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0ID0gYWxwaGFTZXR0aW5nczsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfU2xpZGVUcmFuc2l0aW9uOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MgKnNsaWRlU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZVNldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsX1NsaWRlVHJhbnNpdGlvblNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxfU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKikiSW50ZXJuYWwgc2xpZGUgdHJhbnNpdGlvbiBzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggTTRPU0FfTlVMTCA9PSBzbGlkZVNldHRpbmdzICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBKdXN0IGNvcHkgdGhlIGxvbmUgcGFyYW1ldGVyIGZyb20gdGhlIGlucHV0IHNldHRpbmdzIHRvIHRoZSBpbnRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlU2V0dGluZ3MtPmRpcmVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnhWU1MudHJhbnNpdGlvblNwZWNpZmljLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTbGlkZVRyYW5zaXRpb25TZXR0aW5ncy0+ZGlyZWN0aW9uOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBuZWVkIHRvIGtlZXAgb3VyIGNvcHkgb2YgdGhlIHNldHRpbmdzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucFNsaWRlVHJhbnNpdGlvblNldHRpbmdzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0VmlkZW9UcmFuc2l0aW9uRmN0ID0gJk00eFZTU19TbGlkZVRyYW5zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IHNsaWRlU2V0dGluZ3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9GYWRlQmxhY2s6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dFZpZGVvVHJhbnNpdGlvbkZjdCA9ICZNNHhWU1NfRmFkZUJsYWNrVHJhbnNpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsOgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRWaWRlb1RyYW5zaXRpb25GY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5FeHRWaWRlb1RyYW5zaXRpb25GY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0OwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9UcmFuc2l0aW9uVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2tWaWRlb1RyYW5zaXRpb25UeXBlX0V4dGVybmFsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSAvLyBzd2l0Y2gKLQotICAgICAgICAgICAgLyogVXBkYXRlIHRvdGFsX2R1cmF0aW9uIHdpdGggdHJhbnNpdGlvbiBkdXJhdGlvbiAqLwotICAgICAgICAgICAgdG90YWxEdXJhdGlvbiAtPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLT51aVRyYW5zaXRpb25EdXJhdGlvbjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODggKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihNNE9TQV9UUlVFID09Ci0gICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5pc1Bhblpvb20pIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9DaGFyIG91dF9pbWdbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfaW1nX3RtcFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfUHRvM0dQUF9wYXJhbXMgKnBQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIE00T1NBX0NvbnRleHQgcEFSR0JGaWxlSW47Ci0gICAgICAgICAgICAgICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0KLSAgICAgICAgICAgICAgICAvKiBQYXJzZSBQdG8zR1BQIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8ga25vdyBpZiBpbnB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgKi8KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0OwotICAgICAgICAgICAgICAgICAgICAvKiBXZSBwYXJzZSBhbGwgUHRvM2dwcCBQYXJhbSBjaGFpbmVkIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoIHBQYXJhbXMgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbXBSZXN1bHQgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZUluKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBDbXBSZXN1bHQgPT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+ZHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+ZHVyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuTWVkaWFSZW5kZXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyApCi0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjZSBKUEcgZmlsZW5hbWUgd2l0aCBleGlzdGluZyAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlcGxhY2VBUkdCXzNHUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdmFyaWFibGUsIGluIGNhc2Ugc29tZSBwaWN0dXJlcyBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBiZXR3ZWVuIHR3byAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsbHMgdG8gTTR4VlNTX3NlbmRDb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwUHRvM0dQUF9sYXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBvdXRwdXQgdGVtcG9yYXJ5IDNHUCBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0X2ltZywgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEsIChNNE9TQV9DaGFyICopIiVzaW1nJWQuM2dwIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNE9TQV9jaHJTUHJpbnRmKG91dF9pbWdfdG1wLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSwgIiVzaW1nJWQudG1wIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICNlbmRpZiAvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwotCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4Kys7Ci0KLSAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBsYXN0IGVsZW1lbnQgUHRvM0dQUCBwYXJhbXMgc3RydWN0dXJlICovCi0gICAgICAgICAgICAgICAgcFBhcmFtcyA9IChNNHhWU1NfUHRvM0dQUF9wYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19QdG8zR1BQX3BhcmFtcyksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkVsZW1lbnQgb2YgUHRvM0dQUCBQYXJhbXMiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBQcm9ibGVtIHdoZW4gYWxsb2NhdGluZyBvbmUgZWxlbWVudCBQdG8zR1BQIFBhcmFtcyIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZXMgcGZpbGV4eHggbWVtYmVycyBvZiBwUGFyYW1zIHRvIGJlIGFibGUgdG8gZnJlZSB0aGVtIGNvcnJlY3RseSAqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBOZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyA9IE00eFZTU19rUmVzaXppbmc7Ci0KLSAgICAgICAgICAgICAgICAvKlRvIHN1cHBvcnQgQVJHQjg4ODggOmdldCB0aGUgd2lkdGggYW5kIGhlaWdodCAqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPmhlaWdodCA9IHBTZXR0aW5ncy0+cENsaXBMaXN0WwotICAgICAgICAgICAgICAgICAgICBpXS0+Q2xpcFByb3BlcnRpZXMudWlTdGlsbFBpY0hlaWdodDsgLy9BUkdCX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+d2lkdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFsKLSAgICAgICAgICAgICAgICAgICAgICAgIGldLT5DbGlwUHJvcGVydGllcy51aVN0aWxsUGljV2lkdGg7IC8vQVJHQl9XaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJDTElQIE00eFZTU19TZW5kQ29tbWFuZCBBUkdCODg4OCBIID0gJWQiLCBwUGFyYW1zLT5oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UzXzEoIkNMSVAgTTR4VlNTX1NlbmRDb21tYW5kIEFSR0I4ODg4IFcgPSAlZCIsIHBQYXJhbXMtPndpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFBUbzNHUFBwYXJhbXNMaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgeFZTUyBjb250ZXh0IHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoaXMgZWxlbWVudCBpbiBjYXNlIG9mIG90aGVyIGZpbGUgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQdG8zR1BQX2xhc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IHBvaW50ZXIgb2YgdGhlIHByZXZpb3VzIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHRvM0dQUF9sYXN0LT5wTmV4dCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgc2F2ZSBvZiBsYXN0IGVsZW1lbnQgb2YgdGhlIGNoYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFB0bzNHUFBfbGFzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGwgdGhlIGxhc3QgTTR4VlNTX1B0bzNHUFBfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmR1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBkdXJhdGlvbiBpcyBmaWxsZWQsIGxldCdzIHVzZSBpdCBpbnN0ZWFkIG9mIEVuZEN1dFRpbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb24gIT0gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZHVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPklucHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQVJHQjg4ODg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBDb252RnJvbVVURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwgKE00T1NBX1ZvaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogcENvbnZGcm9tVVRGOEZjdCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUHRvM0dQUCBQYXJhbXM6IGZpbGUgaW4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlSW4gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZUluLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IGlucHV0IGZpbGUgcGF0aCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayB0aGF0IEpQRyBmaWxlIGlzIHByZXNlbnQgb24gdGhlIEZTIChQNE1FMDAwMDI5NzQpIGJ5IGp1c3Qgb3BlbmluZwotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBjbG9zaW5nIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLT5vcGVuUmVhZCgmcEFSR0JGaWxlSW4sIHBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9rRmlsZVJlYWQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBvcGVuIGlucHV0IGpwZyBmaWxlICVzLCBlcnJvcjogMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLT5jbG9zZVJlYWQocEFSR0JGaWxlSW4pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8yKCJDYW4ndCBjbG9zZSBpbnB1dCBqcGcgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF9pbWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF9pbWcsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IHBDb252RnJvbVVURjhGY3QgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIlB0bzNHUFAgUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVPdXQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZU91dCwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCArIDEpKTsgLyogQ29weSBvdXRwdXQgZmlsZSBwYXRoICovCi0KLSAgICAjaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfaW1nX3RtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopb3V0X2ltZ190bXAsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJQdG8zR1BQIFBhcmFtczogZmlsZSB0ZW1wIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZVRlbXAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZVRlbXAsICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgdGVtcG9yYXJ5IGZpbGUgcGF0aCAqLwotCi0gICAgI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGwgUGFuQW5kWm9vbSBzZXR0aW5ncyBpZiBuZWVkZWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE00T1NBX1RSVUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLmlzUGFuWm9vbSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNQYW5ab29tID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5pc1Bhblpvb207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBQYW4gJiBab29tIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3RzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhhID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAwIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGEgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWEgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gMTAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLlBhblpvb21YYgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSAwIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WGIgPiAxMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhblpvb21Ub3BsZWZ0WWIgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21YYSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFlhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21YYiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuUGFuWm9vbVhiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFhiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+eFZTUy5QYW5ab29tVG9wbGVmdFliOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzUGFuWm9vbSA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyorIFBSIE5vOiBibHJueHBzdyMyMjMqLwotICAgICAgICAgICAgICAgICAgICAgICAgLypJbnRpYWxpemluZyB0aGUgVmlkZW8gRnJhbWUgUmF0ZSBhcyBpdCBtYXkgbm90IGJlIGludGlhbGl6ZWQqLwotICAgICAgICAgICAgICAgICAgICAgICAgLypPdGhlciBjaGFuZ2VzIG1hZGUgaXMgQCBNNHhWU1NfSW50ZXJuYWwuYyBAIGxpbmUgMTUxOCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDMzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazI1X0ZQUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+ZnJhbWVyYXRlID0gNDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rMjBfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA1MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDY2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEyXzVfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA4MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2sxMF9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s3XzVfRlBTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSAxMzM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNV9GUFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmZyYW1lcmF0ZSA9IDIwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKk1ha2luZyBEZWZhdWx0IEZyYW1lIFJhdGUgQCAxNSBGUFMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5mcmFtZXJhdGUgPSA2NjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKi1QUiBObzogYmxybnhwc3cjMjIzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLk1lZGlhUmVuZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tDcm9wcGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNDcmVhdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsKys7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBiVHJhbnNjb2RpbmdSZXF1aXJlZCB0byBUUlVFIHRvIGluZGljYXRlIHRoZSBrZW5idXJuIHZpZGVvIGhhcwotICAgICAgICAgICAgICAgICAgICAgICAgKiBiZWVuIGdlbmVyYXRlZCBpbiBhbmFseXNpcyBwaGFzZSwgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgdGFuc2NvZGVkIGFnYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGluIHNhdmluZyBwaGFzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJVRTsKLQotICAgIHJlcGxhY2VBUkdCXzNHUDoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0b3RhbCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxEdXJhdGlvbiArPSBwUGFyYW1zLT5kdXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVwbGFjaW5nIGluIFZTUyBzdHJ1Y3R1cmUgdGhlIEpQRyBmaWxlIGJ5IHRoZSAzZ3AgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byBVVEY4LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBwUGFyYW1zLT5wRmlsZU91dDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopcFBhcmFtcy0+cEZpbGVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMSksIE00VlMsIChNNE9TQV9DaGFyICopInhWU1MgZmlsZSBwYXRoIG9mIEFSR0IgdG8gM2dwIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCAobGVuZ3RoICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIGJlY2F1c2Ugb2YgVVRGMTYgY29udmVyc2lvbiovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIDNHUCBpbnB1dCBmaWxlIHR5cGUgY2FzZQotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlCi0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0Ci0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX000ViApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKiBOZWVkIHRvIGNhbGwgTUNTIGluIGNhc2UgM0dQIHZpZGVvL2F1ZGlvIHR5cGVzIGFyZSBub3QgY29tcGF0aWJsZQotICAgICAgICAgICAgKEgyNjMvTVBFRzQgb3IgQU1STkIvQUFDKSAqLwotICAgICAgICAgICAgLyogPT4gTmVlZCB0byBmaWxsIE1DU19QYXJhbXMgc3RydWN0dXJlIHdpdGggdGhlIHJpZ2h0IHBhcmFtZXRlcnMgISAqLwotICAgICAgICAgICAgLyogTmVlZCBhbHNvIHRvIHBhcnNlIE1DUyBwYXJhbXMgc3RydWN0IHRvIGNoZWNrIGlmIGZpbGUgaGFzIGFscmVhZHkgYmVlbiB0cmFuc2NvZGVkICovCi0KLSAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGZpbGVQcm9wZXJ0aWVzOwotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXM7Ci0gICAgICAgICAgICBNNE9TQV9Cb29sIGF1ZGlvSXNEaWZmZXJlbnQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIE00T1NBX0Jvb2wgdmlkZW9Jc0RpZmZlcmVudCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgTTRPU0FfQm9vbCBiQXVkaW9Nb25vOwotICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBmaWxlIHByb3BlcnRpZXMgc3RydWN0dXJlICovCi0KLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKSAmZmlsZVByb3BlcnRpZXMsMCwKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMpKTsKLQotICAgICAgICAgICAgLy9maWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvOwotCi0gICAgICAgICAgICAvKiBQcmV2ZW50IGZyb20gYmFkIGluaXRpYWxpemluZyBvZiBwZXJjZW50YWdlIGN1dCB0aW1lICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUVuZEN1dFBlcmNlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IDEwMCB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQmVnaW5DdXRQZXJjZW50ID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUaGVzZSBwZXJjZW50YWdlIGN1dCB0aW1lIGhhdmUgcHJvYmFibHkgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgICAgICAgICAvKiBMZXQncyBub3QgdXNlIHRoZW0gYnkgc2V0dGluZyB0aGVtIHRvIDAgKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRW5kQ3V0UGVyY2VudCA9IDA7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUJlZ2luQ3V0UGVyY2VudCA9Ci0gICAgICAgICAgICAgICAgICAgIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkCi0gICAgICAgICAgICAgICAgICAgICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoeFZTU19jb250ZXh0LCBwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgJmZpbGVQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8ga25vdyBpZiBpbnB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gY29udmVydGVkICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgcENtcFJlc3VsdCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgICAgICAgICAvKiBXZSBwYXJzZSBhbGwgTUNTIFBhcmFtIGNoYWluZWQgbGlzdCAqLwotICAgICAgICAgICAgICAgIHdoaWxlKCBwUGFyYW1zICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIFVURjgsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFBhcmFtcy0+cEZpbGVJbjsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwUGFyYW1zLT5wRmlsZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4IHJldHVybnMgZXJyOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopcERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAvKiBJZiBpbnB1dCBmaWxlbmFtZXMgYXJlIHRoZSBzYW1lLCBhbmQgaWYgdGhpcyBpcyBub3QgYSBCR00sIHdlIGNhbiByZXVzZQotICAgICAgICAgICAgICAgICAgICB0aGUgdHJhbnNjb2RlZCBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwQ21wUmVzdWx0ID09IDAgJiYgcFBhcmFtcy0+aXNCR00gPT0gTTRPU0FfRkFMU0UKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXMtPkJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocFBhcmFtcy0+RW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcFBhcmFtcy0+RW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLnVpRHVyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy5NZWRpYVJlbmRlcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgPT0gcFBhcmFtcy0+TWVkaWFSZW5kZXJpbmcgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUgPT0gMTAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTnVsbEF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVBdWRpbyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXBsYWNlIDNHUCBmaWxlbmFtZSB3aXRoIHRyYW5zY29kZWQgM0dQIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVwbGFjZTNHUF8zR1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggKCBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOdWxsQXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcFBhcmFtcy0+T3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBwU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXBsYWNlIDNHUCBmaWxlbmFtZSB3aXRoIHRyYW5zY29kZWQgM0dQIGZpbGVuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXBsYWNlM0dQXzNHUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdmFyaWFibGUsIGluIGNhc2Ugc29tZSAzR1AgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkCi0gICAgICAgICAgICAgICAgICAgIGJldHdlZW4gdHdvICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGNhbGxzIHRvIE00eFZTU19zZW5kQ29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBwTUNTX2xhc3QgPSBwUGFyYW1zOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zID0gcFBhcmFtcy0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIHBlcmNlbnRhZ2UgaW5mb3JtYXRpb24gbGV0J3MgdXNlIGl0Li4uICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUVuZEN1dFBlcmNlbnQgIT0gMAotICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlCZWdpbkN1dFBlcmNlbnQKLSAgICAgICAgICAgICAgICAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiBwZXJjZW50YWdlIGluZm9ybWF0aW9uIGFyZSBub3QgY29ycmVjdCBhbmQgaWYgZHVyYXRpb24gZmllbGQgaXMgbm90IGZpbGxlZCAqLwotICAgICAgICAgICAgICAgIGlmKCAoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MuCi0gICAgICAgICAgICAgICAgICAgIHVpRW5kQ3V0UGVyY2VudAotICAgICAgICAgICAgICAgICAgICA8PSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudCkKLSAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBCYWQgcGVyY2VudGFnZSBmb3IgYmVnaW4gYW5kIGVuZCBjdXQgdGltZSAhIik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFdlIHRyYW5zZm9ybSB0aGUgcGVyY2VudGFnZSBpbnRvIGFic29sdXRlIHRpbWUgKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA9IChNNE9TQV9VSW50MzIpKAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICB1aUJlZ2luQ3V0UGVyY2VudAotICAgICAgICAgICAgICAgICAgICAqIGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uIC8gMTAwKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPSAoTTRPU0FfVUludDMyKSgKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgdWlFbmRDdXRQZXJjZW50Ci0gICAgICAgICAgICAgICAgICAgICogZmlsZVByb3BlcnRpZXMudWlDbGlwRHVyYXRpb24gLyAxMDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogLi4uT3RoZXJ3aXNlLCB3ZSB1c2UgYWJzb2x1dGUgdGltZS4gKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBJZiBlbmRDdXRUaW1lID09IDAsIGl0IG1lYW5zIGFsbCB0aGUgZmlsZSBpcyB0YWtlbi4gTGV0J3MgY2hhbmdlIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgZHVyYXRpb24sIHRvIGFjY3VyYXRlIHByZXZpZXcuICovCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9PSAwCi0gICAgICAgICAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA+IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIGR1cmF0aW9uIGZpZWxkIGlzIGZpbGxlZCwgaXQgaGFzIHByaW9yaXR5IG9uIG90aGVyIGZpZWxkcyBvbiBFbmRDdXRUaW1lLAotICAgICAgICAgICAgIHNvIGxldCdzIHVzZSBpdCAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnhWU1MudWlEdXJhdGlvbiAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAreFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy51aUR1cmF0aW9uOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICA+IGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIElmIG91dHB1dCB2aWRlbyBmb3JtYXQgaXMgbm90IHNldCwgd2UgdGFrZSB2aWRlbyBmb3JtYXQgb2YgdGhlIGZpcnN0IDNHUCB2aWRlbyAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0Ci0gICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCA9IGZpbGVQcm9wZXJ0aWVzLlZpZGVvU3RyZWFtVHlwZTsKLSAgICAgICAgICAgICAgICAvL000T1NBX1RSQUNFMl8xKCJPdXRwdXQgdmlkZW8gZm9ybWF0IGlzIG5vdCBzZXQsIHNldCBpdCB0byBjdXJyZW50IGNsaXA6ICVkIiwKLSAgICAgICAgICAgICAgICAvLyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJPdXRwdXQgdmlkZW8gZm9ybWF0IGlzIG5vdCBzZXQsIGFuIGVycm9yIHBhcmFtZXRlciBpcyByZXR1cm5lZC4iKTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0ID0gZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlOwotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKAotICAgICAgICAgICAgICAgICAgICAiT3V0cHV0IGF1ZGlvIGZvcm1hdCBpcyBub3Qgc2V0IC0+IHJlbW92ZSBhdWRpbyB0cmFjayBvZiBjbGlwOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggZmlsZVByb3BlcnRpZXMudWlOYkNoYW5uZWxzID09IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJBdWRpb01vbm8gPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZQotICAgICAgICAgICAgICAgICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICAgICAgfHwgKGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSA9PSBNNFZJREVPRURJVElOR19rQUFDCi0gICAgICAgICAgICAgICAgJiYgKGZpbGVQcm9wZXJ0aWVzLnVpU2FtcGxpbmdGcmVxdWVuY3kgIT0gc2FtcGxpbmdGcmVxCi0gICAgICAgICAgICAgICAgfHwgYkF1ZGlvTW9ubwotICAgICAgICAgICAgICAgICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8pKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXVkaW9Jc0RpZmZlcmVudCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgLyogSWYgd2Ugd2FudCB0byByZXBsYWNlIGF1ZGlvLCB0aGVyZSBpcyBubyBuZWVkIHRvIHRyYW5zY29kZSBhdWRpbyAqLwotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogdGVtcCBmaXggOlBUIHZvbHVtZSBub3QgaGVyYWQgaW4gdGhlIHNlY29uZCBjbGlwICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCAvKihwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZSA9PSAxMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCovCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gKSAvKjExLzEyLzIwMDggQ1IgMzI4MyBWQUwgZm9yIHRoZSBNTVMKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZSBjYXNlLCB3ZSBuZWVkIHRvIHRyYW5zY29kZSBleGNlcHQgdGhlIG1lZGlhIHdpdGhvdXQgYXVkaW8qLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0lzRGlmZmVyZW50ID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggZmlsZVByb3BlcnRpZXMuQXVkaW9TdHJlYW1UeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tOb25lQXVkaW8gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9Jc0RpZmZlcmVudCA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIEhlcmUgY2hlY2sgdGhlIGNsaXAgdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwsIGlmIGl0IGV4Y2VlZHMKLSAgICAgICAgICAgICAqIHRoZSBwcm9maWxlIGFuZCBsZXZlbCBvZiBleHBvcnQgZmlsZSwgdGhlbiB0aGUgZmlsZSBuZWVkcwotICAgICAgICAgICAgICogdG8gYmUgdHJhbnNjb2RlZChkbyBub3QgZG8gY29tcHJlc3MgZG9tYWluIHRyaW0pLgotICAgICAgICAgICAgICogQWxzbyBmb3IgTVBFRzQgZm9tYXJ0LCBhbHdheXMgZG8gdHJhbnNjb2Rpbmcgc2luY2UgSFcgZW5jb2RlcgotICAgICAgICAgICAgICogbWF5IHVzZSBkaWZmZXJlbnQgdGltZSBzY2FsZSB2YWx1ZSB0aGFuIHRoZSBpbnB1dCBjbGlwKi8KLSAgICAgICAgICAgaWYgKChmaWxlUHJvcGVydGllcy51aVZpZGVvUHJvZmlsZSA+Ci0gICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGUpIHx8Ci0gICAgICAgICAgICAgICAgKGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9MZXZlbCA+Ci0gICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsKSB8fAotICAgICAgICAgICAgICAgIChmaWxlUHJvcGVydGllcy5WaWRlb1N0cmVhbVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa01QRUc0KSkgewotICAgICAgICAgICAgICAgLyogU2V0IGJUcmFuc2NvZGluZ1JlcXVpcmVkIHRvIFRSVUUgdG8gaW5kaWNhdGUgdGhlIHZpZGVvIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAqIHRyYW5zY29kZWQgaW4gTUNTLiAqLwotICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+YlRyYW5zY29kaW5nUmVxdWlyZWQgPQotICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICB2aWRlb0lzRGlmZmVyZW50ID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggdmlkZW9Jc0RpZmZlcmVudCA9PSBNNE9TQV9UUlVFIHx8IGF1ZGlvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9DaGFyIG91dF8zZ3BbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwX3RtcFtNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLQotICAgICAgICAgICAgICAgIC8qIENvbnN0cnVjdCBvdXRwdXQgdGVtcG9yYXJ5IDNHUCBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0XzNncCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEsIChNNE9TQV9DaGFyICopIiVzdmlkJWQuM2dwIiwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00T1NBX2NoclNQcmludGY6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLQotICAgICAgICAgICAgICAgIGVyciA9IE00T1NBX2NoclNQcmludGYob3V0XzNncF90bXAsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxLCAiJXN2aWQlZC50bXAiLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgeFZTU19jb250ZXh0LT50ZW1wRmlsZUluZGV4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRPU0FfY2hyU1ByaW50ZjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0jZW5kaWYgLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCsrOwotCi0gICAgICAgICAgICAgICAgcFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIChNNHhWU1NfTUNTX3BhcmFtcyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX01DU19wYXJhbXMpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJFbGVtZW50IG9mIE1DUyBQYXJhbXMgKGZvciAzR1ApIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogUHJvYmxlbSB3aGVuIGFsbG9jYXRpbmcgb25lIGVsZW1lbnQgTUNTIFBhcmFtcyIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk1lZGlhUmVuZGVyaW5nID0gTTR4VlNTX2tSZXNpemluZzsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT52aWRlb2NsaXBudW1iZXIgPSBpOyAvLyBJbmRpY2F0ZXMgdmlkZW8gY2xpcCBpbmRleAotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHRoZSB4VlNTIGNvbnRleHQgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgcG9pbnRlciBvZiB0aGUgcHJldmlvdXMgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgICAgICBwTUNTX2xhc3QtPnBOZXh0ID0gcFBhcmFtczsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBTYXZlIHRoaXMgZWxlbWVudCBpbiBjYXNlIG9mIG90aGVyIGZpbGUgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgIHBNQ1NfbGFzdCA9IHBQYXJhbXM7Ci0KLSAgICAgICAgICAgICAgICAvKiBGaWxsIHRoZSBsYXN0IE00eFZTU19NQ1NfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5JbnB1dEZpbGVUeXBlID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0RmlsZVR5cGUgPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUDsKLQotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvVGltZXNjYWxlID0geFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZTsKLQotICAgICAgICAgICAgICAgIC8qIFdlIGRvIG5vdCBuZWVkIHRvIHJlZW5jb2RlIHZpZGVvIGlmIGl0cyBwYXJhbWV0ZXJzIGRvIG5vdCBkaWZmZXIgKi8KLSAgICAgICAgICAgICAgICAvKiBmcm9tIG91dHB1dCBzZXR0aW5ncyBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgaWYoIHZpZGVvSXNEaWZmZXJlbnQgPT0gTTRPU0FfVFJVRSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0Zvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0Zvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+b3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRnJhbWVTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAvKkZCOiBWQUwgQ1IgUDRNRTAwMDAzMDc2Ci0gICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgdmlkZW8gYml0cmF0ZSBpcyBub3cgZGlyZWN0bHkgZ2l2ZW4gYnkgdGhlIHVzZXIgaW4gdGhlIGVkaXRpb24KLSAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Mgc3RydWN0dXJlIElmIHRoZSBiaXRyYXRlIGdpdmVuIGJ5IHRoZSB1c2VyIGlzIGlycmVsZXZhbnQKLSAgICAgICAgICAgICAgICAgICAgKHRoZSBNQ1MgbWluaW11bSBhbmQgbWF4aW11bSB2aWRlbyBiaXRyYXRlIGFyZSB1c2VkKSwKLSAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCB2aWRlbyBiaXRyYXRlIGlzIGhhcmRjb2RlZCBhY2NvcmRpbmcgdG8gdGhlIG91dHB1dCB2aWRlbyBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPj0gTTRWSURFT0VESVRJTkdfazE2X0tCUFMKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazhfTUJQUyApIC8qKyBOZXcgRW5jb2RlciBiaXRyYXRlcyAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tTUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s0OF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2sxMjhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazM4NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2szODRfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNTEyX0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogU2hvdWxkIG5vdCBoYXBwZW4gISEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5vdXRwdXRWaWRlb1Byb2ZpbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlOwotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5vdXRwdXRWaWRlb0xldmVsID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvTGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa051bGxWaWRlbzsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazE1X0ZQUzsgLyogTXVzdCBiZSBzZXQsIG90aGVyd2lzZSwgTUNTIHJldHVybnMgYW4gZXJyb3IgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggYXVkaW9Jc0RpZmZlcmVudCA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0OwotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tOb25lQXVkaW86Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FNUl9OQjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0FBQzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRkI6IFZBTCBDUiBQNE1FMDAwMDMwNzYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCBhdWRpbyBiaXRyYXRlIGluIHRoZSBBQUMgY2FzZSBpcyBub3cgZGlyZWN0bHkgZ2l2ZW4gYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVzZXIgaW4gdGhlIGVkaXRpb24gc2V0dGluZ3Mgc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBiaXRyYXRlIGdpdmVuIGJ5IHRoZSB1c2VyIGlzIGlycmVsZXZhbnQgb3IgdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgTUNTIG1pbmltdW0gYW5kIG1heGltdW0gYXVkaW8gYml0cmF0ZSBhcmUgdXNlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRwdXQgYXVkaW8gYml0cmF0ZSBpcyBoYXJkIGNvZGVkIGFjY29yZGluZyB0byB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvIHNhbXBsaW5nIGZyZXF1ZW5jeSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgYXVkaW8gYml0cmF0ZSBpcyBjb3JyZWN0bHkgZGVmaW5lZCovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypNb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DUyB2YWx1ZXMgZm9yIEFBQyBNb25vIGFyZSBtaW46IDE2a2JwcyBhbmQgbWF4OiAxOTIga2JwcyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2sxNl9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypTdGVyZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTIHZhbHVlcyBmb3IgQUFDIE1vbm8gYXJlIG1pbjogMzJrYnBzIGFuZCBtYXg6IDE5MiBrYnBzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb0JpdHJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2szMl9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgYXVkaW8gYml0cmF0ZSBpcyBoYXJkIGNvZGVkIGFjY29yZGluZyB0byB0aGUgb3V0cHV0IGF1ZGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZyBmcmVxdWVuY3kqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXEgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazE2MDAwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2syNF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazIyMDUwX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2syNDAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMzJfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2szMjAwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rNDhfS0JQUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2s0NDEwMF9BU0Y6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rNDgwMDBfQVNGOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfazY0X0tCUFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX2s2NF9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJpdHJhdGUgaGF2ZSB0byBiZSBkb3VibGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlICs9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy5vdXRwdXRBdWRpb1NhbXBsRnJlcQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfazgwMDBfQVNGICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJldmVudCBmcm9tIHVuYWxsb3dlZCBzYW1wbGluZyBmcmVxdWVuY2llcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAvKiBTaG91bGQgbm90IGhhcHBlbiAhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FNUl9OQjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rMTJfMl9LQlBTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa051bGxBdWRpbzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlOwotICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIGluIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlSW4sICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IGlucHV0IGZpbGUgcGF0aCAqLwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwOwotICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3AsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPQotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksIE00VlMsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyAzR1AgUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlT3V0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFBhcmFtcy0+cEZpbGVPdXQsICh2b2lkICopcERlY29kZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IG91dHB1dCBmaWxlIHBhdGggKi8KLQotI2lmZGVmIE00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gb3V0XzNncF90bXA7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopb3V0XzNncF90bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTUNTIDNHUCBQYXJhbXM6IGZpbGUgdGVtcCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHBQYXJhbXMtPnBGaWxlVGVtcCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlVGVtcCwgKHZvaWQgKilwRGVjb2RlZFBhdGgsCi0gICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgdGVtcG9yYXJ5IGZpbGUgcGF0aCAqLwotCi0jZWxzZQotCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLQotI2VuZGlmIC8qTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRSovCi0KLSAgICAgICAgICAgICAgICAvKkZCIDIwMDgvMTAvMjAga2VlcCBtZWRpYSBhc3BlY3QgcmF0aW8sIGFkZCBtZWRpYSByZW5kZXJpbmcgcGFyYW1ldGVyKi8KLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLk1lZGlhUmVuZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rQ3JvcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMKLSAgICAgICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+eFZTUy4KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tSZXNpemluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5NZWRpYVJlbmRlcmluZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT54VlNTLgotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZW5kZXJpbmc7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLypGQjogdHJhbnNjb2RpbmcgcGVyIHBhcnRzKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5CZWdpbkN1dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5FbmRDdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lOwotCi0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPmlzQkdNID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+aXNDcmVhdGVkID0gTTRPU0FfRkFMU0U7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCsrOwotICAgICAgICAgICAgICAgIGJJc1RyYW5zY29kaW5nID0gTTRPU0FfVFJVRTsKLQotcmVwbGFjZTNHUF8zR1A6Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIHRvdGFsIGR1cmF0aW9uICovCi0gICAgICAgICAgICAgICAgdG90YWxEdXJhdGlvbiArPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUVuZEN1dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgLSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZTsKLQotICAgICAgICAgICAgICAgIC8qIFJlcGxhY2luZyBpbiBWU1Mgc3RydWN0dXJlIHRoZSBvcmlnaW5hbCAzR1AgZmlsZSBieSB0aGUgdHJhbnNjb2RlZCAzR1AgZmlsZSAqLwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFA7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFBhcmFtcy0+cEZpbGVPdXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwUGFyYW1zLT5wRmlsZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIChsZW5ndGggKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUyBmaWxlIHBhdGggb2YgM2dwIHRvIDNncCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCAobGVuZ3RoICsgMSkpOwotICAgICAgICAgICAgICAgIC8qRkI6IGFkZCBmaWxlIHBhdGggc2l6ZSBiZWNhdXNlIG9mIFVURiAxNiBjb252ZXJzaW9uKi8KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLQotICAgICAgICAgICAgICAgIC8qIFdlIGRlZmluZSBtYXN0ZXIgY2xpcCBhcyBmaXJzdCAzR1AgaW5wdXQgY2xpcCAqLwotICAgICAgICAgICAgICAgIC8qaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcCA9PSAwICYmIGZpbGVQcm9wZXJ0aWVzLgotICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdG90YWwgZHVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uICs9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZQotICAgICAgICAgICAgICAgICAgICAtIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogV2UgZGVmaW5lIG1hc3RlciBjbGlwIGFzIGZpcnN0IDNHUCBpbnB1dCBjbGlwICovCi0gICAgICAgICAgICBpZiggbWFzdGVyQ2xpcCA9PSAtMQotICAgICAgICAgICAgICAgICYmIGZpbGVQcm9wZXJ0aWVzLkF1ZGlvU3RyZWFtVHlwZSAhPSBNNFZJREVPRURJVElOR19rTm9uZUF1ZGlvICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0gaTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICBPdGhlciBpbnB1dCBmaWxlIHR5cGUgY2FzZQotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkJhZCBmaWxlIHR5cGUgYXMgaW5wdXQgY2xpcCIpOwotICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgKiBQYXJzZSBhbGwgZWZmZWN0cyB0byBtYWtlIHNvbWUgYWRqdXN0bWVudCBmb3IgZnJhbWluZywgKgotICAgICogdGV4dCBhbmQgdG8gdHJhbnNmb3JtIHJlbGF0aXZlIHRpbWUgaW50byBhYnNvbHV0ZSB0aW1lICoKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGZvciAoIGogPSAwOyBqIDwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0czsgaisrICkKLSAgICB7Ci0gICAgICAgIC8qIENvcHkgZWZmZWN0IHRvICJsb2NhbCIgc3RydWN0dXJlICovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKSAmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICh2b2lkICopICYocFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgIHNpemVvZihNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MpKTsKLQotICAgICAgICAvKiBQcmV2ZW50IGZyb20gYmFkIGluaXRpYWxpemluZyBvZiBlZmZlY3QgcGVyY2VudGFnZSB0aW1lICovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpRHVyYXRpb25QZXJjZW50ID4gMTAwCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpU3RhcnRQZXJjZW50ID4gMTAwICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGhlc2UgcGVyY2VudGFnZSB0aW1lIGhhdmUgcHJvYmFibHkgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgICAgIC8qIExldCdzIG5vdCB1c2UgdGhlbSBieSBzZXR0aW5nIHRoZW0gdG8gMCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aUR1cmF0aW9uUGVyY2VudCA9IDA7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpU3RhcnRQZXJjZW50ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIHdlIGhhdmUgcGVyY2VudGFnZSBpbmZvcm1hdGlvbiBsZXQncyB1c2UgaXQuLi4gT3RoZXJ3aXNlLCB3ZSB1c2UgYWJzb2x1dGUgdGltZS4gKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlEdXJhdGlvblBlcmNlbnQgIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnVpU3RhcnRUaW1lID0gKE00T1NBX1VJbnQzMikodG90YWxEdXJhdGlvbgotICAgICAgICAgICAgICAgICogeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aVN0YXJ0UGVyY2VudAotICAgICAgICAgICAgICAgIC8gMTAwKTsKLSAgICAgICAgICAgIC8qIFRoZSBwZXJjZW50YWdlIG9mIGVmZmVjdCBkdXJhdGlvbiBpcyBiYXNlZCBvbiB0aGUgZHVyYXRpb24gb2YgdGhlIGNsaXAgLQotICAgICAgICAgICAgc3RhcnQgdGltZSAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIEVmZmVjdHNbal0udWlEdXJhdGlvbiA9IChNNE9TQV9VSW50MzIpKHRvdGFsRHVyYXRpb24KLSAgICAgICAgICAgICAgICAqIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlEdXJhdGlvblBlcmNlbnQKLSAgICAgICAgICAgICAgICAvIDEwMCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJZiB0aGVyZSBpcyBhIGZyYW1pbmcgZWZmZWN0LCB3ZSBuZWVkIHRvIGFsbG9jYXRlIGZyYW1pbmcgZWZmZWN0IHN0cnVjdHVyZSAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nICkKLSAgICAgICAgewotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgIE00eFZTU19GcmFtaW5nQ29udGV4dCAqZnJhbWluZ0N0eDsKLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0jZWxzZQotCi0gICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCAqZnJhbWluZ0N0eDsKLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgICAgICAgICBNNE9TQV9DaGFyICpwRXh0MiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgTTRPU0FfSW50MzIgcmVzdWx0MSwgcmVzdWx0MjsKLQotICAgICAgICAgICAgLyogQ29weSBmcmFtaW5nIGZpbGUgcGF0aCAqLwotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGggIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aCA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgpCi0gICAgICAgICAgICAgICAgICAgICsgMSwgTTRWUywgKE00T1NBX0NoYXIgKikiTG9jYWwgRnJhbWluZyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoLCBzdHJsZW4oCi0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgpICsgMSk7Ci0KLSAgICAgICAgICAgICAgICBwRXh0MiA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgIH0KLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgIGZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nQ29udGV4dCksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBTUFNDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5iRWZmZWN0UmVzaXplID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLmJSZXNpemU7Ci0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRWZmZWN0RmlsZVBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBGaWxlUmVhZFB0ciA9IHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEZpbGVXcml0ZVB0ciA9IHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0cjsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPmVmZmVjdER1cmF0aW9uID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS51aUR1cmF0aW9uOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+Yl9Jc0ZpbGVHaWYgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+Yl9hbmltYXRlZCA9IE00T1NBX0ZBTFNFOwotCi0gICAgICAgICAgICAvKiBPdXRwdXQgcmF0aW8gZm9yIHRoZSBlZmZlY3QgaXMgc3RvcmVkIGluIHVpRmlmdGllc091dEZyYW1lUmF0ZSBwYXJhbWV0ZXJzIG9mIHRoZQotICAgICAgICAgICAgZXh0ZW5kZWQgeFZTUyBlZmZlY3RzIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlGaWZ0aWVzT3V0RnJhbWVSYXRlCi0gICAgICAgICAgICAgICAgIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+ZnJhbWVEdXJhdGlvblJhdGlvID0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0Zsb2F0KSgoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnVpRmlmdGllc091dEZyYW1lUmF0ZSkgLyAxMDAwLjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmZyYW1lRHVyYXRpb25SYXRpbyA9IDEuMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypBbHBoYSBibGVuZGluZyovCi0gICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBhbHBoYSBibGVuZGluZyBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0cyovCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlT3V0VGltZSA+IDEwMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQgPSAxMDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPiAxMDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ01pZGRsZSA9IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0ID4gMTAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA9IDEwMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWUgPiAwCi0gICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKkFsbG9jYXRlIHRoZSBhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX2ludGVybmFsRWZmZWN0c0FscGhhQmxlbmRpbmcgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypGaWxsIHRoZSBhbHBoYSBibGVuZGluZyBzdHJ1Y3R1cmUqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kID0KLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlID0KLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQgPQotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydDsKLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lCi0gICAgICAgICAgICAgICAgICAgICsgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgID4gMTAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgMTAwIC0gZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGg7Ci0gICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgJiYgeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTG9jYWwgRnJhbWluZyBmaWxlIHBhdGgiKTsKLQotICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAodm9pZCAqKXBEZWNvZGVkUGF0aCwgbGVuZ3RoICsgMSk7Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgZnJhbWluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwotCi0jZWxzZQotCi0gICAgICAgICAgICBmcmFtaW5nQ3R4ID0gKE00eFZTU19GcmFtaW5nU3RydWN0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICBpZiggZnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0KLSAgICAgICAgICAgIC8qIEJ1Z0ZpeCAxLjIuMDogTGVhayB3aGVuIGRlY29kaW5nIGVycm9yICovCi0gICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotICAgICAgICAgICAgLyogU2F2ZSBmcmFtaW5nIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHg7Ci0KLSNlbmRpZiAvKkRFQ09ERV9HSUZfT05fU0FWSU5HKi8KLQotICAgICAgICAgICAgaWYoIHBFeHQyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERlY29kZSB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB0byB0aGUgZWZmZWN0LCBhbmQgZmlsbCBmcmFtaW5nIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIHBFeHQyICs9IChzdHJsZW4oKGNvbnN0IGNoYXIgKilwRXh0MikgLSA0KTsKLQotICAgICAgICAgICAgICAgIHJlc3VsdDEgPSBzdHJjbXAoKGNvbnN0IGNoYXIgKilwRXh0MiwoY29uc3QgY2hhciAqKSIucmdiIik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0MiA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBFeHQyLChjb25zdCBjaGFyICopIi5SR0IiKTsKLQotICAgICAgICAgICAgICAgIGlmKCAwID09IHJlc3VsdDEgfHwgMCA9PSByZXN1bHQyICkKLSAgICAgICAgICAgICAgICB7Ci0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ1N0cnVjdCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICopCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsRGVjb2RlR0lGOiBDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBTUFMgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cEN1cnJlbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsgLyogT25seSB1c2VkIGJ5IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLSAgICAgICAgICAgICAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogZ2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPndpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1Mud2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJGUkFNTUlORyBCRUZPUkUgTTR4VlNTX1NlbmRDb21tYW5kICAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+d2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRlJBTU1JTkcgQkVGT1JFIE00eFZTU19TZW5kQ29tbWFuZCAgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPmhlaWdodCk7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJGUkFNSU5HIFdJRFRIIEJFRk9SRSBNNHhWU1NfU2VuZENvbW1hbmQgICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT53aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFM18xKCJGUkFNSU5HIEhFSUdIVCBCRUZPUkUgTTR4VlNTX1NlbmRDb21tYW5kICAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+aGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxEZWNvZGVQTkcgcmV0dXJuZWQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFNQUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2VuZENvbW1hbmQ6IE5vdCBzdXBwb3J0ZWQgc3RpbGwgcGljdHVyZSBmb3JtYXQgMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIHBQbGFuZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GcmFtaW5nU3RydWN0KSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiQ29udGV4dCBvZiB0aGUgZnJhbWluZyBlZmZlY3QiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF94OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLQotICAgICAgICAgICAgICAgIC8qIEJ1Z0ZpeCAxLjIuMDogTGVhayB3aGVuIGRlY29kaW5nIGVycm9yICovCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+cEN1cnJlbnQgPSBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+ZHVyYXRpb24gPSAwOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgICAgIC8qIEZvcmNlIGlucHV0IFJHQiBidWZmZXIgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbiBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGggJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgJiB+MTsKLSAgICAgICAgICAgICAgICAvKiBJbnB1dCBSR0IgcGxhbmUgaXMgcHJvdmlkZWQsIGxldCdzIGNvbnZlcnQgaXQgdG8gWVVWNDIwLCBhbmQgdXBkYXRlIGZyYW1pbmcKLSAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgICovCi0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4KTsKLQotI2Vsc2UKLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBGcmFtaW5nQnVmZmVyOwotICAgICAgICAgICAgICAgIC8qIEZvcmNlIGlucHV0IFJHQiBidWZmZXIgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbiBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV93aWR0aCAmIH4xOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IudV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLnVfaGVpZ2h0ICYgfjE7Ci0gICAgICAgICAgICAgICAgLyogSW5wdXQgUkdCIHBsYW5lIGlzIHByb3ZpZGVkLCBsZXQncyBjb252ZXJ0IGl0IHRvIFlVVjQyMCwgYW5kIHVwZGF0ZSBmcmFtaW5nCi0gICAgICAgICAgICAgICAgIHN0cnVjdHVyZSAgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoZnJhbWluZ0N0eCk7Ci0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIFJHQiB0byBZVVY6IDB3JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IE5vIGlucHV0IGltYWdlL3BsYW5lIHByb3ZpZGVkIGZvciBmcmFtaW5nIGVmZmVjdC4iKTsKLSAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogQ1I6IEFkZCB0ZXh0IGhhbmRsaW5nIHdpdGggZXh0ZXJuYWwgdGV4dCBpbnRlcmZhY2UgKi8KLSAgICAgICAgLyogSWYgZWZmZWN0IHR5cGUgaXMgdGV4dCwgd2UgY2FsbCBleHRlcm5hbCB0ZXh0IGZ1bmN0aW9uIHRvIGdldCBSR0IgNTY1IGJ1ZmZlciAqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9UZXh0ICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ2FsbCB0aGUgZm9udCBlbmdpbmUgZnVuY3Rpb24gcG9pbnRlciB0byBnZXQgUkdCNTY1IGJ1ZmZlciAqLwotICAgICAgICAgICAgLyogV2UgdHJhbnNmb3JtIHRleHQgZWZmZWN0IGludG8gZnJhbWluZyBlZmZlY3QgZnJvbSBidWZmZXIgKi8KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKkZCOiBhZGQgVVRGIGNvbnZlcnRpb24gZm9yIHRleHQgYnVmZmVyKi8KLSAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0KLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ0NvbnRleHQgKmZyYW1pbmdDdHg7Ci0KLSNlbHNlCi0KLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCAqZnJhbWluZ0N0eDsKLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLQotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHggPSAoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfRnJhbWluZ0NvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHggPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPm91dHB1dFZpZGVvU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvU2l6ZTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRvcGxlZnRfeTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5iRWZmZWN0UmVzaXplID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5iUmVzaXplOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRmlsZVJlYWRQdHIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0cjsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5wRmlsZVdyaXRlUHRyID0geFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmVmZmVjdER1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0udWlEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5iX0lzRmlsZUdpZiA9IE00T1NBX0ZBTFNFOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmJfYW5pbWF0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgIC8qIFNhdmUgZnJhbWluZyBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcgZWZmZWN0ICovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHg7Ci0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnRvcGxlZnRfeSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudG9wbGVmdF95OwotCi0gICAgICAgICAgICAgICAgLyogQnVnRml4IDEuMi4wOiBMZWFrIHdoZW4gZGVjb2RpbmcgZXJyb3IgKi8KLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wTmV4dCA9IGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4OwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5kdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPnByZXZpb3VzQ2xpcFRpbWUgPSAtMTsKLQotICAgICAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcqLwotICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIGFscGhhIGJsZW5kaW5nIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3RzKi8KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDEwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdFbmQgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRW5kID0gMTAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdNaWRkbGUgPiAxMDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlID0gMTAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA+IDEwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdTdGFydCA9IDEwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiggcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZUluVGltZSA+IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWUKLSAgICAgICAgICAgICAgICAgICAgPiAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qQWxsb2NhdGUgdGhlIGFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSovCi0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopImFscGhhIGJsZW5kaW5nIHN0cnVjdHVyZSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qRmlsbCB0aGUgYWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nRmFkZU91dFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0VuZDsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9taWRkbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlhbHBoYUJsZW5kaW5nTWlkZGxlOwotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ1N0YXJ0OwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy51aWFscGhhQmxlbmRpbmdGYWRlSW5UaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpYWxwaGFCbGVuZGluZ0ZhZGVPdXRUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAxMDAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgLSBmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVJblRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jZWxzZQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QpLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhcgotICAgICAgICAgICAgICAgICAgICAqKSJDb250ZXh0IG9mIHRoZSBmcmFtaW5nIGVmZmVjdCAoZm9yIHRleHQpIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF94ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3g7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+dG9wbGVmdF95ID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50b3BsZWZ0X3k7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICAvKiBCdWdGaXggMS4yLjA6IExlYWsgd2hlbiBkZWNvZGluZyBlcnJvciAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBOZXh0ID0gZnJhbWluZ0N0eDsKLQotI2VuZGlmCi0gICAgICAgICAgICAgICAgLyogU2F2ZSBmcmFtaW5nIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4OwotCi0gICAgICAgICAgICAgICAgLyogRkI6IGNoYW5nZXMgZm9yIFZpZGVvIEFydGlzdDogbWVtY29weSBwVGV4dEJ1ZmZlciBzbyB0aGF0IGl0IGNhbiBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgYWZ0ZXIgYSBjb21wbGV0ZSBhbmFseXNpcyovCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19TZW5kQ29tbWFuZDogcFRleHRCdWZmZXIgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKkNvbnZlcnQgdGV4dCBidWZmZXIgaW50byBjdXN0b21lciBmb3JtYXQgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXI7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdAotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSArIDEsCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIkxvY2FsIHRleHQgYnVmZmVyIGVmZmVjdCIpOwotCi0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyID0KLSAgICAgICAgICAgICAgICAvLyBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyKSsxLAotICAgICAgICAgICAgICAgIC8vIE00VlMsICJMb2NhbCB0ZXh0IGJ1ZmZlciBlZmZlY3QiKTsKLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9tZW1jcHkoKE00T1NBX01lbUFkZHI4KXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdCi0gICAgICAgICAgICAgICAgICAgIC8vLnhWU1MucFRleHRCdWZmZXIsIChNNE9TQV9NZW1BZGRyOClwU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RybGVuKHBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnBUZXh0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy50ZXh0QnVmZmVyU2l6ZSArIDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qQWxsb2NhdGUgdGhlIHRleHQgUkdCIGJ1ZmZlciovCi0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPQotICAgICAgICAgICAgICAgICAgICAoTTRWSUZJX0ltYWdlUGxhbmUgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwKLSAgICAgICAgICAgICAgICAgICAgTTRWUywKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiUkdCIHN0cnVjdHVyZSBmb3IgdGhlIHRleHQgZWZmZWN0Iik7Ci0KLSAgICAgICAgICAgICAgICBpZiggZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnVpVGV4dEJ1ZmZlcldpZHRoCi0gICAgICAgICAgICAgICAgICAgID09IDAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlUZXh0QnVmZmVySGVpZ2h0ID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiB0ZXh0IHBsYW5lIHdpZHRoIGFuZCBoZWlnaHQgYXJlIG5vdCBkZWZpbmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIC8qRkI6IHRvIGF2b2lkIGxlYWtzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIHNlbmQgY29tbWFuZCovCi0gICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGlucHV0IFJHQiB0ZXh0IGJ1ZmZlciBhbmQgZm9yY2UgaXQgdG8gZXZlbiBzaXplIHRvIGF2b2lkIGVycm9ycyBpbgotICAgICAgICAgICAgICAgICBZVVYgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlUZXh0QnVmZmVyV2lkdGggJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy51aVRleHRCdWZmZXJIZWlnaHQgJiB+MTsKLSAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9zdHJpZGUgPQotICAgICAgICAgICAgICAgICAgICAyICogZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgKE00VklGSV9VSW50OCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICogZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJUZXh0IFJHQiBwbGFuZS0+cGFjX2RhdGEiKTsKLQotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEKLSAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgLypGQjogdG8gYXZvaWQgbGVha3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgc2VuZCBjb21tYW5kKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgIH0KLQotI2lmZGVmIERFQ09ERV9HSUZfT05fU0FWSU5HCi0gICAgICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgICAgIC8qIENhbGwgdGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gKi8KLQotICAgICAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBUZXh0UmVuZGVyaW5nRmN0KAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLnBSZW5kZXJpbmdEYXRhLAotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy5wVGV4dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudGV4dEJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGV4dCByZW5kZXJpbmcgZXh0ZXJuYWwgZnVuY3Rpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBSR0IgYnVmZmVyIGlzIHNldCAqLwotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uIGRpZCBub3Qgc2V0IFJHQiBidWZmZXIgY29ycmVjdGx5ICEiKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ29udmVydCBSR0IgcGxhbmUgdG8gWVVWNDIwIGFuZCB1cGRhdGUgZnJhbWluZyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogZXJyb3Igd2hlbiBjb252ZXJ0aW5nIFJHQiB0byBZVVY6IDB3JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0jZWxzZQotICAgICAgICAgICAgICAgIC8qKi8KLSAgICAgICAgICAgICAgICAvKiBDYWxsIHRleHQgcmVuZGVyaW5nIGZ1bmN0aW9uICovCi0KLSAgICAgICAgICAgICAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wVGV4dFJlbmRlcmluZ0ZjdCgKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ueFZTUy5wUmVuZGVyaW5nRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MucFRleHRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0c1tqXS54VlNTLnRleHRCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAmKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpKTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiVGV4dCByZW5kZXJpbmcgZXh0ZXJuYWwgZnVuY3Rpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBSR0IgYnVmZmVyIGlzIHNldCAqLwotICAgICAgICAgICAgICAgIGlmKCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gZGlkIG5vdCBzZXQgUkdCIGJ1ZmZlciBjb3JyZWN0bHkgISIpOwotICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IFJHQiBwbGFuZSB0byBZVVY0MjAgYW5kIHVwZGF0ZSBmcmFtaW5nIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihmcmFtaW5nQ3R4KTsKLQotICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IGVycm9yIHdoZW4gY29udmVydGluZyBSR0IgdG8gWVVWOiAwdyV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qREVDT0RFX0dJRl9PTl9TQVZJTkcqLwotCi0gICAgICAgICAgICAgICAgLyogQ2hhbmdlIGludGVybmFsbHkgZWZmZWN0IHR5cGUgZnJvbSAidGV4dCIgdG8gZnJhbWluZyAqLwotCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZzsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS54VlNTLmJSZXNpemUgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTm8gdGV4dCByZW5kZXJpbmcgZnVuY3Rpb24gc2V0ICEhIik7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIGRhdGEgbmVlZGVkIGJ5IHRoZSBGaWZ0aWVzIGVmZmVjdCAqLwotICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRmlmdGllc1N0cnVjdCAqZmlmdGllc0N0eDsKLQotICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGV4cGVjdGVkIGZyYW1lIHJhdGUgZm9yIHRoZSBmaWZ0aWVzIGVmZmVjdCAobXVzdCBiZSBhYm92ZSAwKSAqLwotICAgICAgICAgICAgaWYoIDAgPT0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIEVmZmVjdHNbal0ueFZTUy51aUZpZnRpZXNPdXRGcmFtZVJhdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICAgICAiVGhlIGZyYW1lIHJhdGUgZm9yIHRoZSBmaWZ0aWVzIGVmZmVjdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwICEiKTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaWZ0aWVzQ3R4ID0gKE00eFZTU19GaWZ0aWVzU3RydWN0Ci0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00eFZTU19GaWZ0aWVzU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBmaWZ0aWVzIGVmZmVjdCIpOwotCi0gICAgICAgICAgICBpZiggZmlmdGllc0N0eCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmlmdGllc0N0eC0+cHJldmlvdXNDbGlwVGltZSA9IC0xOwotICAgICAgICAgICAgZmlmdGllc0N0eC0+ZmlmdGllc0VmZmVjdER1cmF0aW9uID0gMTAwMCAvIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICBFZmZlY3RzW2pdLnhWU1MudWlGaWZ0aWVzT3V0RnJhbWVSYXRlOwotICAgICAgICAgICAgZmlmdGllc0N0eC0+c2hpZnRSYW5kb21WYWx1ZSA9IDA7Ci0gICAgICAgICAgICBmaWZ0aWVzQ3R4LT5zdHJpcGVSYW5kb21WYWx1ZSA9IDA7Ci0KLSAgICAgICAgICAgIC8qIFNhdmUgdGhlIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggY29ycmVzcG9uZGluZyBlZmZlY3QgKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIGZpZnRpZXNDdHg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBkYXRhIG5lZWRlZCBieSB0aGUgQ29sb3IgZWZmZWN0ICovCi0gICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNgotICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9CbGFja0FuZFdoaXRlCi0gICAgICAgICAgICB8fCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgID09IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1BpbmsKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW4KLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfU2VwaWEKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmUKLSAgICAgICAgICAgIHx8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfQ29sb3JTdHJ1Y3QgKkNvbG9yQ3R4OwotCi0gICAgICAgICAgICBDb2xvckN0eCA9Ci0gICAgICAgICAgICAgICAgKE00eFZTU19Db2xvclN0cnVjdCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0NvbG9yU3RydWN0KSwKLSAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJDb250ZXh0IG9mIHRoZSBjb2xvciBlZmZlY3QiKTsKLQotICAgICAgICAgICAgaWYoIENvbG9yQ3R4ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TZW5kQ29tbWFuZCIpOwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb2xvckN0eC0+Y29sb3JFZmZlY3RUeXBlID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGU7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2Ci0gICAgICAgICAgICAgICAgfHwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbG9yQ3R4LT5yZ2IxNkNvbG9yRGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnhWU1MudWlSZ2IxNklucHV0Q29sb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29sb3JDdHgtPnJnYjE2Q29sb3JEYXRhID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogU2F2ZSB0aGUgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBjb3JyZXNwb25kaW5nIGVmZmVjdCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgQ29sb3JDdHg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIEJhY2tncm91bmQgbXVzaWMgcmVnaXN0ZXJpbmcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmKCBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgJiYgaXNOZXdCR00gPT0gTTRPU0FfVFJVRSApCi0gICAgewotI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAotCi0gICAgICAgIE00eFZTU19NQ1NfcGFyYW1zICpwUGFyYW1zOwotICAgICAgICBNNE9TQV9DaGFyICpvdXRfcGNtOwotICAgICAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgICAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0jZW5kaWYKLQotICAgICAgICAvKiBXZSBzYXZlIG91dHB1dCBmaWxlIHBvaW50ZXIsIGJlY2F1c2Ugd2Ugd2lsbCBuZWVkIHRvIHVzZSBpdCB3aGVuIHNhdmluZyBhdWRpbyBtaXhlZAotICAgICAgICAgZmlsZSAobGFzdCBzYXZlIHN0ZXApICovCi0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wVGVtcG9yYXJ5RmlsZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZTsKLQotICAgICAgICAvKiBJZiBhIHByZXZpb3VzIEJHTSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsIGRlbGV0ZSBpdCAqLwotICAgICAgICAvKiBIZXJlIGNhbiBiZSBpbXBsZW1lbnRlZCB0ZXN0IHRvIGtub3cgaWYgdGhlIHNhbWUgQkdNIGlzIHJlZ2lzdGVyZWQgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPgotICAgICAgICAgICAgICAgICAgICBwRmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgQkdNICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9Ci0gICAgICAgICAgICAoTTR4VlNTX0JHTVNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfQkdNU2V0dGluZ3MpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikieFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvcHkgaW5wdXQgc3RydWN0dXJlIHRvIG91ciBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLAotICAgICAgICAgICAgKHZvaWQgKilwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLAotICAgICAgICAgICAgc2l6ZW9mKE00eFZTU19CR01TZXR0aW5ncykpOwotICAgICAgICAvKiBBbGxvY2F0ZSBmaWxlIG5hbWUsIGFuZCBjb3B5IGZpbGUgbmFtZSBidWZmZXIgdG8gb3VyIHN0cnVjdHVyZSAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0KLSAgICAgICAgICAgIE00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoc3RybGVuKHBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKQotICAgICAgICAgICAgKyAxKSwgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUyBCR00gZmlsZSBwYXRoIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgICh2b2lkICopcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICBzdHJsZW4ocFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpICsgMSk7Ci0KLSNpZmRlZiBQUkVWSUVXX0VOQUJMRUQKLSAgICAgICAgLyogRGVjb2RlIEJHTSB0cmFjayB0byBwY20gb3V0cHV0IGZpbGUgKi8KLQotICAgICAgICBwUGFyYW1zID0KLSAgICAgICAgICAgIChNNHhWU1NfTUNTX3BhcmFtcyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX01DU19wYXJhbXMpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiRWxlbWVudCBvZiBNQ1MgUGFyYW1zIChmb3IgQkdNKSIpOwotCi0gICAgICAgIGlmKCBwUGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKAotICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IFByb2JsZW0gd2hlbiBhbGxvY2F0aW5nIG9uZSBlbGVtZW50IE1DUyBQYXJhbXMiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBvaW50ZXJzIGluIGNhc2Ugb2YgcHJvYmxlbSAoUFIgMjI3MykgKi8KLSAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcFBhcmFtcy0+cEZpbGVUZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcFBhcmFtcy0+cE5leHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBwUGFyYW1zLT5CZWdpbkN1dFRpbWUgPSAwOwotICAgICAgICBwUGFyYW1zLT5FbmRDdXRUaW1lID0gMDsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdAotICAgICAgICAgICAgPT0gTTRPU0FfTlVMTCApIC8qIE1lYW5zIGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHhWU1MgY29udGV4dCB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtczsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfdGVtcCA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19wcmV2ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8gZmluZCBhbmQgZGVsZXRlIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICB3aGlsZSggcFBhcmFtc190ZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcC0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBQQ00gdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXNfdGVtcC0+cEZpbGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXAtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIENoYWluIHByZXZpb3VzIGVsZW1lbnQgd2l0aCBuZXh0IGVsZW1lbnQgPSByZW1vdmUgQkdNIGNoYWluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0IGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfcHJldiAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2LT5wTmV4dCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSWYgY3VycmVudCBwb2ludGVyIGlzIHRoZSBmaXJzdCBvZiB0aGUgY2hhaW5lZCBsaXN0IGFuZCBuZXh0IHBvaW50ZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgdGhlIGNoYWluZWQgbGlzdCBpcyBOVUxMICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGl0IG1lYW5zIHRoYXQgdGhlcmUgd2FzIG9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogPT4gd2UgcHV0IHRoZSBjb250ZXh0IHZhcmlhYmxlIHRvIE5VTEwgdG8gcmVhZmZlY3QgdGhlIGZpcnN0IGNoYWluZWQgbGlzdAotICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wID09IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfdGVtcC0+cE5leHQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgQkdNIHBvaW50ZXIgaXMgdGhlIGZpcnN0IG9uZSwgYnV0IHRoZXJlIGFyZSBvdGhlcnMgZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgIGFmdGVyIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIFNvLCB3ZSBuZWVkIHRvIGNoYW5nZSBmaXJzdCBjaGFpbmVkIGxpc3QgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwUGFyYW1zX3RlbXAtPnBOZXh0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfcHJldiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wTmV4dCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2ID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBwUGFyYW1zX3ByZXY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldiA9IHBQYXJhbXNfdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBXZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgY2hhaW5lZCBsaXN0IHRvIGJlIGFibGUgdG8gYWRkIG5ldwotICAgICAgICAgICAgIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICBwTUNTX2xhc3QgPSBwUGFyYW1zX3ByZXY7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgaXQgbWVhbnMgdGhhdCB0aGVyZSB3YXMgb25seSBvbmUgZWxlbWVudCBpbiB0aGUgY2hhaW5lZCBsaXN0ICovCi0gICAgICAgICAgICAgICAgLyogU28sIHdlIG5lZWQgdG8gc2F2ZSB0aGUgbmV3IHBhcmFtcyovCi0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCA9IHBQYXJhbXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVXBkYXRlIG5leHQgcG9pbnRlciBvZiB0aGUgcHJldmlvdXMgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiAqLwotICAgICAgICAgICAgICAgIHBNQ1NfbGFzdC0+cE5leHQgPSBwUGFyYW1zOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvKiBGaWxsIHRoZSBsYXN0IE00eFZTU19NQ1NfcGFyYW1zIGVsZW1lbnQgKi8KLSAgICAgICAgcFBhcmFtcy0+SW5wdXRGaWxlVHlwZSA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlOwotICAgICAgICBwUGFyYW1zLT5PdXRwdXRGaWxlVHlwZSA9IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9QQ007Ci0gICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa05vbmVWaWRlbzsKLSAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVNpemUgPSBNNFZJREVPRURJVElOR19rUUNJRjsKLSAgICAgICAgcFBhcmFtcy0+T3V0cHV0VmlkZW9GcmFtZVJhdGUgPSBNNFZJREVPRURJVElOR19rMTVfRlBTOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdAotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0FBQyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvRm9ybWF0ID0gTTRWSURFT0VESVRJTkdfa0FBQzsKLSAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvU2FtcGxpbmdGcmVxdWVuY3kgPSBNNFZJREVPRURJVElOR19rRGVmYXVsdF9BU0Y7Ci0KLSAgICAgICAgICAgIC8qRkI6IFZBTCBDUiBQNE1FMDAwMDMwNzYKLSAgICAgICAgICAgIFRoZSBvdXRwdXQgYXVkaW8gYml0cmF0ZSBpbiB0aGUgQUFDIGNhc2UgaXMgbm93IGRpcmVjdGx5IGdpdmVuIGJ5IHRoZSB1c2VyKi8KLSAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIGF1ZGlvIGJpdHJhdGUgaXMgY29ycmVjdGx5IGRlZmluZWQqLwotICAgICAgICAgICAgLypNb25vCi0gICAgICAgICAgICBNQ1MgdmFsdWVzIGZvciBBQUMgTW9ubyBhcmUgbWluOiAxNmticHMgYW5kIG1heDogMTkyIGticHMqLwotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2sxNl9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0JpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0JpdHJhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKlN0ZXJlbwotICAgICAgICAgICAgTUNTIHZhbHVlcyBmb3IgQUFDIE1vbm8gYXJlIG1pbjogMzJrYnBzIGFuZCBtYXg6IDE5MiBrYnBzKi8KLSAgICAgICAgICAgIGVsc2UgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZQotICAgICAgICAgICAgICAgID49IE00VklERU9FRElUSU5HX2szMl9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlCi0gICAgICAgICAgICAgICAgPD0gTTRWSURFT0VESVRJTkdfazE5Ml9LQlBTCi0gICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9GQUxTRSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2szMl9LQlBTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBhcmFtcy0+YkF1ZGlvTW9ubyA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLmJBdWRpb01vbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdCA9IE00VklERU9FRElUSU5HX2tBTVJfTkI7Ci0gICAgICAgICAgICBwUGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5ID0gTTRWSURFT0VESVRJTkdfa0RlZmF1bHRfQVNGOwotICAgICAgICAgICAgcFBhcmFtcy0+T3V0cHV0QXVkaW9CaXRyYXRlID0gTTRWSURFT0VESVRJTkdfazEyXzJfS0JQUzsKLSAgICAgICAgICAgIHBQYXJhbXMtPmJBdWRpb01vbm8gPSBNNE9TQV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIHBQYXJhbXMtPk91dHB1dFZpZGVvQml0cmF0ZSA9IE00VklERU9FRElUSU5HX2tVbmRlZmluZWRCaXRyYXRlOwotCi0gICAgICAgIC8qIFByZXBhcmUgb3V0cHV0IGZpbGVuYW1lICovCi0gICAgICAgIC8qIDIxIGlzIHRoZSBzaXplIG9mICJwcmV2aWV3XzE2MDAwXzIucGNtIiArIFwwICovCi0gICAgICAgIG91dF9wY20gPQotICAgICAgICAgICAgKE00T1NBX0NoYXIgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc3RybGVuKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKQotICAgICAgICAgICAgKyAyMSwgTTRWUywgKE00T1NBX0NoYXIgKikiVGVtcCBjaGFyKiBmb3IgcGNtUHJldmlld0ZpbGUiKTsKLQotICAgICAgICBpZiggb3V0X3BjbSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfSW5pdCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29weSB0ZW1wb3JhcnkgcGF0aCB0byBmaW5hbCBwcmV2aWV3IHBhdGggc3RyaW5nICovCi0gICAgICAgIE00T1NBX2Nock5Db3B5KG91dF9wY20sIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLAotICAgICAgICAgICAgc3RybGVuKHhWU1NfY29udGV4dC0+cFRlbXBQYXRoKSArIDEpOwotCi0gICAgICAgIC8qIERlcGVuZGluZyBvZiB0aGUgb3V0cHV0IHNhbXBsZSBmcmVxdWVuY3kgYW5kIG5iIG9mIGNoYW5uZWxzLCB3ZSBjb25zdHJ1Y3QgcHJldmlldwotICAgICAgICBvdXRwdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0Ci0gICAgICAgICAgICA9PSBNNFZJREVPRURJVElOR19rQUFDICkKLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29uc3RydWN0IG91dHB1dCB0ZW1wb3JhcnkgUENNIGZpbGVuYW1lICovCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubyA9PSBNNE9TQV9UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0X3BjbSwgKGNvbnN0IGNoYXIgKikicHJldmlld18xNjAwMF8xLnBjbVwwIiwKLSAgICAgICAgICAgICAgICAgICAgMjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfcGNtLCAoY29uc3QgY2hhciAqKSJwcmV2aWV3XzE2MDAwXzIucGNtXDAiLAotICAgICAgICAgICAgICAgICAgICAyMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSBQQ00gZmlsZW5hbWUgKi8KLSAgICAgICAgICAgIHN0cm5jYXQoKGNoYXIgKilvdXRfcGNtLCAoY29uc3QgY2hhciAqKSJwcmV2aWV3XzA4MDAwXzEucGNtXDAiLCAyMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggb3V0X3BjbSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKG91dF9wY20pOwotICAgICAgICAgICAgICAgIG91dF9wY20gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIGF1ZGlvIG91dHB1dCBmb3JtYXQgXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgIH0KLQotICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0gb3V0X3BjbTsKLQotICAgICAgICAvKioKLSAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLSAgICAgICAgcERlY29kZWRQYXRoID0gb3V0X3BjbTsKLSAgICAgICAgbGVuZ3RoID0gc3RybGVuKHBEZWNvZGVkUGF0aCk7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilvdXRfcGNtLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIFNlbmQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhsZW5ndGggKyAxLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikicGNtUHJldmlld0ZpbGUiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wY21QcmV2aWV3RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NlbmRDb21tYW5kIik7Ci0gICAgICAgICAgICBmcmVlKG91dF9wY20pOwotICAgICAgICAgICAgb3V0X3BjbSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAvKkZCOiB0byBhdm9pZCBsZWFrcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBzZW5kIGNvbW1hbmQqLwotICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgIE00eFZTU19mcmVlQ29tbWFuZCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgLyoqLwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUsICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLQotICAgICAgICAvKiBGcmVlIHRlbXBvcmFyeSBvdXRwdXQgZmlsZW5hbWUgKi8KLSAgICAgICAgaWYoIG91dF9wY20gIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUob3V0X3BjbSk7Ci0gICAgICAgICAgICBvdXRfcGNtID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHBQYXJhbXMtPnBGaWxlT3V0ID0gTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKChsZW5ndGggKyAxKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk1DUyBCR00gUGFyYW1zOiBmaWxlIG91dCIpOwotCi0gICAgICAgIGlmKCBwUGFyYW1zLT5wRmlsZU91dCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBQYXJhbXMtPnBGaWxlT3V0LCh2b2lkICopIHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUsCi0gICAgICAgICAgICAobGVuZ3RoICsgMSkpOyAvKiBDb3B5IG91dHB1dCBmaWxlIHBhdGggKi8KLQotICAgICAgICAvKioKLSAgICAgICAgKiBVVEYgY29udmVyc2lvbjogY29udmVydCBpbnRvIHRoZSBjdXN0b21lciBmb3JtYXQsIGJlZm9yZSBiZWluZyB1c2VkKi8KLQotICAgICAgICBwRGVjb2RlZFBhdGggPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+Ci0gICAgICAgICAgICAgICAgcEZpbGUsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NlbmRDb21tYW5kOiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIC8qIEZyZWUgU2VuZCBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICBwUGFyYW1zLT5wRmlsZUluID0gKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGxlbmd0aCArIDEpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTUNTIEJHTSBQYXJhbXM6IGZpbGUgaW4iKTsKLQotICAgICAgICBpZiggcFBhcmFtcy0+cEZpbGVJbiA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTR4VlNTX2ZyZWVDb21tYW5kKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2VuZENvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwUGFyYW1zLT5wRmlsZUluLCAodm9pZCAqKXBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgIChsZW5ndGggKyAxKSk7IC8qIENvcHkgaW5wdXQgZmlsZSBwYXRoICovCi0KLSAgICAgICAgcFBhcmFtcy0+aXNCR00gPSBNNE9TQV9UUlVFOwotICAgICAgICBwUGFyYW1zLT5pc0NyZWF0ZWQgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5uYlN0ZXBUb3RhbCsrOwotICAgICAgICBiSXNUcmFuc2NvZGluZyA9IE00T1NBX1RSVUU7Ci0jZW5kaWYgLyogUFJFVklFV19FTkFCTEVEICovCi0KLSAgICB9Ci0gICAgZWxzZSBpZiggcFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIGlzTmV3QkdNID09IE00T1NBX0ZBTFNFICkKLSAgICB7Ci0jaWZkZWYgUFJFVklFV19FTkFCTEVECi0gICAgICAgIC8qIEJHTSBpcyB0aGUgc2FtZSBhcyBwcmV2aW91c2x5LCBubyBuZWVkIHRvIHJlZGVjb2RlIGF1ZGlvICovCi0gICAgICAgIC8qIE5lZWQgdG8gdXBkYXRlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0LCB0byBzaWduYWwgTTR4VlNTX3N0ZXAgZnVuY3Rpb24gdG8gc2tpcAotICAgICAgICBCR00gZGVjb2RpbmcgKi8KLQotICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc190ZW1wID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfcHJldiA9IE00T1NBX05VTEw7Ci0KLSNlbmRpZiAvKiBQUkVWSUVXX0VOQUJMRUQgKi8KLSAgICAgICAgLyogV2Ugc2F2ZSBvdXRwdXQgZmlsZSBwb2ludGVyLCBiZWNhdXNlIHdlIHdpbGwgbmVlZCB0byB1c2UgaXQgd2hlbiBzYXZpbmcgYXVkaW8KLSAgICAgICAgIG1peGVkIGZpbGUgKGxhc3Qgc2F2ZSBzdGVwKSAqLwotCi0gICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGU7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFRlbXBvcmFyeUZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGU7Ci0KLSAgICAgICAgLyogUmUtd3JpdGUgQkdNIHNldHRpbmdzIGluIGNhc2UgdGhleSBoYXZlIGNoYW5nZWQgYmV0d2VlbiB0d28gc2VuZENvbW1hbmQgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZEN0cyA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZEN0czsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZSA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcCA9Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcDsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUVuZExvb3AgPQotICAgICAgICAgICAgcFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlFbmRMb29wOwotCi0jaWZkZWYgUFJFVklFV19FTkFCTEVECi0gICAgICAgIC8qIFBhcnNlIE1DUyBwYXJhbXMgY2hhaW5lZCBsaXN0IHRvIGZpbmQgYW5kIGRlbGV0ZSBCR00gZWxlbWVudCAqLwotCi0gICAgICAgIHdoaWxlKCBwUGFyYW1zX3RlbXAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcC0+aXNDcmVhdGVkID0gTTRPU0FfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQYXJhbXNfcHJldiA9IHBQYXJhbXNfdGVtcDsKLSAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgIH0KLQotI2VuZGlmIC8qIFBSRVZJRVdfRU5BQkxFRCAqLwotCi0gICAgICAgIE00T1NBX1RSQUNFMl8wKCJNNHhWU1NfU2VuZENvbW1hbmQgaGFzIGJlZW4gcmVjYWxsZWQsIEJHTSBpcyB0aGUgc2FtZSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTm8gQkdNIGluIHRoaXMgeFZTUyBjb21tYW5kIik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotI2lmZGVmIFBSRVZJRVdfRU5BQkxFRAotICAgICAgICAgICAgLyogTmVlZCB0byByZW1vdmUgTUNTIHByZXZpb3VzIHBhcmFtcyBjaGFpbmVkIGxpc3QgKi8KLQotICAgICAgICAgICAgTTR4VlNTX01DU19wYXJhbXMgKnBQYXJhbXNfdGVtcCA9IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3Q7Ci0gICAgICAgICAgICBNNHhWU1NfTUNTX3BhcmFtcyAqcFBhcmFtc19wcmV2ID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgLyogUGFyc2UgTUNTIHBhcmFtcyBjaGFpbmVkIGxpc3QgdG8gZmluZCBhbmQgZGVsZXRlIEJHTSBlbGVtZW50ICovCi0gICAgICAgICAgICB3aGlsZSggcFBhcmFtc190ZW1wICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3RlbXAtPmlzQkdNID09IE00T1NBX1RSVUUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wLT5wRmlsZUluICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXNfdGVtcC0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIHBQYXJhbXNfdGVtcC0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zX3RlbXAtPnBGaWxlT3V0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBDaGFpbiBwcmV2aW91cyBlbGVtZW50IHdpdGggbmV4dCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBwUGFyYW1zX3ByZXYgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfcHJldi0+cE5leHQgPSBwUGFyYW1zX3RlbXAtPnBOZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIElmIGN1cnJlbnQgcG9pbnRlciBpcyB0aGUgZmlyc3Qgb2YgdGhlIGNoYWluZWQgbGlzdCBhbmQgbmV4dCBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY2hhaW5lZCBsaXN0IGlzIE5VTEwgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogaXQgbWVhbnMgdGhhdCB0aGVyZSB3YXMgb25seSBvbmUgZWxlbWVudCBpbiB0aGUgbGlzdCAqLwotICAgICAgICAgICAgICAgICAgICAvKiA9PiB3ZSBwdXQgdGhlIGNvbnRleHQgdmFyaWFibGUgdG8gTlVMTCAqLwotICAgICAgICAgICAgICAgICAgICBpZiggcFBhcmFtc190ZW1wID09IHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBQYXJhbXNfdGVtcC0+cE5leHQgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEluIHRoYXQgY2FzZSwgQkdNIHBvaW50ZXIgaXMgdGhlIGZpcnN0IG9uZSwgYnV0IHRoZXJlIGFyZSBvdGhlcnMKLSAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGFmdGVyIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIFNvLCB3ZSBuZWVkIHRvIGNoYW5nZSBmaXJzdCBjaGFpbmVkIGxpc3QgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwUGFyYW1zX3RlbXAtPnBOZXh0ICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID0gcFBhcmFtc190ZW1wLT5wTmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtc190ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogSW4gYWxsIG90aGVyIGNhc2VzLCBub3RoaW5nIGVsc2UgdG8gZG8gZXhjZXB0IGZyZWVpbmcgdGhlIGNoYWluZWQKLSAgICAgICAgICAgICAgICAgICAgbGlzdCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zX3RlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtc190ZW1wID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFBhcmFtc19wcmV2ID0gcFBhcmFtc190ZW1wOwotICAgICAgICAgICAgICAgIHBQYXJhbXNfdGVtcCA9IHBQYXJhbXNfdGVtcC0+cE5leHQ7Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZiAvKiBQUkVWSUVXX0VOQUJMRUQgKi8KLSAgICAgICAgICAgIC8qIEhlcmUsIHdlIHVuYWxsb2NhdGUgYWxsIEJHTSBjb21wb25lbnRzIGFuZCBwdXQgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgeFZTUy5wQkdNdHJhY2sgdG8gTlVMTCAqLwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlCi0gICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlZCB0byBiZSBhYmxlIHRvIG1peCB3aXRoIHZpZGVvIG9ubHkgZmlsZXMgLT4gaW4gY2FzZSBubyBtYXN0ZXIgY2xpcCBpcyBmb3VuZAotICAgIChpLmUgb25seSBKUEcgaW5wdXQgb3IgdmlkZW8gb25seSBpbnB1dCkgKi8KLSAgICAvKiBhbmQgaWYgdGhlcmUgaXMgYSBCR00sIHdlIGZvcmNlIHRoZSBhZGRlZCB2b2x1bWUgdG8gMTAwIChpLmUgcmVwbGFjZSBhdWRpbykgKi8KLQotICAgIGlmKCBtYXN0ZXJDbGlwID09IC0xCi0gICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIC8qIEluIHRoYXQgY2FzZSwgaXQgbWVhbnMgdGhhdCBubyBpbnB1dCAzR1AgZmlsZSBoYXMgYSB2aWRlbyB0cmFjay4KLSAgICAgICAgVGhlcmVmb3JlLCBpZiBhIG1peGluZyBpcyBhc2tlZCwgaXQgd2lsbCBmYWlsLiBUaHVzLCB3ZSBmb3JjZSByZXBsYWNlIGF1ZGlvLiAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpQWRkVm9sdW1lID0gMTAwOwotICAgIH0KLQotICAgIC8qIFNhdmUgY2xpcCBudW1iZXIgdG8ga25vdyBpZiBhIE00eFZTU19zZW5kQ29tbWFuZCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCAqLwotICAgIHhWU1NfY29udGV4dC0+cHJldmlvdXNDbGlwTnVtYmVyID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsKLQotICAgIC8qIENoYW5nZSBzdGF0ZSAqLwotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVBbmFseXppbmc7Ci0KLSAgICAvKiBJbiBjYXNlIG9mIE1NUyB1c2UgY2FzZSwgd2UgY29tcHV0ZSBoZXJlIHRoZSBtYXggdmlkZW8gYml0cmF0ZSAqLwotICAgIC8qIEluIGNhc2Ugb2YgdG9vIGxvdyBiaXRyYXRlLCBhIHNwZWNpZmljIHdhcm5pbmcgaXMgcmV0dXJuZWQgKi8KLSAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUgIT0gMCAmJiB0b3RhbER1cmF0aW9uID4gMCApCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgZmlsZVByb3BlcnRpZXM7Ci0gICAgICAgIE00T1NBX0RvdWJsZSByYXRpbzsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUFkZFZvbHVtZQotICAgICAgICAgICAgICAgID09IDEwMCApIC8qIFdlIGFyZSBpbiAicmVwbGFjZSBhdWRpbyBtb2RlLCBuZWVkIHRvIGNoZWNrIHRoZSBmaWxldHlwZSAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlCi0gICAgICAgICAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV8zR1BQICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQgKnBEZWNvZGVkUGF0aDsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlOwotICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMICYmIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjgoeFZTU19jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MucEJHTXRyYWNrLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1NlbmRDb21tYW5kOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPQotICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBEZWNvZGVkUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBCR00gdHJhY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgLyplcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKHhWU1NfY29udGV4dCwgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPgotICAgICAgICAgICAgICAgICAgICB4VlNTLnBCR010cmFjay0+cEZpbGUsICZmaWxlUHJvcGVydGllcyk7Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19zZW5kQ29tbWFuZDogTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyByZXR1cm5lZCBhbiBlcnJvcjpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IE00VklERU9FRElUSU5HX2tBTVJfTkIgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX3NlbmRDb21tYW5kOiBJbXBvc3NpYmxlIHRvIHVzZSBNTVMgbW9kZSB3aXRoIEJHTSAhPSBBTVItTkIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZQotICAgICAgICAgICAgICAgICAgICAhPSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfQU1SCi0gICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+RmlsZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgIT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX01QMyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX3NlbmRDb21tYW5kOiBCYWQgaW5wdXQgQkdNIGZpbGUiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIHRhcmdldGVkIGJpdHJhdGUsIHdpdGggOCUgbWFyZ2luIChtb292KSAqLwotICAgICAgICBpZiggdG90YWxEdXJhdGlvbiA+IDEwMDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRlZEJpdHJhdGUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0RmlsZVNpemUKLSAgICAgICAgICAgICAgICAqIDggKiAwLjg0KSAvICh0b3RhbER1cmF0aW9uIC8gMTAwMCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFJlbW92ZSBhdWRpbyBiaXRyYXRlICovCi0gICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPj0gMTIyMDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRlZEJpdHJhdGUgLT0gMTIyMDA7IC8qIE9ubHkgQU1SIGlzIHN1cHBvcnRlZCBpbiBNTVMgY2FzZSAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgYW4gaW5kaWNhdG9yIG9mICJjb21wbGV4aXR5IiBkZXBlbmRpbmcgb24gbmIgb2Ygc2VxdWVuY2VzIGFuZCB0b3RhbCBkdXJhdGlvbiAqLwotICAgICAgICAvKiBUaGUgaGlnaGVzdCBpcyB0aGUgbnVtYmVyIG9mIHNlcXVlbmNlcywgdGhlIG1vcmUgdGhlcmUgYXJlIHNvbWUgSSBmcmFtZXMgKi8KLSAgICAgICAgLyogSW4gdGhhdCBjYXNlLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVkdWNlIHRoZSB0YXJnZXQgYml0cmF0ZSAqLwotICAgICAgICByYXRpbyA9Ci0gICAgICAgICAgICAoTTRPU0FfRG91YmxlKSgoTTRPU0FfRG91YmxlKSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyCi0gICAgICAgICAgICAqIDEwMDAwMCkgLyAoTTRPU0FfRG91YmxlKSh0b3RhbER1cmF0aW9uKSk7Ci0gICAgICAgIE00T1NBX1RSQUNFMl8zKAotICAgICAgICAgICAgIlJhdGlvIGNsaXBfbmIvZHVyYXRpb24gPSAlZlxuVGFyZ2V0ZWQgYml0cmF0ZSA9ICVkXG5Ub3RhbCBkdXJhdGlvbjogJWQiLAotICAgICAgICAgICAgKE00T1NBX0RvdWJsZSkoKE00T1NBX0RvdWJsZSkoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpQ2xpcE51bWJlcgotICAgICAgICAgICAgKiAxMDAwMDApIC8gKE00T1NBX0RvdWJsZSkodG90YWxEdXJhdGlvbikpLAotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlLCB0b3RhbER1cmF0aW9uKTsKLQotICAgICAgICBpZiggcmF0aW8gPiA1MCAmJiByYXRpbyA8PSA3NSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBwb3RlbnRpYWwgcmlzayBvZiBoYXZpbmcgYSBoaWdoZXIgZmlsZSBzaXplCi0gICAgICAgICAgICB0aGFuIHNwZWNpZmllZCAqLwotICAgICAgICAgICAgdGFyZ2V0ZWRCaXRyYXRlIC09IChNNE9TQV9VSW50MzIpKHRhcmdldGVkQml0cmF0ZSAqIDAuMSk7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMigKLSAgICAgICAgICAgICAgICAiTmV3IGJpdHJhdGUxICEhXG5SYXRpbyBjbGlwX25iL2R1cmF0aW9uID0gJWZcblRhcmdldGVkIGJpdHJhdGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgcmF0aW8sIHRhcmdldGVkQml0cmF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcmF0aW8gPiA3NSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldGVkQml0cmF0ZSAtPSAoTTRPU0FfVUludDMyKSh0YXJnZXRlZEJpdHJhdGUgKiAwLjE1KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8yKAotICAgICAgICAgICAgICAgICJOZXcgYml0cmF0ZTIgISFcblJhdGlvIGNsaXBfbmIvZHVyYXRpb24gPSAlZlxuVGFyZ2V0ZWQgYml0cmF0ZSA9ICVkIiwKLSAgICAgICAgICAgICAgICByYXRpbywgdGFyZ2V0ZWRCaXRyYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qQ1IgMzI4MyBNTVMgdXNlIGNhc2UgZm9yIFZBTDoKLSAgICAgICAgRGVjcmVhc2UgdGhlIG91dHB1dCBmaWxlIHNpemUgdG8ga2VlcCBhIG1hcmdpbiBvZiA1JQotICAgICAgICBUaGUgd3JpdGVyIHdpbGwgc3RvcCB3aGVuIHRoZSB0YXJnZXRlZCBvdXRwdXQgZmlsZSBzaXplIHdpbGwgYmUgcmVhY2hlZCovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEZpbGVTaXplIC09Ci0gICAgICAgICAgICAoTTRPU0FfVUludDMyKSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRGaWxlU2l6ZSAqIDAuMDUpOwotCi0gICAgICAgIHN3aXRjaCggeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplICkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rU1FDSUY6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDMyMDAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gMzIwMDA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FRVkdBOgotICAgICAgICAgICAgICAgIGlmKCB0YXJnZXRlZEJpdHJhdGUgPCAzMjAwMCApICAgICAgICAgICAgICAvKjQ4MDAwKSovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDMyMDAwOyAvKjQ4MDAwOyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1FDSUY6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDQ4MDAwICkgICAgICAgICAgICAgIC8qNjQwMDApKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gNDgwMDA7IC8qNjQwMDA7Ki8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfT1VUUFVURklMRVNJWkVfRVhDRUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNNFZJREVPRURJVElOR19rUVZHQToKLSAgICAgICAgICAgICAgICBpZiggdGFyZ2V0ZWRCaXRyYXRlIDwgNjQwMDAgKSAgICAgICAgICAgICAgLyoxMjgwMDApKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gNjQwMDA7IC8qMTI4MDAwOyovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNFZTUzNHUFBfV0FSX09VVFBVVEZJTEVTSVpFX0VYQ0VFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgICAgICAgICBpZiggdGFyZ2V0ZWRCaXRyYXRlIDwgMTI4MDAwICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlID0gMTI4MDAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9PVVRQVVRGSUxFU0laRV9FWENFRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgICAgICAgICAgaWYoIHRhcmdldGVkQml0cmF0ZSA8IDE5MjAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IDE5MjAwMDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9XQVJfT1VUUFVURklMRVNJWkVfRVhDRUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBDYW5ub3QgaGFwcGVuICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1Nfc2VuZENvbW1hbmQ6IEVycm9yIGluIG91dHB1dCBmaWxlU2l6ZSAhIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB4VlNTX2NvbnRleHQtPnRhcmdldGVkQml0cmF0ZSA9IChNNE9TQV9VSW50MzIpdGFyZ2V0ZWRCaXRyYXRlOwotICAgIH0KLQotICAgIGlmKCBiSXNUcmFuc2NvZGluZyApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWU1MzR1BQX1dBUl9UUkFOU0NPRElOR19ORUNFU1NBUlk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TYXZlU3RhcnQoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfQ2hhciogcEZpbGVQYXRoKQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmUgdGhlIHNhdmUKLSAqIEBub3RlICAgICAgICBUaGUgeFZTUyBjcmVhdGUgM0dQIGVkaXRlZCBmaW5hbCBmaWxlCi0gKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uY2UgTTR4VlNTX1N0ZXAgaGFzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgICBNNFZTUzNHUFBfV0FSX0FOQUxZWklOR19ET05FCi0gKiAgICAgICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUgdXNlciBtdXN0IGNhbGwgTTR4VlNTX1N0ZXAgdW50aWwKLSAqICAgICAgICAgICAgICAgIGl0IHJldHVybnMgYW5vdGhlciBlcnJvciB0aGFuIE00Tk9fRVJST1IuCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHBGaWxlUGF0aCAgICAgICAgICAgIChJTikgSWYgdGhlIHVzZXIgd2FudHMgdG8gcHJvdmlkZSBhIGRpZmZlcmVudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBmaWxlbmFtZSwgZWxzZSBjYW4gYmUgTlVMTCAoYWxsb2NhdGVkIGJ5IHRoZSB1c2VyKQotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0YXJ0KCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkICpwRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgZmlsZVBhdGhTaXplICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qQWRkIGZvciBVVEYgY29udmVyc2lvbjogY29weSB0aGUgcFNldHRpbmdzIHN0cnVjdHVyZSBpbnRvIGEgbmV3IHBDdXJyZW50RWRpdFNldHRpbmdzKi8KLSAgICBNNFZTUzNHUFBfRWRpdFNldHRpbmdzICpwRWRpdFNhdmluZ1NldHRpbmdzID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50OCBpLCBqOwotICAgIE00T1NBX1VJbnQzMiBvZmZzZXQgPSAwOwotICAgIE00T1NBX1VJbnQ4IG5iRWZmZWN0cyA9IDA7Ci0gICAgLypvbmx5IGZvciBVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNE9TQV9Wb2lkICpwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBsZW5ndGggPSAwOwotICAgIC8qKi8KLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlT3BlbmVkICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1NhdmVTdGFydCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotICAgIC8qIFJDOiB0byB0ZW1wb3JhcnkgaGFuZGxlIGNoYW5naW5nIG9mIG91dHB1dCBmaWxlcGF0aCAqLwotICAgIC8qIFRPIEJFIENIQU5HRUQgQ0xFQU5MWSBXSVRIIEEgTUFMTE9DL01FTUNQWSAhISEhICovCi0gICAgaWYoIHBGaWxlUGF0aCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qaXQgbWVhbnMgdGhhdCBwT3V0cHV0RmlsZSBoYXMgYmVlbiBhbGxvY2F0ZWQgaW4gTTR4VlNTX3NlbmRDb21tYW5kKCkqLwotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aU91dHB1dFBhdGhTaXplID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHBGaWxlUGF0aDsKLSAgICAgICAgLypBcyBhbGwgaW5wdXRzIG9mIHRoZSB4VlNTIGFyZSBpbiBVVEY4LCBjb252ZXJ0IHRoZSBvdXRwdXQgZmlsZSBwYXRoIGludG8gdGhlIGN1c3RvbWVyCi0gICAgICAgICBmb3JtYXQqLwotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBGaWxlUGF0aCwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgZmlsZVBhdGhTaXplID0gbGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9Ci0gICAgICAgICAgICAoTTRPU0FfVm9pZCAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhmaWxlUGF0aFNpemUgKyAxLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiTTR4VlNTX1NhdmVTdGFydDogb3V0cHV0IGZpbGUiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUsICh2b2lkICopcERlY29kZWRQYXRoLCBmaWxlUGF0aFNpemUgKyAxKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZVtmaWxlUGF0aFNpemVdID0gJ1wwJzsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0geFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpT3V0cHV0UGF0aFNpemUgPSBmaWxlUGF0aFNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKioqLwotCi0gICAgLypGQjogQWRkIGZvciBVVEYgY29udmVyc2lvbjogY29weSB0aGUgcFNldHRpbmdzIHN0cnVjdHVyZSBpbnRvIGEgbmV3IHBDdXJyZW50RWRpdFNldHRpbmdzKi8KLSAgICAvKkl0IGlzIHRoZSBzYW1lIHByaW5jaXBsZSBhcyBpbiB0aGUgUHJldmlld1N0YXJ0KCkqLwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MgPQotICAgICAgICAoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyksCi0gICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopIlNhdmluZywgY29weSBvZiBWU1Mgc3RydWN0dXJlIik7Ci0KLSAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncyA9PSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IHNldHRpbmdzIGZyb20gaW5wdXQgc3RydWN0dXJlICovCi0gICAgbWVtY3B5KCh2b2lkICopICYocEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUyksCi0gICAgICAgICh2b2lkICopICYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MpLAotICAgICAgICBzaXplb2YoTTR4VlNTX0VkaXRTZXR0aW5ncykpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwRWRpdFNhdmluZ1NldHRpbmdzIHN0cnVjdHVyZSAqLwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID0gTTRPU0FfTlVMTDsKLQotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlID0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnZpZGVvRnJhbWVSYXRlOwotICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXI7Ci0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlNYXN0ZXJDbGlwID0KLSAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnVpTWFzdGVyQ2xpcDsgLyogVlNTMi4wIG1hbmRhdG9yeSBwYXJhbWV0ZXIgKi8KLQotICAgIC8qIEFsbG9jYXRlIHNhdmluZ1NldHRpbmdzLnBDbGlwTGlzdC9wVHJhbnNpdGlvbnMgc3RydWN0dXJlICovCi0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0ID0gKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKgotICAgICAgICAqIClNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MgKikKLSAgICAgICAgKnBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciwKLSAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUywgc2F2aW5nICwgY29weSBvZiBwQ2xpcExpc3QiKTsKLQotICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wQ2xpcExpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciA+IDEgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MgKgotICAgICAgICAgICAgKiApTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzICopCi0gICAgICAgICAgICAqKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnVpQ2xpcE51bWJlciAtIDEpLAotICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikieFZTUywgc2F2aW5nLCBjb3B5IG9mIHBUcmFuc2l0aW9uTGlzdCIpOwotCi0gICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3QgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgcEVkaXRTYXZpbmdTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldID0gKE00VlNTM0dQUF9DbGlwU2V0dGluZ3MKLSAgICAgICAgICAgICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNFZTUzNHUFBfQ2xpcFNldHRpbmdzKSwKLSAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyBjbGlwIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoIGkgPCBwRWRpdFNhdmluZ1NldHRpbmdzLT51aUNsaXBOdW1iZXIKLSAgICAgICAgICAgIC0gMSApIC8qIEJlY2F1c2UgdGhlcmUgaXMgMSBsZXNzIHRyYW5zaXRpb24gdGhhbiBjbGlwIG51bWJlciAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPQotICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfVHJhbnNpdGlvblNldHRpbmdzCi0gICAgICAgICAgICAgICAgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VlNTM0dQUF9UcmFuc2l0aW9uU2V0dGluZ3MpLAotICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyB0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaSA9IDA7IGkgPCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgIHsKLSAgICAgICAgLy8gQWRkIE1QNCBmaWxlIHN1cHBvcnQKLQotICAgICAgICBpZiggKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZQotICAgICAgICAgICAgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFApCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NUDQpCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9NNFYpCi0gICAgICAgICAgICB8fCAoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUKLSAgICAgICAgICAgID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkpCi0KLSAgICAgICAgewotICAgICAgICAgICAgLyogQ29weSBkYXRhIGZyb20gZ2l2ZW4gc3RydWN0dXJlIHRvIG91ciBzYXZpbmcgc3RydWN0dXJlICovCi0gICAgICAgICAgICBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSwKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLAotICAgICAgICAgICAgICAgIE00T1NBX0ZBTFNFIC8qIHJlbW92ZSBlZmZlY3RzICovKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICAgICAgcERlY29kZWRQYXRoID0gcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZTsKLSAgICAgICAgICAgIGxlbmd0aCA9IHN0cmxlbihwRGVjb2RlZFBhdGgpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0Ci0gICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVyciA9Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkCi0gICAgICAgICAgICAgICAgICAgICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICZsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBFbmQgb2YgdGhlIFVURiBjb252ZXJzaW9uLCB1c2UgdGhlIGNvbnZlcnRlZCBmaWxlIHBhdGgqLwotICAgICAgICAgICAgICAgIGZyZWUoCi0gICAgICAgICAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUpOwotICAgICAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGUgPSAoTTRPU0FfVm9pZAotICAgICAgICAgICAgICAgICAgICAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygobGVuZ3RoICsgMSksCi0gICAgICAgICAgICAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyICopInNhdmluZyB0cmFuc2l0aW9uIHNldHRpbmdzIik7Ci0KLSAgICAgICAgICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5wRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLypGQjogYWRkIGZpbGUgcGF0aCBzaXplIGJlY2F1c2Ugb2YgVVRGIDE2IGNvbnZlcnNpb24qLwotICAgICAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5maWxlUGF0aFNpemUgPSBsZW5ndGgrMTsKLQotICAgICAgICAgICAgaWYoIGkKLSAgICAgICAgICAgICAgICA8IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT51aUNsaXBOdW1iZXIKLSAgICAgICAgICAgICAgICAtIDEgKSAvKiBCZWNhdXNlIHRoZXJlIGlzIDEgbGVzcyB0cmFuc2l0aW9uIHRoYW4gY2xpcCBudW1iZXIgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT4KLSAgICAgICAgICAgICAgICAgICAgcFRyYW5zaXRpb25MaXN0W2ldLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoTTRWU1MzR1BQX1RyYW5zaXRpb25TZXR0aW5ncykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoCi0gICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IEVycm9yIHdoZW4gcGFyc2luZyB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cENsaXBMaXN0W2ldOlwKLSAgICAgICAgICAgICAgICAgQmFkIGZpbGUgdHlwZSIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgdmlkZW8gZWZmZWN0cywgdXNlZCB0byBrbm93IGhvdyBtdWNoIG1lbW9yeSBpcyBuZWVkZWQgdG8gYWxsb2NhdGUqLwotICAgIC8qIEZCIDIwMDgvMTAvMTU6IHJlbW92ZWQgOiBub3QgY29tcGF0aWJsZSB3aXRoIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX05vbmUKLSAgICBmb3Ioaj0wO2o8eFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0cztqKyspCi0gICAgewotICAgIGlmKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSAhPSBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9Ob25lKQotICAgIHsKLSAgICBuYkVmZmVjdHMrKzsKLSAgICB9Ci0gICAgfSovCi0gICAgbmJFZmZlY3RzID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPm5iRWZmZWN0czsKLQotICAgIC8qIEFsbG9jYXRlIGVmZmVjdHMgc2F2aW5nIHN0cnVjdHVyZSB3aXRoIGNvcnJlY3QgbnVtYmVyIG9mIGVmZmVjdHMgKi8KLSAgICBpZiggbmJFZmZlY3RzICE9IDAgKQotICAgIHsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+RWZmZWN0cyA9Ci0gICAgICAgICAgICAoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKG5iRWZmZWN0cwotICAgICAgICAgICAgKiBzaXplb2YoTTRWU1MzR1BQX0VmZmVjdFNldHRpbmdzKSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICopIlNhdmluZyBzZXR0aW5ncywgZWZmZWN0cyB0YWJsZSBvZiBzdHJ1Y3R1cmUgc2V0dGluZ3MiKTsKLQotICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+RWZmZWN0cyA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSnVzdCBjb3B5IGVmZmVjdCBzdHJ1Y3R1cmUgdG8gc2F2aW5nIHN0cnVjdHVyZSwgYXMgZWZmZWN0cyB0aW1lIGFyZSBub3cgKi8KLSAgICAgICAgLyogcmVsYXRpdmUgdG8gb3V0cHV0IGNsaXAgdGltZSovCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBFZGl0U2F2aW5nU2V0dGluZ3MtPkVmZmVjdHMsCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzLAotICAgICAgICAgICAgbmJFZmZlY3RzICogc2l6ZW9mKE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncykpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT5FZmZlY3RzID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9Ci0gICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+bmJFZmZlY3RzID0gbmJFZmZlY3RzOwotCi0gICAgaWYoIHBGaWxlUGF0aCAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0gICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gcEZpbGVQYXRoOwotICAgIH0KLQotICAgIC8qIFNhdmUgcG9pbnRlciBvZiBzYXZpbmcgdmlkZW8gZWRpdG9yIHRvIHVzZSBpbiBzdGVwIGZ1bmN0aW9uICovCi0gICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyA9IHBFZGl0U2F2aW5nU2V0dGluZ3M7Ci0KLSAgICAvKiBDaGFuZ2Ugb3V0cHV0IGZpbGUgbmFtZSB0byB0ZW1wb3Jhcnkgb3V0cHV0IGZpbGUgbmFtZSwgYmVjYXVzZSBmaW5hbCBmaWxlIHdpbGwgYmUKLSAgICAgZ2VuZXJhdGVkIGJ5IGF1ZGlvIG1peGVyICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayAhPSBNNE9TQV9OVUxMICkKLSAgICB7Ci0KLSAgICAgICAgTTRPU0FfQ2hhciBvdXRfM2dwW000WFZTU19NQVhfUEFUSF9MRU5dOwotICAgICAgICBNNE9TQV9DaGFyIG91dF8zZ3BfdG1wW000WFZTU19NQVhfUEFUSF9MRU5dOwotCi0gICAgICAgIC8qKi8KLSAgICAgICAgcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPQotICAgICAgICAgICAgKE00eFZTU19CR01TZXR0aW5ncyAqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhzaXplb2YoTTR4VlNTX0JHTVNldHRpbmdzKSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyCi0gICAgICAgICAgICAqKSJTYXZpbmcgc2V0dGluZ3MsIGVmZmVjdHMgdGFibGUgb2Ygc3RydWN0dXJlIHNldHRpbmdzIik7Ci0KLSAgICAgICAgaWYoIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfU2F2ZVN0YXJ0Iik7Ci0KLSAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBKdXN0IGNvcHkgZWZmZWN0IHN0cnVjdHVyZSB0byBzYXZpbmcgc3RydWN0dXJlLCBhcyBlZmZlY3RzIHRpbWUgYXJlIG5vdyAqLwotICAgICAgICAvKiByZWxhdGl2ZSB0byBvdXRwdXQgY2xpcCB0aW1lKi8KLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2ssCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjaywKLSAgICAgICAgICAgIHNpemVvZihNNHhWU1NfQkdNU2V0dGluZ3MpKTsKLQotICAgICAgICAvKiBBbGxvY2F0ZSBmaWxlIG5hbWUsIGFuZCBjb3B5IGZpbGUgbmFtZSBidWZmZXIgdG8gb3VyIHN0cnVjdHVyZSAqLwotICAgICAgICBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAoc3RybGVuKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpCi0gICAgICAgICAgICArIDEpLAotICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIgKikiU2F2aW5nIHN0cnVjdCB4VlNTIEJHTSBmaWxlIHBhdGgiKTsKLQotICAgICAgICBpZiggcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID09IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAodm9pZCAqKXhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICBzdHJsZW4oeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSkKLSAgICAgICAgICAgICsgMSk7Ci0KLSAgICAgICAgLypDb3B5IEJHTSB0cmFjayBmaWxlIHBhdGgqLwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVURiBjb252ZXJzaW9uKi8KLSAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcgotICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUsCi0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICBlcnIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0KLSAgICAgICAgICAgIGZyZWUocEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgIHBFZGl0U2F2aW5nU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuZ3RoICsgMSwgTTRWUywgKE00T1NBX0NoYXIKLSAgICAgICAgICAgICAgICAqKSJNNHhWU1NfU2F2ZVN0YXJ0OiBUZW1wIGZpbGVuYW1lIGluIGNhc2Ugb2YgQkdNIik7Ci0KLSAgICAgICAgICAgIGlmKCBwRWRpdFNhdmluZ1NldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcEVkaXRTYXZpbmdTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKi8KLQotICAgICAgICBNNE9TQV9jaHJOQ29weShvdXRfM2dwLCB4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCwgTTRYVlNTX01BWF9QQVRIX0xFTiAtIDEpOwotICAgICAgICBNNE9TQV9jaHJOQ29weShvdXRfM2dwX3RtcCwgeFZTU19jb250ZXh0LT5wVGVtcFBhdGgsIE00WFZTU19NQVhfUEFUSF9MRU4gLSAxKTsKLQotICAgICAgICAvKiBDb25zdHJ1Y3Qgb3V0cHV0IHRlbXBvcmFyeSAzR1AgZmlsZW5hbWUgKi8KLSAgICAgICAgc3RybmNhdCgoY2hhciAqKW91dF8zZ3AsIChjb25zdCBjaGFyICopInNhdmV0ZW1wLjNncFwwIiwgMTMpOwotICAgICAgICBzdHJuY2F0KChjaGFyICopb3V0XzNncF90bXAsIChjb25zdCBjaGFyICopInNhdmV0ZW1wLnRtcFwwIiwgMTMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCwgYmVmb3JlIGJlaW5nIHVzZWQqLwotICAgICAgICBwRGVjb2RlZFBhdGggPSBvdXRfM2dwOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3AsIChNNE9TQV9Wb2lkICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1NhdmVTdGFydDogTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPQotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogRW5kIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgdXNlIHRoZSBjb252ZXJ0ZWQgZmlsZSBwYXRoKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPQotICAgICAgICAgICAgKE00T1NBX1ZvaWQgKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MobGVuZ3RoICsgMSwgTTRWUywKLSAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19TYXZlU3RhcnQ6IFRlbXAgZmlsZW5hbWUgaW4gY2FzZSBvZiBCR00iKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19TYXZlU3RhcnQiKTsKLQotICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoKHZvaWQgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSwKLSAgICAgICAgICAgICh2b2lkICopcERlY29kZWRQYXRoLCBsZW5ndGggKyAxKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlPdXRwdXRQYXRoU2l6ZSA9IGxlbmd0aCArIDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgIHBEZWNvZGVkUGF0aCA9IG91dF8zZ3BfdG1wOwotICAgICAgICBsZW5ndGggPSBzdHJsZW4ocERlY29kZWRQYXRoKTsKLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyCi0gICAgICAgICAgICAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKW91dF8zZ3BfdG1wLCAoTTRPU0FfVm9pZCAqKXhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgIk00eFZTU19TYXZlU3RhcnQ6IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgIGVycik7Ci0KLSAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlY29kZWRQYXRoID0KLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqIEVuZCBvZiB0aGUgVVRGIGNvbnZlcnNpb24sIHVzZSB0aGUgY29udmVydGVkIGZpbGUgcGF0aCovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0KLSAgICAgICAgICAgIChNNE9TQV9Wb2lkICopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGxlbmd0aCArIDEsIE00VlMsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfU2F2ZVN0YXJ0OiBUZW1wb3JhcnkgZmlsZSIpOwotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX1NhdmVTdGFydCIpOwotCi0gICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKXhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlLAotICAgICAgICAgICAgKHZvaWQgKilwRGVjb2RlZFBhdGgsIGxlbmd0aCArIDEpOwotCi0gICAgICAgIC8qIFB1dCBuYiBvZiBzdGVwIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nIHRvIDIsIGJlY2F1c2UgYXVkaW8gbWl4aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsID0gMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qIFB1dCBuYiBvZiBzdGVwIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nIHRvIDEsIGJlY2F1c2Ugbm8gYXVkaW8gbWl4aW5nIGlzIG5lZWRlZCAqLwotICAgICAgICB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsID0gMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAqKiovCi0KLSAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUoeFZTU19jb250ZXh0KTsKLQotICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICJNNHhWU1NfU2F2ZVN0YXJ0OiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUgcmV0dXJuZWQgYW4gZXJyb3I6IDB4JXgiLAotICAgICAgICAgICAgZXJyKTsKLQotICAgICAgICAvKiovCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPT0gTTRPU0FfTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+Ci0gICAgICAgICAgICAgICAgcE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPgotICAgICAgICAgICAgICAgIHBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cE91dHB1dEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgLyogVE9ETzogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFJlaW5pdGlhbGl6ZSBjdXJyZW50IHN0ZXAgbnVtYmVyIGZvciBwcm9ncmVzc2lvbiBtb25pdG9yaW5nICovCi0gICAgeFZTU19jb250ZXh0LT5jdXJyZW50U3RlcCA9IDA7Ci0KLSAgICAvKiBDaGFuZ2UgeFZTUyBzdGF0ZSAqLwotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVTYXZpbmc7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TYXZlU3RvcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHVuYWxsb2NhdGUgc2F2ZSByZXNzb3VyY2VzIGFuZCBjaGFuZ2UgeFZTUwotICogICAgICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbmNlIE00eFZTU19TdGVwIGhhcyByZXR1cm5lZAotICogICAgICAgICAgICAgICAgTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORQotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU2F2ZVN0b3AoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlU2F2aW5nICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1NhdmVTdG9wIGZ1bmN0aW9uISBTdGF0ZSBpcyAlZCIsCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogRnJlZSBzYXZpbmcgc3RydWN0dXJlcyAqLwotICAgIE00eFZTU19pbnRlcm5hbEZyZWVTYXZpbmcoeFZTU19jb250ZXh0KTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwgKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyogQ2hhbmdlIHhWU1Mgc3RhdGUgKi8KLSAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPSBNNHhWU1Nfa1N0YXRlU2F2ZWQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19TdGVwKE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1VJbnQ4ICpwUHJvZ3Jlc3MpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgZGlmZmVyZW50cyB0YXNrcywgZGVwZW5kaW5nIG9mIHhWU1MKLSAqICAgICAgICAgICAgICAgIGludGVybmFsIHN0YXRlLgotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb246Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBhbmFseXNlcyBlZGl0aW5nIHN0cnVjdHVyZSBpZiBjYWxsZWQgYWZ0ZXIgTTR4VlNTX1NlbmRDb21tYW5kCi0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgcHJldmlldyBmaWxlIGlmIGNhbGxlZCBhZnRlciBNNHhWU1NfUHJldmlld1N0YXJ0Ci0gKiAgICAgICAgICAgICAgICAgICAgLSBnZW5lcmF0ZXMgZmluYWwgZWRpdGVkIGZpbGUgaWYgY2FsbGVkIGFmdGVyIE00eFZTU19TYXZlU3RhcnQKLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcFByb2dyZXNzICAgICAgICAgICAgICAgICAgICAgICAgKElOL09VVCkgUG9pbnRlciBvbiBhbiBpbnRlZ2VyIGdpdmluZyBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgaW5kaWNhdGlvbiAoYmV0d2VlbiAwLTEwMCkKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICAgICAgICAgICAgICBObyBlcnJvciwgdGhlIHVzZXIgbXVzdCBjYWxsIE00eFZTU19TdGVwIGFnYWluCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9QUkVWSUVXX1JFQURZOiAgICBQcmV2aWV3IGZpbGUgaXMgZ2VuZXJhdGVkCi0gKiBAcmV0dXJuICAgIE00VlNTM0dQUF9XQVJfU0FWSU5HX0RPTkU6ICAgICAgICBGaW5hbCBlZGl0ZWQgZmlsZSBpcyBnZW5lcmF0ZWQKLSAqIEByZXR1cm4gICAgTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTogICAgQW5hbHlzZSBpcyBkb25lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfU3RlcCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVUludDggKnBQcm9ncmVzcyApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00VlNTM0dQUF9FZGl0Q29udGV4dCBwVnNzQ3R4dCA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dDsKLSAgICBNNFZTUzNHUFBfQXVkaW9NaXhpbmdDb250ZXh0IHBBdWRpb01peGluZ0N0eHQgPQotICAgICAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDggdWlQcm9ncmVzcyA9IDA7Ci0KLSAgICBzd2l0Y2goIHhWU1NfY29udGV4dC0+bV9zdGF0ZSApCi0gICAgewotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVTYXZpbmc6Ci0gICAgICAgIC8vY2FzZSBNNHhWU1Nfa1N0YXRlR2VuZXJhdGluZ1ByZXZpZXc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAKLSAgICAgICAgICAgICAgICAgICAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlRWRpdGluZyApIC8qIFZTUyAtPiBjcmVhdGluZyBlZmZlY3RzLCB0cmFuc2l0aW9ucyAuLi4gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQgKnBWU1NDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCAqKXBWc3NDdHh0OwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0U3RlcChwVnNzQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKSAmJiAoZXJyICE9IE00VlNTM0dQUF9XQVJfRURJVElOR19ET05FKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNNHhWU1NfU3RlcDogTTRWU1MzR1BQX2VkaXRTdGVwIHJldHVybmVkIDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSA/ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIFJDOiB0byBkZWxldGUgdW5lY2Vzc2FyeSB0ZW1wIGZpbGVzIG9uIHRoZSBmbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSBNNFZTUzNHUFBfV0FSX1NXSVRDSF9DTElQICkKLSAgICAgICAgICAgICAgICAgICAgewotI2lmbmRlZiBET19OT1RfUkVNT1ZFX1RFTVBfRklMRVMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHdlIGNhbiBkZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBzdGVwLCBjaGVjayB0aGUgdGVtcCBmaWxlIGlzIG5vdCB1c2Ugc29tZXdoZXJlIGVsc2UgYWZ0ZXIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBjbXBSZXN1bHQgPSAtMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IHBWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPCBwVlNTQ29udGV4dC0+dWlDbGlwTnVtYmVyOyBpKysgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwVlNTQ29udGV4dC0+cENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMV0uZmlsZVBhdGhTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHBWU1NDb250ZXh0LT5wQ2xpcExpc3RbaV0uZmlsZVBhdGhTaXplICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcFJlc3VsdCA9IG1lbWNtcCgodm9pZCAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgKHZvaWQgKilwVlNTQ29udGV4dC0+cENsaXBMaXN0W2ldLnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZTU0NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLmZpbGVQYXRoU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNtcFJlc3VsdCA9PSAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSXQgbWVhbnMgd2UgZm91bmQgYSBjb3JyZXNwb25kaW5nIGZpbGUsIHdlIGRvIG5vdCBkZWxldGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggY21wUmVzdWx0ICE9IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBDb252ZXJ0ZWRTaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9DaGFyICp0b3RvOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0NoYXIgKnBUbXBTdHI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb252ZXJ0IHJlc3VsdCBpbiBVVEY4IHRvIGNoZWNrIGlmIHdlIGNhbiBkZWxldGUgaXQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gTTRPU0FfTlVMTCAmJiB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCh4VlNTX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZSwgKE00T1NBX1ZvaWQgKil4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcE91dENvbnZlcnNpb25CdWZmZXIsICZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopeFZTU19jb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBUZW1wUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBTdHIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopcFZTU0NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBMaXN0W3BWU1NDb250ZXh0LT51aUN1cnJlbnRDbGlwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLnBGaWxlLCAoY29uc3QgY2hhciAqKXhWU1NfY29udGV4dC0+cFRlbXBQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRtcFN0ciA9IHBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtwVlNTQ29udGV4dC0+dWlDdXJyZW50Q2xpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxXS5wRmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdG90byAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzIHRlbXBvcmFyeSBmaWxlcyBjYW4gYmUgaW1nWFhYLjNncCBvciB2aWRYWFguM2dwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUbXBTdHIgKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJsZW4oKGNvbnN0IGNoYXIgKilwVG1wU3RyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxMCk7IC8qIEJlY2F1c2UgdGVtcG9yYXJ5IGZpbGVzIGhhdmUgYSBsZW5ndGggYXQgbW9zdCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90byA9IChNNE9TQV9DaGFyICopc3Ryc3RyKChjb25zdCBjaGFyICopcFRtcFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopImltZyIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0b3RvICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RvID0gKE00T1NBX0NoYXIgKilzdHJzdHIoKGNvbnN0IGNoYXIgKilwVG1wU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopInZpZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVycgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTROT19FUlJPUiApIC8qIEl0IG1lYW5zIHRoZSBmaWxlIGlzIGEgdGVtcG9yYXJ5IGZpbGUsIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gZGVsZXRlIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBWU1NDb250ZXh0LT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcExpc3RbcFZTU0NvbnRleHQtPnVpQ3VycmVudENsaXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDFdLnBGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotI2VuZGlmIC8qIERPX05PVF9SRU1PVkVfVEVNUF9GSUxFUyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSBNNFZTUzNHUFBfV0FSX0VESVRJTkdfRE9ORSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFA0TUUwMDAwMzI3NjogV2hlbiBhIHN0ZXAgaXMgY29tcGxldGUsIGluY3JlbWVudCBjdXJyZW50U3RlcCBhbmQgcmVzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgdW5sZXNzIHByb2dyZXNzIHdvdWxkIGJlIHdyb25nICovCi0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZSh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciAgYmxybnhwc3cjMjM0LS0tPiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsQ2xvc2VFZGl0ZWRGaWxlIHJldHVybmVkIGFuIGVycm9yOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyo8LS0tLSBGaXggZm9yICBibHJueHBzdyMyMzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuIEF1ZGlvIG1peGluZyBjb21wb25lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZSh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlIHJldHVybmVkIGFuIGVycm9yOiAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIFZTUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9TQVZJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5lZGl0aW5nU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZyApIC8qIEF1ZGlvIG1peGluZzogbWl4L3JlcGxhY2UgYXVkaW8gdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgd2l0aCBnaXZlbiBCR00gKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAocEF1ZGlvTWl4aW5nQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNFZTUzNHUFBfV0FSX0VORF9PRl9BVURJT19NSVhJTkcpICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk00VlNTM0dQUF9hdWRpb01peGluZ01haW46IE00VlNTM0dQUF9hdWRpb01peGluZ1N0ZXAgcmV0dXJuZWQgMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gTTRWU1MzR1BQX1dBUl9FTkRfT0ZfQVVESU9fTUlYSU5HICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5jdXJyZW50U3RlcCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogUDRNRTAwMDAzMjc2OiBXaGVuIGEgc3RlcCBpcyBjb21wbGV0ZSwgaW5jcmVtZW50IGN1cnJlbnRTdGVwIGFuZCByZXNldAotICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyB1bmxlc3MgcHJvZ3Jlc3Mgd291bGQgYmUgd3JvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSByZXR1cm5lZCBhbiBlcnJvcjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNFZTUzNHUFBfV0FSX1NBVklOR19ET05FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3N0ZXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQmFkIHN0YXRlIGluIHN0ZXAgZnVuY3Rpb24gISIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlQW5hbHl6aW5nOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rTWljcm9TdGF0ZUFuYWx5c2VQdG8zR1BQICkgLyogUHRvM0dQUCwgYW5hbHlzaW5nIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyA9PSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBUbzNHUFBwYXJhbXNMaXN0OyAvKiBDdXJyZW50IFB0bzNHUFAgUGFyYW1ldGVyIGlzIHRoZSBmaXJzdCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcyAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV4dDsgLyogQ3VycmVudCBQdG8zR1BQIFBhcmFtZXRlciBpcyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE00T1NBX05VTEwgKSAvKiBJdCBtZWFucyB0aGVyZSBpcyBubyBuZXh0IGltYWdlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBzdGVwIHRvIE1DUyBwaGFzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXplTUNTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmRfc3RlcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9PSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHl6ZU1DUzsgLyogQ2hhbmdlIEFuYWx5emluZyBtaWNybyBzdGF0ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1MgcGhhc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhpcyBmaWxlIGhhcyB0byBiZSBjb252ZXJ0ZWQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCwgd2UganVzdCByZXR1cm4gTTROT19FUlJPUiwgYW5kIGdvIHRvIG5leHQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPmlzQ3JlYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgPT0gTTRPU0FfRkFMU0UgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVuaW5nIFB0bzNHUFAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncCh4VlNTX2NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljdHVyZVRvM2dwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBlcnJvcjogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyA/IDogVHJhbnNsYXRlIGVycm9yIGNvZGUgb2YgVlNTIHRvIGFuIHhWU1MgZXJyb3IgY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQ29udmVydFB0bzNHUFA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVDb252ZXJ0UHRvM0dQUCApIC8qIFB0bzNHUFAsIGNvbnZlcnRpbmcgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00UFRPM0dQUF9TdGVwKHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHByb2dyZXNzIGJhciAqLwotICAgICAgICAgICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDYWxsQmFja0N0eHQtPm1fTmJJbWFnZSA+IDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0LT5tX0ltYWdlQ291bnRlciAqIDEwMCkgLyAoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0LT5tX05iSW1hZ2UgLTEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoICggZXJyICE9IE00Tk9fRVJST1IpICYmIChlcnIKLSAgICAgICAgICAgICAgICAgICAgICAgICE9ICgoTTRPU0FfVUludDMyKU00UFRPM0dQUF9XQVJfRU5EX09GX1BST0NFU1NJTkcpKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPIEJFIENIRUNLRUQgTk8gTEVBS1MgICEhISEhICovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTR4VlNTX1N0ZXA6IE00UFRPM0dQUF9TdGVwIHJldHVybmVkIDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBWU1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGVycgotICAgICAgICAgICAgICAgICAgICAgICAgPT0gKChNNE9TQV9VSW50MzIpTTRQVE8zR1BQX1dBUl9FTkRfT0ZfUFJPQ0VTU0lORykgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBQNE1FMDAwMDMyNzY6IFdoZW4gYSBzdGVwIGlzIGNvbXBsZXRlLCBpbmNyZW1lbnQgY3VycmVudFN0ZXAgYW5kIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyB1bmxlc3MgcHJvZ3Jlc3Mgd291bGQgYmUgd3JvbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpUHJvZ3Jlc3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2tNaWNyb1N0YXRlQW5hbHlzZVB0bzNHUFA7IC8qIFdlIGdvIGJhY2sgdG8gYW5hbHl6ZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbmV4dCBmaWxlIHRvIGNvbnZlcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJDICEhISEhISEhICovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+aXNDcmVhdGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUlVFOyAvKiBUbyBhdm9pZCByZWNvbnZlcnRpbmcgaXQgaWYgYW5vdGhlciBTZW5kQ29tbWFuZCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AoeFZTU19jb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qU1M6Ymxybnhwc3cjICAyMzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncCByZXR1cm5lZCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBWU1MgdG8gYW4geFZTUyBlcnJvciBjb2RlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09Ci0gICAgICAgICAgICAgICAgICAgIE00eFZTU19rTWljcm9TdGF0ZUFuYWx5emVNQ1MgKSAvKiBNQ1M6IGFuYWx5emluZyBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9PSBNNE9TQV9OVUxMIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPSB4VlNTX2NvbnRleHQtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNQ1NwYXJhbXNMaXN0OyAvKiBDdXJyZW50IE1DUyBQYXJhbWV0ZXIgaXMgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgdGhlIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zICE9IE00T1NBX05VTEwgXAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHQ7IC8qIEN1cnJlbnQgTUNTIFBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IG1lYW5zIHRoZXJlIGlzIG5vIG5leHQgaW1hZ2UgdG8gY29udmVydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsgLyogUmVpbml0IEFuYWx5emluZyBtaWNybyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rU3RhdGVPcGVuZWQ7IC8qIENoYW5nZSB4VlNTIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9zdGVwOyAvKiBFbmQgb2YgQW5hbHlzaXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPnBNQ1NwYXJhbXNMaXN0ID09IE00T1NBX05VTEwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsgLyogUmVpbml0IEFuYWx5emluZyBtaWNybyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5tX3N0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa1N0YXRlT3BlbmVkOyAvKiBDaGFuZ2UgeFZTUyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRWU1MzR1BQX1dBUl9BTkFMWVpJTkdfRE9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kX3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kIG9mIEFuYWx5c2lzICovCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGlzIGZpbGUgaGFzIHRvIGJlIHRyYW5zY29kZWQgb3Igbm90ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIElmIG5vdCwgd2UganVzdCByZXR1cm4gTTROT19FUlJPUiwgYW5kIGdvIHRvIG5leHQgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICBpZiggeFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+aXNDcmVhdGVkID09IE00T1NBX0ZBTFNFICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogT3BlbmluZyBNQ1MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiByb3RhdGlvbkRlZ3JlZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdGFydFRyYW5zY29kaW5nKHhWU1NfY29udGV4dCwgJnJvdGF0aW9uRGVncmVlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcgcmV0dXJuZWRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXggPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT52aWRlb2NsaXBudW1iZXI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXRzIGFyZSBkb25lIGluIHRoZSBNQ1MsIHNvIHdlIG5lZWQgdG8gcmVwbGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJlZ2luQ3V0VGltZSBhbmQgZW5kQ3V0VGltZSB0byBrZWVwIHRoZSBlbnRpcmUgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBDbGlwTGlzdFtpbmRleF0tPnVpQmVnaW5DdXRUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaW5kZXhdLT51aUVuZEN1dFRpbWUgPSAwOwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcgcmV0dXJuZWQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOyBNQ1MgY29udGV4dDogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVUcmFuc2NvZGVNQ1M7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldGFpbiByb3RhdGlvbiBpbmZvIG9mIHRyaW1tZWQgLyB0cmFuc2NvZGVkIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wQ2xpcExpc3RbaW5kZXhdLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpcFByb3BlcnRpZXMudmlkZW9Sb3RhdGlvbkRlZ3JlZXMgPSByb3RhdGlvbkRlZ3JlZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwCi0gICAgICAgICAgICAgICAgICAgID09IE00eFZTU19rTWljcm9TdGF0ZVRyYW5zY29kZU1DUyApCi0gICAgICAgICAgICAgICAgICAgIC8qIE1DUzogdHJhbnNjb2RpbmcgZmlsZSAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gTTRNQ1Nfc3RlcCh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCwgJnVpUHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgICAgICAvKlNTOmJscm54cHN3IyAgMjM0ICovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRNQ1NfRVJSX05PTU9SRV9TUEFDRSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NFUlJfTk9fTU9SRV9TUEFDRTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCAoIGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVyciAhPSBNNE1DU19XQVJfVFJBTlNDT0RJTkdfRE9ORSkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUTyBCRSBDSEVDS0VEIE5PIExFQUtTICAhISEhISAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19TdGVwOiBNNE1DU19zdGVwIHJldHVybmVkIDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gPyA6IFRyYW5zbGF0ZSBlcnJvciBjb2RlIG9mIE1DUyB0byBhbiB4VlNTIGVycm9yIGNvZGUgPyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBlcnIgPT0gTTRNQ1NfV0FSX1RSQU5TQ09ESU5HX0RPTkUgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmN1cnJlbnRTdGVwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBQNE1FMDAwMDMyNzY6IFdoZW4gYSBzdGVwIGlzIGNvbXBsZXRlLCBpbmNyZW1lbnQgY3VycmVudFN0ZXAgYW5kIHJlc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aVByb2dyZXNzIHVubGVzcyBwcm9ncmVzcyB3b3VsZCBiZSB3cm9uZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdWlQcm9ncmVzcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPmFuYWx5c2VTdGVwID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXplTUNTOyAvKiBXZSBnbyBiYWNrIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHl6ZSBwYXJhbWV0ZXJzIHRvIHNlZSBpZiB0aGVyZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIG5leHQgZmlsZSB0byB0cmFuc2NvZGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJDICEhISEhISEhISovCi0gICAgICAgICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5pc0NyZWF0ZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSVUU7IC8qIFRvIGF2b2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb252ZXJ0aW5nIGl0IGlmIGFub3RoZXIgU2VuZENvbW1hbmQgaXMgY2FsbGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZyByZXR1cm5lZCAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPID8gOiBUcmFuc2xhdGUgZXJyb3IgY29kZSBvZiBNQ1MgdG8gYW4geFZTUyBlcnJvciBjb2RlID8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJCYWQgbWljcm8gc3RhdGUgaW4gYW5hbHl6aW5nIHN0YXRlIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX1N0ZXAgZnVuY3Rpb24hIFN0YXRlIGlzICVkIiwKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX1NUQVRFOwotICAgIH0KLQotZW5kX3N0ZXA6Ci0gICAgLyogQ29tcHV0ZSBwcm9ncmVzc2lvbiAqLwotICAgIGlmKCB4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsICE9IDAgKQotICAgIHsKLSAgICAgICAgKnBQcm9ncmVzcyA9IChNNE9TQV9VSW50OCkoKCAoIHhWU1NfY29udGV4dC0+Y3VycmVudFN0ZXAgKiAxMDApIFwKLSAgICAgICAgICAgIC8gKHhWU1NfY29udGV4dC0+bmJTdGVwVG90YWwpKQotICAgICAgICAgICAgKyAodWlQcm9ncmVzcyAvICh4VlNTX2NvbnRleHQtPm5iU3RlcFRvdGFsKSkpOwotCi0gICAgICAgIGlmKCAqcFByb2dyZXNzID4gMTAwICkKLSAgICAgICAgewotICAgICAgICAgICAgKnBQcm9ncmVzcyA9IDEwMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcFByb2dyZXNzID0gMTAwOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfQ2xvc2VDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBjdXJyZW50IGVkaXRpbmcgcHJvZmlsZSwgdW5hbGxvY2F0ZQotICogICAgICAgICAgICAgICAgcmVzc291cmNlcyBhbmQgY2hhbmdlIHhWU1MgaW50ZXJuYWwgc3RhdGUuCi0gKiBAbm90ZSAgICAgICAgQWZ0ZXIgdGhpcyBmdW5jdGlvbiwgdGhlIHVzZXIgY2FuIGNhbGwgYSBuZXcgTTR4VlNTX1NlbmRDb21tYW5kCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX1NUQVRFOiAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW5ub3Qgbm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19DbG9zZUNvbW1hbmQoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgLyogRGVwZW5kaW5nIG9mIHRoZSBzdGF0ZSwgZGlmZmVyZW50cyB0aGluZ3MgaGF2ZSB0byBiZSBkb25lICovCi0gICAgc3dpdGNoKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgKQotICAgIHsKLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlT3BlbmVkOgotICAgICAgICAgICAgLyogTm90aGluZyB0byBkbyBoZXJlICovCi0gICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVTYXZpbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlRWRpdGluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoeFZTU19jb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiggZXJyICE9IE00Tk9fRVJST1IgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXggZm9yIGJscm54cHN3IzIzNC0tLS0+Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0Nsb3NlQ29tbWFuZDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUgcmV0dXJuZWQgYW4gZXJyb3I6IDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5lZGl0aW5nU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVBdWRpb01peGluZyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlKHhWU1NfY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciBibHJueHBzdyMyMzQtLS0tPiovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiggZXJyID09ICgoTTRPU0FfVUludDMyKU00RVJSX0ZJTEVfSU5WQUxJRF9QT1NJVElPTikgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE00eFZTU0VSUl9OT19NT1JFX1NQQUNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19DbG9zZUNvbW1hbmQ6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSByZXR1cm5lZCBhbiBlcnJvcjogMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiA8LS0tLUZpeCBmb3IgYmxybnhwc3cjMjM0Ki8KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKHhWU1NfY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgLyogV2UgZnJlZSB0aGlzIHBvaW50ZXIgb25seSBpZiBhIEJHTSB0cmFjayBpcyBwcmVzZW50LCBiZWNhdXNlIGluIHRoYXQgY2FzZSwKLSAgICAgICAgICAgICAgICB0aGlzIHBvaW50ZXIgb3ducyB0byB1cyAqLwotICAgICAgICAgICAgICAgIGlmKCB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCApIHsKLSAgICAgICAgICAgICAgICAgICAgLyppZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0qLwotICAgICAgICAgICAgICAgICAgICAvKmlmKE00T1NBX05VTEwgIT0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNHhWU1Nfa1N0YXRlU2F2ZWQ6Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00eFZTU19rU3RhdGVBbmFseXppbmc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPT0gTTR4VlNTX2tNaWNyb1N0YXRlQ29udmVydFB0bzNHUFAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBQdG8zR1BQIG1vZHVsZSAqLwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncCh4VlNTX2NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAvKiBGaXggZm9yIGJscm54cHN3IzIzNC0tLS0+Ki8KLSAgICAgICAgICAgICAgICAgICAgaWYoIGVyciAhPSBNNE5PX0VSUk9SICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVyciA9PSAoKE00T1NBX1VJbnQzMilNNEVSUl9GSUxFX0lOVkFMSURfUE9TSVRJT04pICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBNNHhWU1NFUlJfTk9fTU9SRV9TUEFDRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfU3RlcDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AgcmV0dXJuZWQgMHgleCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogPC0tLS0tRml4IGZvciBibHJueHBzdyMyMzQ+Ki8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggeFZTU19jb250ZXh0LT5hbmFseXNlU3RlcAotICAgICAgICAgICAgICAgICAgICA9PSBNNHhWU1Nfa01pY3JvU3RhdGVUcmFuc2NvZGVNQ1MgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRnJlZSBNQ1MgbW9kdWxlICovCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IE00TUNTX2Fib3J0KHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogRml4IGZvciBibHJueHBzdyMyMzQtLS0tPiovCi0gICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgIT0gTTROT19FUlJPUiApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlcnIgPT0gKChNNE9TQV9VSW50MzIpTTRFUlJfRklMRV9JTlZBTElEX1BPU0lUSU9OKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTRVJSX05PX01PUkVfU1BBQ0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX1N0ZXA6IE00TUNTX2Fib3J0IHJldHVybmVkIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmUgcmV0YWluaW5nIGVycm9yIGhlcmUgYW5kIHJldHVybmluZyBlcnJvciAgaW4gdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICBhcyB0byBhdmlvZCBtZW1vcnkgbGVhayovCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogPC0tLUZpeCBmb3IgYmxybnhwc3cjMjM0Ki8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoCi0gICAgICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX0Nsb3NlQ29tbWFuZCBmdW5jdGlvbiEgU3RhdGUgaXMgJWQiLAotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyogRnJlZSBTZW5kIGNvbW1hbmQgKi8KLSAgICBNNHhWU1NfZnJlZUNvbW1hbmQoeFZTU19jb250ZXh0KTsKLQotICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSA9IE00eFZTU19rU3RhdGVJbml0aWFsaXplZDsgLyogQ2hhbmdlIHhWU1Mgc3RhdGUgKi8KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfQ2xlYW5VcChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgYWxsIHhWU1MgcmVzc291cmNlcwotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgTTR4VlNTX0Nsb3NlQ29tbWFuZC4KLSAqCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHhWU1MgZWRpdCBjb250ZXh0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0NsZWFuVXAoIE00T1NBX0NvbnRleHQgcENvbnRleHQgKQotewotICAgIE00eFZTU19Db250ZXh0ICp4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQgKilwQ29udGV4dDsKLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX0NsZWFuVXA6ZW50ZXJpbmciKTsKLQotICAgIC8qIENoZWNrIHN0YXRlICovCi0gICAgaWYoIHhWU1NfY29udGV4dC0+bV9zdGF0ZSAhPSBNNHhWU1Nfa1N0YXRlSW5pdGlhbGl6ZWQgKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoXAotICAgICAgICAgICAgIkJhZCBzdGF0ZSB3aGVuIGNhbGxpbmcgTTR4VlNTX0NsZWFuVXAgZnVuY3Rpb24hIFN0YXRlIGlzICVkIixcCi0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPm1fc3RhdGUpOwotICAgICAgICByZXR1cm4gTTRFUlJfU1RBVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBVVEYgY29udmVyc2lvbjogZnJlZSB0ZW1wb3JhcnkgYnVmZmVyKi8KLSAgICBpZiggeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIKLSAgICAgICAgIT0gTTRPU0FfTlVMTCApCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+Ci0gICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIpOwotICAgICAgICB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciA9Ci0gICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIGZyZWUoeFZTU19jb250ZXh0LT5wVGVtcFBhdGgpOwotICAgIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoID0gTTRPU0FfTlVMTDsKLQotICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MpOwotICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgIGZyZWUoeFZTU19jb250ZXh0KTsKLSAgICB4VlNTX2NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1RSQUNFM18wKCJNNHhWU1NfQ2xlYW5VcDpsZWF2aW5nICIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19HZXRWZXJzaW9uKE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbikKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBnZXQgdGhlIHZlcnNpb24gb2YgdGhlIFZpZGVvIFN0dWRpbyAyLjEKLSAqCi0gKiBAcGFyYW0gICAgcFZlcnNpb24gICAgICAgICAgICAoSU4pIFBvaW50ZXIgb24gdGhlIHZlcnNpb24gaW5mbyBzdHJ1Y3QKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0dldFZlcnNpb24oIE00X1ZlcnNpb25JbmZvICpwVmVyc2lvbiApCi17Ci0gICAgLyogSnVzdCB1c2VkIGZvciBhIGdyZXAgaW4gY29kZSAqLwotICAgIC8qIENIQU5HRV9WRVJTSU9OX0hFUkUgKi8KLSAgICBzdGF0aWMgY29uc3QgTTRPU0FfQ2hhciBjVmVyc2lvblsyNl0gPSAiTlhQU1dfVmlkZW9TdHVkaW8yMV8xXzNfMCI7Ci0KLSAgICBpZiggTTRPU0FfTlVMTCA9PSBwVmVyc2lvbiApCi0gICAgewotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBWZXJzaW9uLT5tX21ham9yID0gTTRfeFZTU19NQUpPUjsKLSAgICBwVmVyc2lvbi0+bV9taW5vciA9IE00X3hWU1NfTUlOT1I7Ci0gICAgcFZlcnNpb24tPm1fcmV2aXNpb24gPSBNNF94VlNTX1JFVklTSU9OOwotICAgIHBWZXJzaW9uLT5tX3N0cnVjdFNpemUgPSBzaXplb2YoTTRfVmVyc2lvbkluZm8pOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MoKQotICogQGJyaWVmICAgIEFsbG93cyBmaWxsaW5nIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcwotICoKLSAqIEBub3RlICAgIFdBUk5JTkc6IHBDbGlwU2V0dGluZ3MtPkVmZmVjdHNbIF0gd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqICAgICAgICAgICAgICAgICAgIHBDbGlwU2V0dGluZ3MtPnBGaWxlICAgICAgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5ncyAgICAgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgIHBGaWxlICAgICAgICAgICAgICAgKElOKSBDbGlwIGZpbGUgbmFtZQotICogQHBhcmFtICAgZmlsZVBhdGhTaXplICAgICAgICAoSU4pIFNpemUgb2YgdGhlIGNsaXAgcGF0aCAobmVlZGVkIGZvciB0aGUgVVRGMTYgY29udmVyc2lvbikKLSAqIEBwYXJhbSAgICBuYkVmZmVjdHMgICAgICAgICAgIChJTikgTmIgb2YgZWZmZWN0IHNldHRpbmdzIHRvIGFsbG9jYXRlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzKCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCAqcEZpbGUsIE00T1NBX1VJbnQzMiBmaWxlUGF0aFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDggbmJFZmZlY3RzICkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIE00T1NBX1RSQUNFM18xKCJNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzIGNhbGxlZCB3aXRoIHBDbGlwU2V0dGluZ3M9MHglcCIsCi0gICAgICAgIHBDbGlwU2V0dGluZ3MpOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3MgaXMgTlVMTCIpOwotCi0gICAgLyogQ3JlYXRlIGluaGVyaXRlZCBWU1MzR1BQIHN0dWZmICovCi0gICAgLyplcnIgPSBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyhwQ2xpcFNldHRpbmdzLCBwRmlsZSxuYkVmZmVjdHMpOyovCi0gICAgLypGQjogYWRkIGNsaXAgcGF0aCBzaXplIChuZWVkZWQgZm9yIFVURiAxNiBjb252ZXJzaW9uKSovCi0gICAgZXJyID0gTTRWU1MzR1BQX2VkaXRDcmVhdGVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5ncywgcEZpbGUsIGZpbGVQYXRoU2l6ZSwKLSAgICAgICAgbmJFZmZlY3RzKTsKLQotICAgIGlmKCBNNE5PX0VSUk9SICE9IGVyciApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0NyZWF0ZUNsaXBTZXR0aW5ncyA6XAotICAgICAgICAgICAgICAgICAgICAgICBFUlJPUiBpbiBNNFZTUzNHUFBfZWRpdENyZWF0ZUNsaXBTZXR0aW5ncyA9IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgY2xpcCBzZXR0aW5ncyB0byBkZWZhdWx0ICovCi0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy51aUJlZ2luQ3V0UGVyY2VudCA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy51aUVuZEN1dFBlcmNlbnQgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MudWlEdXJhdGlvbiA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5pc1Bhblpvb20gPSBNNE9TQV9GQUxTRTsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21Ub3BsZWZ0WGEgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MuUGFuWm9vbVRvcGxlZnRZYSA9IDA7Ci0gICAgcENsaXBTZXR0aW5ncy0+eFZTUy5QYW5ab29tVG9wbGVmdFhiID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21Ub3BsZWZ0WWIgPSAwOwotICAgIHBDbGlwU2V0dGluZ3MtPnhWU1MuUGFuWm9vbVhhID0gMDsKLSAgICBwQ2xpcFNldHRpbmdzLT54VlNTLlBhblpvb21YYiA9IDA7Ci0KLSAgICAvKioKLSAgICAqIFJldHVybiB3aXRoIG5vIGVycm9yICovCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19DcmVhdGVDbGlwU2V0dGluZ3MoKTogcmV0dXJuaW5nIE00Tk9fRVJST1IiKTsKLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBEdXBsaWNhdGVzIGEgY2xpcCBzZXR0aW5ncyBzdHJ1Y3R1cmUsIHBlcmZvcm1pbmcgYWxsb2NhdGlvbnMgaWYgcmVxdWlyZWQKLSAqCi0gKiBAcGFyYW0gICAgcENsaXBTZXR0aW5nc0Rlc3QgICAgKElOKSBQb2ludGVyIHRvIGEgdmFsaWQgTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAgICBwQ2xpcFNldHRpbmdzT3JpZyAgICAoSU4pIFBvaW50ZXIgdG8gYSB2YWxpZCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgYkNvcHlFZmZlY3RzICAgICAgICAoSU4pIEZsYWcgdG8ga25vdyBpZiB3ZSBoYXZlIHRvIGR1cGxpY2F0ZSBlZmZlY3RzCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzKCBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfQ2xpcFNldHRpbmdzICpwQ2xpcFNldHRpbmdzT3JpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Cb29sIGJDb3B5RWZmZWN0cyApCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9UUkFDRTNfMigKLSAgICAgICAgIk00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3MgY2FsbGVkIHdpdGggZGVzdD0weCVwIHNyYz0weCVwIiwKLSAgICAgICAgcENsaXBTZXR0aW5nc0Rlc3QsIHBDbGlwU2V0dGluZ3NPcmlnKTsKLQotICAgIC8qIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ2xpcFNldHRpbmdzRGVzdCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19EdXBsaWNhdGVDbGlwU2V0dGluZ3M6IHBDbGlwU2V0dGluZ3NEZXN0IGlzIE5VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5nc09yaWcpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfRHVwbGljYXRlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzT3JpZyBpcyBOVUxMIik7Ci0KLSAgICAvKiBDYWxsIGluaGVyaXRlZCBWU1MzR1BQIGR1cGxpY2F0aW9uICovCi0gICAgZXJyID0gTTRWU1MzR1BQX2VkaXREdXBsaWNhdGVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5nc0Rlc3QsCi0gICAgICAgIHBDbGlwU2V0dGluZ3NPcmlnLCBiQ29weUVmZmVjdHMpOwotCi0gICAgaWYoIE00Tk9fRVJST1IgIT0gZXJyICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfQ3JlYXRlQ2xpcFNldHRpbmdzIDpcCi0gICAgICAgICAgICAgICAgICAgICAgIEVSUk9SIGluIE00VlNTM0dQUF9lZGl0RHVwbGljYXRlQ2xpcFNldHRpbmdzID0gMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogUmV0dXJuIHdpdGggbm8gZXJyb3IgKi8KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX0R1cGxpY2F0ZUNsaXBTZXR0aW5ncygpOiByZXR1cm5pbmcgTTROT19FUlJPUiIpOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19GcmVlQ2xpcFNldHRpbmdzKCkKLSAqIEBicmllZiAgICBGcmVlIHRoZSBwb2ludGVycyBhbGxvY2F0ZWQgaW4gdGhlIENsaXBTZXR0aW5nIHN0cnVjdHVyZSAocEZpbGUsIEVmZmVjdHMsIC4uLikuCi0gKgotICogQHBhcmFtICAgIHBDbGlwU2V0dGluZ3MgICAgICAgIChJTikgUG9pbnRlciB0byBhIHZhbGlkIE00VlNTM0dQUF9DbGlwU2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBwQ2xpcFNldHRpbmdzIGlzIE00T1NBX05VTEwgKGRlYnVnIG9ubHkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyggTTRWU1MzR1BQX0NsaXBTZXR0aW5ncyAqcENsaXBTZXR0aW5ncyApCi17Ci0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENsaXBTZXR0aW5ncyksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19GcmVlQ2xpcFNldHRpbmdzOiBwQ2xpcFNldHRpbmdzIGlzIE5VTEwiKTsKLQotICAgIC8qIEZyZWUgaW5oZXJpdGVkIFZTUzNHUFAgc3R1ZmYgKi8KLSAgICBNNFZTUzNHUFBfZWRpdEZyZWVDbGlwU2V0dGluZ3MocENsaXBTZXR0aW5ncyk7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19nZXRNQ1NDb250ZXh0KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX0NvbnRleHQqIG1jc0NvbnRleHQpCi0gKiBAYnJpZWYgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgTUNTIGNvbnRleHQgd2l0aGluIHRoZSB4VlNTIGludGVybmFsIGNvbnRleHQKLSAqIEBub3RlICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgVlNTIHN0YXRlIGhhcyBtb3ZlZCB0byBhbmFseXppbmcgc3RhdGUgb3IKLSAqIGJleW9uZAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEBwYXJhbSAgICBtY3NDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgbWNzIGNvbnRleHQgdG8gcmV0dXJuCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9TVEFURTogICAgICAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IG5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfZ2V0TUNTQ29udGV4dCggTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0ICptY3NDb250ZXh0ICkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCAqeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0ICopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvKioKLSAgICAqICAgIENoZWNrIGlucHV0IHBhcmFtZXRlciAqLwotICAgIE00T1NBX0RFQlVHX0lGMigoTTRPU0FfTlVMTCA9PSBwQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIk00eFZTU19nZXRNQ1NDb250ZXh0OiBwQ29udGV4dCBpcyBOVUxMIik7Ci0KLSAgICBpZiggeFZTU19jb250ZXh0LT5tX3N0YXRlID09IE00eFZTU19rU3RhdGVJbml0aWFsaXplZCApCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2dldE1DU0NvbnRleHQ6IEJhZCBzdGF0ZSEgU3RhdGUgaXMgJWQiLFwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAqbWNzQ29udGV4dCA9IHhWU1NfY29udGV4dC0+cE1DU19DdHh0OwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19nZXRWU1MzR1BQQ29udGV4dChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0KiBtY3NDb250ZXh0KQotICogQGJyaWVmICAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFZTUzNHUFAgY29udGV4dCB3aXRoaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQG5vdGUgICAgICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBWU1Mgc3RhdGUgaGFzIG1vdmVkIHRvIEdlbmVyYXRpbmcgcHJldmlldwotICogICAgICAgICAgICAgIG9yIGJleW9uZAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHBhcmFtICAgIHZzczNncHBDb250ZXh0ICAgICAgICAoT1VUKSBQb2ludGVyIHRvIHBvaW50ZXIgb2YgdnNzM2dwcCBjb250ZXh0IHRvIHJldHVybgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiAgICBBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIE00T1NBX05VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfU1RBVEU6ICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBub3QgYmUgY2FsbGVkIGF0IHRoaXMgdGltZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZTUzNHUFBDb250ZXh0KCBNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Db250ZXh0ICp2c3MzZ3BwQ29udGV4dCApCi17Ci0gICAgTTR4VlNTX0NvbnRleHQgKnhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCAqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLyoqCi0gICAgKiAgICBDaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEwgPT0gcENvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQ6IHBDb250ZXh0IGlzIE5VTEwiKTsKLQotICAgIGlmKCB4VlNTX2NvbnRleHQtPm1fc3RhdGUgPCBNNHhWU1Nfa1N0YXRlU2F2aW5nICkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfZ2V0VlNTM0dQUENvbnRleHQ6IEJhZCBzdGF0ZSEgU3RhdGUgaXMgJWQiLFwKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+bV9zdGF0ZSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAqdnNzM2dwcENvbnRleHQgPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdENvbnRleHQ7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgTTR4VlNTX2dldFZpZGVvRGVjb2RlckNhcGFiaWxpdGllcyhNNERFQ09ERVJfVmlkZW9EZWNvZGVycyAqKmRlY29kZXJzKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICAvLyBDYWxsIHRoZSBkZWNvZGVyIGFwaSBkaXJlY3RseQotICAgIC8vIHRvIGdldCBhbGwgdGhlIHZpZGVvIGRlY29kZXIgY2FwYWJsaXRpZXMuCi0gICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0VmlkZW9EZWNvZGVyc0FuZENhcGFiaWxpdGllcyhkZWNvZGVycyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX2ludGVybmFsLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL000eFZTU19pbnRlcm5hbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NDk1OWVjLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTTR4VlNTX2ludGVybmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICBNNHhWU1NfaW50ZXJuYWwuYwotICogQGJyaWVmICAgIEludGVybmFsIGZ1bmN0aW9ucyBvZiBleHRlbmRlZCBWaWRlbyBTdHVkaW8gU2VydmljZSAoVmlkZW8gU3R1ZGlvIDIuMSkKLSAqIEBub3RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00T1NBX0NoYXJTdGFyLmgiCi0KLSNpbmNsdWRlICJOWFBTV19Db21waWxlclN3aXRjaGVzLmgiCi0KLSNpbmNsdWRlICJNNFZTUzNHUFBfQVBJLmgiCi0jaW5jbHVkZSAiTTRWU1MzR1BQX0Vycm9yQ29kZXMuaCIKLQotI2luY2x1ZGUgIk00eFZTU19BUEkuaCIKLSNpbmNsdWRlICJNNHhWU1NfSW50ZXJuYWwuaCIKLQotLypmb3IgcmdiMTYgY29sb3IgZWZmZWN0Ki8KLSNpbmNsdWRlICJNNFZJRklfRGVmaW5lcy5oIgotI2luY2x1ZGUgIk00VklGSV9DbGlwLmgiCi0KLS8qKgotICogY29tcG9uZW50IGluY2x1ZGVzICovCi0jaW5jbHVkZSAiTTRWRkxfdHJhbnNpdGlvbi5oIiAgICAgICAgICAgIC8qKjwgdmlkZW8gZWZmZWN0cyAqLwotCi0vKiBJbnRlcm5hbCBoZWFkZXIgZmlsZSBvZiBWU1MgaXMgaW5jbHVkZWQgYmVjYXVzZSBvZiBNTVMgdXNlIGNhc2UgKi8KLSNpbmNsdWRlICJNNFZTUzNHUFBfSW50ZXJuYWxUeXBlcy5oIgotCi0vKkV4aWYgaGVhZGVyIGZpbGVzIHRvIGFkZCBpbWFnZSByZW5kZXJpbmcgc3VwcG9ydCAoY3JvcHBpbmcsIGJsYWNrIGJvcmRlcnMpKi8KLSNpbmNsdWRlICJNNEVYSUZDX0NvbW1vbkFQSS5oIgotLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotI2RlZmluZSBUUkFOU1BBUkVOVF9DT0xPUiAweDdFMAotCi0vKiBQcm90b3R5cGUgb2YgTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAgZnVuY3Rpb24gKGF2b2lkIGdyZWVuIGVmZmVjdCBvZiB0cmFuc3BhcmVuY3kgY29sb3IpICovCi1NNFZJRklfVUludDggTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCk7Ci0KLQotLypzcGVjaWFsIE1DUyBmdW5jdGlvbiB1c2VkIG9ubHkgaW4gVmlkZW9BcnRpc3QgYW5kIFZpZGVvU3R1ZGlvIHRvIG9wZW4gdGhlIG1lZGlhIGluIHRoZSBub3JtYWwKLSBtb2RlLiBUaGF0IHdheSB0aGUgbWVkaWEgZHVyYXRpb24gaXMgYWNjdXJhdGUqLwotZXh0ZXJuIE00T1NBX0VSUiBNNE1DU19vcGVuX25vcm1hbE1vZGUoTTRNQ1NfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfRmlsZVR5cGUgSW5wdXRGaWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVPdXQsIE00T1NBX1ZvaWQqIHBUZW1wRmlsZSk7Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBNQ1MgKDNHUCB0cmFuc2NvZGVyKSB3aXRoIHRoZSBnaXZlbgotICogICAgICAgICAgICAgICAgcGFyYW1ldGVycwotICogQG5vdGUgICAgICAgIFRoZSB0cmFuc2NvZGluZyBwYXJhbWV0ZXJzIGFyZSBnaXZlbiBieSB0aGUgaW50ZXJuYWwgeFZTUyBjb250ZXh0LgotICogICAgICAgICAgICAgICAgVGhpcyBjb250ZXh0IGNvbnRhaW5zIGEgcG9pbnRlciBvbiB0aGUgY3VycmVudCBlbGVtZW50IG9mIHRoZQotICogICAgICAgICAgICAgICAgY2hhaW5lZCBsaXN0IG9mIE1DUyBwYXJhbWV0ZXJzLgotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAgICAgICAgIChJTikgUG9pbnRlciBvbiB0aGUgeFZTUyBlZGl0IGNvbnRleHQKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogICAgICAgIE1lbW9yeSBhbGxvY2F0aW9uIGhhcyBmYWlsZWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0VHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAqcm90YXRpb25EZWdyZWUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE1DU19Db250ZXh0IG1jc19jb250ZXh0OwotICAgIE00TUNTX091dHB1dFBhcmFtcyBQYXJhbXM7Ci0gICAgTTRNQ1NfRW5jb2RpbmdQYXJhbXMgUmF0ZXM7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0gICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgY2xpcFByb3BzOwotCi0gICAgZXJyID0gTTRNQ1NfaW5pdCgmbWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX2luaXQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX29wZW4obWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlSW4sCi0gICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5JbnB1dEZpbGVUeXBlLAotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlT3V0LAotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX29wZW46IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgY2xpcCBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgZXJyID0gTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhtY3NfY29udGV4dCwgJmNsaXBQcm9wcyk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICAqcm90YXRpb25EZWdyZWUgPSBjbGlwUHJvcHMudmlkZW9Sb3RhdGlvbkRlZ3JlZXM7Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsIE1DUyBwYXJhbWV0ZXJzIHdpdGggdGhlIHBhcmFtZXRlcnMgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IGVsZW1lbnQgb2YgdGhlCi0gICAgICAgTUNTIHBhcmFtZXRlcnMgY2hhaW5lZCBsaXN0ICovCi0gICAgUGFyYW1zLk91dHB1dEZpbGVUeXBlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0RmlsZVR5cGU7Ci0gICAgUGFyYW1zLk91dHB1dFZpZGVvRm9ybWF0ID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9Gb3JtYXQ7Ci0gICAgUGFyYW1zLm91dHB1dFZpZGVvUHJvZmlsZT0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+b3V0cHV0VmlkZW9Qcm9maWxlOwotICAgIFBhcmFtcy5vdXRwdXRWaWRlb0xldmVsID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+b3V0cHV0VmlkZW9MZXZlbDsKLSAgICBQYXJhbXMuT3V0cHV0VmlkZW9GcmFtZVNpemUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lU2l6ZTsKLSAgICBQYXJhbXMuT3V0cHV0VmlkZW9GcmFtZVJhdGUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRWaWRlb0ZyYW1lUmF0ZTsKLSAgICBQYXJhbXMuT3V0cHV0QXVkaW9Gb3JtYXQgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICBQYXJhbXMuT3V0cHV0QXVkaW9TYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5PdXRwdXRBdWRpb1NhbXBsaW5nRnJlcXVlbmN5OwotICAgIFBhcmFtcy5iQXVkaW9Nb25vID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+YkF1ZGlvTW9ubzsKLSAgICBQYXJhbXMucE91dHB1dFBDTWZpbGUgPSBNNE9TQV9OVUxMOwotICAgIC8qRkIgMjAwOC8xMC8yMDogYWRkIG1lZGlhIHJlbmRlcmluZyBwYXJhbWV0ZXIgdG8ga2VlcCBhc3BlY3QgcmF0aW8qLwotICAgIHN3aXRjaCh4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5NZWRpYVJlbmRlcmluZykKLSAgICB7Ci0gICAgY2FzZSBNNHhWU1Nfa1Jlc2l6aW5nOgotICAgICAgICBQYXJhbXMuTWVkaWFSZW5kZXJpbmcgPSBNNE1DU19rUmVzaXppbmc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTR4VlNTX2tDcm9wcGluZzoKLSAgICAgICAgUGFyYW1zLk1lZGlhUmVuZGVyaW5nID0gTTRNQ1Nfa0Nyb3BwaW5nOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00eFZTU19rQmxhY2tCb3JkZXJzOgotICAgICAgICBQYXJhbXMuTWVkaWFSZW5kZXJpbmcgPSBNNE1DU19rQmxhY2tCb3JkZXJzOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgLyoqLwotICAgIC8vIG5ldyBwYXJhbXMgYWZ0ZXIgaW50ZWdyYXRpbmcgTUNTIDIuMAotICAgIC8vIFNldCB0aGUgbnVtYmVyIG9mIGF1ZGlvIGVmZmVjdHM7IDAgZm9yIG5vdy4KLSAgICBQYXJhbXMubmJFZmZlY3RzID0gMDsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gZWZmZWN0OyBudWxsIGZvciBub3cuCi0gICAgUGFyYW1zLnBFZmZlY3RzID0gTlVMTDsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gZWZmZWN0OyBudWxsIGZvciBub3cuCi0gICAgUGFyYW1zLmJEaXNjYXJkRXhpZiA9IE00T1NBX0ZBTFNFOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyBlZmZlY3Q7IG51bGwgZm9yIG5vdy4KLSAgICBQYXJhbXMuYkFkanVzdE9yaWVudGF0aW9uID0gTTRPU0FfRkFMU0U7Ci0gICAgLy8gbmV3IHBhcmFtcyBhZnRlciBpbnRlZ3JhdGluZyBNQ1MgMi4wCi0KLSAgICAvKioKLSAgICAgKiBTZXQgb3V0cHV0IHBhcmFtZXRlcnMgKi8KLSAgICBlcnIgPSBNNE1DU19zZXRPdXRwdXRQYXJhbXMobWNzX2NvbnRleHQsICZQYXJhbXMpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19zZXRPdXRwdXRQYXJhbXM6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgUmF0ZXMuT3V0cHV0VmlkZW9CaXRyYXRlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIFJhdGVzLk91dHB1dEF1ZGlvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMtPk91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBSYXRlcy5CZWdpbkN1dFRpbWUgPSAwOwotICAgIFJhdGVzLkVuZEN1dFRpbWUgPSAwOwotICAgIFJhdGVzLk91dHB1dEZpbGVTaXplID0gMDsKLQotICAgIC8qRkI6IHRyYW5zY29kaW5nIHBlciBwYXJ0cyovCi0gICAgUmF0ZXMuQmVnaW5DdXRUaW1lID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+QmVnaW5DdXRUaW1lOwotICAgIFJhdGVzLkVuZEN1dFRpbWUgPSB4VlNTX2NvbnRleHQtPnBNQ1NjdXJyZW50UGFyYW1zLT5FbmRDdXRUaW1lOwotICAgIFJhdGVzLk91dHB1dFZpZGVvVGltZXNjYWxlID0geFZTU19jb250ZXh0LT5wTUNTY3VycmVudFBhcmFtcy0+T3V0cHV0VmlkZW9UaW1lc2NhbGU7Ci0KLSAgICBlcnIgPSBNNE1DU19zZXRFbmNvZGluZ1BhcmFtcyhtY3NfY29udGV4dCwgJlJhdGVzKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiRXJyb3IgaW4gTTRNQ1Nfc2V0RW5jb2RpbmdQYXJhbXM6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRNQ1NfY2hlY2tQYXJhbXNBbmRTdGFydChtY3NfY29udGV4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIkVycm9yIGluIE00TUNTX2NoZWNrUGFyYW1zQW5kU3RhcnQ6IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2F2ZSBNQ1MgY29udGV4dCB0byBiZSBhYmxlIHRvIGNhbGwgTUNTIHN0ZXAgZnVuY3Rpb24gaW4gTTR4VlNTX3N0ZXAgZnVuY3Rpb24gKi8KLSAgICB4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCA9IG1jc19jb250ZXh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdG9wVHJhbnNjb2RpbmcoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICAgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgTUNTICgzR1AgdHJhbnNjb2RlcikKLSAqIEBub3RlCi0gKgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSBQb2ludGVyIG9uIHRoZSB4VlNTIGVkaXQgY29udGV4dAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogICAgQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBNNE9TQV9OVUxMCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiAgICAgICAgTWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIGVyciA9IE00TUNTX2Nsb3NlKHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RvcFRyYW5zY29kaW5nOiBFcnJvciBpbiBNNE1DU19jbG9zZTogMHgleCIsIGVycik7Ci0gICAgICAgIE00TUNTX2Fib3J0KHhWU1NfY29udGV4dC0+cE1DU19DdHh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRoaXMgTUNTIGluc3RhbmNlICovCi0gICAgZXJyID0gTTRNQ1NfY2xlYW5VcCh4VlNTX2NvbnRleHQtPnBNQ1NfQ3R4dCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbFN0b3BUcmFuc2NvZGluZzogRXJyb3IgaW4gTTRNQ1NfY2xlYW5VcDogMHgleCIsIGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgeFZTU19jb250ZXh0LT5wTUNTX0N0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX0ZpbGVSZWFkUG9pbnRlciogcEZpbGVSZWFkUHRyLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSogcEltYWdlUGxhbmVzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHdpZHRoLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgaGVpZ2h0KTsKLSAqIEBicmllZiAgICBJdCBDb3ZlcnRzIGFuZCByZXNpemVzIGEgQVJHQjg4ODggaW1hZ2UgdG8gWVVWNDIwCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGaWxlSW4gICAgICAgICAgICAoSU4pIFRoZSBJbWFnZSBpbnB1dCBmaWxlCi0gKiBAcGFyYW0gICAgcEZpbGVSZWFkUHRyICAgIChJTikgUG9pbnRlciBvbiBmaWxlc3lzdGVtIGZ1bmN0aW9ucwotICogQHBhcmFtICAgIHBJbWFnZVBsYW5lcyAgICAoSU4vT1VUKSBQb2ludGVyIG9uIFlVVjQyMCBvdXRwdXQgcGxhbmVzIGFsbG9jYXRlZCBieSB0aGUgdXNlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJHQjg4ODggaW1hZ2UgIHdpbGwgYmUgY29udmVydGVkIGFuZCByZXNpemVkICB0byBvdXRwdXQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotICpAcGFyYW0gICAgd2lkdGggICAgICAgIChJTikgd2lkdGggb2YgdGhlIEFSR0I4ODg4Ci0gKkBwYXJhbSAgICBoZWlnaHQgICAgICAgICAgICAoSU4pIGhlaWdodCBvZiB0aGUgQVJHQjg4ODgKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IG1lbW9yeSBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwKE00T1NBX1ZvaWQqIHBGaWxlSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRmlsZVJlYWRQb2ludGVyKiBwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkKLXsKLSAgICBNNE9TQV9Db250ZXh0IHBBUkdCSW47Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcmdiUGxhbmUxICxyZ2JQbGFuZTI7Ci0gICAgTTRPU0FfVUludDMyIGZyYW1lU2l6ZV9hcmdiPSh3aWR0aCAqIGhlaWdodCAqIDQpOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKTsgLy9TaXplIG9mIFJHQjg4OCBkYXRhLgotICAgIE00T1NBX1VJbnQzMiBpID0gMCxqPSAwOwotICAgIE00T1NBX0VSUiBlcnI9TTROT19FUlJPUjsKLQotCi0gICAgTTRPU0FfVUludDggKnBUbXBEYXRhID0gKE00T1NBX1VJbnQ4KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZV9hcmdiLAotICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJJbWFnZSBhcmdiIGRhdGEiKTsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIEVudGVyaW5nIDoiKTsKLSAgICBpZihwVG1wRGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6XAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIDp3aWR0aCBhbmQgaGVpZ2h0ICVkICVkIiwKLSAgICAgICAgd2lkdGggLGhlaWdodCk7Ci0gICAgLyogR2V0IGZpbGUgc2l6ZSAobWFuZGF0b3J5IGZvciBjaHVuayBkZWNvZGluZykgKi8KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPm9wZW5SZWFkKCZwQVJHQkluLCBwRmlsZUluLCBNNE9TQV9rRmlsZVJlYWQpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIDpcCi0gICAgICAgICAgICBDYW4ndCBvcGVuIGlucHV0IEFSR0I4ODg4IGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICBlcnIgPSBwRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBUbXBEYXRhLCAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIENhbid0IGNsb3NlIEFSR0I4ODg4XAotICAgICAgICAgICAgIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIHBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotCi0gICAgZXJyID0gcEZpbGVSZWFkUHRyLT5jbG9zZVJlYWQocEFSR0JJbik7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgQ2FuJ3QgY2xvc2UgQVJHQjg4ODggXAotICAgICAgICAgICAgIGZpbGUgJXMsIGVycm9yOiAweCV4XG4iLHBGaWxlSW4sIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICB9Ci0KLSAgICByZ2JQbGFuZTEucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIqKSJJbWFnZSBjbGlwIFJHQjg4OCBkYXRhIik7Ci0gICAgaWYocmdiUGxhbmUxLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAgXAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICAgICByZ2JQbGFuZTEudV9oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHJnYlBsYW5lMS51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIHJnYlBsYW5lMS51X3N0cmlkZSA9IHdpZHRoKjM7Ci0gICAgICAgIHJnYlBsYW5lMS51X3RvcGxlZnQgPSAwOwotCi0KLSAgICAvKiogUmVtb3ZlIHRoZSBhbHBoYSBjaGFubmVsICovCi0gICAgZm9yIChpPTAsIGogPSAwOyBpIDwgZnJhbWVTaXplX2FyZ2I7IGkrKykgewotICAgICAgICBpZiAoKGkgJSA0KSA9PSAwKSBjb250aW51ZTsKLSAgICAgICAgcmdiUGxhbmUxLnBhY19kYXRhW2pdID0gcFRtcERhdGFbaV07Ci0gICAgICAgIGorKzsKLSAgICB9Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotCi0gICAgLyogVG8gQ2hlY2sgaWYgcmVzaXppbmcgaXMgcmVxdWlyZWQgd2l0aCBjb2xvciBjb252ZXJzaW9uICovCi0gICAgaWYod2lkdGggIT0gcEltYWdlUGxhbmVzLT51X3dpZHRoIHx8IGhlaWdodCAhPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIFJlc2l6aW5nIDoiKTsKLSAgICAgICAgZnJhbWVTaXplID0gICggcEltYWdlUGxhbmVzLT51X3dpZHRoICogcEltYWdlUGxhbmVzLT51X2hlaWdodCAqIDMpOwotICAgICAgICByZ2JQbGFuZTIucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplLCBNNFZTLAotICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOwotICAgICAgICBpZihyZ2JQbGFuZTIucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEltYWdlIGNsaXAiKTsKLSAgICAgICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0gICAgICAgICAgICByZ2JQbGFuZTIudV9oZWlnaHQgPSAgcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgIHJnYlBsYW5lMi51X3dpZHRoID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgcmdiUGxhbmUyLnVfc3RyaWRlID0gcEltYWdlUGxhbmVzLT51X3dpZHRoKjM7Ci0gICAgICAgICAgICByZ2JQbGFuZTIudV90b3BsZWZ0ID0gMDsKLQotICAgICAgICAvKiBSZXNpemluZyBSR0I4ODggdG8gUkdCODg4ICovCi0gICAgICAgIGVyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsICZyZ2JQbGFuZTEsICZyZ2JQbGFuZTIpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJlc2l6ZSBSR0I4ODggdG8gUkdCODg4OiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTIucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZShyZ2JQbGFuZTEucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAvKkNvbnZlcnRpbmcgUmVzaXplZCBSR0I4ODggdG8gWVVWNDIwICovCi0gICAgICAgIGVyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCAmcmdiUGxhbmUyLCBwSW1hZ2VQbGFuZXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoImVycm9yIHdoZW4gY29udmVydGluZyBmcm9tIFJHQjg4OCB0byBZVVY6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMi5wYWNfZGF0YSk7Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJSR0IgdG8gWVVWIGRvbmUiKTsKLQotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBOTyAgUmVzaXppbmcgOiIpOwotICAgICAgICBlcnIgPSBNNFZJRklfUkdCODg4dG9ZVVY0MjAoTTRPU0FfTlVMTCwgJnJnYlBsYW5lMSwgcEltYWdlUGxhbmVzKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHJnYlBsYW5lMS5wYWNfZGF0YSk7Ci0KLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJSR0IgdG8gWVVWIGRvbmUiKTsKLSAgICB9Ci1jbGVhbnVwOgotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCBsZWF2aW5nIDoiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4ODh0b1lVVjQyMChNNE9TQV9Wb2lkKiBwRmlsZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB3aWR0aCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGhlaWdodCk7Ci0gKiBAYnJpZWYgICAgSXQgQ292ZXJ0cyBhIEFSR0I4ODg4IGltYWdlIHRvIFlVVjQyMAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRmlsZUluICAgICAgICAgICAgKElOKSBUaGUgSW1hZ2UgaW5wdXQgZmlsZQotICogQHBhcmFtICAgIHBGaWxlUmVhZFB0ciAgICAoSU4pIFBvaW50ZXIgb24gZmlsZXN5c3RlbSBmdW5jdGlvbnMKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMgICAgKElOL09VVCkgUG9pbnRlciBvbiBZVVY0MjAgb3V0cHV0IHBsYW5lcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSR0I4ODg4IGltYWdlICB3aWxsIGJlIGNvbnZlcnRlZCBhbmQgcmVzaXplZCAgdG8gb3V0cHV0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVY0MjAgcGxhbmUgc2l6ZQotICogQHBhcmFtICAgIHdpZHRoICAgICAgICAoSU4pIHdpZHRoIG9mIHRoZSBBUkdCODg4OAotICogQHBhcmFtICAgIGhlaWdodCAgICAgICAgICAgIChJTikgaGVpZ2h0IG9mIHRoZSBBUkdCODg4OAotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogbWVtb3J5IGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODg4dG9ZVVY0MjAoTTRPU0FfVm9pZCogcEZpbGVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9GaWxlUmVhZFBvaW50ZXIqIHBGaWxlUmVhZFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSoqIHBJbWFnZVBsYW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgd2lkdGgsTTRPU0FfVUludDMyIGhlaWdodCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqeXV2UGxhbmUgPSBNNE9TQV9OVUxMOwotCi0gICAgeXV2UGxhbmUgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICAgICAgICAgTTRWUywgKE00T1NBX0NoYXIqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IE91dHB1dCBwbGFuZSBZVVYiKTsKLSAgICBpZih5dXZQbGFuZSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCA6XAotICAgICAgICAgICAgRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIHl1dlBsYW5lWzBdLnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgIHl1dlBsYW5lWzBdLnVfd2lkdGggPSB3aWR0aDsKLSAgICB5dXZQbGFuZVswXS51X3N0cmlkZSA9IHdpZHRoOwotICAgIHl1dlBsYW5lWzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgeXV2UGxhbmVbMF0ucGFjX2RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoeXV2UGxhbmVbMF0udV9oZWlnaHQgXAotICAgICAgICAqIHl1dlBsYW5lWzBdLnVfd2lkdGggKiAxLjUsIE00VlMsIChNNE9TQV9DaGFyKikiaW1hZ2VDbGlwIFlVViBkYXRhIik7Ci0KLSAgICB5dXZQbGFuZVsxXS51X2hlaWdodCA9IHl1dlBsYW5lWzBdLnVfaGVpZ2h0ID4+MTsKLSAgICB5dXZQbGFuZVsxXS51X3dpZHRoID0geXV2UGxhbmVbMF0udV93aWR0aCA+PiAxOwotICAgIHl1dlBsYW5lWzFdLnVfc3RyaWRlID0geXV2UGxhbmVbMV0udV93aWR0aDsKLSAgICB5dXZQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgIHl1dlBsYW5lWzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopKHl1dlBsYW5lWzBdLnBhY19kYXRhICsgeXV2UGxhbmVbMF0udV9oZWlnaHQgXAotICAgICAgICAqIHl1dlBsYW5lWzBdLnVfd2lkdGgpOwotCi0gICAgeXV2UGxhbmVbMl0udV9oZWlnaHQgPSB5dXZQbGFuZVswXS51X2hlaWdodCA+PjE7Ci0gICAgeXV2UGxhbmVbMl0udV93aWR0aCA9IHl1dlBsYW5lWzBdLnVfd2lkdGggPj4gMTsKLSAgICB5dXZQbGFuZVsyXS51X3N0cmlkZSA9IHl1dlBsYW5lWzJdLnVfd2lkdGg7Ci0gICAgeXV2UGxhbmVbMl0udV90b3BsZWZ0ID0gMDsKLSAgICB5dXZQbGFuZVsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKSh5dXZQbGFuZVsxXS5wYWNfZGF0YSArIHl1dlBsYW5lWzFdLnVfaGVpZ2h0IFwKLSAgICAgICAgKiB5dXZQbGFuZVsxXS51X3dpZHRoKTsKLSAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QW5kUmVzaXplQVJHQjg4ODh0b1lVVjQyMCggcEZpbGVJbixwRmlsZVJlYWRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2UGxhbmUsIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBbmRSZXNpemVBUkdCODg4OHRvWVVWNDIwIHJldHVybiBlcnJvcjogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgZnJlZSh5dXZQbGFuZSk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgICAgICpwSW1hZ2VQbGFuZXMgPSB5dXZQbGFuZTsKLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4ODh0b1lVVjQyMCA6TGVhdmluZyIpOwotICAgIHJldHVybiBlcnI7Ci0KLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdCAoTTRPU0FfVm9pZCogcFBpY3R1cmVDdHh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHBJbWFnZVBsYW5lcywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcFBpY3R1cmVEdXJhdGlvbik7Ci0gKiBAYnJpZWYgICAgSXQgZmVlZHMgdGhlIFBUTzNHUFAgd2l0aCBZVVY0MjAgcGljdHVyZXMuCi0gKiBAbm90ZSAgICBUaGlzIGZ1bmN0aW9uIGlzIGdpdmVuIHRvIHRoZSBQVE8zR1BQIGluIHRoZSBNNFBUTzNHUFBfUGFyYW1zIHN0cnVjdHVyZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwSW1hZ2VQbGFuZXMoSU4vT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcwotICogQHBhcmFtICAgIHBQaWN0dXJlRHVyYXRpb24oT1VUKSBEdXJhdGlvbiBvZiB0aGUgcmV0dXJuZWQgcGljdHVyZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU6IFRoZSByZXR1cm5lZCBpbWFnZSBpcyB0aGUgbGFzdCBvbmUKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdChNNE9TQV9Wb2lkKiBwUGljdHVyZUN0eHQsIE00VklGSV9JbWFnZVBsYW5lKiBwSW1hZ2VQbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfRG91YmxlKiBwUGljdHVyZUR1cmF0aW9uKQotewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQ4ICAgIGxhc3RfZnJhbWVfZmxhZyA9IDA7Ci0gICAgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQqIHBDID0gKE00eFZTU19QaWN0dXJlQ2FsbGJhY2tDdHh0KikgKHBQaWN0dXJlQ3R4dCk7Ci0KLSAgICAvKlVzZWQgZm9yIHBhbiZ6b29tKi8KLSAgICBNNE9TQV9VSW50OCB0ZW1wUGFuem9vbVhhID0gMDsKLSAgICBNNE9TQV9VSW50OCB0ZW1wUGFuem9vbVhiID0gMDsKLSAgICBNNEFJUl9QYXJhbXMgUGFyYW1zOwotICAgIC8qKi8KLQotICAgIC8qVXNlZCBmb3IgY3JvcHBpbmcgYW5kIGJsYWNrIGJvcmRlcnMqLwotICAgIE00T1NBX0NvbnRleHQgICAgcFBpY3R1cmVDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9GaWxlUG9zaXRpb24gICAgcGljdHVyZVNpemUgPSAwIDsKLSAgICBNNE9TQV9VSW50OCogICAgcGljdHVyZUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgLy9NNEVYSUZDX0NvbnRleHQgcEV4aWZDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNEVYSUZDX0Jhc2ljVGFncyBwQmFzaWNUYWdzOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHBJbWFnZVBsYW5lczEgPSBwSW1hZ2VQbGFuZXNbMF07Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcEltYWdlUGxhbmVzMiA9IHBJbWFnZVBsYW5lc1sxXTsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSBwSW1hZ2VQbGFuZXMzID0gcEltYWdlUGxhbmVzWzJdOwotICAgIC8qKi8KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBQaWN0dXJlQ3R4dCksICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcFBpY3R1cmVDdHh0IGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBJbWFnZVBsYW5lcyksICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcEltYWdlUGxhbmVzIGlzIE00T1NBX05VTEwiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKE00T1NBX05VTEw9PXBQaWN0dXJlRHVyYXRpb24pLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdDogcFBpY3R1cmVEdXJhdGlvbiBpcyBNNE9TQV9OVUxMIik7Ci0gICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QgOkVudGVyaW5nIik7Ci0gICAgLypQUiBQNE1FMDAwMDMxODEgSW4gY2FzZSB0aGUgaW1hZ2UgbnVtYmVyIGlzIDAsIHBhbiZ6b29tIGNhbiBub3QgYmUgdXNlZCovCi0gICAgaWYoTTRPU0FfVFJVRSA9PSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tICYmIHBDLT5tX05iSW1hZ2UgPT0gMCkKLSAgICB7Ci0gICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20gPSBNNE9TQV9GQUxTRTsKLSAgICB9Ci0KLSAgICAvKklmIG5vIGNyb3BwaW5nL2JsYWNrIGJvcmRlcnMgb3IgcGFuJnpvb20sIGp1c3QgZGVjb2RlIGFuZCByZXNpemUgdGhlIHBpY3R1cmUqLwotICAgIGlmKHBDLT5tX21lZGlhUmVuZGVyaW5nID09IE00eFZTU19rUmVzaXppbmcgJiYgTTRPU0FfRkFMU0UgPT0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmlzUGFuWm9vbSkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IGFuZCByZXNpemUgaW5wdXQgQVJHQjg4ODggZmlsZSB0byBZVVY0MjAgKi8KLSAgICAgICAgLypUbyBzdXBwb3J0IEFSR0I4ODg4IDogKi8KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3QgMTogd2lkdGggYW5kIGhlZ2h0ICVkICVkIiwKLSAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCxwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEFuZFJlc2l6ZUFSR0I4ODg4dG9ZVVY0MjAocEMtPm1fRmlsZUluLAotICAgICAgICAgICAgIHBDLT5tX3BGaWxlUmVhZFB0ciwgcEltYWdlUGxhbmVzLHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCwKLSAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGRlY29kaW5nIEpQRUc6IDB4JXhcbiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qSW4gY2FzZSBvZiBjcm9wcGluZywgYmxhY2sgYm9yZGVycyBvciBwYW4mem9vbSwgY2FsbCB0aGUgRVhJRiByZWFkZXIgYW5kIHRoZSBBSVIqLwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21wdXRlcyByYXRpb3MgKi8KLSAgICAgICAgaWYocEMtPm1fcERlY29kZWRQbGFuZSA9PSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENvbnZlcnQgaW5wdXQgQVJHQjg4ODggZmlsZSB0byBZVVY0MjAgKi8KLSAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX1BpY3R1cmVDYWxsYmFja0ZjdCAyOiB3aWR0aCBhbmQgaGVnaHQgJWQgJWQiLAotICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT53aWR0aCxwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aGVpZ2h0KTsKLSAgICAgICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4OHRvWVVWNDIwKHBDLT5tX0ZpbGVJbiwgcEMtPm1fcEZpbGVSZWFkUHRyLAotICAgICAgICAgICAgICAgICYocEMtPm1fcERlY29kZWRQbGFuZSkscEMtPm1fcFB0bzNHUFBwYXJhbXMtPndpZHRoLHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5oZWlnaHQpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IEVycm9yIHdoZW4gZGVjb2RpbmcgSlBFRzogMHgleFxuIiwgZXJyKTsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wRGVjb2RlZFBsYW5lICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBZVVY0MjAgcGxhbmFyIGlzIHJldHVybmVkIGJ1dCBhbGxvY2F0aW9uIGlzIG1hZGUgb25seSBvbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29udGlnb3VzIHBsYW5lcyBpbiBtZW1vcnkpICovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZS0+cGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLypJbml0aWFsaXplIEFJUiBQYXJhbXMqLwotICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQ7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aDsKLSAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgUGFyYW1zLm1fYk91dHB1dFN0cmlwZSA9IE00T1NBX0ZBTFNFOwotICAgICAgICBQYXJhbXMubV9vdXRwdXRPcmllbnRhdGlvbiA9IE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ7Ci0KLSAgICAgICAgLypJbml0aWFsaXplIEV4aWYgcGFyYW1zIHN0cnVjdHVyZSovCi0gICAgICAgIHBCYXNpY1RhZ3Mub3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOwotCi0gICAgICAgIC8qKgotICAgICAgICBQYW4mem9vbSBwYXJhbXMqLwotICAgICAgICBpZihNNE9TQV9UUlVFID09IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qU2F2ZSByYXRpbyB2YWx1ZXMsIHRoZXkgY2FuIGJlIHJldXNlZCBpZiB0aGUgbmV3IHJhdGlvcyBhcmUgMCovCi0gICAgICAgICAgICB0ZW1wUGFuem9vbVhhID0gKE00T1NBX1VJbnQ4KXBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGE7Ci0gICAgICAgICAgICB0ZW1wUGFuem9vbVhiID0gKE00T1NBX1VJbnQ4KXBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGI7Ci0gICAgICAgICAgICAvKkNoZWNrIHRoYXQgdGhlIHJhdGlvIGlzIG5vdCAwKi8KLSAgICAgICAgICAgIC8qQ2hlY2sgKGEpIHBhcmFtZXRlcnMqLwotICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG1heFJhdGlvID0gMDsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA+PQotICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYSkKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpcyBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhICsgdGVtcFBhbnpvb21YYSA+IDEwMDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG92ZXJzaXplIGlzIG1heFJhdGlvKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1heFJhdGlvID0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgKyB0ZW1wUGFuem9vbVhhIC0gMTAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYSkKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaXMgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSArIHRlbXBQYW56b29tWGEgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdmVyc2l6ZSBpcyBtYXhSYXRpbyovCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSYXRpbyA9IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhICsgdGVtcFBhbnpvb21YYSAtIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypNb2RpZnkgdGhlIChhKSBwYXJhbWV0ZXJzOiovCi0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgPj0gbWF4UmF0aW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSAoYSkgdG9wbGVmdCBwYXJhbWV0ZXJzIGNhbiBiZSBtb3ZlZCB0byBrZWVwIHRoZSBzYW1lIGFyZWEgc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhIC09IG1heFJhdGlvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1vdmUgdGhlIChhKSB0b3BsZWZ0IHBhcmFtZXRlciB0byAwIGJ1dCB0aGUgcmF0aW8gd2lsbCBiZSBhbHNvIGZ1cnRoZXIKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgdG8gbWF0Y2ggdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID49IG1heFJhdGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgKGEpIHRvcGxlZnQgcGFyYW1ldGVycyBjYW4gYmUgbW92ZWQgdG8ga2VlcCB0aGUgc2FtZSBhcmVhIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSAtPSBtYXhSYXRpbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNb3ZlIHRoZSAoYSkgdG9wbGVmdCBwYXJhbWV0ZXIgdG8gMCBidXQgdGhlIHJhdGlvIHdpbGwgYmUgYWxzbyBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCB0byBtYXRjaCB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLypUaGUgbmV3IHJhdGlvIGlzIHRoZSBvcmlnaW5hbCBvbmUqLwotICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgPSB0ZW1wUGFuem9vbVhhOwotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgKyBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSA+IDEwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKkNoYW5nZSB0aGUgcmF0aW8gaWYgdGhlIGFyZWEgb2YgdGhlIHBpY3R1cmUgZGVmaW5lZCB3aXRoIChhKSBwYXJhbWV0ZXJzIGlzCi0gICAgICAgICAgICAgICAgICAgIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSA9IDEwMDAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYSArIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhID4gMTAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qQ2hhbmdlIHRoZSByYXRpbyBpZiB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGEpIHBhcmFtZXRlcnMgaXMKLSAgICAgICAgICAgICAgICAgICAgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhID0gMTAwMCAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qQ2hlY2sgKGIpIHBhcmFtZXRlcnMqLwotICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1VJbnQ4IG1heFJhdGlvID0gMDsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiA+PQotICAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSByYXRpbyBpcyAwLCB0aGF0IG1lYW5zIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYikKLSAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaXMgYmlnZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiArIHRlbXBQYW56b29tWGIgPiAxMDAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBvdmVyc2l6ZSBpcyBtYXhSYXRpbyovCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSYXRpbyA9IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiICsgdGVtcFBhbnpvb21YYiAtIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgcmF0aW8gaXMgMCwgdGhhdCBtZWFucyB0aGUgYXJlYSBvZiB0aGUgcGljdHVyZSBkZWZpbmVkIHdpdGggKGIpCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgKyB0ZW1wUGFuem9vbVhiID4gMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3ZlcnNpemUgaXMgbWF4UmF0aW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmF0aW8gPSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiArIHRlbXBQYW56b29tWGIgLSAxMDAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qTW9kaWZ5IHRoZSAoYikgcGFyYW1ldGVyczoqLwotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID49IG1heFJhdGlvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypUaGUgKGIpIHRvcGxlZnQgcGFyYW1ldGVycyBjYW4gYmUgbW92ZWQgdG8ga2VlcCB0aGUgc2FtZSBhcmVhIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYiAtPSBtYXhSYXRpbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypNb3ZlIHRoZSAoYikgdG9wbGVmdCBwYXJhbWV0ZXIgdG8gMCBidXQgdGhlIHJhdGlvIHdpbGwgYmUgYWxzbyBmdXJ0aGVyCi0gICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCB0byBtYXRjaCB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWIgPj0gbWF4UmF0aW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlRoZSAoYikgdG9wbGVmdCBwYXJhbWV0ZXJzIGNhbiBiZSBtb3ZlZCB0byBrZWVwIHRoZSBzYW1lIGFyZWEgc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliIC09IG1heFJhdGlvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKk1vdmUgdGhlIChiKSB0b3BsZWZ0IHBhcmFtZXRlciB0byAwIGJ1dCB0aGUgcmF0aW8gd2lsbCBiZSBhbHNvIGZ1cnRoZXIKLSAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgdG8gbWF0Y2ggdGhlIGltYWdlIHNpemUqLwotICAgICAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qVGhlIG5ldyByYXRpbyBpcyB0aGUgb3JpZ2luYWwgb25lKi8KLSAgICAgICAgICAgICAgICBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiID0gdGVtcFBhbnpvb21YYjsKLSAgICAgICAgICAgICAgICBpZihwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiICsgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGIgPiAxMDAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLypDaGFuZ2UgdGhlIHJhdGlvIGlmIHRoZSBhcmVhIG9mIHRoZSBwaWN0dXJlIGRlZmluZWQgd2l0aCAoYikgcGFyYW1ldGVycyBpcwotICAgICAgICAgICAgICAgICAgICBiaWdnZXIgdGhhbiB0aGUgaW1hZ2Ugc2l6ZSovCi0gICAgICAgICAgICAgICAgICAgIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgPSAxMDAwIC0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgKyBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYiA+IDEwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKkNoYW5nZSB0aGUgcmF0aW8gaWYgdGhlIGFyZWEgb2YgdGhlIHBpY3R1cmUgZGVmaW5lZCB3aXRoIChiKSBwYXJhbWV0ZXJzIGlzCi0gICAgICAgICAgICAgICAgICAgIGJpZ2dlciB0aGFuIHRoZSBpbWFnZSBzaXplKi8KLSAgICAgICAgICAgICAgICAgICAgcEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21YYiA9IDEwMDAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ29tcHV0ZXMgQUlSIHBhcmFtZXRlcnMgKi8KLS8qICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IChNNE9TQV9VSW50MzIpKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKgotICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiIFwKLSAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0gICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gKE00T1NBX1VJbnQzMikocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKgotICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFliXAotICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0KLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAoTTRPU0FfVUludDMyKShwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICoKLSAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0KLSAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID0gIChNNE9TQV9VSW50MzIpKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0ICoKLSAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgIChNNE9TQV9JbnQxNikoKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlKSkgLyAxMDA7Ci0gKi8KLSAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgdXNpbmcgcEMtPm1fTmJJbWFnZSB3ZSBoYXZlIHRvIHVzZSAocEMtPm1fTmJJbWFnZS0xKSBhcyBwQy0+bV9JbWFnZUNvdW50ZXIKLSAgICAgICAgICAgIC8vIHdpbGwgYmUgeC0xIG1heCBmb3IgeCBuby4gb2YgZnJhbWVzCi0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IChNNE9TQV9VSW50MzIpKCgoKE00T1NBX0RvdWJsZSlwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoICoKLSAgICAgICAgICAgICAgICAocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WGEgKwotICAgICAgICAgICAgICAgIChNNE9TQV9Eb3VibGUpKChNNE9TQV9Eb3VibGUpKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFhiXAotICAgICAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRYYSkgKgotICAgICAgICAgICAgICAgIHBDLT5tX0ltYWdlQ291bnRlcikgLyAoTTRPU0FfRG91YmxlKXBDLT5tX05iSW1hZ2UtMSkpIC8gMTAwMCkpOwotICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPQotICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgoKChNNE9TQV9Eb3VibGUpcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgKgotICAgICAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVRvcGxlZnRZYSArCi0gICAgICAgICAgICAgICAgKE00T1NBX0RvdWJsZSkoKE00T1NBX0RvdWJsZSkocEMtPm1fcFB0bzNHUFBwYXJhbXMtPlBhblpvb21Ub3BsZWZ0WWJcCi0gICAgICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tVG9wbGVmdFlhKSAqCi0gICAgICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZS0xKSkgLyAxMDAwKSk7Ci0KLSAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKCgoTTRPU0FfRG91YmxlKXBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKgotICAgICAgICAgICAgICAgIChwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhICsKLSAgICAgICAgICAgICAgICAoTTRPU0FfRG91YmxlKSgoTTRPU0FfRG91YmxlKShwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhiXAotICAgICAgICAgICAgICAgICAgICAgLSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+UGFuWm9vbVhhKSAqCi0gICAgICAgICAgICAgICAgcEMtPm1fSW1hZ2VDb3VudGVyKSAvIChNNE9TQV9Eb3VibGUpcEMtPm1fTmJJbWFnZS0xKSkgLyAxMDAwKSk7Ci0KLSAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9Ci0gICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKCgoKE00T1NBX0RvdWJsZSlwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqCi0gICAgICAgICAgICAgICAgKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEgKwotICAgICAgICAgICAgICAgIChNNE9TQV9Eb3VibGUpKChNNE9TQV9Eb3VibGUpKHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGIgXAotICAgICAgICAgICAgICAgICAgICAtIHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5QYW5ab29tWGEpICoKLSAgICAgICAgICAgICAgICBwQy0+bV9JbWFnZUNvdW50ZXIpIC8gKE00T1NBX0RvdWJsZSlwQy0+bV9OYkltYWdlLTEpKSAvIDEwMDApKTsKLQotICAgICAgICAgICAgaWYoKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoICsgUGFyYW1zLm1faW5wdXRDb29yZC5tX3gpXAotICAgICAgICAgICAgICAgICA+IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIFwKLSAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dENvb3JkLm1feDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCArIFBhcmFtcy5tX2lucHV0Q29vcmQubV95KVwKLSAgICAgICAgICAgICAgICAgPiBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRDb29yZC5tX3k7Ci0gICAgICAgICAgICB9Ci0KLQotCi0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgfQotCi0KLQotICAgIC8qKgotICAgICAgICBQaWN0dXJlIHJlbmRlcmluZzogQmxhY2sgYm9yZGVycyovCi0KLSAgICAgICAgaWYocEMtPm1fbWVkaWFSZW5kZXJpbmcgPT0gTTR4VlNTX2tCbGFja0JvcmRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBJbWFnZVBsYW5lc1swXS5wYWNfZGF0YSxZX1BMQU5FX0JPUkRFUl9WQUxVRSwKLSAgICAgICAgICAgICAgICAocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0KnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcEltYWdlUGxhbmVzWzFdLnBhY19kYXRhLFVfUExBTkVfQk9SREVSX1ZBTFVFLAotICAgICAgICAgICAgICAgIChwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHQqcEltYWdlUGxhbmVzWzFdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwSW1hZ2VQbGFuZXNbMl0ucGFjX2RhdGEsVl9QTEFORV9CT1JERVJfVkFMVUUsCi0gICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodCpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGUpKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICBGaXJzdCB3aXRob3V0IHBhbiZ6b29tKi8KLSAgICAgICAgICAgIGlmKE00T1NBX0ZBTFNFID09IHBDLT5tX3BQdG8zR1BQcGFyYW1zLT5pc1Bhblpvb20pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKHBCYXNpY1RhZ3Mub3JpZW50YXRpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOgotICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRPcmllbnRhdGlvbiA9IE00Q09NTU9OX2tPcmllbnRhdGlvblRvcExlZnQ7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wUmlnaHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21SaWdodDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbUxlZnQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmKChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpIDw9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPCBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyBoZWlnaHQgc28gYmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSB0b3AgYW5kIG9uIHRoZSBib3R0b20gc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qbnVtYmVyIG9mIGxpbmVzIGF0IHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0KT4+MSkpKnBJbWFnZVBsYW5lc1swXS51X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkqcEltYWdlUGxhbmVzWzFdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSpwSW1hZ2VQbGFuZXNbMl0udV9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyppdCBpcyB3aWR0aCBzbyBibGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzLT51X2hlaWdodCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMF0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzJdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpIDwgcEltYWdlUGxhbmVzLT51X2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPiBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKml0IGlzIGhlaWdodCBzbyBibGFjayBib3JkZXJzIHdpbGwgYmUgb24gdGhlIHRvcCBhbmQgb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJvdHRvbSBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm51bWJlciBvZiBsaW5lcyBhdCB0aGUgdG9wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkpPj4xKSpwSW1hZ2VQbGFuZXNbMF0udV9zdHJpZGUpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEltYWdlUGxhbmVzWzJdLnVfc3RyaWRlKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKml0IGlzIHdpZHRoIHNvIGJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzJdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpKSk+PjEpKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgIFNlY29uZGx5IHdpdGggcGFuJnpvb20qLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaChwQmFzaWNUYWdzLm9yaWVudGF0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVW5rbm93bjoKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0T3JpZW50YXRpb24gPSBNNENPTU1PTl9rT3JpZW50YXRpb25Ub3BMZWZ0OwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblRvcFJpZ2h0OgotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uQm90dG9tUmlnaHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgICAgICAgICAvKk5PIFJPVEFUSU9OKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0ICogcEltYWdlUGxhbmVzLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCkgPD0gcEltYWdlUGxhbmVzLT51X2hlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA8IFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIG91dHB1dCB2aWRlbyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gb3V0cHV0IGhlaWdodCBpZiB0aGUgaW5wdXQgaW1hZ2UgYXNwZWN0IHJhdGlvIGlzIGtlcHQgYW5kIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IHdpZHRoIGlzIHRoZSBzY3JlZW4gd2lkdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBPdXRwdXRTaXplSGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBJbWFnZVBsYW5lcy0+dV93aWR0aCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBJbnB1dFNpemVIZWlnaHRNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG91dHB1dCB3aWR0aCBpcyB0aGUgc2NyZWVuIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRTaXplSGVpZ2h0ID0gKHRlbXBPdXRwdXRTaXplSGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIGlucHV0IGhlaWdodCBhY2NvcmRpbmcgdG8gdGhlIG1heGltdW0gb3V0cHV0IGhlaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BvcnRpb25hbCB0byB0aGUgbWF4aW11bSBvdXRwdXQgaGVpZ2h0KSovCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHBJbWFnZVBsYW5lcy0+dV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkvdGVtcE91dHB1dFNpemVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHRlbXBJbnB1dFNpemVIZWlnaHRNYXg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IGhlaWdodCBpcyBjb250YWluZWQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGltYWdlIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgaGVpZ2h0IGlzIGNvbnRhaW5lZCBpbiB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIGhlaWdodCB3aWxsIGJlIHRoZSBtYXhpbXVtIHBvc3NpYmxlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV95Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZUhlaWdodE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3lcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIGlucHV0IHBhbiB6b29tIGFyZWEgY2FuIGJlIGV4dGVuZGVkIHN5bW1ldHJpY2FsbHkgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCBhbmQgYm90dG9tIHNpZGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSAtPSAoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihQYXJhbXMubV9pbnB1dENvb3JkLm1feSA8IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX2lucHV0Q29vcmQubV95ICsgUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBhYm92ZSB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBiZWxvdyB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSBib3R0b20qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGVtcElucHV0U2l6ZUhlaWdodE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgaGVpZ2h0IG9mIHRoZSBBSVIgaXMgdGhlIG1heGltdW0gcG9zc2libGUgaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgaGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgaGVpZ2h0IG9mIHRoZSBBSVIgaXMgYWxsIHRoZSBpbnB1dCBpbWFnZSBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVtcE91dHB1dFNpemVIZWlnaHQqcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpPj4xKSkqcEltYWdlUGxhbmVzWzBdLnVfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1sxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1syXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlIG9mIHRoZSBvdXRwdXQgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIG91dHB1dCB3aWR0aCBpZiB0aGUgaW5wdXQgaW1hZ2UgYXNwZWN0IHJhdGlvIGlzIGtlcHQgYW5kIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBoZWlnaHQgaXMgdGhlIHNjcmVlbiBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBPdXRwdXRTaXplV2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfVUludDMyKSgocEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcEltYWdlUGxhbmVzLT51X2hlaWdodCkgL3BDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0V2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3V0cHV0IGhlaWdodCBpcyB0aGUgc2NyZWVuIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBPdXRwdXRTaXplV2lkdGggPSAodGVtcE91dHB1dFNpemVXaWR0aD4+MSk8PDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qTWF4aW11bSBpbnB1dCB3aWR0aCBhY2NvcmRpbmcgdG8gdGhlIG1heGltdW0gb3V0cHV0IHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAocHJvcG9ydGlvbmFsIHRvIHRoZSBtYXhpbXVtIG91dHB1dCB3aWR0aCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV93aWR0aCpQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aClcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC90ZW1wT3V0cHV0U2l6ZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0gKHRlbXBJbnB1dFNpemVXaWR0aE1heD4+MSk8PDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQ2hlY2sgaWYgdGhlIG1heGltdW0gcG9zc2libGUgaW5wdXQgd2lkdGggaXMgY29udGFpbmVkIGludG8gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodGVtcElucHV0U2l6ZVdpZHRoTWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIHdpZHRoIHdpbGwgYmUgdGhlIG1heGltdW0gcG9zc2libGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj4xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV94Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoIC0oUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgcGFuIHpvb20gYXJlYSBjYW4gYmUgZXh0ZW5kZWQgc3ltbWV0cmljYWxseSBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCBhbmQgbGVmdCBzaWRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggLT0gKCh0ZW1wSW5wdXRTaXplV2lkdGhNYXhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0Q29vcmQubV94IDwgcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feCArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBhYm92ZSB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kIGl0IHN5bW1ldHJpY2FsbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIGV4dGVuZCBpdCB0byB0aGUgbWF4aW11bSBvbiB0aGUgbGVmdCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGVyZSBpcyBub3QgZW5vdWdoIHBsYWNlIGJlbG93IHRoZSBpbnB1dCBwYW4gem9vbSBhcmVhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSByaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRlbXBJbnB1dFNpemVXaWR0aE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSB0ZW1wSW5wdXRTaXplV2lkdGhNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBncmVhdGVyIHRoYW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Ugd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyBhbGwgdGhlIGlucHV0IGltYWdlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wT3V0cHV0U2l6ZVdpZHRoKnBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCk+PjEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzFdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aD4+MSkpKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkxlZnRCb3R0b206Ci0gICAgICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25SaWdodFRvcDoKLSAgICAgICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgICAgICAvKlJPVEFUSU9OKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgIC9wQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCkgPCBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID4gUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQmxhY2sgYm9yZGVycyB3aWxsIGJlIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlIG9mIHRoZSBvdXRwdXQgdmlkZW8qLwotICAgICAgICAgICAgICAgICAgICAgICAgLypNYXhpbXVtIG91dHB1dCBoZWlnaHQgaWYgdGhlIGlucHV0IGltYWdlIGFzcGVjdCByYXRpbyBpcyBrZXB0IGFuZCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG91dHB1dCBoZWlnaHQgaXMgdGhlIHNjcmVlbiB3aWR0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcE91dHB1dFNpemVIZWlnaHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMikoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggKiBwSW1hZ2VQbGFuZXMtPnVfd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBJbnB1dFNpemVIZWlnaHRNYXggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBGaW5hbElucHV0SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlIG91dHB1dCB3aWR0aCBpcyB0aGUgc2NyZWVuIGhlaWdodCovCi0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gcEltYWdlUGxhbmVzLT51X3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcE91dHB1dFNpemVIZWlnaHQgPSAodGVtcE91dHB1dFNpemVIZWlnaHQ+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gaW5wdXQgaGVpZ2h0IGFjY29yZGluZyB0byB0aGUgbWF4aW11bSBvdXRwdXQgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wb3J0aW9uYWwgdG8gdGhlIG1heGltdW0gb3V0cHV0IGhlaWdodCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcElucHV0U2l6ZUhlaWdodE1heCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQqUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvdGVtcE91dHB1dFNpemVIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4ID0gKHRlbXBJbnB1dFNpemVIZWlnaHRNYXg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKkNoZWNrIGlmIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IGhlaWdodCBpcyBjb250YWluZWQgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgaW1hZ2Ugd2lkdGggKHJvdGF0aW9uIGluY2x1ZGVkKSovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4IDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCBoZWlnaHQgaXMgY29udGFpbmVkIGluIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoIChyb3RhdGlvbiBpbmNsdWRlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBubyBibGFjayBib3JkZXJzLCB0aGUgaW5wdXQgcGFuIHpvb20gYXJlYSB3aWxsIGJlIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgaW5wdXQgQUlSIHdpZHRoIHdpbGwgYmUgdGhlIG1heGltdW0gcG9zc2libGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgodGVtcElucHV0U2l6ZUhlaWdodE1heCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+MSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBQYXJhbXMubV9pbnB1dENvb3JkLm1feAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHRlbXBJbnB1dFNpemVIZWlnaHRNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLShQYXJhbXMubV9pbnB1dENvb3JkLm1feCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCBwYW4gem9vbSBhcmVhIGNhbiBiZSBleHRlbmRlZCBzeW1tZXRyaWNhbGx5IG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgYW5kIGxlZnQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94IC09ICgodGVtcElucHV0U2l6ZUhlaWdodE1heCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPCBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKFBhcmFtcy5tX2lucHV0Q29vcmQubV94ICsgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGVyZSBpcyBub3QgZW5vdWdoIHBsYWNlIG9uIHRoZSBsZWZ0IG9mIHRoZSBpbnB1dCBwYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbSBhcmVhIHRvIGV4dGVuZCBpdCBzeW1tZXRyaWNhbGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBleHRlbmQgaXQgdG8gdGhlIG1heGltdW0gb24gdGhlIGxlZnQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBvbiB0aGUgcmlnaHQgb2YgdGhlIGlucHV0IHBhbiB6b29tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhIHRvIGV4dGVuZCBpdCBzeW1tZXRyaWNhbGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBleHRlbmQgaXQgdG8gdGhlIG1heGltdW0gb24gdGhlIHJpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLSB0ZW1wSW5wdXRTaXplSGVpZ2h0TWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCB3aWR0aCBvZiB0aGUgQUlSIGlzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHRlbXBJbnB1dFNpemVIZWlnaHRNYXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCBoZWlnaHQgaXMgZ3JlYXRlciB0aGFuIHRoZSBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHdpZHRoIChyb3RhdGlvbiBpbmNsdWRlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyBibGFjayBib3JkZXJzIGFyZSBuZWNlc3NhcnkgdG8ga2VlcCBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgaW5wdXQgd2lkdGggb2YgdGhlIEFJUiBpcyBhbGwgdGhlIGlucHV0IGltYWdlIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wT3V0cHV0U2l6ZUhlaWdodCpwQy0+bV9wRGVjb2RlZFBsYW5lLT51X3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV94ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzBdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1swXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGgpKT4+MSkqcEltYWdlUGxhbmVzWzBdLnVfc3RyaWRlKSsxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMV0udV9oZWlnaHRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKSkpPj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW1hZ2VQbGFuZXNbMV0udV9zdHJpZGUpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3RvcGxlZnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1syXS51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjEpKSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJbWFnZVBsYW5lc1syXS51X3N0cmlkZSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkJsYWNrIGJvcmRlcnMgd2lsbCBiZSBvbiB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIG91dHB1dCB2aWRlbyovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gb3V0cHV0IHdpZHRoIGlmIHRoZSBpbnB1dCBpbWFnZSBhc3BlY3QgcmF0aW8gaXMga2VwdCBhbmQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IHdpZHRoIGlzIHRoZSBzY3JlZW4gaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wT3V0cHV0U2l6ZVdpZHRoID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAqIHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvcEMtPm1fcERlY29kZWRQbGFuZS0+dV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcElucHV0U2l6ZVdpZHRoTWF4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB0ZW1wRmluYWxJbnB1dFdpZHRoID0gMCwgdGVtcEZpbmFsT3V0cHV0V2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgb3V0cHV0IGhlaWdodCBpcyB0aGUgc2NyZWVuIHdpZHRoKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0PSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0cHV0U2l6ZVdpZHRoID0gKHRlbXBPdXRwdXRTaXplV2lkdGg+PjEpPDwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKk1heGltdW0gaW5wdXQgd2lkdGggYWNjb3JkaW5nIHRvIHRoZSBtYXhpbXVtIG91dHB1dCB3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wb3J0aW9uYWwgdG8gdGhlIG1heGltdW0gb3V0cHV0IHdpZHRoKSovCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPQotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbWFnZVBsYW5lcy0+dV93aWR0aCpQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpL3RlbXBPdXRwdXRTaXplV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5wdXRTaXplV2lkdGhNYXggPSAodGVtcElucHV0U2l6ZVdpZHRoTWF4Pj4xKTw8MTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLypDaGVjayBpZiB0aGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW50byB0aGUgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBoZWlnaHQgKHJvdGF0aW9uIGluY2x1ZGVkKSovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0ZW1wSW5wdXRTaXplV2lkdGhNYXggPD0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgbWF4aW11bSBwb3NzaWJsZSBpbnB1dCB3aWR0aCBpcyBjb250YWluZWQgaW4gdGhlIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGhlaWdodCAocm90YXRpb24gaW5jbHVkZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgbm8gYmxhY2sgYm9yZGVycywgdGhlIGlucHV0IHBhbiB6b29tIGFyZWEgd2lsbCBiZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhlIGlucHV0IEFJUiBoZWlnaHQgd2lsbCBiZSB0aGUgbWF4aW11bSBwb3NzaWJsZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCh0ZW1wSW5wdXRTaXplV2lkdGhNYXggLSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpPj4xKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IFBhcmFtcy5tX2lucHV0Q29vcmQubV95Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypUaGUgaW5wdXQgcGFuIHpvb20gYXJlYSBjYW4gYmUgZXh0ZW5kZWQgc3ltbWV0cmljYWxseSBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmlnaHQgYW5kIGxlZnQgc2lkZSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95IC09ICgodGVtcElucHV0U2l6ZVdpZHRoTWF4IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KT4+MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgPCBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9pbnB1dENvb3JkLm1feSArIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZXJlIGlzIG5vdCBlbm91Z2ggcGxhY2Ugb24gdGhlIHRvcCBvZiB0aGUgaW5wdXQgcGFuIHpvb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYSB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSB0b3AqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVGhlcmUgaXMgbm90IGVub3VnaCBwbGFjZSBvbiB0aGUgYm90dG9tIG9mIHRoZSBpbnB1dCBwYW4gem9vbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYSB0byBleHRlbmQgaXQgc3ltbWV0cmljYWxseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZXh0ZW5kIGl0IHRvIHRoZSBtYXhpbXVtIG9uIHRoZSBib3R0b20qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dENvb3JkLm1feSA9IHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfaGVpZ2h0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdGVtcElucHV0U2l6ZVdpZHRoTWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBpbnB1dCBoZWlnaHQgb2YgdGhlIEFJUiBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSBoZWlnaHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCA9IHRlbXBJbnB1dFNpemVXaWR0aE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlRoZSBtYXhpbXVtIHBvc3NpYmxlIGlucHV0IHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgaW5wdXRcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGhlaWdodCAocm90YXRpb24gaW5jbHVkZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWVhbnMgYmxhY2sgYm9yZGVycyBhcmUgbmVjZXNzYXJ5IHRvIGtlZXAgYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlucHV0IGhlaWdodCBvZiB0aGUgQUlSIGlzIGFsbCB0aGUgaW5wdXQgaW1hZ2UgaGVpZ2h0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbXBPdXRwdXRTaXplV2lkdGgqcEMtPm1fcERlY29kZWRQbGFuZS0+dV9oZWlnaHQpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0ID0gKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV90b3BsZWZ0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfQUJTKChNNE9TQV9JbnQzMikocEltYWdlUGxhbmVzWzBdLnVfd2lkdGhcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMF0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0FCUygoTTRPU0FfSW50MzIpKHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xKSkpPj4xKSkrMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMV0udV93aWR0aCA9IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQ+PjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfdG9wbGVmdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE00eFZTU19BQlMoKE00T1NBX0ludDMyKShwSW1hZ2VQbGFuZXNbMl0udV93aWR0aFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSkpKT4+MSkpKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEltYWdlUGxhbmVzWzJdLnVfd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0Pj4xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypXaWR0aCBhbmQgaGVpZ2h0IGhhdmUgdG8gYmUgZXZlbiovCi0gICAgICAgICAgICBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGggPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCA9IChQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aD4+MSk8PDE7Ci0gICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0Pj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1swXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1sxXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1syXS51X3dpZHRoID0gKHBJbWFnZVBsYW5lc1syXS51X3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgIHBJbWFnZVBsYW5lc1swXS51X2hlaWdodCA9IChwSW1hZ2VQbGFuZXNbMF0udV9oZWlnaHQ+PjEpPDwxOwotICAgICAgICAgICAgcEltYWdlUGxhbmVzWzFdLnVfaGVpZ2h0ID0gKHBJbWFnZVBsYW5lc1sxXS51X2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICBwSW1hZ2VQbGFuZXNbMl0udV9oZWlnaHQgPSAocEltYWdlUGxhbmVzWzJdLnVfaGVpZ2h0Pj4xKTw8MTsKLQotICAgICAgICAgICAgLypDaGVjayB0aGF0IHZhbHVlcyBhcmUgY29oZXJlbnQqLwotICAgICAgICAgICAgaWYoUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0ID09IFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSBQYXJhbXMubV9vdXRwdXRTaXplLm1fd2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoID09IFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSBQYXJhbXMubV9vdXRwdXRTaXplLm1faGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgIFBpY3R1cmUgcmVuZGVyaW5nOiBSZXNpemluZyBhbmQgQ3JvcHBpbmcqLwotICAgICAgICBpZihwQy0+bV9tZWRpYVJlbmRlcmluZyAhPSBNNHhWU1Nfa0JsYWNrQm9yZGVycykKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKHBCYXNpY1RhZ3Mub3JpZW50YXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Vbmtub3duOgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dE9yaWVudGF0aW9uID0gTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDsKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wTGVmdDoKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uVG9wUmlnaHQ6Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvbkJvdHRvbVJpZ2h0OgotICAgICAgICAgICAgY2FzZSBNNENPTU1PTl9rT3JpZW50YXRpb25Cb3R0b21MZWZ0OgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwSW1hZ2VQbGFuZXMtPnVfaGVpZ2h0OwotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCA9IHBJbWFnZVBsYW5lcy0+dV93aWR0aDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdFRvcDoKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uTGVmdEJvdHRvbToKLSAgICAgICAgICAgIGNhc2UgTTRDT01NT05fa09yaWVudGF0aW9uUmlnaHRUb3A6Ci0gICAgICAgICAgICBjYXNlIE00Q09NTU9OX2tPcmllbnRhdGlvblJpZ2h0Qm90dG9tOgotICAgICAgICAgICAgICAgIFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgPSBwSW1hZ2VQbGFuZXMtPnVfd2lkdGg7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoID0gcEltYWdlUGxhbmVzLT51X2hlaWdodDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICBQaWN0dXJlIHJlbmRlcmluZzogQ3JvcHBpbmcqLwotICAgICAgICBpZihwQy0+bV9tZWRpYVJlbmRlcmluZyA9PSBNNHhWU1Nfa0Nyb3BwaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigoUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKVwKLSAgICAgICAgICAgICAgICAgL1BhcmFtcy5tX291dHB1dFNpemUubV93aWR0aDxQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHRlbXBIZWlnaHQgPSBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgLypoZWlnaHQgd2lsbCBiZSBjcm9wcGVkKi8KLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAgKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV9oZWlnaHQgXAotICAgICAgICAgICAgICAgICAgICAqIFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoKSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX3dpZHRoKTsKLSAgICAgICAgICAgICAgICBQYXJhbXMubV9pbnB1dFNpemUubV9oZWlnaHQgPSAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodD4+MSk8PDE7Ci0gICAgICAgICAgICAgICAgaWYoTTRPU0FfRkFMU0UgPT0gcEMtPm1fcFB0bzNHUFBwYXJhbXMtPmlzUGFuWm9vbSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtcy5tX2lucHV0Q29vcmQubV95ID0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAgICAgKChwQy0+bV9wRGVjb2RlZFBsYW5lLT51X2hlaWdodCAtIFBhcmFtcy5tX2lucHV0U2l6ZS5tX2hlaWdodCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3kgKz0gKE00T1NBX0ludDMyKSgoTTRPU0FfSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAgICAgKCh0ZW1wSGVpZ2h0IC0gUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSk+PjEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdGVtcFdpZHRoPSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aDsKLSAgICAgICAgICAgICAgICAvKndpZHRoIHdpbGwgYmUgY3JvcHBlZCovCi0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAgKE00T1NBX1VJbnQzMikoKFBhcmFtcy5tX291dHB1dFNpemUubV93aWR0aCBcCi0gICAgICAgICAgICAgICAgICAgICogUGFyYW1zLm1faW5wdXRTaXplLm1faGVpZ2h0KSAvUGFyYW1zLm1fb3V0cHV0U2l6ZS5tX2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRTaXplLm1fd2lkdGggPSAgKFBhcmFtcy5tX2lucHV0U2l6ZS5tX3dpZHRoPj4xKTw8MTsKLSAgICAgICAgICAgICAgICBpZihNNE9TQV9GQUxTRSA9PSBwQy0+bV9wUHRvM0dQUHBhcmFtcy0+aXNQYW5ab29tKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggPSAoTTRPU0FfSW50MzIpKChNNE9TQV9JbnQzMilcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKHBDLT5tX3BEZWNvZGVkUGxhbmUtPnVfd2lkdGggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1zLm1faW5wdXRDb29yZC5tX3ggKz0gKE00T1NBX0ludDMyKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKE00T1NBX0ludDMyKSh0ZW1wV2lkdGggLSBQYXJhbXMubV9pbnB1dFNpemUubV93aWR0aCkpPj4xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGwgQUlSIGZ1bmN0aW9ucyAqLwotICAgICAgICBpZihNNE9TQV9OVUxMID09IHBDLT5tX2Fpcl9jb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBlcnIgPSBNNEFJUl9jcmVhdGUoJnBDLT5tX2Fpcl9jb250ZXh0LCBNNEFJUl9rWVVWNDIwUCk7Ci0gICAgICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICAgICAgcEMtPm1fcERlY29kZWRQbGFuZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6XAotICAgICAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBpbml0aWFsaXppbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gTTRBSVJfY29uZmlndXJlKHBDLT5tX2Fpcl9jb250ZXh0LCAmUGFyYW1zKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OlwKLSAgICAgICAgICAgICAgICAgRXJyb3Igd2hlbiBjb25maWd1cmluZyBBSVI6IDB4JXgiLCBlcnIpOwotICAgICAgICAgICAgTTRBSVJfY2xlYW5VcChwQy0+bV9haXJfY29udGV4dCk7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tX3BEZWNvZGVkUGxhbmVbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lKTsKLSAgICAgICAgICAgIHBDLT5tX3BEZWNvZGVkUGxhbmUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IE00QUlSX2dldChwQy0+bV9haXJfY29udGV4dCwgcEMtPm1fcERlY29kZWRQbGFuZSwgcEltYWdlUGxhbmVzKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OiBFcnJvciB3aGVuIGdldHRpbmcgQUlSIHBsYW5lOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgIE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcEltYWdlUGxhbmVzWzBdID0gcEltYWdlUGxhbmVzMTsKLSAgICAgICAgcEltYWdlUGxhbmVzWzFdID0gcEltYWdlUGxhbmVzMjsKLSAgICAgICAgcEltYWdlUGxhbmVzWzJdID0gcEltYWdlUGxhbmVzMzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudCB0aGUgaW1hZ2UgY291bnRlciAqLwotICAgIHBDLT5tX0ltYWdlQ291bnRlcisrOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgZW5kIG9mIHNlcXVlbmNlICovCi0gICAgbGFzdF9mcmFtZV9mbGFnICAgID0gKHBDLT5tX0ltYWdlQ291bnRlciA+PSBwQy0+bV9OYkltYWdlKTsKLQotICAgIC8qKgotICAgICAqIEtlZXAgdGhlIHBpY3R1cmUgZHVyYXRpb24gKi8KLSAgICAqcFBpY3R1cmVEdXJhdGlvbiA9IHBDLT5tX3RpbWVEdXJhdGlvbjsKLQotICAgIGlmICgxID09IGxhc3RfZnJhbWVfZmxhZykKLSAgICB7Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fYWlyX2NvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00QUlSX2NsZWFuVXAocEMtPm1fYWlyX2NvbnRleHQpOwotICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IEVycm9yIHdoZW4gY2xlYW5pbmcgQUlSOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1fcERlY29kZWRQbGFuZSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwQy0+bV9wRGVjb2RlZFBsYW5lWzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgIGZyZWUocEMtPm1fcERlY29kZWRQbGFuZSk7Ci0gICAgICAgICAgICBwQy0+bV9wRGVjb2RlZFBsYW5lID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTTRQVE8zR1BQX1dBUl9MQVNUX1BJQ1RVUkU7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19QaWN0dXJlQ2FsbGJhY2tGY3Q6IExlYXZpbmcgIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncChNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgUHRvM0dQUCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCi0gKiBAbm90ZSAgICBUaGUgIlBpY3R1cmVzIHRvIDNHUFAiIHBhcmFtZXRlcnMgYXJlIGdpdmVuIGJ5IHRoZSBpbnRlcm5hbCB4VlNTCi0gKiAgICAgICAgICAgIGNvbnRleHQuIFRoaXMgY29udGV4dCBjb250YWlucyBhIHBvaW50ZXIgb24gdGhlIGN1cnJlbnQgZWxlbWVudAotICogICAgICAgICAgICBvZiB0aGUgY2hhaW5lZCBsaXN0IG9mIFB0bzNHUFAgcGFyYW1ldGVycy4KLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNFBUTzNHUFBfV0FSX0xBU1RfUElDVFVSRTogVGhlIHJldHVybmVkIGltYWdlIGlzIHRoZSBsYXN0IG9uZQotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIERlZmluaXRpb25zIHRvIGdlbmVyYXRlIGR1bW15IEFNUiBmaWxlIHVzZWQgdG8gYWRkIEFNUiBzaWxlbmNlIGluIGZpbGVzIGdlbmVyYXRlZAotICAgICBieSBQdG8zR1BQICovCi0gICAgI2RlZmluZSBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUgICAgIDEzCi0gICAgLyogVGhpcyBjb25zdGFudCBpcyBkZWZpbmVkIGluIE00VlNTM0dQUF9JbnRlcm5hbENvbmZpZy5oICovCi0gICAgZXh0ZXJuIGNvbnN0IE00T1NBX1VJbnQ4XAotICAgICAgICAgTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OFtNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkVdOwotCi0gICAgLyogQU1SIHNpbGVudCBmcmFtZSB1c2VkIHRvIGNvbXB1dGUgZHVtbXkgQU1SIHNpbGVuY2UgZmlsZSAqLwotICAgICNkZWZpbmUgTTRWU1MzR1BQX0FNUl9IRUFERVJfU0laRSA2Ci0gICAgY29uc3QgTTRPU0FfVUludDggTTRWU1MzR1BQX0FNUl9IRUFERVJbTTRWU1MzR1BQX0FNUl9BVV9TSUxFTkNFX0ZSQU1FXzA0OF9TSVpFXSA9Ci0gICAgeyAweDIzLCAweDIxLCAweDQxLCAweDRkLCAweDUyLCAweDBhIH07Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgTTRQVE8zR1BQX0NvbnRleHQgcE00UFRPM0dQUF9DdHh0ID0gTTRPU0FfTlVMTDsKLSAgICBNNFBUTzNHUFBfUGFyYW1zIFBhcmFtczsKLSAgICAgTTR4VlNTX1BpY3R1cmVDYWxsYmFja0N0eHQqICAgIHBDYWxsQmFja0N0eHQ7Ci0gICAgTTRPU0FfQm9vbCBjbXBSZXN1bHQ9TTRPU0FfRkFMU0U7Ci0gICAgTTRPU0FfQ29udGV4dCBwRHVtbXlBTVJGaWxlOwotICAgIE00T1NBX0NoYXIgb3V0X2FtcltNNFhWU1NfTUFYX1BBVEhfTEVOXTsKLSAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgIE00T1NBX0NoYXIqIHBEZWNvZGVkUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIGk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBNNFBUTzNHUFAgaW5zdGFuY2UgKi8KLSAgICBlcnIgPSBNNFBUTzNHUFBfSW5pdCggJnBNNFBUTzNHUFBfQ3R4dCwgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHIsCi0gICAgICAgICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3AgcmV0dXJuZWQgJWxkXG4iLGVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcENhbGxCYWNrQ3R4dCA9IChNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZihNNHhWU1NfUGljdHVyZUNhbGxiYWNrQ3R4dCksCi0gICAgICAgICBNNFZTLChNNE9TQV9DaGFyICopICJQdG8zZ3BwIGNhbGxiYWNrIHN0cnVjdCIpOwotICAgIGlmKHBDYWxsQmFja0N0eHQgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbFN0YXJ0Q29udmVydFBpY3R1cmVUbzNncCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgUGFyYW1zLk91dHB1dFZpZGVvRnJhbWVTaXplID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplOwotICAgIFBhcmFtcy5PdXRwdXRWaWRlb0Zvcm1hdCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0OwotICAgIFBhcmFtcy52aWRlb1Byb2ZpbGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1Byb2ZpbGU7Ci0gICAgUGFyYW1zLnZpZGVvTGV2ZWwgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgImR1bW15IiBhbXIgZmlsZSBjb250YWluaW5nIHNpbGVuY2UgaW4gdGVtcG9yYXJ5IGZvbGRlciAqLwotICAgIE00T1NBX2Nock5Db3B5KG91dF9hbXIsIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSk7Ci0gICAgc3RybmNhdCgoY2hhciAqKW91dF9hbXIsIChjb25zdCBjaGFyICopImR1bW15LmFtclwwIiwgMTApOwotCi0gICAgLyoqCi0gICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgdGhlIHRlbXBvcmFyeSBwYXRoIGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgcERlY29kZWRQYXRoID0gb3V0X2FtcjsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgb3V0X2FtciwKLSAgICAgICAgICAgICAoTTRPU0FfVm9pZCopIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdGFydENvbnZlcnRQaWN0dXJlVG8zZ3A6XAotICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjggcmV0dXJucyBlcnI6IDB4JXgiLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBjb252ZXJ0ZWQgcGF0aCovCi0KLSAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHItPm9wZW5Xcml0ZSgmcER1bW15QU1SRmlsZSwgcERlY29kZWRQYXRoLCBNNE9TQV9rRmlsZVdyaXRlKTsKLQotICAgIC8qQ29tbWVudGVkIGJlY2F1c2Ugb2YgdGhlIHVzZSBvZiB0aGUgVVRGIGNvbnZlcnNpb24gc2VlIGFib3ZlKi8KLS8qICAgIGVyciA9IHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0ci0+b3BlbldyaXRlKCZwRHVtbXlBTVJGaWxlLCBvdXRfYW1yLCBNNE9TQV9rRmlsZVdyaXRlKTsKLSAqLwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IENhbid0IG9wZW4gb3V0cHV0IGR1bW15IGFtciBmaWxlICVzLFwKLSAgICAgICAgICAgICBlcnJvcjogMHgleFxuIixvdXRfYW1yLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9ICB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHItPndyaXRlRGF0YShwRHVtbXlBTVJGaWxlLAotICAgICAgICAoTTRPU0FfSW50OCopTTRWU1MzR1BQX0FNUl9IRUFERVIsIE00VlNTM0dQUF9BTVJfSEVBREVSX1NJWkUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IENhbid0IHdyaXRlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcyxcCi0gICAgICAgICAgICAgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyLT53cml0ZURhdGEocER1bW15QU1SRmlsZSwKLSAgICAgICAgIChNNE9TQV9JbnQ4KilNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4LCBNNFZTUzNHUFBfQU1SX0FVX1NJTEVOQ0VfRlJBTUVfMDQ4X1NJWkUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IFwKLSAgICAgICAgICAgIENhbid0IHdyaXRlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSAgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyLT5jbG9zZVdyaXRlKHBEdW1teUFNUkZpbGUpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRQaWN0dXJlVG8zZ3A6IFwKLSAgICAgICAgICAgIENhbid0IGNsb3NlIG91dHB1dCBkdW1teSBhbXIgZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIsb3V0X2FtciwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsIHBhcmFtZXRlcnMgZm9yIFB0bzNHUFAgd2l0aCB0aGUgcGFyYW1ldGVycyBjb250YWluZWQgaW4gdGhlIGN1cnJlbnQgZWxlbWVudCBvZiB0aGUKLSAgICAgKiBQdG8zR1BQIHBhcmFtZXRlcnMgY2hhaW5lZCBsaXN0IGFuZCB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyAqLwotLyorIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlID09IDApIHsKLSAgICAgICAgUGFyYW1zLk91dHB1dFZpZGVvQml0cmF0ZSAgICA9IE00VklERU9FRElUSU5HX2tWQVJJQUJMRV9LQlBTOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgICBQYXJhbXMuT3V0cHV0VmlkZW9CaXRyYXRlID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlOwotICAgIH0KLSAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsU3RhcnRDb252ZXJ0UGljVG8zR1A6IHZpZGVvIGJpdHJhdGUgPSAlZCIsCi0gICAgICAgIFBhcmFtcy5PdXRwdXRWaWRlb0JpdHJhdGUpOwotLyotIE5ldyBFbmNvZGVyIGJpdHJhdGVzICovCi0gICAgUGFyYW1zLk91dHB1dEZpbGVNYXhTaXplICAgID0gTTRQVE8zR1BQX2tVTkxJTUlURUQ7Ci0gICAgUGFyYW1zLnBQaWN0dXJlQ2FsbGJhY2tGY3QgICAgPSBNNHhWU1NfUGljdHVyZUNhbGxiYWNrRmN0OwotICAgIFBhcmFtcy5wUGljdHVyZUNhbGxiYWNrQ3R4dCAgICA9IHBDYWxsQmFja0N0eHQ7Ci0gICAgLypGQjogY2hhbmdlIHRvIHVzZSB0aGUgY29udmVydGVkIHBhdGggKFVURiBjb252ZXJzaW9uKSBzZWUgdGhlIGNvbnZlcnNpb24gYWJvdmUqLwotICAgIC8qRml4IDotIEFkZGluZyBBdWRpbyBUcmFjayBpbiBJbWFnZSBhcyBpbnB1dCA6QXVkaW9UYXJja0ZpbGUgU2V0dGluZyB0byBOVUxMICovCi0gICAgUGFyYW1zLnBJbnB1dEF1ZGlvVHJhY2tGaWxlICAgID0gTTRPU0FfTlVMTDsvLyhNNE9TQV9Wb2lkKilwRGVjb2RlZFBhdGg7Ly9vdXRfYW1yOwotICAgIFBhcmFtcy5BdWRpb1BhZGRpbmdNb2RlICAgICAgICA9IE00UFRPM0dQUF9rQXVkaW9QYWRkaW5nTW9kZV9Mb29wOwotICAgIFBhcmFtcy5BdWRpb0ZpbGVGb3JtYXQgICAgICAgID0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX0FNUjsKLSAgICBQYXJhbXMucE91dHB1dDNncHBGaWxlICAgICAgICA9IHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5wRmlsZU91dDsKLSAgICBQYXJhbXMucFRlbXBvcmFyeUZpbGUgICAgICAgID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPnBGaWxlVGVtcDsKLSAgICAvKitQUiBObzogIGJscm54cHN3IzIyMyovCi0gICAgLypJbmNyZWFzaW5nIGZyZXF1ZW5jeSBvZiBGcmFtZSwgY2FsY3VsYXRpbmcgTm9zIG9mIEZyYW1lID0gZHVyYXRpb24gL0ZQUyAqLwotICAgIC8qT3RoZXIgY2hhbmdlcyBtYWRlIGlzIEAgTTR4VlNTX0FQSS5jIEAgbGluZSAzODQxIGluIE00eFZTU19TZW5kQ29tbWFuZCovCi0gICAgLypJZiBjYXNlIGNoZWNrIGZvciBQYW5ab29tIHJlbW92ZWQgKi8KLSAgICBQYXJhbXMuTmJWaWRlb0ZyYW1lcyAgICAgICAgICAgID0gKE00T1NBX1VJbnQzMikKLSAgICAgICAgKHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5kdXJhdGlvbiBcCi0gICAgICAgICAgICAvIHhWU1NfY29udGV4dC0+cFBUbzNHUFBjdXJyZW50UGFyYW1zLT5mcmFtZXJhdGUpOyAvKiAqLwotICAgIHBDYWxsQmFja0N0eHQtPm1fdGltZUR1cmF0aW9uICAgID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPmZyYW1lcmF0ZTsKLSAgICAvKi1QUiBObzogIGJscm54cHN3IzIyMyovCi0gICAgcENhbGxCYWNrQ3R4dC0+bV9JbWFnZUNvdW50ZXIgICAgPSAwOwotICAgIHBDYWxsQmFja0N0eHQtPm1fRmlsZUluICAgICAgICAgICAgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtcy0+cEZpbGVJbjsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX05iSW1hZ2UgICAgICAgID0gUGFyYW1zLk5iVmlkZW9GcmFtZXM7Ci0gICAgcENhbGxCYWNrQ3R4dC0+bV9wRmlsZVJlYWRQdHIgICAgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0cjsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX3BEZWNvZGVkUGxhbmUgICAgPSBNNE9TQV9OVUxMOwotICAgIHBDYWxsQmFja0N0eHQtPm1fcFB0bzNHUFBwYXJhbXMgICAgPSB4VlNTX2NvbnRleHQtPnBQVG8zR1BQY3VycmVudFBhcmFtczsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX2Fpcl9jb250ZXh0ICAgID0gTTRPU0FfTlVMTDsKLSAgICBwQ2FsbEJhY2tDdHh0LT5tX21lZGlhUmVuZGVyaW5nID0geFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMtPk1lZGlhUmVuZGVyaW5nOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzICovCi0gICAgZXJyID0gTTRQVE8zR1BQX09wZW4ocE00UFRPM0dQUF9DdHh0LCAmUGFyYW1zKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX09wZW4gcmV0dXJuZWQ6IDB4JXhcbiIsZXJyKTsKLSAgICAgICAgaWYocENhbGxCYWNrQ3R4dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKHBDYWxsQmFja0N0eHQpOwotICAgICAgICAgICAgcENhbGxCYWNrQ3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgTTRQVE8zR1BQX0NsZWFuVXAocE00UFRPM0dQUF9DdHh0KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGNvbnRleHQgdG8gYmUgYWJsZSB0byBjYWxsIFB0bzNHUFAgc3RlcCBmdW5jdGlvbiBpbiBNNHhWU1Nfc3RlcCBmdW5jdGlvbiAqLwotICAgIHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0ID0gcE00UFRPM0dQUF9DdHh0OwotICAgIHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCA9IHBDYWxsQmFja0N0eHQ7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsU3RvcENvbnZlcnRQaWN0dXJlVG8zZ3AoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBQdG8zR1BQCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbFN0b3BDb252ZXJ0UGljdHVyZVRvM2dwKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9DaGFyIG91dF9hbXJbTTRYVlNTX01BWF9QQVRIX0xFTl07Ci0gICAgLypVVEYgY29udmVyc2lvbiBzdXBwb3J0Ki8KLSAgICBNNE9TQV9DaGFyKiBwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgLyoqCi0gICAgKiBGcmVlIHRoZSBQVE8zR1BQIGNhbGxiYWNrIGNvbnRleHQgKi8KLSAgICBpZihNNE9TQV9OVUxMICE9IHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0KTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ2FsbEJhY2tDdHh0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5hbGl6ZSB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBlcnIgPSBNNFBUTzNHUFBfQ2xvc2UoeFZTU19jb250ZXh0LT5wTTRQVE8zR1BQX0N0eHQpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNFBUTzNHUFBfQ2xvc2UgcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICBNNFBUTzNHUFBfQ2xlYW5VcCh4VlNTX2NvbnRleHQtPnBNNFBUTzNHUFBfQ3R4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSB0aGlzIE00UFRPM0dQUCBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00UFRPM0dQUF9DbGVhblVwKHhWU1NfY29udGV4dC0+cE00UFRPM0dQUF9DdHh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTRQVE8zR1BQX0NsZWFuVXAgcmV0dXJuZWQgMHgleFxuIixlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBkdW1teS5hbXIgZmlsZSAqLwotICAgIE00T1NBX2Nock5Db3B5KG91dF9hbXIsIHhWU1NfY29udGV4dC0+cFRlbXBQYXRoLCBNNFhWU1NfTUFYX1BBVEhfTEVOIC0gMSk7Ci0gICAgc3RybmNhdCgoY2hhciAqKW91dF9hbXIsIChjb25zdCBjaGFyICopImR1bW15LmFtclwwIiwgMTApOwotCi0gICAgLyoqCi0gICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgdGhlIHRlbXBvcmFyeSBwYXRoIGludG8gdGhlIGN1c3RvbWVyIGZvcm1hdCovCi0gICAgcERlY29kZWRQYXRoID0gb3V0X2FtcjsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgb3V0X2FtciwKLSAgICAgICAgICAgICAoTTRPU0FfVm9pZCopIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAmbGVuZ3RoKTsKLSAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxTdG9wQ29udmVydFBpY3R1cmVUbzNncDpcCi0gICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCByZXR1cm5zIGVycjogMHgleCIsZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcERlY29kZWRQYXRoID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgfQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBEZWNvZGVkUGF0aCk7Ci0KLSAgICAvKkNvbW1lbnRlZCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YgdGhlIFVURiBjb252ZXJzaW9uKi8KLS8qICAgIHJlbW92ZShvdXRfYW1yKTsKLSAqLwotCi0gICAgeFZTU19jb250ZXh0LT5wTTRQVE8zR1BQX0N0eHQgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cENhbGxCYWNrQ3R4dCA9IE00T1NBX05VTEw7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRSR0J0b1lVVihNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCkKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIFJHQjU2NSBwbGFuZSB0byBZVVY0MjAgcGxhbmFyCi0gKiBAbm90ZSAgICBJdCBpcyB1c2VkIG9ubHkgZm9yIGZyYW1pbmcgZWZmZWN0Ci0gKiAgICAgICAgICAgIEl0IGFsbG9jYXRlcyBvdXRwdXQgWVVWIHBsYW5lcwotICogQHBhcmFtICAgIGZyYW1pbmdDdHggICAgKElOKSBUaGUgZnJhbWluZyBzdHJ1Y3QgY29udGFpbmluZyBpbnB1dCBSR0I1NjUgcGxhbmUKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IEFsbG9jYXRpb24gZXJyb3IgKG5vIG1vcmUgbWVtb3J5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWKE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4KQotewotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgWVVWIHBsYW5lcyAqLwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSAoTTRWSUZJX0ltYWdlUGxhbmUqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygzKnNpemVvZihNNFZJRklfSW1hZ2VQbGFuZSksCi0gICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVY6IE91dHB1dCBwbGFuZSBZVVYiKTsKLSAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBNNHhWU1NfaW50ZXJuYWxDb252ZXJ0UkdCdG9ZVVYiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X2hlaWdodDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGg7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9Ci0gICAgICAgICAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aFwKLSAgICAgICAgICAgICpmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0KjMpPj4xLCBNNFZTLCAoTTRPU0FfQ2hhciAqKVwKLSAgICAgICAgICAgICAgICAiQWxsb2MgZm9yIHRoZSBDb252ZXJ0aW9uIG91dHB1dCBZVVYiKTs7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9oZWlnaHQgPSAoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPSBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhIFwKLSAgICAgICAgKyBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnVfaGVpZ2h0OwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfaGVpZ2h0ID0gKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3N0cmlkZSA9IChmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID0gZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSBcCi0gICAgICAgICsgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X2hlaWdodDsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgaW5wdXQgUkdCIDU2NSB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZwotICAgICAgZWZmZWN0ICovCi0gICAgZXJyID0gTTRWSUZJX3hWU1NfUkdCNTY1dG9ZVVY0MjAoTTRPU0FfTlVMTCwgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiwgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFJHQnRvWVVWOlwKLSAgICAgICAgICAgICBlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgIH0KLQotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlld09mZnNldENsaXBUaW1lID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IG9uZSBlbGVtZW50IGluIHRoZSBjaGFpbmVkIGxpc3QgKG5vIGFuaW1hdGVkIGltYWdlIHdpdGggUkdCIGJ1ZmZlci4uLikgKi8KLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxTZXRQbGFuZVRyYW5zcGFyZW50KE00T1NBX1VJbnQ4KiBwbGFuZUluLCBNNE9TQV9VSW50MzIgc2l6ZSkKLXsKLSAgICBNNE9TQV9VSW50MzIgaTsKLSAgICBNNE9TQV9VSW50OCogcGxhbmUgPSBwbGFuZUluOwotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MSA9IChNNE9TQV9VSW50OCkoKFRSQU5TUEFSRU5UX0NPTE9SICYgMHhGRjAwKT4+OCk7Ci0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQyID0gKE00T1NBX1VJbnQ4KVRSQU5TUEFSRU5UX0NPTE9SOwotCi0gICAgZm9yKGk9MDsgaTwoc2l6ZT4+MSk7IGkrKykKLSAgICB7Ci0gICAgICAgICpwbGFuZSsrID0gdHJhbnNwYXJlbnQxOwotICAgICAgICAqcGxhbmUrKyA9IHRyYW5zcGFyZW50MjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEFSQkc4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRWZmZWN0U2V0dGluZ3MqIHBFZmZlY3QsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJREVPRURJVElOR19WaWRlb0ZyYW1lU2l6ZSBPdXRwdXRWaWRlb1Jlc29sdXRpb24pCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY29udmVydHMgQVJHQjg4ODggaW5wdXQgZmlsZSAgdG8gWVVWNDIwIHdoZW51c2VkIGZvciBmcmFtbWluZyBlZmZlY3QKLSAqIEBub3RlICAgIFRoZSBpbnB1dCBBUkdCODg4OCBmaWxlIHBhdGggaXMgY29udGFpbmVkIGluIHRoZSBwRWZmZWN0IHN0cnVjdHVyZQotICogICAgICAgICAgICBJZiB0aGUgQVJHQjg4ODggbXVzdCBiZSByZXNpemVkIHRvIGZpdCBvdXRwdXQgdmlkZW8gc2l6ZSwgdGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICB3aWxsIGRvIGl0LgotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwRWZmZWN0ICAgICAgICAoSU4pIFRoZSBlZmZlY3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9ucyBvbgotICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSB0byBkZWNvZGUsIHJlc2l6aW5nIC4uLgotICogQHBhcmFtICAgIGZyYW1pbmdDdHggICAgKElOL09VVCkgU3RydWN0dXJlIGluIHdoaWNoIHRoZSBvdXRwdXQgUkdCIHdpbGwgYmUgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKiBAcmV0dXJuICAgIE00RVJSX0FMTE9DOiBBbGxvY2F0aW9uIGVycm9yIChubyBtb3JlIG1lbW9yeSkKLSAqIEByZXR1cm4gICAgTTRFUlJfRklMRV9OT1RfRk9VTkQ6IEZpbGUgbm90IGZvdW5kLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLQotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZmZlY3RTZXR0aW5ncyogcEVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfVmlkZW9GcmFtZVNpemVcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRWaWRlb1Jlc29sdXRpb24pCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfQ29udGV4dCBwQVJHQkluOwotICAgIE00T1NBX1VJbnQzMiBmaWxlX3NpemU7Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDMyIHdpZHRoLCBoZWlnaHQsIHdpZHRoX291dCwgaGVpZ2h0X291dDsKLSAgICBNNE9TQV9Wb2lkKiBwRmlsZSA9IHBFZmZlY3QtPnhWU1MucEZyYW1pbmdGaWxlUGF0aDsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDEgPSAoTTRPU0FfVUludDgpKChUUkFOU1BBUkVOVF9DT0xPUiAmIDB4RkYwMCk+PjgpOwotICAgIE00T1NBX1VJbnQ4IHRyYW5zcGFyZW50MiA9IChNNE9TQV9VSW50OClUUkFOU1BBUkVOVF9DT0xPUjsKLSAgICAvKlVURiBjb252ZXJzaW9uIHN1cHBvcnQqLwotICAgIE00T1NBX0NoYXIqIHBEZWNvZGVkUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIGkgPSAwLGogPSAwOwotICAgIE00VklGSV9JbWFnZVBsYW5lIHJnYlBsYW5lOwotICAgIE00T1NBX1VJbnQzMiBmcmFtZVNpemVfYXJnYj0oZnJhbWluZ0N0eC0+d2lkdGggKiBmcmFtaW5nQ3R4LT5oZWlnaHQgKiA0KTsKLSAgICBNNE9TQV9VSW50MzIgZnJhbWVTaXplOwotICAgIE00T1NBX1VJbnQzMiB0ZW1wQWxwaGFQZXJjZW50ID0gMDsKLSAgICBNNFZJRklfVUludDgqIFRlbXBQYWNEYXRhID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MTYgKnB0ciA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIHogPSAwOwotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6IEVudGVyaW5nICIpOwotCi0gICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Qgd2lkdGggYW5kIGhlaWdodCAlZCAlZCAiLAotICAgICAgICBmcmFtaW5nQ3R4LT53aWR0aCxmcmFtaW5nQ3R4LT5oZWlnaHQpOwotCi0gICAgTTRPU0FfVUludDggKnBUbXBEYXRhID0gKE00T1NBX1VJbnQ4KikgTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1lU2l6ZV9hcmdiLCBNNFZTLCAoTTRPU0FfQ2hhciopXAotICAgICAgICAiSW1hZ2UgYXJnYiBkYXRhIik7Ci0gICAgaWYocFRtcERhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFVURiBjb252ZXJzaW9uOiBjb252ZXJ0IHRoZSBmaWxlIHBhdGggaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0Ki8KLSAgICBwRGVjb2RlZFBhdGggPSBwRmlsZTsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICAgICAmJiB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgIGVyciA9IE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCh4VlNTX2NvbnRleHQsIChNNE9TQV9Wb2lkKikgcEZpbGUsCi0gICAgICAgICAgICAgKE00T1NBX1ZvaWQqKSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwgJmxlbmd0aCk7Ci0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsRGVjb2RlUE5HOlwKLSAgICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4IHJldHVybnMgZXJyOiAweCV4IixlcnIpOwotICAgICAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICogRW5kIG9mIHRoZSBjb252ZXJzaW9uLCBub3cgdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotCi0gICAgIC8qIE9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSBhbmQgc3RvcmUgaXQgaW50byBtZW1vcnkgKi8KLSAgICBlcnIgPSB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+b3BlblJlYWQoJnBBUkdCSW4sIHBEZWNvZGVkUGF0aCwgTTRPU0Ffa0ZpbGVSZWFkKTsKLQotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIkNhbid0IG9wZW4gaW5wdXQgQVJHQjg4ODggZmlsZSAlcywgZXJyb3I6IDB4JXhcbiIscEZpbGUsIGVycik7Ci0gICAgICAgIGZyZWUocFRtcERhdGEpOwotICAgICAgICBwVG1wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0geFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHItPnJlYWREYXRhKHBBUkdCSW4sKE00T1NBX01lbUFkZHI4KXBUbXBEYXRhLCAmZnJhbWVTaXplX2FyZ2IpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHItPmNsb3NlUmVhZChwQVJHQkluKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotICAgIGVyciA9ICB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ci0+Y2xvc2VSZWFkKHBBUkdCSW4pOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIkNhbid0IGNsb3NlIGlucHV0IHBuZyBmaWxlICVzLCBlcnJvcjogMHgleFxuIixwRmlsZSwgZXJyKTsKLSAgICAgICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgICAgIHBUbXBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLQotICAgIHJnYlBsYW5lLnVfaGVpZ2h0ID0gZnJhbWluZ0N0eC0+aGVpZ2h0OwotICAgIHJnYlBsYW5lLnVfd2lkdGggPSBmcmFtaW5nQ3R4LT53aWR0aDsKLSAgICByZ2JQbGFuZS51X3N0cmlkZSA9IHJnYlBsYW5lLnVfd2lkdGgqMzsKLSAgICByZ2JQbGFuZS51X3RvcGxlZnQgPSAwOwotCi0gICAgZnJhbWVTaXplID0gKHJnYlBsYW5lLnVfd2lkdGggKiByZ2JQbGFuZS51X2hlaWdodCAqIDMpOyAvL1NpemUgb2YgUkdCODg4IGRhdGEKLSAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygoKGZyYW1lU2l6ZSkrICgyICogZnJhbWluZ0N0eC0+d2lkdGgpKSwKLSAgICAgICAgIE00VlMsIChNNE9TQV9DaGFyKikiSW1hZ2UgY2xpcCBSR0I4ODggZGF0YSIpOwotICAgIGlmKHJnYlBsYW5lLnBhY19kYXRhID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCIpOwotICAgICAgICBmcmVlKHBUbXBEYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICBSZW1vdmUgdGhlIGFscGhhIGNoYW5uZWwgICIpOwotCi0gICAgLyogcHJlbXVsdGlwbGllZCBhbHBoYSAlIG9uIFJHQiAqLwotICAgIGZvciAoaT0wLCBqID0gMDsgaSA8IGZyYW1lU2l6ZV9hcmdiOyBpICs9IDQpIHsKLSAgICAgICAgLyogdGhpcyBpcyBhbHBoYSB2YWx1ZSAqLwotICAgICAgICBpZiAoKGkgJSA0KSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wQWxwaGFQZXJjZW50ID0gcFRtcERhdGFbaV07Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSICovCi0gICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2pdID0gcFRtcERhdGFbaSsxXTsKLSAgICAgICAgaisrOwotCi0gICAgICAgIC8qIEcgKi8KLSAgICAgICAgaWYgKHRlbXBBbHBoYVBlcmNlbnQgPiAwKSB7Ci0gICAgICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YVtqXSA9IHBUbXBEYXRhW2krMl07Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0gZWxzZSB7LyogSW4gY2FzZSBvZiBhbHBoYSB2YWx1ZSAwLCBtYWtlIEdSRUVOIHRvIDI1NSAqLwotICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbal0gPSAyNTU7IC8vcFRtcERhdGFbaSsyXTsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEIgKi8KLSAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbal0gPSBwVG1wRGF0YVtpKzNdOwotICAgICAgICBqKys7Ci0gICAgfQotCi0gICAgZnJlZShwVG1wRGF0YSk7Ci0gICAgcFRtcERhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgLyogY29udmVydCBSR0I4ODggdG8gUkdCNTY1ICovCi0KLSAgICAvKiBhbGxvY2F0ZSB0ZW1wIFJHQiA1NjUgYnVmZmVyICovCi0gICAgVGVtcFBhY0RhdGEgPSAoTTRWSUZJX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoZnJhbWVTaXplICsKLSAgICAgICAgICAgICAgICAgICAgICAgKDQgKiAoZnJhbWluZ0N0eC0+d2lkdGggKyBmcmFtaW5nQ3R4LT5oZWlnaHQgKyAxKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBNNFZTLCAoTTRPU0FfQ2hhciopIkltYWdlIGNsaXAgUkdCNTY1IGRhdGEiKTsKLSAgICBpZiAoVGVtcFBhY0RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBNNE9TQV9UUkFDRTFfMCgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgSW1hZ2UgY2xpcCBSR0I1NjUgZGF0YSIpOwotICAgICAgICBmcmVlKHJnYlBsYW5lLnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIHB0ciA9IChNNE9TQV9VSW50MTYgKilUZW1wUGFjRGF0YTsKLSAgICB6ID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBqIDsgaSArPSAzKQotICAgIHsKLSAgICAgICAgcHRyW3orK10gPSBQQUNLX1JHQjU2NSgwLCAgIHJnYlBsYW5lLnBhY19kYXRhW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGFbaSsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYlBsYW5lLnBhY19kYXRhW2krMl0pOwotICAgIH0KLQotICAgIC8qIGZyZWUgdGhlIFJCRzg4OCBhbmQgYXNzaWduIFJHQjU2NSAqLwotICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgIHJnYlBsYW5lLnBhY19kYXRhID0gVGVtcFBhY0RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBvdXRwdXQgc2l6ZXMgYXJlIG9kZCAqLwotICAgIGlmKHJnYlBsYW5lLnVfaGVpZ2h0ICUgMiAhPSAwKQotICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQ4KiBvdXRwdXRfcGFjX2RhdGEgPSByZ2JQbGFuZS5wYWNfZGF0YTsKLSAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICAgICBvdXRwdXQgaGVpZ2h0IGlzIG9kZCAgIik7Ci0gICAgICAgIG91dHB1dF9wYWNfZGF0YSArPXJnYlBsYW5lLnVfd2lkdGggKiByZ2JQbGFuZS51X2hlaWdodCoyOwotCi0gICAgICAgIGZvcihpPTA7aTxyZ2JQbGFuZS51X3dpZHRoO2krKykKLSAgICAgICAgewotICAgICAgICAgICAgKm91dHB1dF9wYWNfZGF0YSsrID0gdHJhbnNwYXJlbnQxOwotICAgICAgICAgICAgKm91dHB1dF9wYWNfZGF0YSsrID0gdHJhbnNwYXJlbnQyOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIGp1c3QgYWRkIGEgd2hpdGUgbGluZSB0byB0aGUgUE5HIHRoYXQgd2lsbCBiZSB0cmFuc3BhcmVudCAqLwotICAgICAgICByZ2JQbGFuZS51X2hlaWdodCsrOwotICAgIH0KLSAgICBpZihyZ2JQbGFuZS51X3dpZHRoICUgMiAhPSAwKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIGFkZCBhIG5ldyBjb2x1bW4gb2Ygd2hpdGUgKD10cmFuc3BhcmVudCksIGJ1dCB3ZSBuZWVkIHRvIHBhcnNlIGFsbCBSR0IgbGluZXMgLi4uICovCi0gICAgICAgIE00T1NBX1VJbnQzMiBpOwotICAgICAgICBNNFZJRklfVUludDgqIG5ld1JHQnBhY19kYXRhOwotICAgICAgICBNNFZJRklfVUludDgqIG91dHB1dF9wYWNfZGF0YSwgKmlucHV0X3BhY19kYXRhOwotCi0gICAgICAgIHJnYlBsYW5lLnVfd2lkdGgrKzsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6IFwKLSAgICAgICAgICAgICBvdXRwdXQgd2lkdGggaXMgb2RkICAiKTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgUkdCIG91dHB1dCBidWZmZXIgaW4gd2hpY2ggYWxsIGRlY29kZWQgZGF0YQotICAgICAgICAgICsgd2hpdGUgbGluZSB3aWxsIGJlIGNvcGllZCAqLwotICAgICAgICBuZXdSR0JwYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhyZ2JQbGFuZS51X2hlaWdodCpyZ2JQbGFuZS51X3dpZHRoKjJcCi0gICAgICAgICAgICAqc2l6ZW9mKE00VklGSV9VSW50OCksIE00VlMsIChNNE9TQV9DaGFyICopIk5ldyBGcmFtaW5nIEdJRiBPdXRwdXQgcGFjX2RhdGEgUkdCIik7Ci0KLSAgICAgICAgaWYobmV3UkdCcGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gXAotICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0cHV0X3BhY19kYXRhPSBuZXdSR0JwYWNfZGF0YTsKLSAgICAgICAgaW5wdXRfcGFjX2RhdGEgPSByZ2JQbGFuZS5wYWNfZGF0YTsKLQotICAgICAgICBmb3IoaT0wO2k8cmdiUGxhbmUudV9oZWlnaHQ7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilvdXRwdXRfcGFjX2RhdGEsICh2b2lkICopaW5wdXRfcGFjX2RhdGEsCi0gICAgICAgICAgICAgICAgIChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotCi0gICAgICAgICAgICBvdXRwdXRfcGFjX2RhdGEgKz0gKChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotICAgICAgICAgICAgLyogUHV0IHRoZSBwaXhlbCB0byB0cmFuc3BhcmVuY3kgY29sb3IgKi8KLSAgICAgICAgICAgICpvdXRwdXRfcGFjX2RhdGErKyA9IHRyYW5zcGFyZW50MTsKLSAgICAgICAgICAgICpvdXRwdXRfcGFjX2RhdGErKyA9IHRyYW5zcGFyZW50MjsKLQotICAgICAgICAgICAgaW5wdXRfcGFjX2RhdGEgKz0gKChyZ2JQbGFuZS51X3dpZHRoLTEpKjIpOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICByZ2JQbGFuZS5wYWNfZGF0YSA9IG5ld1JHQnBhY19kYXRhOwotICAgIH0KLQotICAgIC8qIHJlc2V0IHN0cmlkZSAqLwotICAgIHJnYlBsYW5lLnVfc3RyaWRlID0gcmdiUGxhbmUudV93aWR0aCoyOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBjaGFpbmVkIGxpc3QgcGFyYW1ldGVycyAqLwotICAgIGZyYW1pbmdDdHgtPmR1cmF0aW9uID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5wcmV2aW91c0NsaXBUaW1lID0gLTE7Ci0gICAgZnJhbWluZ0N0eC0+cHJldmlld09mZnNldENsaXBUaW1lID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IG9uZSBlbGVtZW50IGluIHRoZSBjaGFpbmVkIGxpc3QgKG5vIGFuaW1hdGVkIGltYWdlIC4uLikgKi8KLSAgICBmcmFtaW5nQ3R4LT5wQ3VycmVudCA9IGZyYW1pbmdDdHg7Ci0gICAgZnJhbWluZ0N0eC0+cE5leHQgPSBmcmFtaW5nQ3R4OwotCi0gICAgLyoqCi0gICAgICogR2V0IG91dHB1dCB3aWR0aC9oZWlnaHQgKi8KLSAgICAgc3dpdGNoKE91dHB1dFZpZGVvUmVzb2x1dGlvbikKLSAgICAvL3N3aXRjaCh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb1NpemUpCi0gICAgewotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa1NRQ0lGOgotICAgICAgICB3aWR0aF9vdXQgPSAxMjg7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA5NjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rUVFWR0E6Ci0gICAgICAgIHdpZHRoX291dCA9IDE2MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDEyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rUUNJRjoKLSAgICAgICAgd2lkdGhfb3V0ID0gMTc2OwotICAgICAgICBoZWlnaHRfb3V0ID0gMTQ0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tRVkdBOgotICAgICAgICB3aWR0aF9vdXQgPSAzMjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSAyNDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfa0NJRjoKLSAgICAgICAgd2lkdGhfb3V0ID0gMzUyOwotICAgICAgICBoZWlnaHRfb3V0ID0gMjg4OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tWR0E6Ci0gICAgICAgIHdpZHRoX291dCA9IDY0MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDQ4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rV1ZHQToKLSAgICAgICAgd2lkdGhfb3V0ID0gODAwOwotICAgICAgICBoZWlnaHRfb3V0ID0gNDgwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2tOVFNDOgotICAgICAgICB3aWR0aF9vdXQgPSA3MjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA0ODA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazY0MF8zNjA6Ci0gICAgICAgIHdpZHRoX291dCA9IDY0MDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDM2MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rODU0XzQ4MDoKLSAgICAgICAgLy8gU3RhZ2VGcmlnaHQgZW5jb2RlcnMgcmVxdWlyZSAlMTYgcmVzb2x1dGlvbgotICAgICAgICB3aWR0aF9vdXQgPSBNNEVOQ09ERVJfODU0XzQ4MF9XaWR0aDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDQ4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rMTI4MF83MjA6Ci0gICAgICAgIHdpZHRoX291dCA9IDEyODA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSA3MjA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTTRWSURFT0VESVRJTkdfazEwODBfNzIwOgotICAgICAgICAvLyBTdGFnZUZyaWdodCBlbmNvZGVycyByZXF1aXJlICUxNiByZXNvbHV0aW9uCi0gICAgICAgIHdpZHRoX291dCA9IE00RU5DT0RFUl8xMDgwXzcyMF9XaWR0aDsKLSAgICAgICAgaGVpZ2h0X291dCA9IDcyMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNNFZJREVPRURJVElOR19rOTYwXzcyMDoKLSAgICAgICAgd2lkdGhfb3V0ID0gOTYwOwotICAgICAgICBoZWlnaHRfb3V0ID0gNzIwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00VklERU9FRElUSU5HX2sxOTIwXzEwODA6Ci0gICAgICAgIHdpZHRoX291dCA9IDE5MjA7Ci0gICAgICAgIGhlaWdodF9vdXQgPSBNNEVOQ09ERVJfMTkyMF8xMDgwX0hlaWdodDsKLSAgICAgICAgYnJlYWs7Ci0gICAgLyoqCi0gICAgICogSWYgb3V0cHV0IHZpZGVvIHNpemUgaXMgbm90IGdpdmVuLCB3ZSB0YWtlIFFDSUYgc2l6ZSwKLSAgICAgKiBzaG91bGQgbm90IGhhcHBlbiwgYmVjYXVzZSBhbHJlYWR5IGRvbmUgaW4gTTR4VlNTX3NlbmRDb21tYW5kICovCi0gICAgZGVmYXVsdDoKLSAgICAgICAgd2lkdGhfb3V0ID0gMTc2OwotICAgICAgICBoZWlnaHRfb3V0ID0gMTQ0OwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBvdXRwdXQgcGxhbmVzIHN0cnVjdHVyZXMgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00VklGSV9JbWFnZVBsYW5lKSwgTTRWUywKLSAgICAgICAgIChNNE9TQV9DaGFyICopIkZyYW1pbmcgT3V0cHV0IHBsYW5lIFJHQiIpOwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXNpemUgUkdCIGlmIG5lZWRlZCAqLwotICAgIGlmKChwRWZmZWN0LT54VlNTLmJSZXNpemUpICYmCi0gICAgICAgICAocmdiUGxhbmUudV93aWR0aCAhPSB3aWR0aF9vdXQgfHwgcmdiUGxhbmUudV9oZWlnaHQgIT0gaGVpZ2h0X291dCkpCi0gICAgewotICAgICAgICB3aWR0aCA9IHdpZHRoX291dDsKLSAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0X291dDsKLQotICAgICAgICBNNE9TQV9UUkFDRTFfMigiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDogXAotICAgICAgICAgICAgIE5ldyBXaWR0aCBhbmQgaGVpZ2h0ICVkICVkICAiLHdpZHRoLGhlaWdodCk7Ci0KLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV9oZWlnaHQgPSBoZWlnaHRfb3V0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0gd2lkdGhfb3V0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3N0cmlkZSA9IGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfd2lkdGgqMjsKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV90b3BsZWZ0ID0gMDsKLQotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9Ci0gICAgICAgICAgICAgKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0KmZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICBGcmFtaW5nUmdiLT51X3dpZHRoKjIqc2l6ZW9mKE00VklGSV9VSW50OCksIE00VlMsCi0gICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJGcmFtaW5nIE91dHB1dCBwYWNfZGF0YSBSR0IiKTsKLQotICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMCgiQWxsb2NhdGlvbiBlcnJvciBpbiBcCi0gICAgICAgICAgICAgICAgTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCIpOwotICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6ICBSZXNpemluZyBOZWVkZWQgIik7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0QVJHQjg4OHRvWVVWNDIwX0ZyYW1taW5nRWZmZWN0OlwKLSAgICAgICAgICAgICAgcmdiUGxhbmUudV9oZWlnaHQgJiByZ2JQbGFuZS51X3dpZHRoICVkICVkIixyZ2JQbGFuZS51X2hlaWdodCxyZ2JQbGFuZS51X3dpZHRoKTsKLQotICAgICAgICAvL2VyciA9IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KE00T1NBX05VTEwsICZyZ2JQbGFuZSxmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiKTsKLSAgICAgICAgZXJyID0gTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUoTTRPU0FfTlVMTCwgJnJnYlBsYW5lLGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IpOwotCi0gICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCA6XAotICAgICAgICAgICAgICAgIHdoZW4gcmVzaXppbmcgUkdCIHBsYW5lOiAweCV4XG4iLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHJnYlBsYW5lLnBhY19kYXRhICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUocmdiUGxhbmUucGFjX2RhdGEpOwotICAgICAgICAgICAgcmdiUGxhbmUucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0KLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6XAotICAgICAgICAgICAgICBSZXNpemluZyBOb3QgTmVlZGVkICIpOwotCi0gICAgICAgIHdpZHRoID0gcmdiUGxhbmUudV93aWR0aDsKLSAgICAgICAgaGVpZ2h0ID0gcmdiUGxhbmUudV9oZWlnaHQ7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnVfc3RyaWRlID0gZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+dV93aWR0aCoyOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT51X3RvcGxlZnQgPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSA9IHJnYlBsYW5lLnBhY19kYXRhOwotICAgIH0KLQotCi0gICAgaWYocEVmZmVjdC0+eFZTUy5iUmVzaXplKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZvcmNlIHRvcGxlZnQgdG8gMCBmb3IgcHVyZSBmcmFtaW5nIGVmZmVjdCAqLwotICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3ggPSAwOwotICAgICAgICBmcmFtaW5nQ3R4LT50b3BsZWZ0X3kgPSAwOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCAgUkdCIG91dHB1dCB0byBZVVYgNDIwIHRvIGJlIGFibGUgdG8gbWVyZ2UgaXQgd2l0aCBvdXRwdXQgdmlkZW8gaW4gZnJhbWluZwotICAgICBlZmZlY3QgKi8KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ID0gKE00VklGSV9JbWFnZVBsYW5lKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoMypzaXplb2YoTTRWSUZJX0ltYWdlUGxhbmUpLCBNNFZTLAotICAgICAgICAgKE00T1NBX0NoYXIgKikiRnJhbWluZyBPdXRwdXQgcGxhbmUgWVVWIik7Ci0gICAgaWYoZnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdCIpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIC8vIEFsbG9jIGZvciBZLCBVIGFuZCBWIHBsYW5lcwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV93aWR0aCA9ICgod2lkdGgrMSk+PjEpPDwxOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQgPSAoKGhlaWdodCsxKT4+MSk8PDE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9zdHJpZGUgPSAoKHdpZHRoKzEpPj4xKTw8MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jCi0gICAgICAgICgoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X3dpZHRoKmZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0udV9oZWlnaHQpLCBNNFZTLAotICAgICAgICAgICAgKE00T1NBX0NoYXIgKikiQWxsb2MgZm9yIHRoZSBvdXRwdXQgWSIpOwotICAgIGlmKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3QiKTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICB9Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3dpZHRoID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0ID0gKCgoaGVpZ2h0KzEpPj4xKTw8MSk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS51X3RvcGxlZnQgPSAwOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0udV9zdHJpZGUgPSAoKCh3aWR0aCsxKT4+MSk8PDEpPj4xOwotCi0KLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnBhY19kYXRhID0gKE00VklGSV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfd2lkdGggKiBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzFdLnVfaGVpZ2h0LCBNNFZTLAotICAgICAgICAoTTRPU0FfQ2hhciAqKSJBbGxvYyBmb3IgdGhlIG91dHB1dCBVIik7Ci0gICAgaWYgKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMV0ucGFjX2RhdGEgPT0gTTRPU0FfTlVMTCkgewotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV93aWR0aCA9ICgoKHdpZHRoKzEpPj4xKTw8MSk+PjE7Ci0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X2hlaWdodCA9ICgoKGhlaWdodCsxKT4+MSk8PDEpPj4xOwotICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMl0udV90b3BsZWZ0ID0gMDsKLSAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlID0gKCgod2lkdGgrMSk+PjEpPDwxKT4+MTsKLQotCi0gICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9IChNNFZJRklfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS51X3dpZHRoICogZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS51X2hlaWdodCwgTTRWUywKLSAgICAgICAgKE00T1NBX0NoYXIgKikiQWxsb2MgZm9yIHRoZSAgb3V0cHV0IFYiKTsKLSAgICBpZiAoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSA9PSBNNE9TQV9OVUxMKSB7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgTTRPU0FfVFJBQ0UzXzAoIk00eFZTU19pbnRlcm5hbENvbnZlcnRBUkdCODg4dG9ZVVY0MjBfRnJhbW1pbmdFZmZlY3Q6XAotICAgICAgICBjb252ZXJ0IFJHQiB0byBZVVYgIik7Ci0KLSAgICAvL2VyciA9IE00VklGSV9SR0I4ODh0b1lVVjQyMChNNE9TQV9OVUxMLCBmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLCAgZnJhbWluZ0N0eC0+RnJhbWluZ1l1dik7Ci0gICAgZXJyID0gTTRWSUZJX1JHQjU2NXRvWVVWNDIwKE00T1NBX05VTEwsIGZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IsICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLQotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJTUFMgcG5nOiBlcnJvciB3aGVuIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWOiAweCV4XG4iLCBlcnIpOwotICAgIH0KLSAgICBNNE9TQV9UUkFDRTNfMCgiTTR4VlNTX2ludGVybmFsQ29udmVydEFSR0I4ODh0b1lVVjQyMF9GcmFtbWluZ0VmZmVjdDogIExlYXZpbmcgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlRWRpdGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIFZTUyBmb3IgZWRpdGluZwotICogQG5vdGUgICAgSXQgYWxzbyBzZXQgc3BlY2lhbCB4VlNTIGVmZmVjdCBhcyBleHRlcm5hbCBlZmZlY3RzIGZvciB0aGUgVlNTCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgKElOKSBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICogQHJldHVybiAgICBNNEVSUl9BTExPQzogQWxsb2NhdGlvbiBlcnJvciAobm8gbW9yZSBtZW1vcnkpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLXsKLSAgICBNNHhWU1NfQ29udGV4dCogeFZTU19jb250ZXh0ID0gKE00eFZTU19Db250ZXh0KilwQ29udGV4dDsKLSAgICBNNFZTUzNHUFBfRWRpdENvbnRleHQgcFZzc0N0eHQ7Ci0gICAgTTRPU0FfVUludDMyIGksajsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgVlNTIDNHUFAgZWRpdGlvbiBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9lZGl0SW5pdCggJnBWc3NDdHh0LCB4VlNTX2NvbnRleHQtPnBGaWxlUmVhZFB0ciwgeFZTU19jb250ZXh0LT5wRmlsZVdyaXRlUHRyKTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2VuZXJhdGVFZGl0ZWRGaWxlOiBNNFZTUzNHUFBfZWRpdEluaXQgcmV0dXJuZWQgMHgleFxuIiwKLSAgICAgICAgICAgIGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlIFZTUyBjb250ZXh0IHRvIE5VTEwgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAgICAgTTRWU1MzR1BQX0ludGVybmFsRWRpdENvbnRleHQqIHBWU1NDb250ZXh0ID0KLSAgICAgICAgICAgIChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCopcFZzc0N0eHQ7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dFZpZGVvRm9ybWF0ID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvRm9ybWF0OwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5vdXRwdXRWaWRlb1NpemUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9TaXplIDsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9Gb3JtYXQ7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvU2FtcGxGcmVxOwotICAgICAgICBwVlNTQ29udGV4dC0+eFZTUy5vdXRwdXRWaWRlb0JpdHJhdGUgPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0VmlkZW9CaXRyYXRlIDsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0QXVkaW9CaXRyYXRlID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZSA7Ci0gICAgICAgIHBWU1NDb250ZXh0LT54VlNTLmJBdWRpb01vbm8gPQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MuYkF1ZGlvTW9ubzsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0VmlkZW9Qcm9maWxlID0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dFZpZGVvUHJvZmlsZTsKLSAgICAgICAgcFZTU0NvbnRleHQtPnhWU1Mub3V0cHV0VmlkZW9MZXZlbCA9Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRWaWRlb0xldmVsOwotICAgIC8qIEluIGNhc2Ugb2YgTU1TIHVzZSBjYXNlLCB3ZSBmaWxsIGRpcmVjdGx5IGludG8gdGhlIFZTUyBjb250ZXh0IHRoZSB0YXJnZXRlZCBiaXRyYXRlICovCi0gICAgaWYoeFZTU19jb250ZXh0LT50YXJnZXRlZEJpdHJhdGUgIT0gMCkKLSAgICB7Ci0gICAgICAgIE00VlNTM0dQUF9JbnRlcm5hbEVkaXRDb250ZXh0KiBwVlNTQ29udGV4dCA9IChNNFZTUzNHUFBfSW50ZXJuYWxFZGl0Q29udGV4dCopcFZzc0N0eHQ7Ci0KLSAgICAgICAgcFZTU0NvbnRleHQtPmJJc01NUyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBWU1NDb250ZXh0LT51aU1NU1ZpZGVvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+dGFyZ2V0ZWRCaXRyYXRlOwotICAgICAgICBwVlNTQ29udGV4dC0+TU1TdmlkZW9GcmFtZXJhdGUgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+dmlkZW9GcmFtZVJhdGU7Ci0gICAgfQotCi0gICAgLypXYXJuaW5nOiBzaW5jZSB0aGUgYWRkaW5nIG9mIHRoZSBVVEYgY29udmVyc2lvbiwgcFNldHRpbmdzIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlIG5leHQKLSAgICBwYXJ0IGluICBwQ3VycmVudEVkaXRTZXR0aW5ncyAodGhlcmUgaXMgYSBzcGVjaWZpYyBjdXJyZW50IGVkaXRpbmcgc3RydWN0dXJlIGZvciB0aGUgc2F2aW5nLAotICAgICBhcyBmb3IgdGhlIHByZXZpZXcpKi8KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZXh0ZXJuYWwgdmlkZW8gZWZmZWN0IGZ1bmN0aW9ucywgZm9yIHNhdmluZyBtb2RlICh0byBiZSBtb3ZlZCB0bwotICAgICAgTTR4VlNTX3NhdmVTdGFydCgpID8pKi8KLSAgICBmb3IgKGk9MDsgaTx4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXI7IGkrKykKLSAgICB7Ci0gICAgICAgIGZvciAoaj0wOyBqPHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPm5iRWZmZWN0czsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZSA9PQotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZTsKLSAgICAgICAgICAgICAgICAvKmNvbW1lbnRlZCBGQiovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldAotICAgICAgICAgICAgICAgICBkdXJpbmcgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9QaW5rID09Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfUGluazsgLyoqPCB3ZSBkb24ndAotICAgICAgICAgICAgICAgIC8vIHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbiA9PQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYSA9PQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIC8vIChNNE9TQV9Wb2lkKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYTsKLSAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICBzZW5kQ29tbWFuZCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgPT0KLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgZnJhbWluZyBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZSA9PQotICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yOwotICAgICAgICAgICAgICAgIC8veFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dCA9Ci0gICAgICAgICAgICAgICAgLy8gKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX05lZ2F0aXZlOwotICAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qY29tbWVudGVkIEZCKi8KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGNvbG9yIGNvbnRleHQsIGl0IGlzIGFscmVhZHkgc2V0IGR1cmluZwotICAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9GcmFtaW5nID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZzsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBXZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGZyYW1pbmcgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nCi0gICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbUluID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPkVmZmVjdHNbal0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHNbal0uRXh0VmlkZW9FZmZlY3RGY3QgPQotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdFpvb207Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21JbjsgLyoqPCB3ZSBkb24ndCB1c2UgYW55Ci0gICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0ID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfWm9vbU91dDsgLyoqPCB3ZSBkb24ndCB1c2UgYW55Ci0gICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnRleHQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2ID09Ci0gICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5WaWRlb0VmZmVjdFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0c1tqXS5FeHRWaWRlb0VmZmVjdEZjdCA9Ci0gICAgICAgICAgICAgICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Q29sb3I7Ci0gICAgICAgICAgICAgICAgLy94VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+RWZmZWN0c1tqXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0ID0KLSAgICAgICAgICAgICAgICAvLyAoTTRPU0FfVm9pZCopTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQ29sb3JSR0IxNjsKLSAgICAgICAgICAgICAgICAvKio8IHdlIGRvbid0IHVzZSBhbnkgZnVuY3Rpb24gY29udGV4dCAqLwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgY29sb3IgY29udGV4dCwgaXQgaXMgYWxyZWFkeSBzZXQgZHVyaW5nCi0gICAgICAgICAgICAgICAgIHNlbmRDb21tYW5kIGZ1bmN0aW9uICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQgPT0KLSAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5FZmZlY3RzW2pdLkV4dFZpZGVvRWZmZWN0RmN0ID0KLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcjsKLSAgICAgICAgICAgICAgICAvL3hWU1NfY29udGV4dC0+cFNldHRpbmdzLT5FZmZlY3RzW2pdLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQgPQotICAgICAgICAgICAgICAgIC8vIChNNE9TQV9Wb2lkKilNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9Db2xvclJHQjE2OwotICAgICAgICAgICAgICAgIC8qKjwgd2UgZG9uJ3QgdXNlIGFueSBmdW5jdGlvbiBjb250ZXh0ICovCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogV2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSBjb2xvciBjb250ZXh0LCBpdCBpcyBhbHJlYWR5IHNldCBkdXJpbmcKLSAgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbiB0aGUgVlNTIDNHUFAgKi8KLSAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdE9wZW4ocFZzc0N0eHQsIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MpOwotICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUVkaXRlZEZpbGU6XAotICAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0T3BlbiByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlIFZTUyBjb250ZXh0IHRvIE5VTEwgKi8KLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIFZTUyBjb250ZXh0IHRvIGJlIGFibGUgdG8gY2xvc2UgLyBmcmVlIFZTUyBsYXRlciAqLwotICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IHBWc3NDdHh0OwotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGUoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgVlNTCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00VlNTM0dQUF9FZGl0Q29udGV4dCBwVnNzQ3R4dCA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2xvc2UgdGhlIFZTUyAzR1BQICovCi0gICAgICAgIGVyciA9IE00VlNTM0dQUF9lZGl0Q2xvc2UocFZzc0N0eHQpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDbG9zZUVkaXRlZEZpbGU6XAotICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfZWRpdENsb3NlIHJldHVybmVkIDB4JXhcbiIsZXJyKTsKLSAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcChwVnNzQ3R4dCk7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNldCB0aGUgVlNTIGNvbnRleHQgdG8gTlVMTCAqLwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSB0aGlzIFZTUzNHUFAgZWRpdGlvbiBpbnN0YW5jZSAqLwotICAgICAgICBlcnIgPSBNNFZTUzNHUFBfZWRpdENsZWFuVXAocFZzc0N0eHQpOwotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBWU1MgY29udGV4dCB0byBOVUxMICovCi0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0Q29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIGlmIChlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbENsb3NlRWRpdGVkRmlsZTogXAotICAgICAgICAgICAgICAgIE00VlNTM0dQUF9lZGl0Q2xlYW5VcCByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZW5lcmF0ZUF1ZGlvTWl4RmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIFZTUyBmb3IgYXVkaW8gbWl4aW5nCi0gKiBAbm90ZSAgICBJdCB0YWtlcyBpdHMgcGFyYW1ldGVycyBmcm9tIHRoZSBCR00gc2V0dGluZ3MgaW4gdGhlIHhWU1MgaW50ZXJuYWwgY29udGV4dAotICogQHBhcmFtICAgIHBDb250ZXh0ICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1I6ICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUjogQXQgbGVhc3Qgb25lIG9mIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlzIG51bGwKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0M6IEFsbG9jYXRpb24gZXJyb3IgKG5vIG1vcmUgbWVtb3J5KQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0vKioqCi0gKiBGQjogdGhlIGZ1bmN0aW9uIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBzdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIHNhdmluZyBpcyBub3cgdGhlCi0gKiAgcEN1cnJlbnRFZGl0U2V0dGluZ3MgYW5kIG5vdCB0aGUgcFNldHRpbmdzCi0gKiBUaGlzIGNoYW5nZSBoYXMgYmVlbiBhZGRlZCBmb3IgdGhlIFVURiBzdXBwb3J0Ci0gKiBBbGwgdGhlICJ4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgInhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MiCi0gKioqLwotTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MqIHBBdWRpb01peFNldHRpbmdzOwotICAgIE00VlNTM0dQUF9BdWRpb01peGluZ0NvbnRleHQgcEF1ZGlvTWl4aW5nQ3R4dDsKLSAgICBNNE9TQV9FUlIgZXJyOwotICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzIGZpbGVQcm9wZXJ0aWVzOwotCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGUgYXVkaW8gbWl4aW5nIHNldHRpbmdzIHN0cnVjdHVyZSBhbmQgZmlsbCBpdCB3aXRoIEJHTSBwYXJhbWV0ZXJzICovCi0gICAgcEF1ZGlvTWl4U2V0dGluZ3MgPSAoTTRWU1MzR1BQX0F1ZGlvTWl4aW5nU2V0dGluZ3MqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYwotICAgICAgICAoc2l6ZW9mKE00VlNTM0dQUF9BdWRpb01peGluZ1NldHRpbmdzKSwgTTRWUywgKE00T1NBX0NoYXIgKikicEF1ZGlvTWl4U2V0dGluZ3MiKTsKLSAgICBpZihwQXVkaW9NaXhTZXR0aW5ncyA9PSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsR2VuZXJhdGVBdWRpb01peEZpbGUiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5GaWxlVHlwZSA9PQotICAgICAgICAgTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFApCi0gICAgewotICAgICAgICBlcnIgPSBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzKChNNE9TQV9Db250ZXh0KXhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAoTTRPU0FfQ2hhciopeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlLAotICAgICAgICAgICAgICAgICAmZmlsZVByb3BlcnRpZXMpOwotICAgICAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlOlwKLSAgICAgICAgICAgICAgICAgaW1wb3NzaWJsZSB0byByZXRyaWV2ZSBhdWRpbyBCR00gcHJvcGVydGllcyAtPlwKLSAgICAgICAgICAgICAgICAgICAgIHJlZW5jb2RpbmcgYXVkaW8gYmFja2dyb3VuZCBtdXNpYyIsIGVycik7Ci0gICAgICAgICAgICBmaWxlUHJvcGVydGllcy5BdWRpb1N0cmVhbVR5cGUgPQotICAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvRm9ybWF0KzE7Ci0gICAgICAgICAgICAgICAgICAvKiBUbyBmb3JjZSBCR00gZW5jb2RpbmcgKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIHBBdWRpb01peFNldHRpbmdzLT5iUmVtb3ZlT3JpZ2luYWwgPSBNNE9TQV9GQUxTRTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+QWRkZWRBdWRpb0ZpbGVUeXBlID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkZpbGVUeXBlOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5wQWRkZWRBdWRpb1RyYWNrRmlsZSA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRWb2x1bWUgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWU7Ci0KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0QXVkaW9Gb3JtYXQgPSB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5vdXRwdXRBdWRpb0Zvcm1hdDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0QVNGID0geFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1Mub3V0cHV0QXVkaW9TYW1wbEZyZXE7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dEF1ZGlvQml0cmF0ZSA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLm91dHB1dEF1ZGlvQml0cmF0ZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlTYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlTYW1wbGluZ0ZyZXF1ZW5jeTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlOdW1DaGFubmVscyA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlOdW1DaGFubmVsczsKLQotICAgIHBBdWRpb01peFNldHRpbmdzLT5iX0R1Y2tpbmdOZWVkZWVkID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPmJfRHVja2luZ05lZWRlZWQ7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPmZCVFZvbExldmVsID0KLSAgICAgKE00T1NBX0Zsb2F0ICl4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRWb2x1bWUvMTAwOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5JbkR1Y2tpbmdfdGhyZXNob2xkID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPkluRHVja2luZ190aHJlc2hvbGQ7Ci0gICAgcEF1ZGlvTWl4U2V0dGluZ3MtPkluRHVja2luZ19sb3dWb2x1bWUgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+bG93Vm9sdW1lLzEwMDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+ZlBUVm9sTGV2ZWwgPQotICAgICAoTTRPU0FfRmxvYXQpeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPlBUVm9sTGV2ZWwvMTAwOwotICAgIHBBdWRpb01peFNldHRpbmdzLT5iTG9vcCA9IHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+Ykxvb3A7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5iQXVkaW9Nb25vKQotICAgIHsKLSAgICAgICAgcEF1ZGlvTWl4U2V0dGluZ3MtPm91dHB1dE5CQ2hhbm5lbHMgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwQXVkaW9NaXhTZXR0aW5ncy0+b3V0cHV0TkJDaGFubmVscyA9IDI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbCBhdWRpbyBtaXggc2V0dGluZ3Mgd2l0aCBCR00gcGFyYW1ldGVycyAqLwotICAgIHBBdWRpb01peFNldHRpbmdzLT51aUJlZ2luTG9vcCA9Ci0gICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT51aUJlZ2luTG9vcDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlFbmRMb29wID0KLSAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnVpRW5kTG9vcDsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+dWlBZGRDdHMgPQotICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+dWlBZGRDdHM7Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgZmlsZSBvZiB0aGUgYXVkaW8gbWl4ZXIgd2lsbCBiZSBmaW5hbCBmaWxlIChhdWRpbyBtaXhpbmcgaXMgdGhlIGxhc3Qgc3RlcCkgKi8KLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+cE91dHB1dENsaXBGaWxlID0geFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZTsKLSAgICBwQXVkaW9NaXhTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUgPSB4VlNTX2NvbnRleHQtPnBUZW1wb3JhcnlGaWxlOwotCi0gICAgLyoqCi0gICAgICogSW5wdXQgZmlsZSBvZiB0aGUgYXVkaW8gbWl4ZXIgaXMgYSB0ZW1wb3JhcnkgZmlsZSBjb250YWluaW5nIGFsbCBhdWRpby92aWRlbyBlZGl0aW9ucyAqLwotICAgIHBBdWRpb01peFNldHRpbmdzLT5wT3JpZ2luYWxDbGlwRmlsZSA9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlOwotCi0gICAgLyoqCi0gICAgICogU2F2ZSBhdWRpbyBtaXhpbmcgc2V0dGluZ3MgcG9pbnRlciB0byBiZSBhYmxlIHRvIGZyZWUgaXQgaW4KLSAgICAgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZSBmdW5jdGlvbiAqLwotICAgIHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4U2V0dGluZ3MgPSBwQXVkaW9NaXhTZXR0aW5nczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFZTUyAzR1BQIGF1ZGlvIG1peGluZyBpbnN0YW5jZSAqLwotICAgIGVyciA9IE00VlNTM0dQUF9hdWRpb01peGluZ0luaXQoJnBBdWRpb01peGluZ0N0eHQsIHBBdWRpb01peFNldHRpbmdzLAotICAgICAgICAgeFZTU19jb250ZXh0LT5wRmlsZVJlYWRQdHIsIHhWU1NfY29udGV4dC0+cEZpbGVXcml0ZVB0cik7Ci0KLSAgICAvKioKLSAgICAgKiBTYXZlIGF1ZGlvIG1peGluZyBjb250ZXh0IHRvIGJlIGFibGUgdG8gY2FsbCBhdWRpbyBtaXhpbmcgc3RlcCBmdW5jdGlvbiBpbgotICAgICAgTTR4VlNTX3N0ZXAgZnVuY3Rpb24gKi8KLSAgICB4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQgPSBwQXVkaW9NaXhpbmdDdHh0OwotCi0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdlbmVyYXRlQXVkaW9NaXhGaWxlOlwKLSAgICAgICAgICAgICBNNFZTUzNHUFBfYXVkaW9NaXhpbmdJbml0IHJldHVybmVkIDB4JXhcbiIsZXJyKTsKLSAgICAgICAgLy9NNFZTUzNHUFBfYXVkaW9NaXhpbmdDbGVhblVwKHBBdWRpb01peGluZ0N0eHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ2xvc2VBdWRpb01peGVkRmlsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBWU1MgZm9yIGF1ZGlvIG1peGluZwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIC8qKgotICAgICAqIEZyZWUgdGhpcyBWU1MzR1BQIGF1ZGlvIG1peGluZyBpbnN0YW5jZSAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEF1ZGlvTWl4Q29udGV4dCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZXJyID0gTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCh4VlNTX2NvbnRleHQtPnBBdWRpb01peENvbnRleHQpOwotICAgICAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDbG9zZUF1ZGlvTWl4ZWRGaWxlOlwKLSAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX2F1ZGlvTWl4aW5nQ2xlYW5VcCByZXR1cm5lZCAweCV4XG4iLGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBWU1MgYXVkaW8gbWl4aW5nIHNldHRpbmdzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wQXVkaW9NaXhTZXR0aW5ncyAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBBdWRpb01peFNldHRpbmdzKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQXVkaW9NaXhTZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlUHJldmlldyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBwcmV2aWV3IGVkaXRpb24gc3RydWN0dXJlIHVzZWQgdG8gZ2VuZXJhdGUKLSAqICAgICAgICAgICAgcHJldmlldy4zZ3AgZmlsZSBnaXZlbiB0byB0aGUgVlBTCi0gKiBAbm90ZSAgICBJdCBhbHNvIGZyZWUgdGhlIHByZXZpZXcgc3RydWN0dXJlIGdpdmVuIHRvIHRoZSBWUFMKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlUHJldmlldyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotewotICAgIE00eFZTU19Db250ZXh0KiB4VlNTX2NvbnRleHQgPSAoTTR4VlNTX0NvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX1VJbnQ4IGk7Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgIGZvcihpPTA7IGk8eFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKyspCi0gICAgewotICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pOwotCi0gICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdFtpXSkpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0gPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCZWNhdXNlIHRoZXJlIGlzIDEgbGVzcyB0cmFuc2l0aW9uIHRoYW4gY2xpcCBudW1iZXIgKi8KLSAgICAgICAgaWYoaSAhPSB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT51aUNsaXBOdW1iZXItMSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0gPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBjbGlwL3RyYW5zaXRpb24gbGlzdCAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cENsaXBMaXN0KSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0KSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSBvdXRwdXQgcHJldmlldyBmaWxlIHBhdGggKi8KLSAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRlbXBvcmFyeSBwcmV2aWV3IGZpbGUgcGF0aCAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRlbXBvcmFyeUZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSAibG9jYWwiIEJHTSBzZXR0aW5ncyAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrKTsKLSAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgY3VycmVudCBlZGl0IHNldHRpbmdzIHN0cnVjdHVyZSAqLwotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgcHJldmlldyBlZmZlY3RzIGdpdmVuIHRvIGFwcGxpY2F0aW9uICovCi0gICAgaWYoTTRPU0FfTlVMTCAhPSB4VlNTX2NvbnRleHQtPnBQcmV2aWV3U2V0dGluZ3MtPkVmZmVjdHMpCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+RWZmZWN0cyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFByZXZpZXdTZXR0aW5ncy0+bmJFZmZlY3RzID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsRnJlZVNhdmluZyhNNE9TQV9Db250ZXh0IHBDb250ZXh0KQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBzYXZpbmcgZWRpdGlvbiBzdHJ1Y3R1cmUgdXNlZCB0byBnZW5lcmF0ZQotICogICAgICAgICAgICBvdXRwdXQuM2dwIGZpbGUgZ2l2ZW4gdG8gdGhlIFZQUwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxGcmVlU2F2aW5nKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfVUludDggaTsKLQotICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBmb3IoaT0wOyBpPHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpQ2xpcE51bWJlcjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pOwotCi0gICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3RbaV0pKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgICAgICBpZihpICE9IHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnVpQ2xpcE51bWJlci0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoXAotICAgICAgICAgICAgICAgICAgICAoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldKSk7Ci0gICAgICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlIGNsaXAvdHJhbnNpdGlvbiBsaXN0ICovCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcmVlKCh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wQ2xpcExpc3QpKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBDbGlwTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCkpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPkVmZmVjdHMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZSgoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0cykpOwotICAgICAgICAgICAgeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+RWZmZWN0cyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5uYkVmZmVjdHMgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZyZWUgb3V0cHV0IHNhdmluZyBmaWxlIHBhdGggKi8KLSAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+cE91dHB1dEZpbGUgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2sgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wT3V0cHV0RmlsZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSB0ZW1wb3Jhcnkgc2F2aW5nIGZpbGUgcGF0aCAqLwotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKil4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT5wVGVtcG9yYXJ5RmlsZSk7Ci0gICAgICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlKTsKLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnBUZW1wb3JhcnlGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGcmVlICJsb2NhbCIgQkdNIHNldHRpbmdzICovCi0gICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlKTsKLSAgICAgICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjay0+cEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBDdXJyZW50RWRpdFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSBjdXJyZW50IGVkaXQgc2V0dGluZ3Mgc3RydWN0dXJlICovCi0gICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wQ3VycmVudEVkaXRTZXR0aW5ncyk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cEN1cnJlbnRFZGl0U2V0dGluZ3MgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfZnJlZVNldHRpbmdzKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIGFuIE00VlNTM0dQUF9FZGl0U2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBTZXR0aW5ncyAgICAoSU4pIFBvaW50ZXIgb24gTTRWU1MzR1BQX0VkaXRTZXR0aW5ncyBzdHJ1Y3R1cmUgdG8gZnJlZQotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVTZXR0aW5ncyhNNFZTUzNHUFBfRWRpdFNldHRpbmdzKiBwU2V0dGluZ3MpCi17Ci0gICAgTTRPU0FfVUludDggaSxqOwotCi0gICAgLyoqCi0gICAgICogRm9yIGVhY2ggY2xpcCAuLi4gKi8KLSAgICBmb3IoaT0wOyBpPHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyOyBpKyspCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGZyZWUgY2xpcCBzZXR0aW5ncyAqLwotICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNHhWU1NfRnJlZUNsaXBTZXR0aW5ncyhwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSk7Ci0KLSAgICAgICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldKSk7Ci0gICAgICAgICAgICBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGZyZWUgdHJhbnNpdGlvbiBzZXR0aW5ncyAqLwotICAgICAgICBpZihpIDwgcFNldHRpbmdzLT51aUNsaXBOdW1iZXItMSkgLyogQmVjYXVzZSB0aGVyZSBpcyAxIGxlc3MgdHJhbnNpdGlvbiB0aGFuIGNsaXAgbnVtYmVyICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+VmlkZW9UcmFuc2l0aW9uVHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb1RyYW5zaXRpb25UeXBlX0FscGhhTWFnaWM6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogSW4gY2FzZSBvZiBBbHBoYSBNYWdpYyB0cmFuc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lIGV4dHJhIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBmcmVlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoKCgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGxhbmUtPnBhY19kYXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCktPnBQbGFuZS0+cGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgoKChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKilcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCktPnBQbGFuZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyopcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV1cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpLT5wUGxhbmUgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGo9aSsxO2o8cFNldHRpbmdzLT51aUNsaXBOdW1iZXItMTtqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXSAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+VmlkZW9UcmFuc2l0aW9uVHlwZSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19rVmlkZW9UcmFuc2l0aW9uVHlwZV9BbHBoYU1hZ2ljKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBwQ21wUmVzdWx0PTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENtcFJlc3VsdCA9IHN0cmNtcCgoY29uc3QgY2hhciAqKXBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtqXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDbXBSZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyZWUgZXh0cmEgaW50ZXJuYWwgYWxwaGEgbWFnaWMgc3RydWN0dXJlIGFuZCBwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgdG8gTlVMTCB0byBhdm9pZCByZWZyZWVpbmcgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSgocFNldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNpdGlvbkxpc3Rbal0tPnBFeHRWaWRlb1RyYW5zaXRpb25GY3RDdHh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2pdLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQWxwaGFGaWxlUGF0aCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBBbHBoYU1hZ2ljU2V0dGluZ3MtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFscGhhRmlsZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFZTUy50cmFuc2l0aW9uU3BlY2lmaWMucEFscGhhTWFnaWNTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYUZpbGVQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wQWxwaGFNYWdpY1NldHRpbmdzID0gTTRPU0FfTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvVHJhbnNpdGlvblR5cGVfU2xpZGVUcmFuc2l0aW9uOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcFNldHRpbmdzLT5wVHJhbnNpdGlvbkxpc3RbaV0tPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4VlNTLnRyYW5zaXRpb25TcGVjaWZpYy5wU2xpZGVUcmFuc2l0aW9uU2V0dGluZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhWU1MudHJhbnNpdGlvblNwZWNpZmljLnBTbGlkZVRyYW5zaXRpb25TZXR0aW5ncyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+cEV4dFZpZGVvVHJhbnNpdGlvbkZjdEN0eHQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldLT5wRXh0VmlkZW9UcmFuc2l0aW9uRmN0Q3R4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEZyZWUgdHJhbnNpdGlvbiBzZXR0aW5ncyBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdFtpXSkpOwotICAgICAgICAgICAgICAgIHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0W2ldID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZyZWUgY2xpcCBsaXN0ICovCi0gICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIGZyZWUoKHBTZXR0aW5ncy0+cENsaXBMaXN0KSk7Ci0gICAgICAgIHBTZXR0aW5ncy0+cENsaXBMaXN0ID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGcmVlIHRyYW5zaXRpb24gbGlzdCAqLwotICAgIGlmKHBTZXR0aW5ncy0+cFRyYW5zaXRpb25MaXN0ICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKChwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCkpOwotICAgICAgICBwU2V0dGluZ3MtPnBUcmFuc2l0aW9uTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUkM6IEZyZWUgZWZmZWN0cyBsaXN0ICovCi0gICAgaWYocFNldHRpbmdzLT5FZmZlY3RzICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmb3IoaT0wOyBpPHBTZXR0aW5ncy0+bmJFZmZlY3RzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRm9yIGVhY2ggY2xpcCwgZnJlZSBmcmFtaW5nIHN0cnVjdHVyZSBpZiBuZWVkZWQgKi8KLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfRnJhbWluZwotICAgICAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUgPT0gTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfVGV4dCkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nQ29udGV4dCogZnJhbWluZ0N0eCA9IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0OwotI2Vsc2UKLSAgICAgICAgICAgICAgICBNNHhWU1NfRnJhbWluZ1N0cnVjdCogZnJhbWluZ0N0eCA9IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5wRXh0VmlkZW9FZmZlY3RGY3RDdHh0OwotICAgICAgICAgICAgICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBmcmFtaW5nQ3R4X3NhdmU7Ci0gICAgICAgICAgICAgICAgTTR4VlNTX0ZyYW1pbmczMTAyU3RydWN0KiBmcmFtaW5nQ3R4X2ZpcnN0ID0gZnJhbWluZ0N0eDsKLSNlbmRpZgotCi0jaWZkZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4ICE9IE00T1NBX05VTEwpIC8qIEJ1Z2ZpeCAxLjIuMDogY3Jhc2gsIHRyeWluZyB0byBmcmVlIG5vbiBleGlzdGFudAotICAgICAgICAgICAgICAgICBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2IgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdSZ2ItPnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nUmdiID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1l1dlswXS5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHgtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtaW5nWXV2WzFdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdZdXZbMl0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzJdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4LT5GcmFtaW5nWXV2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2IgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JnYi0+cGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdSZ2ItPnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5GcmFtaW5nWXV2ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hRnJhbWluZ0N0eF9sYXN0LT5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1pbmdZdXZbMF0ucGFjX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QtPkZyYW1pbmdZdXZbMF0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1l1dik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdC0+RnJhbWluZ1l1diA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPmFGcmFtaW5nQ3R4X2xhc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+YUZyYW1pbmdDdHhfbGFzdCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+cEVmZmVjdEZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPnBFZmZlY3RGaWxlUGF0aCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLypJbiBjYXNlIHRoZXJlIGFyZSBzdGlsbCBhbGxvY2F0ZWQqLwotICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5wU1BTQ29udGV4dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIE00U1BTX2Rlc3Ryb3koZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+cFNQU0NvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qQWxwaGEgYmxlbmRpbmcgc3RydWN0dXJlKi8KLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eC0+YWxwaGFCbGVuZGluZ1N0cnVjdCAgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5hbHBoYUJsZW5kaW5nU3RydWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPmFscGhhQmxlbmRpbmdTdHJ1Y3QgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWluZ0N0eCAhPSBNNE9TQV9OVUxMKSAvKiBCdWdmaXggMS4yLjA6IGNyYXNoLCB0cnlpbmcgdG8gZnJlZSBub24KLSAgICAgICAgICAgICAgICAgICAgZXhpc3RhbnQgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nUmdiLT5wYWNfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYi0+cGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZnJhbWluZ0N0eC0+RnJhbWluZ1JnYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eC0+RnJhbWluZ1JnYiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4LT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1pbmdDdHgtPkZyYW1pbmdZdXYgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eF9zYXZlID0gZnJhbWluZ0N0eC0+cE5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGZyYW1pbmdDdHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWluZ0N0eCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtaW5nQ3R4ID0gZnJhbWluZ0N0eF9zYXZlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLypGQjogYnVnIGZpeCBQNE1FMDAwMDMwMDIqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IHdoaWxlKGZyYW1pbmdDdHhfZmlyc3QgIT0gZnJhbWluZ0N0eCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0ZpZnRpZXMgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBGcmVlIEZpZnRpZXMgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19GaWZ0aWVzU3RydWN0KiBGaWZ0aWVzQ3R4ID0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLnBFeHRWaWRlb0VmZmVjdEZjdEN0eHQ7Ci0KLSAgICAgICAgICAgICAgICBpZihGaWZ0aWVzQ3R4ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKEZpZnRpZXNDdHgpOwotICAgICAgICAgICAgICAgICAgICBGaWZ0aWVzQ3R4ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTYgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0JsYWNrQW5kV2hpdGUgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1BpbmsgPT0gcFNldHRpbmdzLT5FZmZlY3RzW2ldLlZpZGVvRWZmZWN0VHlwZQotICAgICAgICAgICAgICAgIHx8IE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyZWVuID09IHBTZXR0aW5ncy0+RWZmZWN0c1tpXS5WaWRlb0VmZmVjdFR5cGUKLSAgICAgICAgICAgICAgICB8fCBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYSA9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgfHwgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfTmVnYXRpdmU9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlCi0gICAgICAgICAgICAgICAgfHwgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfR3JhZGllbnQ9PSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0uVmlkZW9FZmZlY3RUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEZyZWUgQ29sb3IgY29udGV4dCAqLwotICAgICAgICAgICAgICAgIE00eFZTU19Db2xvclN0cnVjdCogQ29sb3JDdHggPSBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ucEV4dFZpZGVvRWZmZWN0RmN0Q3R4dDsKLQotICAgICAgICAgICAgICAgIGlmKENvbG9yQ3R4ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcmVlKENvbG9yQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgQ29sb3JDdHggPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogRnJlZSBzaW1wbGUgZmllbGRzICovCi0gICAgICAgICAgICBpZihwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0ZpbGVQYXRoID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBGcmFtaW5nQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wRnJhbWluZ0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgcFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucEZyYW1pbmdCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFNldHRpbmdzLT5FZmZlY3RzW2ldLnhWU1MucFRleHRCdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBTZXR0aW5ncy0+RWZmZWN0c1tpXS54VlNTLnBUZXh0QnVmZmVyKTsKLSAgICAgICAgICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHNbaV0ueFZTUy5wVGV4dEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShwU2V0dGluZ3MtPkVmZmVjdHMpOwotICAgICAgICBwU2V0dGluZ3MtPkVmZmVjdHMgPSBNNE9TQV9OVUxMOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgTTR4VlNTX2ZyZWVDb21tYW5kKE00T1NBX0NvbnRleHQgcENvbnRleHQpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0vLyAgICBNNE9TQV9VSW50OCBpLGo7Ci0KLSAgICAvKiBGcmVlICJsb2NhbCIgQkdNIHNldHRpbmdzICovCi0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBpZih4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnhWU1MucEJHTXRyYWNrLT5wRmlsZSk7Ci0gICAgICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+eFZTUy5wQkdNdHJhY2stPnBGaWxlID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayk7Ci0gICAgICAgIHhWU1NfY29udGV4dC0+cFNldHRpbmdzLT54VlNTLnBCR010cmFjayA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgTTR4VlNTX2ZyZWVTZXR0aW5ncyh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncyk7Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgTTR4VlNTX1B0bzNHUFBfcGFyYW1zKiBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wUFRvM0dQUHBhcmFtc0xpc3Q7Ci0gICAgICAgIE00eFZTU19QdG8zR1BQX3BhcmFtcyogcFBhcmFtc19zYXV2OwotCi0gICAgICAgIHdoaWxlKHBQYXJhbXMgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVJbiAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyZWUocFBhcmFtcy0+cEZpbGVJbik7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVJbiA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwUGFyYW1zLT5wRmlsZU91dCAhPSBNNE9TQV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERlbGV0ZSB0ZW1wb3JhcnkgZmlsZSAqLwotICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlT3V0KTsKLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZU91dCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwUGFyYW1zLT5wRmlsZVRlbXAgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSNpZmRlZiBNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFCi0gICAgICAgICAgICAgICAgcmVtb3ZlKChjb25zdCBjaGFyICopcFBhcmFtcy0+cEZpbGVUZW1wKTsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0jZW5kaWYvKk00eFZTU19SRVNFUlZFRF9NT09WX0RJU0tfU1BBQ0UqLwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlVGVtcCA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGFyYW1zX3NhdXYgPSBwUGFyYW1zOwotICAgICAgICAgICAgcFBhcmFtcyA9IHBQYXJhbXMtPnBOZXh0OwotICAgICAgICAgICAgZnJlZShwUGFyYW1zX3NhdXYpOwotICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00eFZTU19NQ1NfcGFyYW1zKiBwUGFyYW1zID0geFZTU19jb250ZXh0LT5wTUNTcGFyYW1zTGlzdDsKLSAgICAgICAgTTR4VlNTX01DU19wYXJhbXMqIHBQYXJhbXNfc2F1djsKLQotICAgICAgICB3aGlsZShwUGFyYW1zICE9IE00T1NBX05VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBGaWxlSW4gIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBQYXJhbXMtPnBGaWxlSW4pOwotICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBGaWxlSW4gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVPdXQgIT0gTTRPU0FfTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSAgICAgICAgICAgICAgICByZW1vdmUoKGNvbnN0IGNoYXIgKilwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZU91dCk7Ci0gICAgICAgICAgICAgICAgcFBhcmFtcy0+cEZpbGVPdXQgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocFBhcmFtcy0+cEZpbGVUZW1wICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRGVsZXRlIHRlbXBvcmFyeSBmaWxlICovCi0jaWZkZWYgTTR4VlNTX1JFU0VSVkVEX01PT1ZfRElTS19TUEFDRQotICAgICAgICAgICAgICAgIHJlbW92ZSgoY29uc3QgY2hhciAqKXBQYXJhbXMtPnBGaWxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgZnJlZShwUGFyYW1zLT5wRmlsZVRlbXApOwotI2VuZGlmLypNNHhWU1NfUkVTRVJWRURfTU9PVl9ESVNLX1NQQUNFKi8KLSAgICAgICAgICAgICAgICBwUGFyYW1zLT5wRmlsZVRlbXAgPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFBhcmFtc19zYXV2ID0gcFBhcmFtczsKLSAgICAgICAgICAgIHBQYXJhbXMgPSBwUGFyYW1zLT5wTmV4dDsKLSAgICAgICAgICAgIGZyZWUocFBhcmFtc19zYXV2KTsKLSAgICAgICAgICAgIHBQYXJhbXNfc2F1diA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZih4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBmcmVlKHhWU1NfY29udGV4dC0+cGNtUHJldmlld0ZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBjbVByZXZpZXdGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgaWYoeFZTU19jb250ZXh0LT5wU2V0dGluZ3MtPnBPdXRwdXRGaWxlICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5wT3V0cHV0RmlsZSAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgZnJlZSh4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUpOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBTZXR0aW5ncy0+cE91dHB1dEZpbGUgPSBNNE9TQV9OVUxMOwotICAgICAgICB4VlNTX2NvbnRleHQtPnBPdXRwdXRGaWxlID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBSZWluaXQgYWxsIGNvbnRleHQgdmFyaWFibGVzICovCi0gICAgeFZTU19jb250ZXh0LT5wcmV2aW91c0NsaXBOdW1iZXIgPSAwOwotICAgIHhWU1NfY29udGV4dC0+ZWRpdGluZ1N0ZXAgPSBNNHhWU1Nfa01pY3JvU3RhdGVFZGl0aW5nOwotICAgIHhWU1NfY29udGV4dC0+YW5hbHlzZVN0ZXAgPSBNNHhWU1Nfa01pY3JvU3RhdGVBbmFseXNlUHRvM0dQUDsKLSAgICB4VlNTX2NvbnRleHQtPnBQVG8zR1BQcGFyYW1zTGlzdCA9IE00T1NBX05VTEw7Ci0gICAgeFZTU19jb250ZXh0LT5wUFRvM0dQUGN1cnJlbnRQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cE1DU3BhcmFtc0xpc3QgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+cE1DU2N1cnJlbnRQYXJhbXMgPSBNNE9TQV9OVUxMOwotICAgIHhWU1NfY29udGV4dC0+dGVtcEZpbGVJbmRleCA9IDA7Ci0gICAgeFZTU19jb250ZXh0LT50YXJnZXRlZFRpbWVzY2FsZSA9IDA7Ci0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRPU0FfRVJSIE00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXMoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfQ2hhciogcEZpbGUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gcmV0cmlldmUgcHJvcGVydGllcyBvZiBhbiBpbnB1dCAzR1AgZmlsZSB1c2luZyBNQ1MKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgcENvbnRleHQgICAgICAgIChJTikgVGhlIGludGVncmF0b3Igb3duIGNvbnRleHQKLSAqIEBwYXJhbSAgICBwRmlsZSAgICAgICAgICAgIChJTikgM0dQIGZpbGUgdG8gYW5hbHlzZQotICogQHBhcmFtICAgIHBGaWxlUHJvcGVydGllcyAgICAoSU4vT1VUKSBQb2ludGVyIG9uIGEgc3RydWN0dXJlIHRoYXQgd2lsbCBjb250YWluCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgM0dQIGZpbGUgcHJvcGVydGllcwotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyhNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9DaGFyKiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklERU9FRElUSU5HX0NsaXBQcm9wZXJ0aWVzICpwRmlsZVByb3BlcnRpZXMpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE1DU19Db250ZXh0IG1jc19jb250ZXh0OwotCi0gICAgZXJyID0gTTRNQ1NfaW5pdCgmbWNzX2NvbnRleHQsIHhWU1NfY29udGV4dC0+cEZpbGVSZWFkUHRyLCB4VlNTX2NvbnRleHQtPnBGaWxlV3JpdGVQdHIpOwotICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXM6IEVycm9yIGluIE00TUNTX2luaXQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qb3BlbiB0aGUgTUNTIGluIHRoZSAibm9ybWFsIG9wZW5pbmciIG1vZGUgdG8gcmV0cmlldmUgdGhlIGV4YWN0IGR1cmF0aW9uKi8KLSAgICBlcnIgPSBNNE1DU19vcGVuX25vcm1hbE1vZGUobWNzX2NvbnRleHQsIHBGaWxlLCBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfM0dQUCwKLSAgICAgICAgTTRPU0FfTlVMTCwgTTRPU0FfTlVMTCk7Ci0gICAgaWYgKGVyciAhPSBNNE5PX0VSUk9SKQotICAgIHsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzEoIk00eFZTU19pbnRlcm5hbEdldFByb3BlcnRpZXM6IEVycm9yIGluIE00TUNTX29wZW46IDB4JXgiLCBlcnIpOwotICAgICAgICBNNE1DU19hYm9ydChtY3NfY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gTTRNQ1NfZ2V0SW5wdXRGaWxlUHJvcGVydGllcyhtY3NfY29udGV4dCwgcEZpbGVQcm9wZXJ0aWVzKTsKLSAgICBpZihlcnIgIT0gTTROT19FUlJPUikKLSAgICB7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8xKCJFcnJvciBpbiBNNE1DU19nZXRJbnB1dEZpbGVQcm9wZXJ0aWVzOiAweCV4IiwgZXJyKTsKLSAgICAgICAgTTRNQ1NfYWJvcnQobWNzX2NvbnRleHQpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVyciA9IE00TUNTX2Fib3J0KG1jc19jb250ZXh0KTsKLSAgICBpZiAoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgewotICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllczogRXJyb3IgaW4gTTRNQ1NfYWJvcnQ6IDB4JXgiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBUYXJnZXRlZFRpbWVTY2FsZSkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZSB0YXJnZXRlZCB0aW1lIHNjYWxlCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAgICAgKElOKSAgICBUaGUgaW50ZWdyYXRvciBvd24gY29udGV4dAotICogQHBhcmFtICAgIHBUYXJnZXRlZFRpbWVTY2FsZSAgICAoT1VUKSAgICBUYXJnZXRlZCB0aW1lIHNjYWxlCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SOiAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6IEF0IGxlYXN0IG9uZSBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBudWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FZGl0U2V0dGluZ3MqIHBTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyKiBwVGFyZ2V0ZWRUaW1lU2NhbGUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgdG90YWxEdXJhdGlvbiA9IDA7Ci0gICAgTTRPU0FfVUludDggaSA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHRlbXBUaW1lU2NhbGUgPSAwLCB0ZW1wRHVyYXRpb24gPSAwOwotCi0gICAgZm9yKGk9MDtpPHBTZXR0aW5ncy0+dWlDbGlwTnVtYmVyO2krKykKLSAgICB7Ci0gICAgICAgIC8qc2VhcmNoIHRpbWVzY2FsZSBvbmx5IGluIG1wZWc0IGNhc2UqLwotICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlXzNHUFAKLSAgICAgICAgICAgIHx8IHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT5GaWxlVHlwZSA9PSBNNFZJREVPRURJVElOR19rRmlsZVR5cGVfTVA0Ci0gICAgICAgICAgICB8fCBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+RmlsZVR5cGUgPT0gTTRWSURFT0VESVRJTkdfa0ZpbGVUeXBlX000VikKLSAgICAgICAgewotICAgICAgICAgICAgTTRWSURFT0VESVRJTkdfQ2xpcFByb3BlcnRpZXMgZmlsZVByb3BlcnRpZXM7Ci0KLSAgICAgICAgICAgIC8qVVRGIGNvbnZlcnNpb24gc3VwcG9ydCovCi0gICAgICAgICAgICBNNE9TQV9DaGFyKiBwRGVjb2RlZFBhdGggPSBNNE9TQV9OVUxMOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogVVRGIGNvbnZlcnNpb246IGNvbnZlcnQgaW50byB0aGUgY3VzdG9tZXIgZm9ybWF0LCBiZWZvcmUgYmVpbmcgdXNlZCovCi0gICAgICAgICAgICBwRGVjb2RlZFBhdGggPSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+cEZpbGU7Ci0KLSAgICAgICAgICAgIGlmKHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QgIT0gTTRPU0FfTlVMTAotICAgICAgICAgICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KHhWU1NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKikgcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0luaXQ6XAotICAgICAgICAgICAgICAgICAgICAgICAgIE00eFZTU19pbnRlcm5hbENvbnZlcnRUb1VURjggcmV0dXJucyBlcnI6IDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBEZWNvZGVkUGF0aCA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKkVuZCBvZiB0aGUgY29udmVyc2lvbjogdXNlIHRoZSBkZWNvZGVkIHBhdGgqLwotICAgICAgICAgICAgZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBEZWNvZGVkUGF0aCwgJmZpbGVQcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgLypnZXQgaW5wdXQgZmlsZSBwcm9wZXJ0aWVzKi8KLSAgICAgICAgICAgIC8qZXJyID0gTTR4VlNTX2ludGVybmFsR2V0UHJvcGVydGllcyh4VlNTX2NvbnRleHQsIHBTZXR0aW5ncy0+XAotICAgICAgICAgICAgICAgIHBDbGlwTGlzdFtpXS0+cEZpbGUsICZmaWxlUHJvcGVydGllcyk7Ki8KLSAgICAgICAgICAgIGlmKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxHZXRUYXJnZXRlZFRpbWVTY2FsZTpcCi0gICAgICAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxHZXRQcm9wZXJ0aWVzIHJldHVybmVkOiAweCV4IiwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoZmlsZVByb3BlcnRpZXMuVmlkZW9TdHJlYW1UeXBlID09IE00VklERU9FRElUSU5HX2tNUEVHNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHRlbXBEdXJhdGlvbiA8IChwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlFbmRDdXRUaW1lIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gcFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpQmVnaW5DdXRUaW1lKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFRpbWVTY2FsZSA9IGZpbGVQcm9wZXJ0aWVzLnVpVmlkZW9UaW1lU2NhbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRHVyYXRpb24gPSAocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPnVpRW5kQ3V0VGltZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwU2V0dGluZ3MtPnBDbGlwTGlzdFtpXS0+dWlCZWdpbkN1dFRpbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHRlbXBEdXJhdGlvbiA8IChmaWxlUHJvcGVydGllcy51aUNsaXBEdXJhdGlvblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAtIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBUaW1lU2NhbGUgPSBmaWxlUHJvcGVydGllcy51aVZpZGVvVGltZVNjYWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcER1cmF0aW9uID0gKGZpbGVQcm9wZXJ0aWVzLnVpQ2xpcER1cmF0aW9uXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBTZXR0aW5ncy0+cENsaXBMaXN0W2ldLT51aUJlZ2luQ3V0VGltZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYocFNldHRpbmdzLT5wQ2xpcExpc3RbaV0tPkZpbGVUeXBlID09IE00VklERU9FRElUSU5HX2tGaWxlVHlwZV9BUkdCODg4OCkKLSAgICAgICAgewotICAgICAgICAgICAgLyp0aGUgdGltZXNjYWxlIGlzIDMwIGZvciBQVE8zR1AqLwotICAgICAgICAgICAgKnBUYXJnZXRlZFRpbWVTY2FsZSA9IDMwOwotICAgICAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHRlbXBUaW1lU2NhbGUgPj0gMzApLypEZWZpbmUgYSBtaW5pbXVtIHRpbWUgc2NhbGUsIG90aGVyd2lzZSBpZiB0aGUgdGltZXNjYWxlIGlzIG5vdAotICAgIGVub3VnaCwgdGhlcmUgd2lsbCBiZSBhbiBpbmZpbml0ZSBsb29wIGluIHRoZSBzaGVsbCBlbmNvZGVyKi8KLSAgICB7Ci0gICAgICAgICpwVGFyZ2V0ZWRUaW1lU2NhbGUgPSB0ZW1wVGltZVNjYWxlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAqcFRhcmdldGVkVGltZVNjYWxlID0gMzA7Ci0gICAgfQotCi0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RDb2xvcihNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdENvbG9yKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotewotICAgIE00VklGSV9JbnQzMiBwbGFuZV9udW1iZXI7Ci0gICAgTTRWSUZJX1VJbnQzMiBpLGo7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2J1Zl9zcmMsICpwX2J1Zl9kZXN0OwotICAgIE00eFZTU19Db2xvclN0cnVjdCogQ29sb3JDb250ZXh0ID0gKE00eFZTU19Db2xvclN0cnVjdCopcEZ1bmN0aW9uQ29udGV4dDsKLQotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMDsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwX2J1Zl9zcmMgPSAmKFBsYW5lSW5bcGxhbmVfbnVtYmVyXS5wYWNfZGF0YVtQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0XSk7Ci0gICAgICAgIHBfYnVmX2Rlc3QgPSAmKFBsYW5lT3V0W3BsYW5lX251bWJlcl0ucGFjX2RhdGFbUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3RvcGxlZnRdKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBDaHJvbWluYW5jZSAqLwotICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0xIHx8IHBsYW5lX251bWJlcj09MikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KQotICAgICAgICAgICAgICAgIC8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTTR4VlNTX2tWaWRlb0VmZmVjdFR5cGVfQmxhY2tBbmRXaGl0ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTI4LAotICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1Bpbms6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDI1NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9HcmVlbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9TZXBpYToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBsYW5lX251bWJlcj09MSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwX2J1Zl9kZXN0LDExNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsMTM5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwX2J1Zl9zcmMgLFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0NvbG9yUkdCMTY6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDE2IHIgPSAwLGcgPSAwLGIgPSAwLHkgPSAwLHUgPSAwLHYgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypmaXJzdCBnZXQgdGhlIHIsIGcsIGIqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweDAwMWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweDA3ZTApPj41OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoQ29sb3JDb250ZXh0LT5yZ2IxNkNvbG9yRGF0YSAmICAweGY4MDApPj4xMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFUxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsIChNNE9TQV9VSW50OCl2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE00eFZTU19rVmlkZW9FZmZlY3RUeXBlX0dyYWRpZW50OgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQxNiByID0gMCxnID0gMCxiID0gMCx5ID0gMCx1ID0gMCx2ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZmlyc3QgZ2V0IHRoZSByLCBnLCBiKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwMDFmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHgwN2UwKT4+NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKENvbG9yQ29udGV4dC0+cmdiMTZDb2xvckRhdGEgJiAgMHhmODAwKT4+MTE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmZvciBjb2xvciBncmFkYXRpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAoTTRPU0FfVUludDE2KSggYiAtICgoYippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gKE00T1NBX1VJbnQxNikoZyAtICgoZyppKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKE00T1NBX1VJbnQxNikociAtICgocippKS9QbGFuZUluW3BsYW5lX251bWJlcl0udV9oZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qa2VlcCB5LCBidXQgcmVwbGFjZSB1IGFuZCB2Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwbGFuZV9udW1iZXI9PTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZW4gY29udmVydCB0byB1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFUxNihyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh2b2lkICopcF9idWZfZGVzdCwoTTRPU0FfVUludDgpdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocGxhbmVfbnVtYmVyPT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aGVuIGNvbnZlcnQgdG8gdiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBWMTYociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfYnVmX2Rlc3QsKE00T1NBX1VJbnQ4KXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBMdW1pbmFuY2UgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3N3aXRjaCAoKE00T1NBX1VJbnQzMilwRnVuY3Rpb25Db250ZXh0KQotICAgICAgICAgICAgICAgIC8vIGNvbW1lbnRlZCBiZWNhdXNlIGEgc3RydWN0dXJlIGZvciB0aGUgZWZmZWN0cyBjb250ZXh0IGV4aXN0Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChDb2xvckNvbnRleHQtPmNvbG9yRWZmZWN0VHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNNHhWU1Nfa1ZpZGVvRWZmZWN0VHlwZV9OZWdhdGl2ZToKLSAgICAgICAgICAgICAgICAgICAgZm9yKGo9MDtqPFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV93aWR0aDtqKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zl9kZXN0W2pdID0gMjU1IC0gcF9idWZfc3JjW2pdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBfYnVmX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBfYnVmX3NyYyAsUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3dpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9idWZfc3JjICs9IFBsYW5lSW5bcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgICAgIHBfYnVmX2Rlc3QgKz0gUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS51X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RnJhbWluZyhNNE9TQV9Wb2lkICpwRnVuY3Rpb25Db250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIHVpRWZmZWN0S2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhZGQgYSBmaXhlZCBvciBhbmltYXRlZCBpbWFnZSBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHBGdW5jdGlvbkNvbnRleHQoSU4pIENvbnRhaW5zIHdoaWNoIGNvbG9yIHRvIGFwcGx5IChub3QgdmVyeSBjbGVhbiAuLi4pCi0gKiBAcGFyYW0gICAgUGxhbmVJbiAgICAgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlFZmZlY3RLaW5kICAgIChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZyYW1pbmcoIE00T1NBX1ZvaWQgKnVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJblszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkKLXsKLSAgICBNNFZJRklfVUludDMyIHgseTsKLQotICAgIE00VklGSV9VSW50OCAqcF9pbl9ZID0gUGxhbmVJblswXS5wYWNfZGF0YTsKLSAgICBNNFZJRklfVUludDggKnBfaW5fVSA9IFBsYW5lSW5bMV0ucGFjX2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luX1YgPSBQbGFuZUluWzJdLnBhY19kYXRhOwotCi0gICAgTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QqIEZyYW1pbmcgPSBNNE9TQV9OVUxMOwotICAgIE00eFZTU19GcmFtaW5nU3RydWN0KiBjdXJyZW50RnJhbWluZyA9IE00T1NBX05VTEw7Ci0gICAgTTRWSUZJX1VJbnQ4ICpGcmFtaW5nUkdCID0gTTRPU0FfTlVMTDsKLQotICAgIE00VklGSV9VSW50OCAqcF9vdXQwOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQxOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQyOwotCi0gICAgTTRWSUZJX1VJbnQzMiB0b3BsZWZ0WzJdOwotCi0gICAgTTRPU0FfVUludDggdHJhbnNwYXJlbnQxID0gKE00T1NBX1VJbnQ4KSgoVFJBTlNQQVJFTlRfQ09MT1IgJiAweEZGMDApPj44KTsKLSAgICBNNE9TQV9VSW50OCB0cmFuc3BhcmVudDIgPSAoTTRPU0FfVUludDgpVFJBTlNQQVJFTlRfQ09MT1I7Ci0KLSNpZm5kZWYgREVDT0RFX0dJRl9PTl9TQVZJTkcKLSAgICBGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopdXNlckRhdGE7Ci0gICAgY3VycmVudEZyYW1pbmcgPSAoTTR4VlNTX0ZyYW1pbmdTdHJ1Y3QgKilGcmFtaW5nLT5wQ3VycmVudDsKLSAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0KLSAgICAvKkZCKi8KLSNpZmRlZiBERUNPREVfR0lGX09OX1NBVklORwotICAgIE00T1NBX0VSUiBlcnI7Ci0gICAgRnJhbWluZyA9IChNNHhWU1NfRnJhbWluZ1N0cnVjdCAqKSgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFGcmFtaW5nQ3R4OwotICAgIGN1cnJlbnRGcmFtaW5nID0gKE00eFZTU19GcmFtaW5nU3RydWN0ICopRnJhbWluZzsKLSAgICBGcmFtaW5nUkdCID0gRnJhbWluZy0+RnJhbWluZ1JnYi0+cGFjX2RhdGE7Ci0jZW5kaWYgLypERUNPREVfR0lGX09OX1NBVklORyovCi0gICAgLyplbmQgRkIqLwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBpbnB1dCAvIG91dHB1dCBwbGFuZSBwb2ludGVycyAqLwotICAgIHBfaW5fWSArPSBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwX2luX1UgKz0gUGxhbmVJblsxXS51X3RvcGxlZnQ7Ci0gICAgcF9pbl9WICs9IFBsYW5lSW5bMl0udV90b3BsZWZ0OwotCi0gICAgcF9vdXQwID0gUGxhbmVPdXRbMF0ucGFjX2RhdGE7Ci0gICAgcF9vdXQxID0gUGxhbmVPdXRbMV0ucGFjX2RhdGE7Ci0gICAgcF9vdXQyID0gUGxhbmVPdXRbMl0ucGFjX2RhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBEZXBlbmRpbmcgb24gdGltZSwgaW5pdGlhbGl6ZSBGcmFtaW5nIGZyYW1lIHRvIHVzZSAqLwotICAgIGlmKEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPT0gLTEpCi0gICAgewotICAgICAgICBGcmFtaW5nLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGN1cnJlbnQgY2xpcCB0aW1lIGhhcyByZWFjaCB0aGUgZHVyYXRpb24gb2Ygb25lIGZyYW1lIG9mIHRoZSBmcmFtaW5nIHBpY3R1cmUKLSAgICAgKiB3ZSBuZWVkIHRvIHN0ZXAgdG8gbmV4dCBmcmFtaW5nIHBpY3R1cmUgKi8KLQotICAgIEZyYW1pbmctPnByZXZpb3VzQ2xpcFRpbWUgPSBwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZTsKLSAgICBGcmFtaW5nUkdCID0gY3VycmVudEZyYW1pbmctPkZyYW1pbmdSZ2ItPnBhY19kYXRhOwotICAgIHRvcGxlZnRbMF0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF94OwotICAgIHRvcGxlZnRbMV0gPSBjdXJyZW50RnJhbWluZy0+dG9wbGVmdF95OwotCi0gICAgZm9yKCB4PTAgO3ggPCBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgZm9yKCB5PTAgO3kgPCBQbGFuZUluWzBdLnVfd2lkdGggOyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVG8gaGFuZGxlIGZyYW1pbmcgd2l0aCBpbnB1dCBzaXplICE9IG91dHB1dCBzaXplCi0gICAgICAgICAgICAgKiBGcmFtaW5nIGlzIGFwcGx5ZWQgaWYgY29vcmRpbmF0ZXMgbWF0Y2hlcyBiZXR3ZWVuIGZyYW1pbmcvdG9wbGVmdCBhbmQgaW5wdXQgcGxhbmUgKi8KLSAgICAgICAgICAgIGlmKCB5IDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAgJiYKLSAgICAgICAgICAgICAgICB5ID49IHRvcGxlZnRbMF0gJiYKLSAgICAgICAgICAgICAgICB4IDwgKHRvcGxlZnRbMV0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X2hlaWdodCkgJiYKLSAgICAgICAgICAgICAgICB4ID49IHRvcGxlZnRbMV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLypBbHBoYSBibGVuZGluZyBzdXBwb3J0Ki8KLSAgICAgICAgICAgICAgICBNNE9TQV9GbG9hdCBhbHBoYUJsZW5kaW5nID0gMTsKLSAgICAgICAgICAgICAgICBNNHhWU1NfaW50ZXJuYWxFZmZlY3RzQWxwaGFCbGVuZGluZyogIGFscGhhQmxlbmRpbmdTdHJ1Y3QgPVwKLSAgICAgICAgICAgICAgICAgKE00eFZTU19pbnRlcm5hbEVmZmVjdHNBbHBoYUJsZW5kaW5nKilcCi0gICAgICAgICAgICAgICAgICAgICgoTTR4VlNTX0ZyYW1pbmdDb250ZXh0Kil1c2VyRGF0YSktPmFscGhhQmxlbmRpbmdTdHJ1Y3Q7Ci0KLSAgICAgICAgICAgICAgICBpZihhbHBoYUJsZW5kaW5nU3RydWN0ICE9IE00T1NBX05VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgXAotICAgICAgICAgICAgICAgICAgICA8IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZUluVGltZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fc3RhcnQgLyAxMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSAoKE00T1NBX0Zsb2F0KShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX21pZGRsZVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0KVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBQcm9ncmVzcy0+dWlQcm9ncmVzcy8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlSW5UaW1lKjEwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyArPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgLz0gMTAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYocFByb2dyZXNzLT51aVByb2dyZXNzID49IChNNE9TQV9VSW50MzIpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPlwKLSAgICAgICAgICAgICAgICAgICAgbV9mYWRlSW5UaW1lKjEwKSAmJiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPCAxMDAwXAotICAgICAgICAgICAgICAgICAgICAgLSAoTTRPU0FfVUludDMyKShhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2ZhZGVPdXRUaW1lKjEwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9IChNNE9TQV9GbG9hdClcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKE00T1NBX0Zsb2F0KWFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlLzEwMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgPj0gMTAwMCAtIChNNE9TQV9VSW50MzIpXAotICAgICAgICAgICAgICAgICAgICAoYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZmFkZU91dFRpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhQmxlbmRpbmcgPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZCAvIDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyA9ICgoTTRPU0FfRmxvYXQpKGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fbWlkZGxlIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGFscGhhQmxlbmRpbmdTdHJ1Y3QtPm1fZW5kKSkqKDEwMDAgLSBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8oYWxwaGFCbGVuZGluZ1N0cnVjdC0+bV9mYWRlT3V0VGltZSoxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFCbGVuZGluZyArPSBhbHBoYUJsZW5kaW5nU3RydWN0LT5tX2VuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUJsZW5kaW5nIC89IDEwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiovCi0KLSAgICAgICAgICAgICAgICBpZigoKihGcmFtaW5nUkdCKT09dHJhbnNwYXJlbnQxKSAmJiAoKihGcmFtaW5nUkdCKzEpPT10cmFuc3BhcmVudDIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KCoocF9pbl9ZK3kreCpQbGFuZUluWzBdLnVfc3RyaWRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fVSsoeT4+MSkrKHg+PjEpKlBsYW5lSW5bMV0udV9zdHJpZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgKiggcF9vdXQyKyh5Pj4xKSsoeD4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDAreSt4KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKGN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzBdLnBhY19kYXRhKyh5LXRvcGxlZnRbMF0pXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoeC10b3BsZWZ0WzFdKSpjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3N0cmlkZSkpKmFscGhhQmxlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgICooIHBfb3V0MCt5K3gqUGxhbmVPdXRbMF0udV9zdHJpZGUpKz0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqKHBfaW5fWSt5K3gqUGxhbmVJblswXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsxXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzFdLnVfc3RyaWRlKSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDErKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSkrPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9VKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsxXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlsyXS5wYWNfZGF0YSsoKHktdG9wbGVmdFswXSk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoKHgtdG9wbGVmdFsxXSk+PjEpKmN1cnJlbnRGcmFtaW5nLT5GcmFtaW5nWXV2WzJdLnVfc3RyaWRlKSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphbHBoYUJsZW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSkrPQotICAgICAgICAgICAgICAgICAgICAgICAgKCoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSkpKigxLWFscGhhQmxlbmRpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiggUGxhbmVJblswXS51X3dpZHRoIDwgKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoKSAmJgotICAgICAgICAgICAgICAgICAgICB5ID09IFBsYW5lSW5bMF0udV93aWR0aC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRnJhbWluZ1JHQiA9IEZyYW1pbmdSR0IgKyAyIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICogKHRvcGxlZnRbMF0gKyBjdXJyZW50RnJhbWluZy0+RnJhbWluZ1l1dlswXS51X3dpZHRoIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFBsYW5lSW5bMF0udV93aWR0aCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcmFtaW5nUkdCID0gRnJhbWluZ1JHQiArIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBKdXN0IGNvcHkgaW5wdXQgcGxhbmUgdG8gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3kreCpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luX1kreSt4KlBsYW5lSW5bMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeT4+MSkrKHg+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luX1UrKHk+PjEpKyh4Pj4xKSpQbGFuZUluWzFdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHk+PjEpKyh4Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbl9WKyh5Pj4xKSsoeD4+MSkqUGxhbmVJblsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3RGaWZ0aWVzKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIG1ha2UgYSB2aWRlbyBsb29rIGFzIGlmIGl0IHdhcyB0YWtlbiBpbiB0aGUgZmlmdGllcwotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwVXNlckRhdGEgICAgICAgKElOKSBDb250ZXh0Ci0gKiBAcGFyYW0gICAgcFBsYW5lSW4gICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICAgICAgICAgIE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNEVSUl9QQVJBTUVURVI6ICAgIHBGaWZ0aWVzRGF0YSwgcFBsYW5lT3V0IG9yIHBQcm9ncmVzcyBhcmUgTlVMTCAoREVCVUcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyggTTRPU0FfVm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kICkKLXsKLSAgICBNNFZJRklfVUludDMyIHgsIHksIHhTaGlmdDsKLSAgICBNNFZJRklfVUludDggKnBJblkgPSBwUGxhbmVJblswXS5wYWNfZGF0YTsKLSAgICBNNFZJRklfVUludDggKnBPdXRZLCAqcEluWWJlZ2luOwotICAgIE00VklGSV9VSW50OCAqcEluQ3IsKiBwT3V0Q3I7Ci0gICAgTTRWSUZJX0ludDMyIHBsYW5lX251bWJlcjsKLQotICAgIC8qIEludGVybmFsIGNvbnRleHQqLwotICAgIE00eFZTU19GaWZ0aWVzU3RydWN0KiBwX0ZpZnRpZXNEYXRhID0gKE00eFZTU19GaWZ0aWVzU3RydWN0ICopcFVzZXJEYXRhOwotCi0gICAgLyogQ2hlY2sgdGhlIGlucHV0cyAoZGVidWcgb25seSkgKi8KLSAgICBNNE9TQV9ERUJVR19JRjIoKHBfRmlmdGllc0RhdGEgPT0gTTRPU0FfTlVMTCksTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAgInhWU1M6IHBfRmlmdGllc0RhdGEgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMiKTsKLSAgICBNNE9TQV9ERUJVR19JRjIoKHBQbGFuZU91dCA9PSBNNE9TQV9OVUxMKSxNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAieFZTUzogcF9QbGFuZU91dCBpcyBNNE9TQV9OVUxMIGluIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0RmlmdGllcyIpOwotICAgIE00T1NBX0RFQlVHX0lGMigocFByb2dyZXNzID09IE00T1NBX05VTEwpLE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgInhWU1M6IHBfUHJvZ3Jlc3MgaXMgTTRPU0FfTlVMTCBpbiBNNFZTUzNHUFBfZXh0ZXJuYWxWaWRlb0VmZmVjdEZpZnRpZXMiKTsKLQotICAgIC8qIEluaXRpYWxpemUgaW5wdXQgLyBvdXRwdXQgcGxhbmUgcG9pbnRlcnMgKi8KLSAgICBwSW5ZICs9IHBQbGFuZUluWzBdLnVfdG9wbGVmdDsKLSAgICBwT3V0WSA9IHBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwSW5ZYmVnaW4gID0gcEluWTsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIHJhbmRvbSAqLwotICAgIGlmKHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUgPCAwKQotICAgIHsKLSAgICAgICAgTTRPU0FfcmFuZEluaXQoKTsKLSAgICAgICAgTTRPU0FfcmFuZCgoTTRPU0FfSW50MzIgKikmKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV9oZWlnaHQpID4+IDQpOwotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiAqKSYocF9GaWZ0aWVzRGF0YS0+c3RyaXBlUmFuZG9tVmFsdWUpLCAocFBsYW5lSW5bMF0udV93aWR0aCk8PCAyKTsKLSAgICAgICAgcF9GaWZ0aWVzRGF0YS0+cHJldmlvdXNDbGlwVGltZSA9IHBQcm9ncmVzcy0+dWlPdXRwdXRUaW1lOwotICAgIH0KLQotICAgIC8qIENob29zZSByYW5kb20gdmFsdWVzIGlmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZHVyYXRpb24gb2YgYSBwYXJ0aWFsIGVmZmVjdCAqLwotICAgIGVsc2UgaWYoIChwUHJvZ3Jlc3MtPnVpT3V0cHV0VGltZSAtIHBfRmlmdGllc0RhdGEtPnByZXZpb3VzQ2xpcFRpbWUpXAotICAgICAgICAgPiBwX0ZpZnRpZXNEYXRhLT5maWZ0aWVzRWZmZWN0RHVyYXRpb24pCi0gICAgewotICAgICAgICBNNE9TQV9yYW5kKChNNE9TQV9JbnQzMiAqKSYocF9GaWZ0aWVzRGF0YS0+c2hpZnRSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X2hlaWdodCkgPj4gNCk7Ci0gICAgICAgIE00T1NBX3JhbmQoKE00T1NBX0ludDMyICopJihwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSksIChwUGxhbmVJblswXS51X3dpZHRoKTw8IDIpOwotICAgICAgICBwX0ZpZnRpZXNEYXRhLT5wcmV2aW91c0NsaXBUaW1lID0gcFByb2dyZXNzLT51aU91dHB1dFRpbWU7Ci0gICAgfQotCi0gICAgLyogUHV0IGluIFNlcGlhIHRoZSBjaHJvbWluYW5jZSAqLwotICAgIGZvciAocGxhbmVfbnVtYmVyID0gMTsgcGxhbmVfbnVtYmVyIDwgMzsgcGxhbmVfbnVtYmVyKyspCi0gICAgewotICAgICAgICBwSW5DciAgPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnBhY19kYXRhICArIHBQbGFuZUluW3BsYW5lX251bWJlcl0udV90b3BsZWZ0OwotICAgICAgICBwT3V0Q3IgPSBwUGxhbmVPdXRbcGxhbmVfbnVtYmVyXS5wYWNfZGF0YSArIHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfdG9wbGVmdDsKLQotICAgICAgICBmb3IgKHggPSAwOyB4IDwgcFBsYW5lT3V0W3BsYW5lX251bWJlcl0udV9oZWlnaHQ7IHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKDEgPT0gcGxhbmVfbnVtYmVyKQotICAgICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBPdXRDciwgMTE3LHBQbGFuZUluW3BsYW5lX251bWJlcl0udV93aWR0aCk7IC8qIFUgdmFsdWUgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilwT3V0Q3IsIDEzOSxwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfd2lkdGgpOyAvKiBWIHZhbHVlICovCi0KLSAgICAgICAgICAgIHBJbkNyICArPSBwUGxhbmVJbltwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICAgICAgcE91dENyICs9IHBQbGFuZU91dFtwbGFuZV9udW1iZXJdLnVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB0aGUgbmV3IHBpeGVscyB2YWx1ZXMgKi8KLSAgICBmb3IoIHggPSAwIDsgeCA8IHBQbGFuZUluWzBdLnVfaGVpZ2h0IDsgeCsrKQotICAgIHsKLSAgICAgICAgTTRWSUZJX1VJbnQ4ICpwX291dFl0bXAsICpwX2luWXRtcDsKLQotICAgICAgICAvKiBDb21wdXRlIHRoZSB4U2hpZnQgKHJhbmRvbSB2YWx1ZSkgKi8KLSAgICAgICAgaWYgKDAgPT0gKHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgJSA1ICkpCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUgKSAlIChwUGxhbmVJblswXS51X2hlaWdodCAtIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB4U2hpZnQgPSAoeCArIChwUGxhbmVJblswXS51X2hlaWdodCAtIHBfRmlmdGllc0RhdGEtPnNoaWZ0UmFuZG9tVmFsdWUpICkgXAotICAgICAgICAgICAgICAgICUgKHBQbGFuZUluWzBdLnVfaGVpZ2h0IC0gMSk7Ci0KLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcG9pbnRlcnMgKi8KLSAgICAgICAgcF9vdXRZdG1wID0gcE91dFkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHlTaGlmdCBvZiAxIHBpeGVsICovCi0gICAgICAgIHBfaW5ZdG1wICA9IHBJblliZWdpbiArICh4U2hpZnQgKiBwUGxhbmVJblswXS51X3N0cmlkZSk7ICAvKiBBcHBseSB0aGUgeFNoaWZ0ICovCi0KLSAgICAgICAgZm9yKCB5ID0gMCA7IHkgPCBwUGxhbmVJblswXS51X3dpZHRoIDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTZXQgWSB2YWx1ZSAqLwotICAgICAgICAgICAgaWYgKHhTaGlmdCA+IChwUGxhbmVJblswXS51X2hlaWdodCAtIDQpKQotICAgICAgICAgICAgICAgICpwX291dFl0bXAgPSA0MDsgICAgICAgIC8qIEFkZCBzb21lIGhvcml6b250YWwgYmxhY2sgbGluZXMgYmV0d2VlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gcGFydHMgb2YgdGhlIGltYWdlICovCi0gICAgICAgICAgICBlbHNlIGlmICggeSA9PSBwX0ZpZnRpZXNEYXRhLT5zdHJpcGVSYW5kb21WYWx1ZSkKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gOTA7ICAgICAgICAvKiBBZGQgYSByYW5kb20gdmVydGljYWwgbGluZSBmb3IgdGhlIGJ1bGsgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqcF9vdXRZdG1wID0gKnBfaW5ZdG1wOwotCi0KLSAgICAgICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IHBpeGVsICovCi0gICAgICAgICAgICBwX291dFl0bXArKzsKLSAgICAgICAgICAgIHBfaW5ZdG1wKys7Ci0KLSAgICAgICAgICAgIC8qIFJlc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBmb3IgdGhlIGxhc3QgcGl4ZWwqLwotICAgICAgICAgICAgaWYgKHkgPT0gKHBQbGFuZUluWzBdLnVfd2lkdGggLSAyKSkKLSAgICAgICAgICAgICAgICBwX291dFl0bXAgPSBwT3V0WTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IGxpbmUgKi8KLSAgICAgICAgcE91dFkgKz0gcFBsYW5lT3V0WzBdLnVfc3RyaWRlOwotICAgIH0KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRPU0FfRVJSIE00VlNTM0dQUF9leHRlcm5hbFZpZGVvRWZmZWN0Wm9vbSggKQotICogQGJyaWVmICAgIFpvb20gaW4vb3V0IHZpZGVvIGVmZmVjdCBmdW5jdGlvbnMuCi0gKiBAbm90ZSAgICBUaGUgZXh0ZXJuYWwgdmlkZW8gZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGlmIFZpZGVvRWZmZWN0VHlwZSBpcyBzZXQgdG8KLSAqIE00VlNTM0dQUF9rVmlkZW9FZmZlY3RUeXBlX1pvb21JbiBvciBNNFZTUzNHUFBfa1ZpZGVvRWZmZWN0VHlwZV9ab29tT3V0LgotICoKLSAqIEBwYXJhbSAgIHBGdW5jdGlvbkNvbnRleHQgICAgKElOKSBUaGUgZnVuY3Rpb24gY29udGV4dCwgcHJldmlvdXNseSBzZXQgYnkgdGhlIGludGVncmF0b3IKLSAqIEBwYXJhbSAgICBwSW5wdXRQbGFuZXMgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIGltYWdlOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHRocmVlIHZhbGlkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgICBwT3V0cHV0UGxhbmVzICAgICAgICAoSU4vT1VUKSBPdXRwdXQgKGZpbHRlcmVkKSBZVVY0MjAgaW1hZ2U6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVlIHZhbGlkIGltYWdlIHBsYW5lcyAoWSwgVSBhbmQgVikKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgICAgICAoSU4pIFNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmlkZW8gdHJhbnNpdGlvbiBwcm9ncmVzcy4KLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgICAgICAgICBObyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVI6ICAgIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgTTRPU0FfTlVMTCAoZGVidWcgb25seSkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1NNE9TQV9FUlIgTTRWU1MzR1BQX2V4dGVybmFsVmlkZW9FZmZlY3Rab29tKAotICAgIE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBJbnB1dFBsYW5lcywKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcE91dHB1dFBsYW5lcywKLSAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgIE00T1NBX1VJbnQzMiB1aUVmZmVjdEtpbmQKLSkKLXsKLSAgICBNNE9TQV9VSW50MzIgYm94V2lkdGg7Ci0gICAgTTRPU0FfVUludDMyIGJveEhlaWdodDsKLSAgICBNNE9TQV9VSW50MzIgYm94UG9zWDsKLSAgICBNNE9TQV9VSW50MzIgYm94UG9zWTsKLSAgICBNNE9TQV9VSW50MzIgcmF0aW8gPSAwOwotICAgIC8qICAqIDEuMTg5MjA3IGJldHdlZW4gcmF0aW8gKi8KLSAgICAvKiB6b29tIGJldHdlZW4geDEgYW5kIHgxNiAqLwotICAgIE00T1NBX1VJbnQzMiByYXRpb3RhYlsxN10gPXsxMDI0LDEyMTgsMTQ0OCwxNzIyLDIwNDgsMjQzNSwyODk2LDM0NDQsNDA5Niw0ODcxLDU3OTMsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ODg5LDgxOTIsOTc0MiwxMTU4NSwxMzc3NywxNjM4NH07Ci0gICAgTTRPU0FfVUludDMyIGlrOwotCi0gICAgTTRWSUZJX0ltYWdlUGxhbmUgYm94UGxhbmVbM107Ci0KLSAgICBpZigoTTRPU0FfVm9pZCAqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21PdXQgPT0gcEZ1bmN0aW9uQ29udGV4dCkKLSAgICB7Ci0gICAgICAgIC8vcmF0aW8gPSAxNiAtICgxNSAqIHBQcm9ncmVzcy0+dWlQcm9ncmVzcykvMTAwMDsKLSAgICAgICAgcmF0aW8gPSAxNiAtIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAvIDY2IDsKLSAgICB9Ci0gICAgZWxzZSBpZigoTTRPU0FfVm9pZCAqKU00eFZTU19rVmlkZW9FZmZlY3RUeXBlX1pvb21JbiA9PSBwRnVuY3Rpb25Db250ZXh0KQotICAgIHsKLSAgICAgICAgLy9yYXRpbyA9IDEgKyAoMTUgKiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLzEwMDA7Ci0gICAgICAgIHJhdGlvID0gMSArIHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAvIDY2IDsKLSAgICB9Ci0KLSAgICBmb3IoaWs9MDtpazwzO2lrKyspewotCi0gICAgICAgIGJveFBsYW5lW2lrXS51X3N0cmlkZSA9IHBJbnB1dFBsYW5lc1tpa10udV9zdHJpZGU7Ci0gICAgICAgIGJveFBsYW5lW2lrXS5wYWNfZGF0YSA9IHBJbnB1dFBsYW5lc1tpa10ucGFjX2RhdGE7Ci0KLSAgICAgICAgYm94SGVpZ2h0ID0gKCBwSW5wdXRQbGFuZXNbaWtdLnVfaGVpZ2h0IDw8IDEwICkgLyByYXRpb3RhYltyYXRpb107Ci0gICAgICAgIGJveFdpZHRoID0gKCBwSW5wdXRQbGFuZXNbaWtdLnVfd2lkdGggPDwgMTAgKSAvIHJhdGlvdGFiW3JhdGlvXTsKLSAgICAgICAgYm94UGxhbmVbaWtdLnVfaGVpZ2h0ID0gKGJveEhlaWdodCkmKH4xKTsKLSAgICAgICAgYm94UGxhbmVbaWtdLnVfd2lkdGggPSAoYm94V2lkdGgpJih+MSk7Ci0KLSAgICAgICAgYm94UG9zWSA9IChwSW5wdXRQbGFuZXNbaWtdLnVfaGVpZ2h0ID4+IDEpIC0gKGJveFBsYW5lW2lrXS51X2hlaWdodCA+PiAxKTsKLSAgICAgICAgYm94UG9zWCA9IChwSW5wdXRQbGFuZXNbaWtdLnVfd2lkdGggPj4gMSkgLSAoYm94UGxhbmVbaWtdLnVfd2lkdGggPj4gMSk7Ci0gICAgICAgIGJveFBsYW5lW2lrXS51X3RvcGxlZnQgPSBib3hQb3NZICogYm94UGxhbmVbaWtdLnVfc3RyaWRlICsgYm94UG9zWDsKLSAgICB9Ci0KLSAgICBNNFZJRklfUmVzaXplQmlsaW5lYXJZVVY0MjB0b1lVVjQyMChNNE9TQV9OVUxMLCAoTTRWSUZJX0ltYWdlUGxhbmUqKSZib3hQbGFuZSwgcE91dHB1dFBsYW5lcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gKi8KLSAgICByZXR1cm4oTTROT19FUlJPUik7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19BbHBoYU1hZ2ljKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFwcGx5IGEgY29sb3IgZWZmZWN0IG9uIGFuIGlucHV0IFlVVjQyMCBwbGFuYXIgZnJhbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgdXNlckRhdGEgICAgICAgIChJTikgQ29udGFpbnMgYSBwb2ludGVyIG9uIGEgc2V0dGluZ3Mgc3RydWN0dXJlCi0gKiBAcGFyYW0gICAgUGxhbmVJbjEgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hciBmcm9tIHZpZGVvIDEKLSAqIEBwYXJhbSAgICBQbGFuZUluMiAgICAgICAgKElOKSBJbnB1dCBZVVY0MjAgcGxhbmFyIGZyb20gdmlkZW8gMgotICogQHBhcmFtICAgIFBsYW5lT3V0ICAgICAgICAoSU4vT1VUKSBPdXRwdXQgWVVWNDIwIHBsYW5hcgotICogQHBhcmFtICAgIHBQcm9ncmVzcyAgICAgICAgKElOL09VVCkgUHJvZ3Jlc3MgaW5kaWNhdGlvbiAoMC0xMDApCi0gKiBAcGFyYW0gICAgdWlUcmFuc2l0aW9uS2luZChJTikgVW51c2VkCi0gKgotICogQHJldHVybiAgICBNNFZJRklfT0s6ICAgIE5vIGVycm9yCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLU00T1NBX0VSUiBNNHhWU1NfQWxwaGFNYWdpYyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLCBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLXsKLQotICAgIE00T1NBX0VSUiBlcnI7Ci0KLSAgICBNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKiBhbHBoYUNvbnRleHQ7Ci0gICAgTTRWSUZJX0ludDMyIGFscGhhUHJvZ3Jlc3NMZXZlbDsKLQotICAgIE00VklGSV9JbWFnZVBsYW5lKiBwbGFuZXN3YXA7Ci0gICAgTTRWSUZJX1VJbnQzMiB4LHk7Ci0KLSAgICBNNFZJRklfVUludDggKnBfb3V0MDsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MTsKLSAgICBNNFZJRklfVUludDggKnBfb3V0MjsKLSAgICBNNFZJRklfVUludDggKmFscGhhTWFzazsKLSAgICAvKiAiT2xkIGltYWdlIiAqLwotICAgIE00VklGSV9VSW50OCAqcF9pbjFfWTsKLSAgICBNNFZJRklfVUludDggKnBfaW4xX1U7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMV9WOwotICAgIC8qICJOZXcgaW1hZ2UiICovCi0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMl9ZOwotICAgIE00VklGSV9VSW50OCAqcF9pbjJfVTsKLSAgICBNNFZJRklfVUludDggKnBfaW4yX1Y7Ci0KLSAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgYWxwaGFDb250ZXh0ID0gKE00eFZTU19pbnRlcm5hbF9BbHBoYU1hZ2ljU2V0dGluZ3MqKXVzZXJEYXRhOwotCi0gICAgYWxwaGFQcm9ncmVzc0xldmVsID0gKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyAqIDEyOCkvMTAwMDsKLQotICAgIGlmKCBhbHBoYUNvbnRleHQtPmlzcmV2ZXJzZSAhPSBNNE9TQV9GQUxTRSkKLSAgICB7Ci0gICAgICAgIGFscGhhUHJvZ3Jlc3NMZXZlbCA9IDEyOCAtIGFscGhhUHJvZ3Jlc3NMZXZlbDsKLSAgICAgICAgcGxhbmVzd2FwID0gUGxhbmVJbjE7Ci0gICAgICAgIFBsYW5lSW4xID0gUGxhbmVJbjI7Ci0gICAgICAgIFBsYW5lSW4yID0gcGxhbmVzd2FwOwotICAgIH0KLQotICAgIHBfb3V0MCA9IFBsYW5lT3V0WzBdLnBhY19kYXRhOwotICAgIHBfb3V0MSA9IFBsYW5lT3V0WzFdLnBhY19kYXRhOwotICAgIHBfb3V0MiA9IFBsYW5lT3V0WzJdLnBhY19kYXRhOwotCi0gICAgYWxwaGFNYXNrID0gYWxwaGFDb250ZXh0LT5wUGxhbmUtPnBhY19kYXRhOwotCi0gICAgLyogIk9sZCBpbWFnZSIgKi8KLSAgICBwX2luMV9ZID0gUGxhbmVJbjFbMF0ucGFjX2RhdGE7Ci0gICAgcF9pbjFfVSA9IFBsYW5lSW4xWzFdLnBhY19kYXRhOwotICAgIHBfaW4xX1YgPSBQbGFuZUluMVsyXS5wYWNfZGF0YTsKLSAgICAvKiAiTmV3IGltYWdlIiAqLwotICAgIHBfaW4yX1kgPSBQbGFuZUluMlswXS5wYWNfZGF0YTsKLSAgICBwX2luMl9VID0gUGxhbmVJbjJbMV0ucGFjX2RhdGE7Ci0gICAgcF9pbjJfViA9IFBsYW5lSW4yWzJdLnBhY19kYXRhOwotCi0gICAgIC8qKgotICAgICAqIEZvciBlYWNoIGNvbHVtbiAuLi4gKi8KLSAgICBmb3IoIHk9MDsgeTxQbGFuZU91dC0+dV9oZWlnaHQ7IHkrKyApCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogLi4uIGFuZCBlYWNoIHJvdyBvZiB0aGUgYWxwaGEgbWFzayAqLwotICAgICAgICBmb3IoIHg9MDsgeDxQbGFuZU91dC0+dV93aWR0aDsgeCsrICkKLSAgICAgICAgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBJZiB0aGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgcGl4ZWwgb2YgdGhlIGFscGhhIG1hc2sgaXMgPiB0byB0aGUgY3VycmVudCB0aW1lCi0gICAgICAgICAgICAgKiAoIGN1cnJlbnQgdGltZSBpcyBub3JtYWxpemVkIG9uIFswLTI1NV0gKSAqLwotICAgICAgICAgICAgaWYoIGFscGhhUHJvZ3Jlc3NMZXZlbCA8IGFscGhhTWFza1t4K3kqUGxhbmVPdXQtPnVfd2lkdGhdICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBXZSBrZWVwICJvbGQgaW1hZ2UiIGluIG91dHB1dCBwbGFuZSAqLwotICAgICAgICAgICAgICAgICooIHBfb3V0MCt4K3kqUGxhbmVPdXRbMF0udV9zdHJpZGUpPSoocF9pbjFfWSt4K3kqUGxhbmVJbjFbMF0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMV9VKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjFbMV0udV9zdHJpZGUpOwotICAgICAgICAgICAgICAgICooIHBfb3V0MisoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzJdLnVfc3RyaWRlKT0KLSAgICAgICAgICAgICAgICAgICAgKihwX2luMV9WKyh4Pj4xKSsoeT4+MSkqUGxhbmVJbjFbMl0udV9zdHJpZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIHRha2UgIm5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luMl9ZK3greSpQbGFuZUluMlswXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQxKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1UrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBwcm90b3R5cGUgICAgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSBQbGFuZUluMlszXSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBhcHBseSBhIGNvbG9yIGVmZmVjdCBvbiBhbiBpbnB1dCBZVVY0MjAgcGxhbmFyIGZyYW1lCi0gKiBAbm90ZQotICogQHBhcmFtICAgIHVzZXJEYXRhICAgICAgICAoSU4pIENvbnRhaW5zIGEgcG9pbnRlciBvbiBhIHNldHRpbmdzIHN0cnVjdHVyZQotICogQHBhcmFtICAgIFBsYW5lSW4xICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIgZnJvbSB2aWRlbyAxCi0gKiBAcGFyYW0gICAgUGxhbmVJbjIgICAgICAgIChJTikgSW5wdXQgWVVWNDIwIHBsYW5hciBmcm9tIHZpZGVvIDIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpVHJhbnNpdGlvbktpbmQoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0FscGhhTWFnaWNCbGVuZGluZyggTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWU1MzR1BQX0V4dGVybmFsUHJvZ3Jlc3MgKnBQcm9ncmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlUcmFuc2l0aW9uS2luZCkKLXsKLSAgICBNNE9TQV9FUlIgZXJyOwotCi0gICAgTTR4VlNTX2ludGVybmFsX0FscGhhTWFnaWNTZXR0aW5ncyogYWxwaGFDb250ZXh0OwotICAgIE00VklGSV9JbnQzMiBhbHBoYVByb2dyZXNzTGV2ZWw7Ci0gICAgTTRWSUZJX0ludDMyIGFscGhhQmxlbmRMZXZlbE1pbjsKLSAgICBNNFZJRklfSW50MzIgYWxwaGFCbGVuZExldmVsTWF4OwotICAgIE00VklGSV9JbnQzMiBhbHBoYUJsZW5kUmFuZ2U7Ci0KLSAgICBNNFZJRklfSW1hZ2VQbGFuZSogcGxhbmVzd2FwOwotICAgIE00VklGSV9VSW50MzIgeCx5OwotICAgIE00VklGSV9JbnQzMiBhbHBoYU1hc2tWYWx1ZTsKLQotICAgIE00VklGSV9VSW50OCAqcF9vdXQwOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQxOwotICAgIE00VklGSV9VSW50OCAqcF9vdXQyOwotICAgIE00VklGSV9VSW50OCAqYWxwaGFNYXNrOwotICAgIC8qICJPbGQgaW1hZ2UiICovCi0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMV9ZOwotICAgIE00VklGSV9VSW50OCAqcF9pbjFfVTsKLSAgICBNNFZJRklfVUludDggKnBfaW4xX1Y7Ci0gICAgLyogIk5ldyBpbWFnZSIgKi8KLSAgICBNNFZJRklfVUludDggKnBfaW4yX1k7Ci0gICAgTTRWSUZJX1VJbnQ4ICpwX2luMl9VOwotICAgIE00VklGSV9VSW50OCAqcF9pbjJfVjsKLQotCi0gICAgZXJyID0gTTROT19FUlJPUjsKLQotICAgIGFscGhhQ29udGV4dCA9IChNNHhWU1NfaW50ZXJuYWxfQWxwaGFNYWdpY1NldHRpbmdzKil1c2VyRGF0YTsKLQotICAgIGFscGhhUHJvZ3Jlc3NMZXZlbCA9IChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgKiAxMjgpLzEwMDA7Ci0KLSAgICBpZiggYWxwaGFDb250ZXh0LT5pc3JldmVyc2UgIT0gTTRPU0FfRkFMU0UpCi0gICAgewotICAgICAgICBhbHBoYVByb2dyZXNzTGV2ZWwgPSAxMjggLSBhbHBoYVByb2dyZXNzTGV2ZWw7Ci0gICAgICAgIHBsYW5lc3dhcCA9IFBsYW5lSW4xOwotICAgICAgICBQbGFuZUluMSA9IFBsYW5lSW4yOwotICAgICAgICBQbGFuZUluMiA9IHBsYW5lc3dhcDsKLSAgICB9Ci0KLSAgICBhbHBoYUJsZW5kTGV2ZWxNaW4gPSBhbHBoYVByb2dyZXNzTGV2ZWwtYWxwaGFDb250ZXh0LT5ibGVuZGluZ3RocmVzaG9sZDsKLQotICAgIGFscGhhQmxlbmRMZXZlbE1heCA9IGFscGhhUHJvZ3Jlc3NMZXZlbCthbHBoYUNvbnRleHQtPmJsZW5kaW5ndGhyZXNob2xkOwotCi0gICAgYWxwaGFCbGVuZFJhbmdlID0gKGFscGhhQ29udGV4dC0+YmxlbmRpbmd0aHJlc2hvbGQpKjI7Ci0KLSAgICBwX291dDAgPSBQbGFuZU91dFswXS5wYWNfZGF0YTsKLSAgICBwX291dDEgPSBQbGFuZU91dFsxXS5wYWNfZGF0YTsKLSAgICBwX291dDIgPSBQbGFuZU91dFsyXS5wYWNfZGF0YTsKLQotICAgIGFscGhhTWFzayA9IGFscGhhQ29udGV4dC0+cFBsYW5lLT5wYWNfZGF0YTsKLQotICAgIC8qICJPbGQgaW1hZ2UiICovCi0gICAgcF9pbjFfWSA9IFBsYW5lSW4xWzBdLnBhY19kYXRhOwotICAgIHBfaW4xX1UgPSBQbGFuZUluMVsxXS5wYWNfZGF0YTsKLSAgICBwX2luMV9WID0gUGxhbmVJbjFbMl0ucGFjX2RhdGE7Ci0gICAgLyogIk5ldyBpbWFnZSIgKi8KLSAgICBwX2luMl9ZID0gUGxhbmVJbjJbMF0ucGFjX2RhdGE7Ci0gICAgcF9pbjJfVSA9IFBsYW5lSW4yWzFdLnBhY19kYXRhOwotICAgIHBfaW4yX1YgPSBQbGFuZUluMlsyXS5wYWNfZGF0YTsKLQotICAgIC8qIGFwcGx5IEFscGhhIE1hZ2ljIG9uIGVhY2ggcGl4ZWwgKi8KLSAgICAgICBmb3IoIHk9MDsgeTxQbGFuZU91dC0+dV9oZWlnaHQ7IHkrKyApCi0gICAgewotICAgICAgICBmb3IoIHg9MDsgeDxQbGFuZU91dC0+dV93aWR0aDsgeCsrICkKLSAgICAgICAgewotICAgICAgICAgICAgYWxwaGFNYXNrVmFsdWUgPSBhbHBoYU1hc2tbeCt5KlBsYW5lT3V0LT51X3dpZHRoXTsKLSAgICAgICAgICAgIGlmKCBhbHBoYUJsZW5kTGV2ZWxNYXggPCBhbHBoYU1hc2tWYWx1ZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogV2Uga2VlcCAib2xkIGltYWdlIiBpbiBvdXRwdXQgcGxhbmUgKi8KLSAgICAgICAgICAgICAgICAqKCBwX291dDAreCt5KlBsYW5lT3V0WzBdLnVfc3RyaWRlKT0qKHBfaW4xX1kreCt5KlBsYW5lSW4xWzBdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDErKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsxXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbjFfVSsoeD4+MSkrKHk+PjEpKlBsYW5lSW4xWzFdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgICoocF9pbjFfVisoeD4+MSkrKHk+PjEpKlBsYW5lSW4xWzJdLnVfc3RyaWRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoIChhbHBoYUJsZW5kTGV2ZWxNaW4gPCBhbHBoYU1hc2tWYWx1ZSkmJgotICAgICAgICAgICAgICAgICAgICAoYWxwaGFNYXNrVmFsdWUgPD0gYWxwaGFCbGVuZExldmVsTWF4ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIGJsZW5kICJvbGQgYW5kIG5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KE00VklGSV9VSW50OCkKLSAgICAgICAgICAgICAgICAgICAgKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbikqKCAqKHBfaW4xX1kreCt5KlBsYW5lSW4xWzBdLnVfc3RyaWRlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICsoYWxwaGFCbGVuZExldmVsTWF4LWFscGhhTWFza1ZhbHVlKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKCAqKHBfaW4yX1kreCt5KlBsYW5lSW4yWzBdLnVfc3RyaWRlKSkgKS9hbHBoYUJsZW5kUmFuZ2UgKTsKLQotICAgICAgICAgICAgICAgICooIHBfb3V0MSsoeD4+MSkrKHk+PjEpKlBsYW5lT3V0WzFdLnVfc3RyaWRlKT0oTTRWSUZJX1VJbnQ4KVwKLSAgICAgICAgICAgICAgICAgICAgKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbikqKCAqKHBfaW4xX1UrKHg+PjEpKyh5Pj4xKVwKLSAgICAgICAgICAgICAgICAgICAgICAgICpQbGFuZUluMVsxXS51X3N0cmlkZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyhhbHBoYUJsZW5kTGV2ZWxNYXgtYWxwaGFNYXNrVmFsdWUpKiggKihwX2luMl9VKyh4Pj4xKSsoeT4+MSlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQbGFuZUluMlsxXS51X3N0cmlkZSkpICkvYWxwaGFCbGVuZFJhbmdlICk7Ci0KLSAgICAgICAgICAgICAgICAqKCBwX291dDIrKHg+PjEpKyh5Pj4xKSpQbGFuZU91dFsyXS51X3N0cmlkZSk9Ci0gICAgICAgICAgICAgICAgICAgIChNNFZJRklfVUludDgpKCggKGFscGhhTWFza1ZhbHVlLWFscGhhQmxlbmRMZXZlbE1pbilcCi0gICAgICAgICAgICAgICAgICAgICAgICAqKCAqKHBfaW4xX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMVsyXS51X3N0cmlkZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsoYWxwaGFCbGVuZExldmVsTWF4LWFscGhhTWFza1ZhbHVlKSooICoocF9pbjJfVisoeD4+MSkrKHk+PjEpXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBsYW5lSW4yWzJdLnVfc3RyaWRlKSkgKS9hbHBoYUJsZW5kUmFuZ2UgKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFdlIHRha2UgIm5ldyBpbWFnZSIgaW4gb3V0cHV0IHBsYW5lICovCi0gICAgICAgICAgICAgICAgKiggcF9vdXQwK3greSpQbGFuZU91dFswXS51X3N0cmlkZSk9KihwX2luMl9ZK3greSpQbGFuZUluMlswXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQxKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMV0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1UrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsxXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgKiggcF9vdXQyKyh4Pj4xKSsoeT4+MSkqUGxhbmVPdXRbMl0udV9zdHJpZGUpPQotICAgICAgICAgICAgICAgICAgICAqKHBfaW4yX1YrKHg+PjEpKyh5Pj4xKSpQbGFuZUluMlsyXS51X3N0cmlkZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oZXJyKTsKLX0KLQotI2RlZmluZSBNNFhYWF9TYW1wbGVBZGRyZXNzKHBsYW5lLCB4LCB5KSAgKCAocGxhbmUpLnBhY19kYXRhICsgKHBsYW5lKS51X3RvcGxlZnQgKyAoeSlcCi0gICAgICogKHBsYW5lKS51X3N0cmlkZSArICh4KSApCi0KLXN0YXRpYyB2b2lkIE00WFhYX0NvcHlQbGFuZShNNFZJRklfSW1hZ2VQbGFuZSogZGVzdCwgTTRWSUZJX0ltYWdlUGxhbmUqIHNvdXJjZSkKLXsKLSAgICBNNE9TQV9VSW50MzIgICAgaGVpZ2h0LCB3aWR0aCwgc291cmNlU3RyaWRlLCBkZXN0U3RyaWRlLCB5OwotICAgIE00T1NBX01lbUFkZHI4ICAgIHNvdXJjZVdhbGssIGRlc3RXYWxrOwotCi0gICAgLyogY2FjaGUgdGhlIHZhcnMgdXNlZCBpbiB0aGUgbG9vcCBzbyBhcyB0byBhdm9pZCB0aGVtIGJlaW5nIHJlcGVhdGVkbHkgZmV0Y2hlZCBhbmQKLSAgICAgcmVjb21wdXRlZCBmcm9tIG1lbW9yeS4gKi8KLSAgICBoZWlnaHQgPSBkZXN0LT51X2hlaWdodDsKLSAgICB3aWR0aCA9IGRlc3QtPnVfd2lkdGg7Ci0KLSAgICBzb3VyY2VXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoKnNvdXJjZSwgMCwgMCk7Ci0gICAgc291cmNlU3RyaWRlID0gc291cmNlLT51X3N0cmlkZTsKLQotICAgIGRlc3RXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoKmRlc3QsIDAsIDApOwotICAgIGRlc3RTdHJpZGUgPSBkZXN0LT51X3N0cmlkZTsKLQotICAgIGZvciAoeT0wOyB5PGhlaWdodDsgeSsrKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopZGVzdFdhbGssICh2b2lkICopc291cmNlV2Fsaywgd2lkdGgpOwotICAgICAgICBkZXN0V2FsayArPSBkZXN0U3RyaWRlOwotICAgICAgICBzb3VyY2VXYWxrICs9IHNvdXJjZVN0cmlkZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTR4VlNTX1ZlcnRpY2FsU2xpZGVUcmFuc2l0aW9uKE00VklGSV9JbWFnZVBsYW5lKiB0b3BQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBib3R0b21QbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiAgICBzaGlmdFVWKQotewotICAgIE00T1NBX1VJbnQzMiBpOwotCi0gICAgLyogRG8gdGhyZWUgbG9vcHMsIG9uZSBmb3IgZWFjaCBwbGFuZSB0eXBlLCBpbiBvcmRlciB0byBhdm9pZCBoYXZpbmcgdG9vIG1hbnkgYnVmZmVycwotICAgICJob3QiIGF0IHRoZSBzYW1lIHRpbWUgKGJldHRlciBmb3IgY2FjaGUpLiAqLwotICAgIGZvciAoaT0wOyBpPDM7IGkrKykKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiAgICB0b3BQYXJ0SGVpZ2h0LCBib3R0b21QYXJ0SGVpZ2h0LCB3aWR0aCwgc291cmNlU3RyaWRlLCBkZXN0U3RyaWRlLCB5OwotICAgICAgICBNNE9TQV9NZW1BZGRyOCAgICBzb3VyY2VXYWxrLCBkZXN0V2FsazsKLQotICAgICAgICAvKiBjYWNoZSB0aGUgdmFycyB1c2VkIGluIHRoZSBsb29wIHNvIGFzIHRvIGF2b2lkIHRoZW0gYmVpbmcgcmVwZWF0ZWRseSBmZXRjaGVkIGFuZAotICAgICAgICAgcmVjb21wdXRlZCBmcm9tIG1lbW9yeS4gKi8KLSAgICAgICAgaWYgKDAgPT0gaSkgLyogWSBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBib3R0b21QYXJ0SGVpZ2h0ID0gMipzaGlmdFVWOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogVSBhbmQgViBwbGFuZXMgKi8KLSAgICAgICAgewotICAgICAgICAgICAgYm90dG9tUGFydEhlaWdodCA9IHNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgdG9wUGFydEhlaWdodCA9IFBsYW5lT3V0W2ldLnVfaGVpZ2h0IC0gYm90dG9tUGFydEhlaWdodDsKLSAgICAgICAgd2lkdGggPSBQbGFuZU91dFtpXS51X3dpZHRoOwotCi0gICAgICAgIHNvdXJjZVdhbGsgPSAoTTRPU0FfTWVtQWRkcjgpTTRYWFhfU2FtcGxlQWRkcmVzcyh0b3BQbGFuZVtpXSwgMCwgYm90dG9tUGFydEhlaWdodCk7Ci0gICAgICAgIHNvdXJjZVN0cmlkZSA9IHRvcFBsYW5lW2ldLnVfc3RyaWRlOwotCi0gICAgICAgIGRlc3RXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIDApOwotICAgICAgICBkZXN0U3RyaWRlID0gUGxhbmVPdXRbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgLyogRmlyc3QgdGhlIHBhcnQgZnJvbSB0aGUgdG9wIHNvdXJjZSBjbGlwIGZyYW1lLiAqLwotICAgICAgICBmb3IgKHk9MDsgeTx0b3BQYXJ0SGVpZ2h0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWRlc3RXYWxrLCAodm9pZCAqKXNvdXJjZVdhbGssIHdpZHRoKTsKLSAgICAgICAgICAgIGRlc3RXYWxrICs9IGRlc3RTdHJpZGU7Ci0gICAgICAgICAgICBzb3VyY2VXYWxrICs9IHNvdXJjZVN0cmlkZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGFuZCBub3cgY2hhbmdlIHRoZSB2YXJzIHRvIGNvcHkgdGhlIHBhcnQgZnJvbSB0aGUgYm90dG9tIHNvdXJjZSBjbGlwIGZyYW1lLiAqLwotICAgICAgICBzb3VyY2VXYWxrID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoYm90dG9tUGxhbmVbaV0sIDAsIDApOwotICAgICAgICBzb3VyY2VTdHJpZGUgPSBib3R0b21QbGFuZVtpXS51X3N0cmlkZTsKLQotICAgICAgICAvKiBkZXN0V2FsayBpcyBhbHJlYWR5IGF0IE00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIHRvcFBhcnRIZWlnaHQpICovCi0KLSAgICAgICAgZm9yICh5PTA7IHk8Ym90dG9tUGFydEhlaWdodDsgeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2FsaywgKHZvaWQgKilzb3VyY2VXYWxrLCB3aWR0aCk7Ci0gICAgICAgICAgICBkZXN0V2FsayArPSBkZXN0U3RyaWRlOwotICAgICAgICAgICAgc291cmNlV2FsayArPSBzb3VyY2VTdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLXN0YXRpYyBNNE9TQV9FUlIgTTR4VlNTX0hvcml6b250YWxTbGlkZVRyYW5zaXRpb24oTTRWSUZJX0ltYWdlUGxhbmUqIGxlZnRQbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUqIHJpZ2h0UGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfVUludDMyICAgIHNoaWZ0VVYpCi17Ci0gICAgTTRPU0FfVUludDMyIGksIHk7Ci0gICAgLyogSWYgd2Ugc2hpZnRlZCBieSBleGFjdGx5IDAsIG9yIGJ5IHRoZSB3aWR0aCBvZiB0aGUgdGFyZ2V0IGltYWdlLCB0aGVuIHdlIHdvdWxkIGdldCB0aGUgbGVmdAotICAgIGZyYW1lIG9yIHRoZSByaWdodCBmcmFtZSwgcmVzcGVjdGl2ZWx5LiBUaGVzZSBjYXNlcyBhcmVuJ3QgaGFuZGxlZCB0b28gd2VsbCBieSB0aGUgZ2VuZXJhbAotICAgIGhhbmRsaW5nLCBzaW5jZSB0aGV5IHJlc3VsdCBpbiAwLXNpemUgbWVtY29waWVzLCBzbyBtaWdodCBhcyB3ZWxsIHBhcnRpY3VsYXJpemUgdGhlbS4gKi8KLQotICAgIGlmICgwID09IHNoaWZ0VVYpICAgIC8qIG91dHB1dCBsZWZ0IGZyYW1lICovCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpPDM7IGkrKykgLyogZm9yIGVhY2ggWVVWIHBsYW5lICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00WFhYX0NvcHlQbGFuZSgmKFBsYW5lT3V0W2ldKSwgJihsZWZ0UGxhbmVbaV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNNE5PX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChQbGFuZU91dFsxXS51X3dpZHRoID09IHNoaWZ0VVYpIC8qIG91dHB1dCByaWdodCBmcmFtZSAqLwotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaTwzOyBpKyspIC8qIGZvciBlYWNoIFlVViBwbGFuZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBNNFhYWF9Db3B5UGxhbmUoJihQbGFuZU91dFtpXSksICYocmlnaHRQbGFuZVtpXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE00Tk9fRVJST1I7Ci0gICAgfQotCi0KLSAgICAvKiBEbyB0aHJlZSBsb29wcywgb25lIGZvciBlYWNoIHBsYW5lIHR5cGUsIGluIG9yZGVyIHRvIGF2b2lkIGhhdmluZyB0b28gbWFueSBidWZmZXJzCi0gICAgImhvdCIgYXQgdGhlIHNhbWUgdGltZSAoYmV0dGVyIGZvciBjYWNoZSkuICovCi0gICAgZm9yIChpPTA7IGk8MzsgaSsrKQotICAgIHsKLSAgICAgICAgTTRPU0FfVUludDMyICAgIGhlaWdodCwgbGVmdFBhcnRXaWR0aCwgcmlnaHRQYXJ0V2lkdGg7Ci0gICAgICAgIE00T1NBX1VJbnQzMiAgICBsZWZ0U3RyaWRlLCAgICByaWdodFN0cmlkZSwgICAgZGVzdFN0cmlkZTsKLSAgICAgICAgTTRPU0FfTWVtQWRkcjggICAgbGVmdFdhbGssICAgIHJpZ2h0V2FsaywgICAgZGVzdFdhbGtMZWZ0LCBkZXN0V2Fsa1JpZ2h0OwotCi0gICAgICAgIC8qIGNhY2hlIHRoZSB2YXJzIHVzZWQgaW4gdGhlIGxvb3Agc28gYXMgdG8gYXZvaWQgdGhlbSBiZWluZyByZXBlYXRlZGx5IGZldGNoZWQKLSAgICAgICAgYW5kIHJlY29tcHV0ZWQgZnJvbSBtZW1vcnkuICovCi0gICAgICAgIGhlaWdodCA9IFBsYW5lT3V0W2ldLnVfaGVpZ2h0OwotCi0gICAgICAgIGlmICgwID09IGkpIC8qIFkgcGxhbmUgKi8KLSAgICAgICAgewotICAgICAgICAgICAgcmlnaHRQYXJ0V2lkdGggPSAyKnNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiBVIGFuZCBWIHBsYW5lcyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICByaWdodFBhcnRXaWR0aCA9IHNoaWZ0VVY7Ci0gICAgICAgIH0KLSAgICAgICAgbGVmdFBhcnRXaWR0aCA9IFBsYW5lT3V0W2ldLnVfd2lkdGggLSByaWdodFBhcnRXaWR0aDsKLQotICAgICAgICBsZWZ0V2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKGxlZnRQbGFuZVtpXSwgcmlnaHRQYXJ0V2lkdGgsIDApOwotICAgICAgICBsZWZ0U3RyaWRlID0gbGVmdFBsYW5lW2ldLnVfc3RyaWRlOwotCi0gICAgICAgIHJpZ2h0V2FsayA9IChNNE9TQV9NZW1BZGRyOClNNFhYWF9TYW1wbGVBZGRyZXNzKHJpZ2h0UGxhbmVbaV0sIDAsIDApOwotICAgICAgICByaWdodFN0cmlkZSA9IHJpZ2h0UGxhbmVbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgZGVzdFdhbGtMZWZ0ID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIDAsIDApOwotICAgICAgICBkZXN0V2Fsa1JpZ2h0ID0gKE00T1NBX01lbUFkZHI4KU00WFhYX1NhbXBsZUFkZHJlc3MoUGxhbmVPdXRbaV0sIGxlZnRQYXJ0V2lkdGgsIDApOwotICAgICAgICBkZXN0U3RyaWRlID0gUGxhbmVPdXRbaV0udV9zdHJpZGU7Ci0KLSAgICAgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyB5KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKWRlc3RXYWxrTGVmdCwgKHZvaWQgKilsZWZ0V2FsaywgbGVmdFBhcnRXaWR0aCk7Ci0gICAgICAgICAgICBsZWZ0V2FsayArPSBsZWZ0U3RyaWRlOwotCi0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilkZXN0V2Fsa1JpZ2h0LCAodm9pZCAqKXJpZ2h0V2FsaywgcmlnaHRQYXJ0V2lkdGgpOwotICAgICAgICAgICAgcmlnaHRXYWxrICs9IHJpZ2h0U3RyaWRlOwotCi0gICAgICAgICAgICBkZXN0V2Fsa0xlZnQgKz0gZGVzdFN0cmlkZTsKLSAgICAgICAgICAgIGRlc3RXYWxrUmlnaHQgKz0gZGVzdFN0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0KLU00T1NBX0VSUiBNNHhWU1NfU2xpZGVUcmFuc2l0aW9uKCBNNE9TQV9Wb2lkICp1c2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjFbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgUGxhbmVJbjJbM10sIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotewotICAgIE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyogc2V0dGluZ3MgPQotICAgICAgICAgKE00eFZTU19pbnRlcm5hbF9TbGlkZVRyYW5zaXRpb25TZXR0aW5ncyopdXNlckRhdGE7Ci0gICAgTTRPU0FfVUludDMyICAgIHNoaWZ0VVY7Ci0KLSAgICBNNE9TQV9UUkFDRTFfMCgiaW5zaWRlIE00eFZTU19TbGlkZVRyYW5zaXRpb24iKTsKLSAgICBpZiAoKE00eFZTU19TbGlkZVRyYW5zaXRpb25fUmlnaHRPdXRMZWZ0SW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikKLSAgICAgICAgfHwgKE00eFZTU19TbGlkZVRyYW5zaXRpb25fTGVmdE91dFJpZ2h0SW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikgKQotICAgIHsKLSAgICAgICAgLyogaG9yaXpvbnRhbCBzbGlkZSAqLwotICAgICAgICBzaGlmdFVWID0gKChQbGFuZU91dFsxXSkudV93aWR0aCAqIHBQcm9ncmVzcy0+dWlQcm9ncmVzcykvMTAwMDsKLSAgICAgICAgTTRPU0FfVFJBQ0UxXzIoIk00eFZTU19TbGlkZVRyYW5zaXRpb24gdXBwZXI6IHNoaWZ0VVYgPSAlZCxwcm9ncmVzcyA9ICVkIiwKLSAgICAgICAgICAgIHNoaWZ0VVYscFByb2dyZXNzLT51aVByb2dyZXNzICk7Ci0gICAgICAgIGlmIChNNHhWU1NfU2xpZGVUcmFuc2l0aW9uX1JpZ2h0T3V0TGVmdEluID09IHNldHRpbmdzLT5kaXJlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFB1dCB0aGUgcHJldmlvdXMgY2xpcCBmcmFtZSByaWdodCwgdGhlIG5leHQgY2xpcCBmcmFtZSBsZWZ0LCBhbmQgcmV2ZXJzZSBzaGlmdFVWCi0gICAgICAgICAgICAoc2luY2UgaXQncyBhIHNoaWZ0IGZyb20gdGhlIGxlZnQgZnJhbWUpIHNvIHRoYXQgd2Ugc3RhcnQgb3V0IG9uIHRoZSByaWdodAotICAgICAgICAgICAgKGkuZS4gbm90IGxlZnQpIGZyYW1lLCBpdAotICAgICAgICAgICAgYmVpbmcgZnJvbSB0aGUgcHJldmlvdXMgY2xpcC4gKi8KLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfSG9yaXpvbnRhbFNsaWRlVHJhbnNpdGlvbihQbGFuZUluMiwgUGxhbmVJbjEsIFBsYW5lT3V0LAotICAgICAgICAgICAgICAgICAoUGxhbmVPdXRbMV0pLnVfd2lkdGggLSBzaGlmdFVWKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIExlZnQgb3V0LCByaWdodCBpbiovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfSG9yaXpvbnRhbFNsaWRlVHJhbnNpdGlvbihQbGFuZUluMSwgUGxhbmVJbjIsIFBsYW5lT3V0LCBzaGlmdFVWKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiB2ZXJ0aWNhbCBzbGlkZSAqLwotICAgICAgICBzaGlmdFVWID0gKChQbGFuZU91dFsxXSkudV9oZWlnaHQgKiBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpLzEwMDA7Ci0gICAgICAgIE00T1NBX1RSQUNFMV8yKCJNNHhWU1NfU2xpZGVUcmFuc2l0aW9uIGJvdHRvbTogc2hpZnRVViA9ICVkLHByb2dyZXNzID0gJWQiLHNoaWZ0VVYsCi0gICAgICAgICAgICBwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MgKTsKLSAgICAgICAgaWYgKE00eFZTU19TbGlkZVRyYW5zaXRpb25fVG9wT3V0Qm90dG9tSW4gPT0gc2V0dGluZ3MtPmRpcmVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgLyogUHV0IHRoZSBwcmV2aW91cyBjbGlwIGZyYW1lIHRvcCwgdGhlIG5leHQgY2xpcCBmcmFtZSBib3R0b20uICovCi0gICAgICAgICAgICByZXR1cm4gTTR4VlNTX1ZlcnRpY2FsU2xpZGVUcmFuc2l0aW9uKFBsYW5lSW4xLCBQbGFuZUluMiwgUGxhbmVPdXQsIHNoaWZ0VVYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogQm90dG9tIG91dCwgdG9wIGluICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNNHhWU1NfVmVydGljYWxTbGlkZVRyYW5zaXRpb24oUGxhbmVJbjIsIFBsYW5lSW4xLCBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAoUGxhbmVPdXRbMV0pLnVfaGVpZ2h0IC0gc2hpZnRVVik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBOb3RlOiBpdCBtaWdodCBiZSB3b3J0aHdoaWxlIHRvIGRvIHNvbWUgcGFyYW1ldGVyIGNoZWNraW5nLCBzZWUgaWYgZGltZW5zaW9ucyBtYXRjaCwgZXRjLiwKLSAgICBhdCBsZWFzdCBpbiBkZWJ1ZyBtb2RlLiAqLwotfQotCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcHJvdG90eXBlICAgIE00eFZTU19GYWRlQmxhY2tUcmFuc2l0aW9uKE00T1NBX1ZvaWQgKnBGdW5jdGlvbkNvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VlNTM0dQUF9FeHRlcm5hbFByb2dyZXNzICpwUHJvZ3Jlc3MsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWlFZmZlY3RLaW5kKQotICoKLSAqIEBicmllZiAgICBUaGlzIGZ1bmN0aW9uIGFwcGx5IGEgZmFkZSB0byBibGFjayBhbmQgdGhlbiBhIGZhZGUgZnJvbSBibGFjawotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwRnVuY3Rpb25Db250ZXh0KElOKSBDb250YWlucyB3aGljaCBjb2xvciB0byBhcHBseSAobm90IHZlcnkgY2xlYW4gLi4uKQotICogQHBhcmFtICAgIFBsYW5lSW4gICAgICAgICAgICAoSU4pIElucHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBQbGFuZU91dCAgICAgICAgKElOL09VVCkgT3V0cHV0IFlVVjQyMCBwbGFuYXIKLSAqIEBwYXJhbSAgICBwUHJvZ3Jlc3MgICAgICAgIChJTi9PVVQpIFByb2dyZXNzIGluZGljYXRpb24gKDAtMTAwKQotICogQHBhcmFtICAgIHVpRWZmZWN0S2luZCAgICAoSU4pIFVudXNlZAotICoKLSAqIEByZXR1cm4gICAgTTRWSUZJX09LOiAgICBObyBlcnJvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb24oTTRPU0FfVm9pZCAqdXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4xWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lSW4yWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZTUzNHUFBfRXh0ZXJuYWxQcm9ncmVzcyAqcFByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiB1aVRyYW5zaXRpb25LaW5kKQotewotICAgIE00T1NBX0ludDMyIHRtcCA9IDA7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLQotICAgIGlmKChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MpIDwgNTAwKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpICovCi0gICAgICAgIHRtcCA9IChNNE9TQV9JbnQzMikoKDEuMCAtICgoTTRPU0FfRmxvYXQpKHBQcm9ncmVzcy0+dWlQcm9ncmVzcyoyKS8xMDAwKSkgKiAxMDI0ICk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFwcGx5IHRoZSBkYXJrZW5pbmcgZWZmZWN0ICovCi0gICAgICAgIGVyciA9IE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoIChNNFZpQ29tSW1hZ2VQbGFuZSopUGxhbmVJbjEsCi0gICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lKilQbGFuZU91dCwgdG1wLCBNNE9TQV9OVUxMKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb246IE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUgcmV0dXJuc1wKLSAgICAgICAgICAgICAgICAgZXJyb3IgMHgleCwgcmV0dXJuaW5nIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1IiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE00VlNTM0dQUF9FUlJfTFVNQV9GSUxURVJfRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXB1dGUgd2hlcmUgd2UgYXJlIGluIHRoZSBlZmZlY3QgKHNjYWxlIGlzIDAtPjEwMjQpLiAqLwotICAgICAgICB0bXAgPSAoTTRPU0FfSW50MzIpKCAoKChNNE9TQV9GbG9hdCkoKChwUHJvZ3Jlc3MtPnVpUHJvZ3Jlc3MtNTAwKSoyKSkvMTAwMCkpICogMTAyNCApOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBcHBseSB0aGUgZGFya2VuaW5nIGVmZmVjdCAqLwotICAgICAgICBlcnIgPSBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlKChNNFZpQ29tSW1hZ2VQbGFuZSopUGxhbmVJbjIsCi0gICAgICAgICAgICAgKE00VmlDb21JbWFnZVBsYW5lKilQbGFuZU91dCwgdG1wLCBNNE9TQV9OVUxMKTsKLSAgICAgICAgaWYgKE00Tk9fRVJST1IgIT0gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX0ZhZGVCbGFja1RyYW5zaXRpb246XAotICAgICAgICAgICAgICAgICBNNFZGTF9tb2RpZnlMdW1hV2l0aFNjYWxlIHJldHVybnMgZXJyb3IgMHgleCxcCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUiIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gTTRWU1MzR1BQX0VSUl9MVU1BX0ZJTFRFUl9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiogY29udmVydGVkU2l6ZSkKLSAqCi0gKiBAYnJpZWYgICAgVGhpcyBmdW5jdGlvbiBjb252ZXJ0IGZyb20gdGhlIGN1c3RvbWVyIGZvcm1hdCB0byBVVEY4Ci0gKiBAbm90ZQotICogQHBhcmFtICAgIHBDb250ZXh0ICAgICAgICAoSU4pICAgIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlckluICAgICAgICAoSU4pICAgIEJ1ZmZlciB0byBjb252ZXJ0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlck91dCAgICAgICAgKE9VVCkgICAgQ29udmVydGVkIGJ1ZmZlcgotICogQHBhcmFtICAgIGNvbnZlcnRlZFNpemUgICAgKE9VVCkgICAgU2l6ZSBvZiB0aGUgY29udmVydGVkIGJ1ZmZlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOChNNE9TQV9Db250ZXh0IHBDb250ZXh0LCBNNE9TQV9Wb2lkKiBwQnVmZmVySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LCBNNE9TQV9VSW50MzIqIGNvbnZlcnRlZFNpemUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIHBCdWZmZXJPdXQgPSBwQnVmZmVySW47Ci0gICAgaWYoeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdCAhPSBNNE9TQV9OVUxMCi0gICAgICAgICYmIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICE9IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBNNE9TQV9VSW50MzIgQ29udmVydGVkU2l6ZSA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemU7Ci0KLSAgICAgICAgbWVtc2V0KCh2b2lkICopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMAotICAgICAgICAgICAgLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgZXJyID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udlRvVVRGOEZjdCgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLAotICAgICAgICAgICAgKE00T1NBX1VJbnQ4Kil4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQzMiopJkNvbnZlcnRlZFNpemUpOwotICAgICAgICBpZihlcnIgPT0gTTR4VlNTV0FSX0JVRkZFUl9PVVRfVE9PX1NNQUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTJfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGODogcENvbnZUb1VURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0KLSAgICAgICAgICAgIC8qZnJlZSB0b28gc21hbGwgYnVmZmVyKi8KLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKTsKLQotICAgICAgICAgICAgLypyZS1hbGxvY2F0ZSB0aGUgYnVmZmVyKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICAgID0KLSAgICAgICAgICAgICAgICAgKE00T1NBX1ZvaWQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyhDb252ZXJ0ZWRTaXplKnNpemVvZihNNE9TQV9VSW50OCksIE00VkEsCi0gICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciAqKSJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBVVEYgY29udmVyc2lvbiBidWZmZXIiKTsKLSAgICAgICAgICAgIGlmKE00T1NBX05VTEwgPT0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVFJBQ0UxXzAoIkFsbG9jYXRpb24gZXJyb3IgaW4gTTR4VlNTX2ludGVybmFsQ29udmVydFRvVVRGOCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUgPSBDb252ZXJ0ZWRTaXplOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMCwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZUb1VURjhGY3QoKE00T1NBX1ZvaWQqKXBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBwQ29udlRvVVRGOEZjdCByZXR1cm4gMHgleCIsZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoZXJyICE9IE00Tk9fRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0VG9VVEY4OiBwQ29udlRvVVRGOEZjdCByZXR1cm4gMHgleCIsZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLypkZWNvZGVkIHBhdGgqLwotICAgICAgICBwQnVmZmVyT3V0ID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXI7Ci0gICAgICAgICgqY29udmVydGVkU2l6ZSkgPSBDb252ZXJ0ZWRTaXplOwotICAgIH0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHByb3RvdHlwZSAgICBNNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQpCi0gKgotICogQGJyaWVmICAgIFRoaXMgZnVuY3Rpb24gY29udmVydCBmcm9tIFVURjggdG8gdGhlIGN1c3RvbWVyIGZvcm1hdAotICogQG5vdGUKLSAqIEBwYXJhbSAgICBwQ29udGV4dCAgICAoSU4pIFRoZSBpbnRlZ3JhdG9yIG93biBjb250ZXh0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlckluICAgICAgICAoSU4pICAgIEJ1ZmZlciB0byBjb252ZXJ0Ci0gKiBAcGFyYW0gICAgcEJ1ZmZlck91dCAgICAgICAgKE9VVCkgICAgQ29udmVydGVkIGJ1ZmZlcgotICogQHBhcmFtICAgIGNvbnZlcnRlZFNpemUgICAgKE9VVCkgICAgU2l6ZSBvZiB0aGUgY29udmVydGVkIGJ1ZmZlcgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUjogICAgTm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSOiBBdCBsZWFzdCBvbmUgb2YgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaXMgbnVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi1NNE9TQV9FUlIgTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4KE00T1NBX0NvbnRleHQgcENvbnRleHQsIE00T1NBX1ZvaWQqIHBCdWZmZXJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9Wb2lkKiBwQnVmZmVyT3V0LCBNNE9TQV9VSW50MzIqIGNvbnZlcnRlZFNpemUpCi17Ci0gICAgTTR4VlNTX0NvbnRleHQqIHhWU1NfY29udGV4dCA9IChNNHhWU1NfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVycjsKLQotICAgIHBCdWZmZXJPdXQgPSBwQnVmZmVySW47Ci0gICAgaWYoeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wQ29udkZyb21VVEY4RmN0ICE9IE00T1NBX05VTEwKLSAgICAgICAgJiYgeFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIgIT0gTTRPU0FfTlVMTCkKLSAgICB7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBDb252ZXJ0ZWRTaXplID0geFZTU19jb250ZXh0LT5VVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZTsKLQotICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgIFVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwwLChNNE9TQV9VSW50MzIpeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUpOwotCi0gICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdFwKLSAgICAgICAgICAgICgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLChNNE9TQV9VSW50OCopeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyLCAoTTRPU0FfVUludDMyKikmQ29udmVydGVkU2l6ZSk7Ci0gICAgICAgIGlmKGVyciA9PSBNNHhWU1NXQVJfQlVGRkVSX09VVF9UT09fU01BTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1RSQUNFMl8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjg6IHBDb252RnJvbVVURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0KLSAgICAgICAgICAgIC8qZnJlZSB0b28gc21hbGwgYnVmZmVyKi8KLSAgICAgICAgICAgIGZyZWUoeFZTU19jb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgVVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKTsKLQotICAgICAgICAgICAgLypyZS1hbGxvY2F0ZSB0aGUgYnVmZmVyKi8KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyICAgID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVm9pZCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKENvbnZlcnRlZFNpemUqc2l6ZW9mKE00T1NBX1VJbnQ4KSwgTTRWQSwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyICopIk00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGODogVVRGIGNvbnZlcnNpb24gYnVmZmVyIik7Ci0gICAgICAgICAgICBpZihNNE9TQV9OVUxMID09IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucFRlbXBPdXRDb252ZXJzaW9uQnVmZmVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8wKCJBbGxvY2F0aW9uIGVycm9yIGluIE00eFZTU19pbnRlcm5hbENvbnZlcnRGcm9tVVRGOCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQubV9UZW1wT3V0Q29udmVyc2lvblNpemUgPSBDb252ZXJ0ZWRTaXplOwotCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKil4VlNTX2NvbnRleHQtPlwKLSAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5wVGVtcE91dENvbnZlcnNpb25CdWZmZXIsMCwoTTRPU0FfVUludDMyKXhWU1NfY29udGV4dC0+XAotICAgICAgICAgICAgICAgICAgICBVVEZDb252ZXJzaW9uQ29udGV4dC5tX1RlbXBPdXRDb252ZXJzaW9uU2l6ZSk7Ci0KLSAgICAgICAgICAgIGVyciA9IHhWU1NfY29udGV4dC0+VVRGQ29udmVyc2lvbkNvbnRleHQucENvbnZGcm9tVVRGOEZjdCgoTTRPU0FfVm9pZCopcEJ1ZmZlckluLAotICAgICAgICAgICAgICAgIChNNE9TQV9Wb2lkKil4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIqKSZDb252ZXJ0ZWRTaXplKTsKLSAgICAgICAgICAgIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00T1NBX1RSQUNFMV8xKCJNNHhWU1NfaW50ZXJuYWxDb252ZXJ0RnJvbVVURjg6IHBDb252RnJvbVVURjhGY3QgcmV0dXJuIDB4JXgiLGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGVyciAhPSBNNE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9UUkFDRTFfMSgiTTR4VlNTX2ludGVybmFsQ29udmVydEZyb21VVEY4OiBwQ29udkZyb21VVEY4RmN0IHJldHVybiAweCV4IixlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICAvKmRlY29kZWQgcGF0aCovCi0gICAgICAgIHBCdWZmZXJPdXQgPSB4VlNTX2NvbnRleHQtPlVURkNvbnZlcnNpb25Db250ZXh0LnBUZW1wT3V0Q29udmVyc2lvbkJ1ZmZlcjsKLSAgICAgICAgKCpjb252ZXJ0ZWRTaXplKSA9IENvbnZlcnRlZFNpemU7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gTTROT19FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3NyYy9WaWRlb0VkaXRvclJlc2FtcGxlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM1MzdmMC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3JjL1ZpZGVvRWRpdG9yUmVzYW1wbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfTkRFQlVHIDEKLSNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclJlc2FtcGxlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBWaWRlb0VkaXRvclJlc2FtcGxlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKLQotICAgIHB1YmxpYzoKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIsIGludDY0X3QgcHRzKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpOwotCi0gICAgZW51bSB7IC8vU2FtcGxpbmcgZnJlcQotICAgICBrRnJlcTgwMDBIeiA9IDgwMDAsCi0gICAgIGtGcmVxMTEwMjVIeiA9IDExMDI1LAotICAgICBrRnJlcTEyMDAwSHogPSAxMjAwMCwKLSAgICAga0ZyZXExNjAwMEh6ID0gMTYwMDAsCi0gICAgIGtGcmVxMjIwNTBIeiA9IDIyMDUwLAotICAgICBrRnJlcTI0MDAwSHogPSAyNDAwMCwKLSAgICAga0ZyZXEzMjAwMEh6ID0gMzIwMDAsCi0gICAgIGtGcmVxNDQxMDAgPSA0NDEwMCwKLSAgICAga0ZyZXE0ODAwMCA9IDQ4MDAwLAotICAgIH07Ci0KLSAgICBBdWRpb1Jlc2FtcGxlciAqbVJlc2FtcGxlcjsKLSAgICBpbnQxNl90KiBtSW5wdXQ7Ci0gICAgaW50IG5iQ2hhbm5lbHM7Ci0gICAgaW50IG5iU2FtcGxlczsKLSAgICBNNE9TQV9JbnQzMiBvdXRTYW1wbGluZ1JhdGU7Ci0gICAgTTRPU0FfSW50MzIgaW5TYW1wbGluZ1JhdGU7Ci0KLSAgICBpbnQxNl90ICptVG1wSW5CdWZmZXI7Ci19OwotCi0jZGVmaW5lIE1BWF9TQU1QTEVEVVJBVElPTl9GT1JfQ09OVkVSVElPTiA0MCAvL21zCi0KLXN0YXR1c190IFZpZGVvRWRpdG9yUmVzYW1wbGVyOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlciwgaW50NjRfdCBwdHMpIHsKLQotICAgIHVpbnQzMl90IGRhdGFTaXplID0gcEJ1ZmZlci0+ZnJhbWVDb3VudCAqIHRoaXMtPm5iQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7Ci0gICAgbVRtcEluQnVmZmVyID0gKGludDE2X3QqKW1hbGxvYyhkYXRhU2l6ZSk7Ci0gICAgbWVtY3B5KG1UbXBJbkJ1ZmZlciwgdGhpcy0+bUlucHV0LCBkYXRhU2l6ZSk7Ci0gICAgcEJ1ZmZlci0+cmF3ID0gKHZvaWQqKW1UbXBJbkJ1ZmZlcjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBWaWRlb0VkaXRvclJlc2FtcGxlcjo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIpIHsKLQotICAgIGlmKHBCdWZmZXItPnJhdyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUocEJ1ZmZlci0+cmF3KTsKLSAgICAgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKLSAgICAgICAgbVRtcEluQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0gICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci19Ci0KLWV4dGVybiAiQyIgewotCi1NNE9TQV9Db250ZXh0ICBMVkF1ZGlvUmVzYW1wbGVyQ3JlYXRlKE00T1NBX0ludDMyIGJpdERlcHRoLCBNNE9TQV9JbnQzMiBpbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBzYW1wbGVSYXRlLCBNNE9TQV9JbnQzMiBxdWFsaXR5KSB7Ci0KLSAgICBWaWRlb0VkaXRvclJlc2FtcGxlciAqY29udGV4dCA9IG5ldyBWaWRlb0VkaXRvclJlc2FtcGxlcigpOwotICAgIGNvbnRleHQtPm1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKAotICAgICAgICBiaXREZXB0aCwgaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUpOwotICAgIGlmIChjb250ZXh0LT5tUmVzYW1wbGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGNvbnRleHQtPm1SZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoYW5kcm9pZDo6VmlkZW9FZGl0b3JSZXNhbXBsZXI6OmtGcmVxMzIwMDBIeik7Ci0gICAgY29udGV4dC0+bVJlc2FtcGxlci0+c2V0Vm9sdW1lKDB4MTAwMCwgMHgxMDAwKTsKLSAgICBjb250ZXh0LT5uYkNoYW5uZWxzID0gaW5DaGFubmVsQ291bnQ7Ci0gICAgY29udGV4dC0+b3V0U2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICBjb250ZXh0LT5tSW5wdXQgPSBOVUxMOwotICAgIGNvbnRleHQtPm1UbXBJbkJ1ZmZlciA9IE5VTEw7Ci0KLSAgICByZXR1cm4gKChNNE9TQV9Db250ZXh0ICljb250ZXh0KTsKLX0KLQotCi12b2lkIExWQXVkaW9zZXRTYW1wbGVSYXRlKE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCwgTTRPU0FfSW50MzIgaW5TYW1wbGVSYXRlKSB7Ci0KLSAgICBWaWRlb0VkaXRvclJlc2FtcGxlciAqY29udGV4dCA9Ci0gICAgICAoVmlkZW9FZGl0b3JSZXNhbXBsZXIgKilyZXNhbXBsZXJDb250ZXh0OwotICAgIGNvbnRleHQtPm1SZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoaW5TYW1wbGVSYXRlKTsKLSAgICAvKgotICAgICAqIG5iU2FtcGxlcyBpcyBjYWxjdWxhdGVkIGZvciA0MG1zIHdvcnRoIG9mIGRhdGE7aGVuY2Ugc2FtcGxlIHJhdGUKLSAgICAgKiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbmJTYW1wbGVzCi0gICAgICovCi0gICAgY29udGV4dC0+aW5TYW1wbGluZ1JhdGUgPSBpblNhbXBsZVJhdGU7Ci0gICAgLy8gQWxsb2NhdGUgYnVmZmVyIGZvciBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIHNhbXBsZXMuCi0gICAgY29udGV4dC0+bUlucHV0ID0gKGludDE2X3QqKW1hbGxvYyggKGluU2FtcGxlUmF0ZSAqIE1BWF9TQU1QTEVEVVJBVElPTl9GT1JfQ09OVkVSVElPTiAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPm5iQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpIC8gMTAwMCk7Ci19Ci0KLXZvaWQgTFZBdWRpb3NldFZvbHVtZShNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQsIE00T1NBX0ludDE2IGxlZnQsIE00T1NBX0ludDE2IHJpZ2h0KSB7Ci0KLSAgICBWaWRlb0VkaXRvclJlc2FtcGxlciAqY29udGV4dCA9Ci0gICAgICAgKFZpZGVvRWRpdG9yUmVzYW1wbGVyICopcmVzYW1wbGVyQ29udGV4dDsKLSAgICBjb250ZXh0LT5tUmVzYW1wbGVyLT5zZXRWb2x1bWUobGVmdCxyaWdodCk7Ci19Ci0KLXZvaWQgTFZEZXN0cm95KE00T1NBX0NvbnRleHQgcmVzYW1wbGVyQ29udGV4dCkgewotCi0gICAgVmlkZW9FZGl0b3JSZXNhbXBsZXIgKmNvbnRleHQgPQotICAgICAgIChWaWRlb0VkaXRvclJlc2FtcGxlciAqKXJlc2FtcGxlckNvbnRleHQ7Ci0KLSAgICBpZiAoY29udGV4dC0+bVRtcEluQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShjb250ZXh0LT5tVG1wSW5CdWZmZXIpOwotICAgICAgICBjb250ZXh0LT5tVG1wSW5CdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChjb250ZXh0LT5tSW5wdXQgIT0gTlVMTCkgewotICAgICAgICBmcmVlKGNvbnRleHQtPm1JbnB1dCk7Ci0gICAgICAgIGNvbnRleHQtPm1JbnB1dCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGNvbnRleHQtPm1SZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgY29udGV4dC0+bVJlc2FtcGxlcjsKLSAgICAgICAgY29udGV4dC0+bVJlc2FtcGxlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGNvbnRleHQgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgY29udGV4dDsKLSAgICAgICAgY29udGV4dCA9IE5VTEw7Ci0gICAgfQotfQotCi12b2lkIExWQXVkaW9yZXNhbXBsZV9Mb3dRdWFsaXR5KE00T1NBX0ludDE2KiBvdXQsIE00T1NBX0ludDE2KiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9JbnQzMiBvdXRGcmFtZUNvdW50LCBNNE9TQV9Db250ZXh0IHJlc2FtcGxlckNvbnRleHQpIHsKLQotICAgIFZpZGVvRWRpdG9yUmVzYW1wbGVyICpjb250ZXh0ID0KLSAgICAgIChWaWRlb0VkaXRvclJlc2FtcGxlciAqKXJlc2FtcGxlckNvbnRleHQ7Ci0gICAgaW50MzJfdCAqcFRtcEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBjb250ZXh0LT5uYlNhbXBsZXMgPSAoY29udGV4dC0+aW5TYW1wbGluZ1JhdGUgKiBvdXRGcmFtZUNvdW50KSAvIGNvbnRleHQtPm91dFNhbXBsaW5nUmF0ZTsKLSAgICBtZW1jcHkoY29udGV4dC0+bUlucHV0LGlucHV0LChjb250ZXh0LT5uYlNhbXBsZXMgKiBjb250ZXh0LT5uYkNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSk7Ci0KLSAgICAvKgotICAgICBTUkMgbW9kdWxlIGFsd2F5cyBnaXZlcyBzdGVyZW8gb3V0cHV0LCBoZW5jZSAyIGZvciBzdGVyZW8gYXVkaW8KLSAgICAqLwotICAgIHBUbXBCdWZmZXIgPSAoaW50MzJfdCopbWFsbG9jKG91dEZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDMyX3QpKTsKLSAgICBtZW1zZXQocFRtcEJ1ZmZlciwgMHgwMCwgb3V0RnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MzJfdCkpOwotCi0gICAgY29udGV4dC0+bVJlc2FtcGxlci0+cmVzYW1wbGUoKGludDMyX3QgKilwVG1wQnVmZmVyLAotICAgICAgIChzaXplX3Qpb3V0RnJhbWVDb3VudCwgKFZpZGVvRWRpdG9yUmVzYW1wbGVyICopcmVzYW1wbGVyQ29udGV4dCk7Ci0gICAgLy8gQ29udmVydCBiYWNrIHRvIDE2IGJpdHMKLSAgICBkaXRoZXJBbmRDbGFtcCgoaW50MzJfdCopb3V0LCBwVG1wQnVmZmVyLCBvdXRGcmFtZUNvdW50KTsKLSAgICBmcmVlKHBUbXBCdWZmZXIpOwotICAgIHBUbXBCdWZmZXIgPSBOVUxMOwotfQotCi19Ci0KLX0gLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTA1M2U3ZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvcjNncFJlYWRlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvcjNncFJlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YTlhMDEyLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3IzZ3BSZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgM0dQIFJlYWRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgVklERU9FRElUT1JfM0dQUkVBREVSX0gKLSNkZWZpbmUgVklERU9FRElUT1JfM0dQUkVBREVSX0gKLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSNlbmRpZiAvKiBWSURFT0VESVRPUl8zR1BSRUFERVJfSCAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkM2I4MDEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBBdWRpbyBEZWNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl9BVURJT0RFQ09ERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl9BVURJT0RFQ09ERVJfSAotCi0jaW5jbHVkZSAiTTRBRF9Db21tb24uaCIKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BQUMoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BTVJXQihNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfTVAzKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKTsKLQotI2VuZGlmIC8qIFZJREVPRURJVE9SX0FVRElPREVDT0RFUl9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY0ZjZiMDQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBBdWRpbyBFbmNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBWSURFT0VESVRPUl9BVURJT0VOQ09ERVJfSAotI2RlZmluZSBWSURFT0VESVRPUl9BVURJT0VOQ09ERVJfSAotCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRFTkNPREVSX0F1ZGlvQ29tbW9uLmgiCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BTVJOQigKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVAzKAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlKTsKLQotI2VuZGlmIC8qIFZJREVPRURJVE9SX0FVRElPRU5DT0RFUl9IICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQnVmZmVyLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yQnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNhZmY2YTcuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvckJ1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JCdWZmZXIuYwotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEJ1ZmZlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgICBWSURFT0VESVRPUl9CVUZGRVJfSAotI2RlZmluZSAgIFZJREVPRURJVE9SX0JVRkZFUl9ICi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiTTRPU0FfTWVtb3J5LmgiCi0jaW5jbHVkZSAiTTRPU0FfQ2hhclN0YXIuaCIKLSNpbmNsdWRlICJNNF9VdGlscy5oIgotCi0jaW5jbHVkZSAiTFZfTWFjcm9zLmgiCi0KLS8qLS0tIENvcmUgaWQgZm9yIFZJREVPRURJVE9SIEJ1ZmZlciBhbGxvY2F0aW9ucyAgLS0tKi8KLSNkZWZpbmUgVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMIDB4MDEyRgotCi0vKiAtLS0tLSBlcnJvcnMgIC0tLS0tKi8KLSNkZWZpbmUgTTRFUlJfTk9fQlVGRkVSX0FWQUlMQUJMRSBcCi0gICAgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLDB4MDAwMDAxKQotI2RlZmluZSBNNEVSUl9OT19CVUZGRVJfTUFUQ0ggXAotICAgIE00T1NBX0VSUl9DUkVBVEUoTTRfRVJSLFZJREVPRURJVE9SX0JVRkZFUl9FWFRFUk5BTCwweDAwMDAwMikKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfa0VtcHR5ID0gMCwKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfa0ZpbGxlZCwKLX0gVklERU9FRElUT1JfQlVGRkVSX1N0YXRlOwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0cnVjdHVyZSAgICBMVk9NWF9CVUZGRVJfQnVmZmVyCi0gKiBAYnJpZWYgICAgICAgT25lIE9NWCBCdWZmZXIgYW5kIGRhdGEgcmVsYXRlZCB0byBpdAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNE9TQV9Wb2lkKiBwRGF0YTsgICAgICAgICAgICAgIC8qKjwgUG9pbnRlciB0byB0aGUgZGF0YSovCi0gICAgTTRPU0FfVUludDMyIHNpemU7Ci0gICAgVklERU9FRElUT1JfQlVGRkVSX1N0YXRlIHN0YXRlOyAvKio8IEJ1ZmZlciBzdGF0ZSAqLwotICAgIE00T1NBX1VJbnQzMiBpZHg7ICAgICAgICAgICAgICAgLyoqPCBJbmRleCBvZiB0aGUgYnVmZmVyIGluc2lkZSB0aGUgcG9vbCAqLwotICAgIE00X01lZGlhVGltZSAgICBidWZmQ1RTOyAgICAgICAgLyoqPCBUaW1lIHN0YW1wIG9mIHRoZSBidWZmZXIgKi8KLX0gVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcjsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdHJ1Y3R1cmUgICAgTFZPTVhfQlVGRkVSX1Bvb2wKLSAqIEBicmllZiAgICAgICBTdHJ1Y3R1cmUgdG8gbWFuYWdlIGJ1ZmZlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlciogcE5YUEJ1ZmZlcjsKLSAgICBNNE9TQV9VSW50MzIgTkI7Ci0gICAgTTRPU0FfQ2hhciogcG9vbE5hbWU7Ci19IFZJREVPRURJVE9SX0JVRkZFUl9Qb29sOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZiAvL19fY3BsdXNwbHVzCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiogcHBvb2wsCi0gKiAgICAgICAgIE00T1NBX1VJbnQzMiBuYkJ1ZmZlcnMpCi0gKiBAYnJpZWYgICBBbGxvY2F0ZSBhIHBvb2wgb2YgbmJCdWZmZXJzIGJ1ZmZlcnMKLSAqCi0gKiBAcGFyYW0gICBwcG9vbCAgICAgIDogSU4gVGhlIGJ1ZmZlciBwb29sIHRvIGNyZWF0ZQotICogQHBhcmFtICAgbmJCdWZmZXJzICA6IElOIFRoZSBudW1iZXIgb2YgYnVmZmVycyBpbiB0aGUgcG9vbAotICogQHBhcmFtICAgcG9vbE5hbWUgICA6IElOIGEgbmFtZSBnaXZlbiB0byB0aGUgcG9vbAotICogQHJldHVybiAgRXJyb3IgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiogcHBvb2wsCi0gICAgICAgIE00T1NBX1VJbnQzMiBuYkJ1ZmZlcnMsIE00T1NBX0NoYXIqIHBvb2xOYW1lKTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbChMVk9NWF9CVUZGRVJfUG9vbCogcHBvb2wpCi0gKiBAYnJpZWYgICBEZWFsbG9jYXRlIGEgYnVmZmVyIHBvb2wKLSAqCi0gKiBAcGFyYW0gICBwcG9vbCAgICAgIDogSU4gVGhlIGJ1ZmZlciBwb29sIHRvIGZyZWUKLSAqIEByZXR1cm4gIEVycm9yIGNvZGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCk7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZ2V0QnVmZmVyKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCwKLSAqICAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcioqIHBOWFBCdWZmZXIpCi0gKiBAYnJpZWYgICBSZXR1cm5zIGEgYnVmZmVyIGluIGEgZ2l2ZW4gc3RhdGUKLSAqCi0gKiBAcGFyYW0gICBwcG9vbCAgICAgIDogSU4gVGhlIGJ1ZmZlciBwb29sCi0gKiBAcGFyYW0gICBkZXNpcmVkU3RhdGUgOiBJTiBUaGUgYnVmZmVyIHN0YXRlCi0gKiBAcGFyYW0gICBwTlhQQnVmZmVyIDogSU4gVGhlIHNlbGVjdGVkIGJ1ZmZlcgotICogQHJldHVybiAgRXJyb3IgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZ2V0QnVmZmVyKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX1N0YXRlIGRlc2lyZWRTdGF0ZSwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcioqIHBOWFBCdWZmZXIpOwotCi0KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfaW5pdFBvb2xCdWZmZXJzKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCwKLSAgICAgICAgTTRPU0FfVUludDMyIGxTaXplKTsKLQotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9nZXRPbGRlc3RCdWZmZXIoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wgKnBvb2wsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9TdGF0ZSBkZXNpcmVkU3RhdGUsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqKiBwTlhQQnVmZmVyKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLy9fX2NwbHVzcGx1cwotI2VuZGlmIC8qVklERU9FRElUT1JfQlVGRkVSX0gqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yTWFpbi5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvck1haW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGMzYjUxNy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yTWFpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19WSURFT19FRElUT1JfQVBJX0hfXwotI2RlZmluZSBfX1ZJREVPX0VESVRPUl9BUElfSF9fCi0KLSNpbmNsdWRlICJNNE9TQV9UeXBlcy5oIgotCi10eXBlZGVmIGVudW0KLXsKLSAgICBNU0dfVFlQRV9QUk9HUkVTU19JTkRJQ0FUSU9OLCAgICAgLy8gUGxheWJhY2sgcHJvZ3Jlc3MgaW5kaWNhdGlvbiBldmVudAotICAgIE1TR19UWVBFX1BMQVlFUl9FUlJPUiwgICAgICAgICAgICAvLyBQbGF5YmFjayBlcnJvcgotICAgIE1TR19UWVBFX1BSRVZJRVdfRU5ELCAgICAgICAgICAgICAvLyBQcmV2aWV3IG9mIGNsaXBzIGlzIGNvbXBsZXRlCi0gICAgTVNHX1RZUEVfT1ZFUkxBWV9VUERBVEUsICAgICAgICAgIC8vIHVwZGF0ZSBvdmVybGF5IGR1cmluZyBwcmV2aWV3Ci0gICAgTVNHX1RZUEVfT1ZFUkxBWV9DTEVBUiwgICAgICAgICAgIC8vIGNsZWFyIHRoZSBvdmVybGF5Ci19IHByb2dyZXNzX2NhbGxiYWNrX21zZ190eXBlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IG92ZXJsYXlTZXR0aW5nc0luZGV4OwotICAgIGludCBjbGlwSW5kZXg7Ci19IFZpZGVvRWRpdG9yQ3VycmV0RWRpdEluZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTTRPU0FfVm9pZCAgICAgKnBGaWxlOyAgICAgICAgICAgICAgICAgICAvKiogUENNIGZpbGUgcGF0aCAqLwotICAgIE00T1NBX0Jvb2wgICAgIGJSZW1vdmVPcmlnaW5hbDsgICAgICAgICAgLyoqIElmIHRydWUsIHRoZSBvcmlnaW5hbCBhdWRpbyB0cmFjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgKi8KLSAgICBNNE9TQV9VSW50MzIgICB1aU5iQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqIE51bWJlciBvZiBjaGFubmVscyAoMT1tb25vLCAyPXN0ZXJlbykgb2YgQkdNIGNsaXAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpU2FtcGxpbmdGcmVxdWVuY3k7ICAgICAvKiogU2FtcGxpbmcgYXVkaW8gZnJlcXVlbmN5ICg4MDAwIGZvciBhbXIsIDE2MDAwIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGZvciBhYWMpIG9mIEJHTSBjbGlwKi8KLSAgICBNNE9TQV9VSW50MzIgICB1aUV4dGVuZGVkU2FtcGxpbmdGcmVxdWVuY3k7IC8qKiBFeHRlbmRlZCBmcmVxdWVuY3kgZm9yIEFBQyssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlQUFDKyBzdHJlYW1zIG9mIEJHTSBjbGlwKi8KLSAgICBNNE9TQV9VSW50MzIgICB1aUFkZEN0czsgICAgICAgICAgICAgICAgLyoqIFRpbWUsIGluIG1pbGxpc2Vjb25kcywgYXQgd2hpY2ggdGhlIGFkZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyB0cmFjayBpcyBpbnNlcnRlZCAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpQWRkVm9sdW1lOyAgICAgICAgICAgICAvKiogVm9sdW1lLCBpbiBwZXJjZW50YWdlLCBvZiB0aGUgYWRkZWQgYXVkaW8gdHJhY2sgKi8KLSAgICBNNE9TQV9VSW50MzIgICBiZWdpbkN1dE1zOwotICAgIE00T1NBX1VJbnQzMiAgIGVuZEN1dE1zOwotICAgIE00T1NBX0ludDMyICAgIGZpbGVUeXBlOwotICAgIE00T1NBX0Jvb2wgICAgIGJMb29wOyAgICAgICAgICAgICAgICAgICAvKiogTG9vcGluZyBvbi9vZmYgKiovCi0gICAgLyogQXVkaW8gZHVja2luZyAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpSW5EdWNraW5nX3RocmVzaG9sZDsgICAvKiogVGhyZXNob2xkIHZhbHVlIGF0IHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kIG11c2ljIHNoYWxsIGR1Y2sgKi8KLSAgICBNNE9TQV9VSW50MzIgICB1aUluRHVja2luZ19sb3dWb2x1bWU7ICAgLyoqIGxvd2VyIHRoZSBiYWNrZ3JvdW5kIHRyYWNrIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZhY3RvciBvZiBjdXJyZW50IGxldmVsICovCi0gICAgTTRPU0FfQm9vbCAgICAgYkluRHVja2luZ19lbmFibGU7ICAgICAgIC8qKiBlbmFibGUgZHVja2luZyAqLwotICAgIE00T1NBX1VJbnQzMiAgIHVpQlRDaGFubmVsQ291bnQ7ICAgICAgICAvKiogY2hhbm5lbCBjb3VudCBmb3IgQlQgKi8KLSAgICBNNE9TQV9Wb2lkICAgICAqcFBDTUZpbGVQYXRoOwotfSBNNHhWU1NfQXVkaW9NaXhpbmdTZXR0aW5nczsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBNNE9TQV9Wb2lkICAgICAgKnBCdWZmZXI7ICAgICAgICAgICAgLyogWVVWNDIwIGJ1ZmZlciBvZiBmcmFtZSB0byBiZSByZW5kZXJlZCovCi0gICAgTTRPU0FfVUludDMyICAgIHRpbWVNczsgICAgICAgICAgICAvKiB0aW1lIHN0YW1wIG9mIHRoZSBmcmFtZSB0byBiZSByZW5kZXJlZCovCi0gICAgTTRPU0FfVUludDMyICAgIHVpU3VyZmFjZVdpZHRoOyAgICAvKiBTdXJmYWNlIGRpc3BsYXkgd2lkdGgqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aVN1cmZhY2VIZWlnaHQ7ICAgIC8qIFN1cmZhY2UgZGlzcGxheSBoZWlnaHQqLwotICAgIE00T1NBX1VJbnQzMiAgICB1aUZyYW1lV2lkdGg7ICAgICAgICAvKiBGcmFtZSB3aWR0aCovCi0gICAgTTRPU0FfVUludDMyICAgIHVpRnJhbWVIZWlnaHQ7ICAgICAgICAvKiBGcmFtZSBoZWlnaHQqLwotICAgIE00T1NBX0Jvb2wgICAgICBiQXBwbHlFZmZlY3Q7ICAgICAgICAvKiBBcHBseSB2aWRlbyBlZmZlY3RzIGJlZm9yZSByZW5kZXIqLwotICAgIE00T1NBX1VJbnQzMiAgICBjbGlwQmVnaW5DdXRUaW1lOyAgLyogQ2xpcCBiZWdpbiBjdXQgdGltZSByZWxhdGl2ZSB0byBzdG9yeWJvYXJkICovCi0gICAgTTRPU0FfVUludDMyICAgIGNsaXBFbmRDdXRUaW1lOyAgICAvKiBDbGlwIGVuZCBjdXQgdGltZSByZWxhdGl2ZSB0byBzdG9yeWJvYXJkICovCi0gICAgTTRPU0FfVUludDMyICAgIHZpZGVvUm90YXRpb25EZWdyZWU7IC8qIFZpZGVvIHJvdGF0aW9uIGRlZ3JlZSAqLwotCi19IFZpZGVvRWRpdG9yX3JlbmRlclByZXZpZXdGcmFtZVN0cjsKLSNlbmRpZiAvKl9fVklERU9fRURJVE9SX0FQSV9IX18qLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvck1wM1JlYWRlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvck1wM1JlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YjNiZTQwLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JNcDNSZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JNcDNSZWFkZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgTVAzIFJlYWRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgVklERU9FRElUT1JfTVAzUkVBREVSX0gKLSNkZWZpbmUgVklERU9FRElUT1JfTVAzUkVBREVSX0gKLQotI2luY2x1ZGUgIk00UkVBREVSX0NvbW1vbi5oIgotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSNlbmRpZiAvKiBWSURFT0VESVRPUl9NUDNSRUFERVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclV0aWxzLmggYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTIxYjIxZC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yVXRpbHMuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgVXRpbGl0aWVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotI2lmbmRlZiBBTkRST0lEX1VUSUxTX0hfCi0jZGVmaW5lIEFORFJPSURfVVRJTFNfSF8KLQotLyoqKioqKioqKioqKioqKioqKioKLSAqICAgICBIRUFERVJTICAgICAqCi0gKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0KLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVklERU9FRElUT1JfQ0hFQ0sodGVzdCwgZXJyQ29kZSkKLSAqIEBub3RlIFRoaXMgbWFjcm8gZGlzcGxheXMgYW4gZXJyb3IgbWVzc2FnZSBhbmQgZ29lcyB0byBmdW5jdGlvbiBjbGVhblVwIGxhYmVsCi0gKiAgICAgICBpZiB0aGUgdGVzdCBmYWlscy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgVklERU9FRElUT1JfQ0hFQ0sodGVzdCwgZXJyQ29kZSkgXAoteyBcCi0gICAgaWYoICEodGVzdCkgKSB7IFwKLSAgICAgICAgQUxPR1YoIiEhISAlcyAoTCVkKSBjaGVjayBmYWlsZWQgOiAiICN0ZXN0ICIsIHlpZWxkcyBlcnJvciAweCUuOHgiLCBcCi0gICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIGVyckNvZGUpOyBcCi0gICAgICAgIGVyciA9IChlcnJDb2RlKTsgXAotICAgICAgICBnb3RvIGNsZWFuVXA7IFwKLSAgICB9IFwKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU0FGRV9GUkVFKHApCi0gKiBAbm90ZSBUaGlzIG1hY3JvIGNhbGxzIGZyZWUgYW5kIG1ha2VzIHN1cmUgdGhlIHBvaW50ZXIgaXMgc2V0IHRvIE5VTEwuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jZGVmaW5lIFNBRkVfRlJFRShwKSBcCi17IFwKLSAgICBpZihNNE9TQV9OVUxMICE9IChwKSkgeyBcCi0gICAgICAgIGZyZWUoKHApKSA7IFwKLSAgICAgICAgKHApID0gTTRPU0FfTlVMTCA7IFwKLSAgICB9IFwKLX0KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU0FGRV9NQUxMT0MocCwgdHlwZSwgY291bnQsIGNvbW1lbnQpCi0gKiBAbm90ZSBUaGlzIG1hY3JvIGFsbG9jYXRlcyBhIGJ1ZmZlciwgY2hlY2tzIGZvciBzdWNjZXNzIGFuZCBmaWxscyB0aGUgYnVmZmVyCi0gKiAgICAgICB3aXRoIDAuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0jZGVmaW5lIFNBRkVfTUFMTE9DKHAsIHR5cGUsIGNvdW50LCBjb21tZW50KSBcCi17IFwKLSAgICAocCkgPSAodHlwZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKHNpemVvZih0eXBlKSooY291bnQpLCAweEZGLChNNE9TQV9DaGFyKiljb21tZW50KTtcCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSAocCksIE00RVJSX0FMTE9DKTsgXAotICAgIG1lbXNldCgodm9pZCAqKShwKSwgMCxzaXplb2YodHlwZSkqKGNvdW50KSk7IFwKLX0KLQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqCi0gICAgICogICAgVVRJTElUSUVTICAgICAqCi0gICAgICoqKioqKioqKioqKioqKioqKioqLwotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBESVNQTEFZIE1FVEFEQVRBIENPTlRFTlQgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBkaXNwbGF5TWV0YURhdGEoY29uc3Qgc3A8TWV0YURhdGE+IG1ldGEpOwotCi0vLyBCdWlsZCB0aGUgQVZDIGNvZGVjIHNwY2lmaWMgaW5mbyBmcm9tIHRoZSBTdGFnZUZyaWdodCBlbmNvZGVycyBvdXRwdXQKLXN0YXR1c190IGJ1aWxkQVZDQ29kZWNTcGVjaWZpY0RhdGEodWludDhfdCAqKm91dHB1dERhdGEsIHNpemVfdCAqb3V0cHV0U2l6ZSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIE1ldGFEYXRhICpwYXJhbSk7Ci0KLX0vL25hbWVzcGFjZSBhbmRyb2lkCi0KLQotI2VuZGlmIC8vQU5EUk9JRF9VVElMU19IXwpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZWVhM2E2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgdmlkZW8gZGVjb2RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgVklERU9FRElUT1JfVklERU9ERUNPREVSX0gKLSNkZWZpbmUgVklERU9FRElUT1JfVklERU9ERUNPREVSX0gKLQotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9NUEVHNCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLAotICAgICAgICBNNE9TQV9Db250ZXh0ICpwRGVjb2RlckludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLAotICAgICAgICBNNE9TQV9Db250ZXh0ICpwRGVjb2RlckludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRTb2Z0d2FyZUludGVyZmFjZV9NUEVHNCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLAotICAgICAgICBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKTsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlX0gyNjQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSk7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRWaWRlb0RlY29kZXJzQW5kQ2FwYWJpbGl0aWVzKAotICAgIE00REVDT0RFUl9WaWRlb0RlY29kZXJzKiogZGVjb2RlcnMpOwotCi0jZW5kaWYgLy8gVklERU9FRElUT1JfVklERU9ERUNPREVSX0gKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfaW50ZXJuYWwuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjc2MjY0My4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvaW5jL1ZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0ludGVybmFsLmgKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCB2aWRlbyBkZWNvZGVyIGludGVybmFsIGhlYWRlciBmaWxlKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotI2luY2x1ZGUgIk00T1NBX1R5cGVzLmgiCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNF9Db21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9Db3JlSUQuaCIKLQotI2luY2x1ZGUgIk00REFfVHlwZXMuaCIKLSNpbmNsdWRlICJNNFJFQURFUl9Db21tb24uaCIKLSNpbmNsdWRlICJNNFZJRklfRmlsdGVyc0FQSS5oIgotI2luY2x1ZGUgIk00VE9PTF9WZXJzaW9uSW5mby5oIgotI2luY2x1ZGUgIk00REVDT0RFUl9Db21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9TZW1hcGhvcmUuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvckJ1ZmZlci5oIgotI2luY2x1ZGUgIk00VkRfVG9vbHMuaCIKLSNpbmNsdWRlICJJNDIwQ29sb3JDb252ZXJ0ZXIuaCIKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL3JlY3QuaD4KLSNpbmNsdWRlIDxPTVhfVmlkZW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLQotI2RlZmluZSBWSURFT0VESVRPUl9WSURFQ19TSEVMTF9WRVJfTUFKT1IgICAgIDAKLSNkZWZpbmUgVklERU9FRElUT1JfVklERUNfU0hFTExfVkVSX01JTk9SICAgICAwCi0jZGVmaW5lIFZJREVPRURJVE9SX1ZJREVDX1NIRUxMX1ZFUl9SRVZJU0lPTiAgMQotCi0vKiBFUlJPUlMgKi8KLSNkZWZpbmUgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwgTTRPU0FfRVJSX0NSRUFURShNNF9FUlIsIDB4RkYsIDB4MDAwMSkKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10eXBlZGVmIGVudW0gewotICAgIFZJREVPRURJVE9SX2tNcGVnNFZpZGVvRGVjLAotICAgIFZJREVPRURJVE9SX2tIMjYzVmlkZW9EZWMsCi0gICAgVklERU9FRElUT1Jfa0gyNjRWaWRlb0RlYwotfSBWSURFT0VESVRPUl9Db2RlY1R5cGU7Ci0KLQotLyp0eXBlZGVmIHN0cnVjdHsKLSAgICBNNE9TQV9VSW50MzIgc3RyZWFtX2J5dGU7Ci0gICAgTTRPU0FfVUludDMyIHN0cmVhbV9pbmRleDsKLSAgICBNNE9TQV9NZW1BZGRyOCBpbjsKLQotfSBWSURFT0VESVRPUl9WSURFT19CaXRzdHJlYW1fY3R4dDsqLwotCi10eXBlZGVmIE00VlNfQml0c3RyZWFtX2N0eHQgVklERU9FRElUT1JfVklERU9fQml0c3RyZWFtX2N0eHQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIC8qKiBTdGFnZWZyaWd0aCBwYXJhbXMgKi8KLSAgICBPTVhDbGllbnQgICAgICAgICAgICAgICBtQ2xpZW50OyAvKio8IE9NWCBDbGllbnQgc2Vzc2lvbiBpbnN0YW5jZS4gKi8KLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICBtVmlkZW9EZWNvZGVyOyAvKio8IFN0YWdlZnJpZ2h0IGRlY29kZXIgaW5zdGFuY2UgKi8KLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICBtUmVhZGVyU291cmNlOyAvKio8IFJlYWRlciBhY2Nlc3MgPiAqLwotCi0gICAgLyogUkVBREVSICovCi0gICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICptX3BSZWFkZXJHbG9iYWw7Ci0gICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAgKm1fcFJlYWRlcjsKLSAgICBNNF9BY2Nlc3NVbml0ICAgICAgICAgICAqbV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZTsKLQotICAgIC8qIFNUUkVBTSBQQVJBTVMgKi8KLSAgICBNNF9WaWRlb1N0cmVhbUhhbmRsZXIqICBtX3BWaWRlb1N0cmVhbWhhbmRsZXI7Ci0KLSAgICAvKiBVc2VyIGZpbHRlciBwYXJhbXMuICovCi0gICAgTTRWSUZJX1BsYW5Db252ZXJ0ZXJGdW5jdGlvblR5cGUgKm1fcEZpbHRlcjsKLSAgICBNNE9TQV9Wb2lkICAgICAgICAgICAgICAqbV9wRmlsdGVyVXNlckRhdGE7Ci0KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICBtX2xhc3REZWNvZGVkQ1RTOwotICAgIE00X01lZGlhVGltZSAgICAgICAgICAgIG1fbGFzdFJlbmRlckN0czsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICBtUmVhY2hlZEVPUzsKLSAgICBWSURFT0VESVRPUl9Db2RlY1R5cGUgICBtRGVjb2RlclR5cGU7Ci0gICAgTTRERUNPREVSX1ZpZGVvU2l6ZSAgICAgbV9WaWRlb1NpemU7Ci0gICAgTTRERUNPREVSX01QRUc0X0RlY29kZXJDb25maWdJbmZvIG1fRGNpOyAvKio8IERlY29kZXIgQ29uZmlnIGluZm8gKi8KLSAgICBWSURFT0VESVRPUl9CVUZGRVJfUG9vbCAqbV9wRGVjQnVmZmVyUG9vbDsgLyoqPCBEZWNvZGVkIGJ1ZmZlciBwb29sICovCi0gICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgICAgZGVjT3VwdXRDb2xvckZvcm1hdDsKLQotICAgIE00T1NBX1VJbnQzMiAgICAgICAgICAgIG1OYklucHV0RnJhbWVzOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgIG1GaXJzdElucHV0Q3RzOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgIG1MYXN0SW5wdXRDdHM7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgbU5iUmVuZGVyZWRGcmFtZXM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUZpcnN0UmVuZGVyZWRDdHM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUxhc3RSZW5kZXJlZEN0czsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICBtTmJPdXRwdXRGcmFtZXM7Ci0gICAgTTRPU0FfRG91YmxlICAgICAgICAgICAgbUZpcnN0T3V0cHV0Q3RzOwotICAgIE00T1NBX0RvdWJsZSAgICAgICAgICAgIG1MYXN0T3V0cHV0Q3RzOwotICAgIE00T1NBX0ludDMyICAgICAgICAgICAgIG1HaXZlbldpZHRoLCBtR2l2ZW5IZWlnaHQ7IC8vVXNlZCBpbiBjYXNlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JTkZPX0ZPUk1BVF9DSEFOR0VECi0gICAgQVJlY3QgICAgICAgICAgICAgICAgICAgbUNyb3BSZWN0OyAgLy8gVGhlc2UgYXJlIG9idGFpbmVkIGZyb20ga0tleUNyb3BSZWN0LgotICAgIEk0MjBDb2xvckNvbnZlcnRlciogICAgIG1JNDIwQ29sb3JDb252ZXJ0ZXI7Ci0KLSAgICAvLyBUaW1lIGludGVydmFsIGJldHdlZW4gdHdvIGNvbnNlcXV0aXZlL25laWdoYm9yaW5nIHZpZGVvIGZyYW1lcy4KLSAgICBNNF9NZWRpYVRpbWUgICAgICAgICAgICBtRnJhbWVJbnRlcnZhbE1zOwotCi19IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQ7Ci0KLX0gLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5oIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZDUxNTRmLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9pbmMvVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgdmlkZW8gZW5jb2RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNpZm5kZWYgVklERU9FRElUT1JfVklERU9FTkNPREVSX0gKLSNkZWZpbmUgVklERU9FRElUT1JfVklERU9FTkNPREVSX0gKLQotI2luY2x1ZGUgIk00RU5DT0RFUl9jb21tb24uaCIKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZV9IMjYzKE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QRUc0KE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpOwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjQoTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSk7Ci0KLSNlbmRpZiAvL1ZJREVPRURJVE9SX1ZJREVPRU5DT0RFUl9ICmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxODg5NDIuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIE1lZGlhQnVmZmVyUHVsbGVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5jcHAgXAotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcCBcCi0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvclV0aWxzLmNwcCBcCi0gICAgVmlkZW9FZGl0b3JCdWZmZXIuYyBcCi0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuY3BwIFwKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvbHZwcCBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3Ivb3NhbC9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9pbmMgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2xpYnZpZGVvZWRpdG9yL3Zzcy9jb21tb24vaW5jIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci92c3MvbWNzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvZWRpdG9yIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgIFwKLSAgICBsaWJjdXRpbHMgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ1dGlscyAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJtZWRpYSAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJiaW5kZXIgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodCAgICAgICAgICAgIFwKLSAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICBsaWJzdGFnZWZyaWdodF9vbXggICAgICAgIFwKLSAgICBsaWJndWkgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcl9vc2FsICAgICAgIFwKLSAgICBsaWJ2aWRlb2VkaXRvcnBsYXllciAgICAgIFwKLQotTE9DQUxfQ0ZMQUdTICs9IFwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbgotCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnZpZGVvZWRpdG9yX3N0YWdlZnJpZ2h0c2hlbGxzCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9NZWRpYUJ1ZmZlclB1bGxlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjODI2OC4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZWRpYUJ1ZmZlclB1bGxlciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlICJNZWRpYUJ1ZmZlclB1bGxlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLQotTWVkaWFCdWZmZXJQdWxsZXI6Ok1lZGlhQnVmZmVyUHVsbGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAotICAgICAgbUFza1RvU3RhcnQoZmFsc2UpLAotICAgICAgbUFza1RvU3RvcChmYWxzZSksCi0gICAgICBtQWNxdWlyZVN0b3BwZWQoZmFsc2UpLAotICAgICAgbVJlbGVhc2VTdG9wcGVkKGZhbHNlKSwKLSAgICAgIG1Tb3VyY2VFcnJvcihPSykgewotCi0gICAgYW5kcm9pZENyZWF0ZVRocmVhZChhY3F1aXJlVGhyZWFkU3RhcnQsIHRoaXMpOwotICAgIGFuZHJvaWRDcmVhdGVUaHJlYWQocmVsZWFzZVRocmVhZFN0YXJ0LCB0aGlzKTsKLX0KLQotTWVkaWFCdWZmZXJQdWxsZXI6On5NZWRpYUJ1ZmZlclB1bGxlcigpIHsKLSAgICBzdG9wKCk7Ci19Ci0KLWJvb2wgTWVkaWFCdWZmZXJQdWxsZXI6Omhhc01lZGlhU291cmNlUmV0dXJuZWRFcnJvcigpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHJldHVybiAoKG1Tb3VyY2VFcnJvciAhPSBPSykgPyB0cnVlIDogZmFsc2UpOwotfQotdm9pZCBNZWRpYUJ1ZmZlclB1bGxlcjo6c3RhcnQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBtQXNrVG9TdGFydCA9IHRydWU7Ci0gICAgbUFjcXVpcmVDb25kLnNpZ25hbCgpOwotICAgIG1SZWxlYXNlQ29uZC5zaWduYWwoKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlclB1bGxlcjo6c3RvcCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIG1Bc2tUb1N0b3AgPSB0cnVlOwotICAgIG1BY3F1aXJlQ29uZC5zaWduYWwoKTsKLSAgICBtUmVsZWFzZUNvbmQuc2lnbmFsKCk7Ci0gICAgd2hpbGUgKCFtQWNxdWlyZVN0b3BwZWQgfHwgIW1SZWxlYXNlU3RvcHBlZCkgewotICAgICAgICBtVXNlckNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgLy8gUmVsZWFzZSByZW1haW5pbmcgYnVmZmVycwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUJ1ZmZlcnMuaXRlbUF0KGkpLT5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVsZWFzZUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVJlbGVhc2VCdWZmZXJzLml0ZW1BdChpKS0+cmVsZWFzZSgpOwotICAgIH0KLQotICAgIG1CdWZmZXJzLmNsZWFyKCk7Ci0gICAgbVJlbGVhc2VCdWZmZXJzLmNsZWFyKCk7Ci19Ci0KLU1lZGlhQnVmZmVyKiBNZWRpYUJ1ZmZlclB1bGxlcjo6Z2V0QnVmZmVyTm9uQmxvY2tpbmcoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBpZiAobUJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICBNZWRpYUJ1ZmZlciogYiA9IG1CdWZmZXJzLml0ZW1BdCgwKTsKLSAgICAgICAgbUJ1ZmZlcnMucmVtb3ZlQXQoMCk7Ci0gICAgICAgIHJldHVybiBiOwotICAgIH0KLX0KLQotTWVkaWFCdWZmZXIqIE1lZGlhQnVmZmVyUHVsbGVyOjpnZXRCdWZmZXJCbG9ja2luZygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIHdoaWxlIChtQnVmZmVycy5lbXB0eSgpICYmICFtQWNxdWlyZVN0b3BwZWQpIHsKLSAgICAgICAgbVVzZXJDb25kLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIGlmIChtQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBiID0gbUJ1ZmZlcnMuaXRlbUF0KDApOwotICAgICAgICBtQnVmZmVycy5yZW1vdmVBdCgwKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhQnVmZmVyUHVsbGVyOjpwdXRCdWZmZXIoTWVkaWFCdWZmZXIqIGJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgbVJlbGVhc2VCdWZmZXJzLnB1c2goYnVmZmVyKTsKLSAgICBtUmVsZWFzZUNvbmQuc2lnbmFsKCk7Ci19Ci0KLWludCBNZWRpYUJ1ZmZlclB1bGxlcjo6YWNxdWlyZVRocmVhZFN0YXJ0KHZvaWQqIGFyZykgewotICAgIE1lZGlhQnVmZmVyUHVsbGVyKiBzZWxmID0gKE1lZGlhQnVmZmVyUHVsbGVyKilhcmc7Ci0gICAgc2VsZi0+YWNxdWlyZVRocmVhZEZ1bmMoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IE1lZGlhQnVmZmVyUHVsbGVyOjpyZWxlYXNlVGhyZWFkU3RhcnQodm9pZCogYXJnKSB7Ci0gICAgTWVkaWFCdWZmZXJQdWxsZXIqIHNlbGYgPSAoTWVkaWFCdWZmZXJQdWxsZXIqKWFyZzsKLSAgICBzZWxmLT5yZWxlYXNlVGhyZWFkRnVuYygpOwotICAgIHJldHVybiAwOwotfQotCi12b2lkIE1lZGlhQnVmZmVyUHVsbGVyOjphY3F1aXJlVGhyZWFkRnVuYygpIHsKLSAgICBtTG9jay5sb2NrKCk7Ci0KLSAgICAvLyBXYWl0IGZvciB0aGUgc3RhcnQgc2lnbmFsCi0gICAgd2hpbGUgKCFtQXNrVG9TdGFydCAmJiAhbUFza1RvU3RvcCkgewotICAgICAgICBtQWNxdWlyZUNvbmQud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgLy8gTG9vcCB1bnRpbCB3ZSBhcmUgYXNrZWQgdG8gc3RvcCwgb3IgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvIHJlYWQKLSAgICB3aGlsZSAoIW1Bc2tUb1N0b3ApIHsKLSAgICAgICAgTWVkaWFCdWZmZXIqIHBCdWZmZXI7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtU291cmNlLT5yZWFkKCZwQnVmZmVyLCBOVUxMKTsKLSAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICBtU291cmNlRXJyb3IgPSByZXN1bHQ7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1CdWZmZXJzLnB1c2gocEJ1ZmZlcik7Ci0gICAgICAgIG1Vc2VyQ29uZC5zaWduYWwoKTsKLSAgICB9Ci0KLSAgICBtQWNxdWlyZVN0b3BwZWQgPSB0cnVlOwotICAgIG1Vc2VyQ29uZC5zaWduYWwoKTsKLSAgICBtTG9jay51bmxvY2soKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlclB1bGxlcjo6cmVsZWFzZVRocmVhZEZ1bmMoKSB7Ci0gICAgbUxvY2subG9jaygpOwotCi0gICAgLy8gV2FpdCBmb3IgdGhlIHN0YXJ0IHNpZ25hbAotICAgIHdoaWxlICghbUFza1RvU3RhcnQgJiYgIW1Bc2tUb1N0b3ApIHsKLSAgICAgICAgbVJlbGVhc2VDb25kLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIC8vIExvb3AgdW50aWwgd2UgYXJlIGFza2VkIHRvIHN0b3AKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAobVJlbGVhc2VCdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmIChtQXNrVG9TdG9wKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1SZWxlYXNlQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBNZWRpYUJ1ZmZlciogcEJ1ZmZlciA9IG1SZWxlYXNlQnVmZmVycy5pdGVtQXQoMCk7Ci0gICAgICAgIG1SZWxlYXNlQnVmZmVycy5yZW1vdmVBdCgwKTsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHBCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUxvY2subG9jaygpOwotICAgIH0KLQotICAgIG1SZWxlYXNlU3RvcHBlZCA9IHRydWU7Ci0gICAgbVVzZXJDb25kLnNpZ25hbCgpOwotICAgIG1Mb2NrLnVubG9jaygpOwotfQotCi19OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTWVkaWFCdWZmZXJQdWxsZXIuaCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvTWVkaWFCdWZmZXJQdWxsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3MmE1My4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL01lZGlhQnVmZmVyUHVsbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTUVESUFfQlVGRkVSX1BVTExFUl9ICi0jZGVmaW5lIF9NRURJQV9CVUZGRVJfUFVMTEVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBNZWRpYVNvdXJjZTsKLXN0cnVjdCBNZWRpYUJ1ZmZlcjsKLQotLyoKLSAqIEFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGNhbiBwdWxsIGEgbGlzdCBvZiBtZWRpYSBidWZmZXJzCi0gKiBmcm9tIGEgTWVkaWFTb3VyY2UgcmVwZWF0ZWRseS4gVGhlIHVzZXIgY2FuIHRoZW4gZ2V0IHRoZQotICogYnVmZmVycyBmcm9tIHRoYXQgbGlzdC4KLSAqLwotc3RydWN0IE1lZGlhQnVmZmVyUHVsbGVyIHsKLXB1YmxpYzoKLSAgICBNZWRpYUJ1ZmZlclB1bGxlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSk7Ci0gICAgfk1lZGlhQnVmZmVyUHVsbGVyKCk7Ci0KLSAgICAvLyBTdGFydCB0byBidWlsZCB1cCB0aGUgbGlzdCBvZiB0aGUgYnVmZmVycy4KLSAgICB2b2lkIHN0YXJ0KCk7Ci0KLSAgICAvLyBSZWxlYXNlIHRoZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgYnVmZmVycywgYW5kIHN0b3AKLSAgICAvLyBwdWxsaW5nIGJ1ZmZlcnMgZnJvbSB0aGUgTWVkaWFTb3VyY2UuCi0gICAgdm9pZCBzdG9wKCk7Ci0KLSAgICAvLyBHZXQgYSBidWZmZXIgZnJvbSB0aGUgbGlzdC4gSWYgdGhlcmUgaXMgbm8gYnVmZmVyIGF2YWlsYWJsZQotICAgIC8vIGF0IHRoZSB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgTlVMTCBpcyByZXR1cm5lZC4KLSAgICBNZWRpYUJ1ZmZlciogZ2V0QnVmZmVyQmxvY2tpbmcoKTsKLQotICAgIC8vIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSBsaXN0LiBJZiB0aGVyZSBpcyBubyBidWZmZXIgYXZhaWxhYmxlCi0gICAgLy8gYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBpdCBibG9ja3Mgd2FpdGluZyBmb3IKLSAgICAvLyBhIGJ1ZmZlciB0byBiZWNvbWUgYXZhaWxhYmxlIG9yIHVudGlsIHN0b3AoKSBpcyBjYWxsZWQuCi0gICAgTWVkaWFCdWZmZXIqIGdldEJ1ZmZlck5vbkJsb2NraW5nKCk7Ci0KLSAgICAvLyBBZGQgYSBidWZmZXIgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhdmFpbGFibGUgbWVkaWEgYnVmZmVycwotICAgIHZvaWQgcHV0QnVmZmVyKE1lZGlhQnVmZmVyKiBidWZmZXIpOwotCi0gICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc291cmNlIHJldHVybmVkIGFuIGVycm9yIG9yIG5vdC4KLSAgICBib29sIGhhc01lZGlhU291cmNlUmV0dXJuZWRFcnJvcigpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBpbnQgYWNxdWlyZVRocmVhZFN0YXJ0KHZvaWQqIGFyZyk7Ci0gICAgdm9pZCBhY3F1aXJlVGhyZWFkRnVuYygpOwotCi0gICAgc3RhdGljIGludCByZWxlYXNlVGhyZWFkU3RhcnQodm9pZCogYXJnKTsKLSAgICB2b2lkIHJlbGVhc2VUaHJlYWRGdW5jKCk7Ci0KLSAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKLSAgICBWZWN0b3I8TWVkaWFCdWZmZXIqPiBtQnVmZmVyczsKLSAgICBWZWN0b3I8TWVkaWFCdWZmZXIqPiBtUmVsZWFzZUJ1ZmZlcnM7Ci0KLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgIENvbmRpdGlvbiBtVXNlckNvbmQ7ICAgICAvLyBmb3IgdGhlIHVzZXIgb2YgdGhpcyBjbGFzcwotICAgIENvbmRpdGlvbiBtQWNxdWlyZUNvbmQ7ICAvLyBmb3IgdGhlIGFjcXVpcmUgdGhyZWFkCi0gICAgQ29uZGl0aW9uIG1SZWxlYXNlQ29uZDsgIC8vIGZvciB0aGUgcmVsZWFzZSB0aHJlYWQKLQotICAgIGJvb2wgbUFza1RvU3RhcnQ7ICAgICAgLy8gQXNrcyB0aGUgdGhyZWFkcyB0byBzdGFydAotICAgIGJvb2wgbUFza1RvU3RvcDsgICAgICAgLy8gQXNrcyB0aGUgdGhyZWFkcyB0byBzdG9wCi0gICAgYm9vbCBtQWNxdWlyZVN0b3BwZWQ7ICAvLyBUaGUgYWNxdWlyZSB0aHJlYWQgaGFzIHN0b3BwZWQKLSAgICBib29sIG1SZWxlYXNlU3RvcHBlZDsgIC8vIFRoZSByZWxlYXNlIHRocmVhZCBoYXMgc3RvcHBlZAotICAgIHN0YXR1c190IG1Tb3VyY2VFcnJvcjsgLy8gRXJyb3IgcmV0dXJuZWQgYnkgTWVkaWFTb3VyY2UgcmVhZAotCi0gICAgLy8gRG9uJ3QgY2FsbCBtZSEKLSAgICBNZWRpYUJ1ZmZlclB1bGxlcihjb25zdCBNZWRpYUJ1ZmZlclB1bGxlciYpOwotICAgIE1lZGlhQnVmZmVyUHVsbGVyJiBvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJQdWxsZXImKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gX01FRElBX0JVRkZFUl9QVUxMRVJfSApkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9OT1RJQ0UgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0KLSAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvcjNncFJlYWRlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTljZjllYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yM2dwUmVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvcjNncFJlYWRlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCAzR1AgUmVhZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl8zR1BSRUFERVIiCi0KLS8qKgotICogSEVBREVSUwotICoKLSAqLwotI2RlZmluZSBWSURFT0VESVRPUl9CSVRTVFJFQU1fUEFSU0VSCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yM2dwUmVhZGVyLmgiCi0jaW5jbHVkZSAiTTRTWVNfQWNjZXNzVW5pdC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVXRpbHMuaCIKLSNpbmNsdWRlICJNNFJFQURFUl8zZ3BDb20uaCIKLSNpbmNsdWRlICJNNF9Db21tb24uaCIKLSNpbmNsdWRlICJNNE9TQV9GaWxlV3JpdGVyLmgiCi0KLSNpZmRlZiBWSURFT0VESVRPUl9CSVRTVFJFQU1fUEFSU0VSCi0jaW5jbHVkZSAiTTRPU0FfQ29yZUlELmgiCi0jaW5jbHVkZSAiTTRPU0FfRXJyb3IuaCIKLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLSNpbmNsdWRlICJNNF9VdGlscy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJFU0RTLmgiCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0vKioKLSAqIFNPVVJDRSBDTEFTUwotICovCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UKLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEFycmF5IG9mIEFNUiBOQi9XQiBiaXRyYXRlcwotICogQG5vdGUgICAgQXJyYXkgdG8gbWF0Y2ggdGhlIG1vZGUgYW5kIHRoZSBiaXQgcmF0ZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLWNvbnN0IE00T1NBX1VJbnQzMiBWaWRlb0VkaXRvcjNncFJlYWRlcl9BbXJCaXRSYXRlIFsyIC8qIDhrSHogLyAxNmtIeiAgICAgKi9dCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOSAvKiB0aGUgYml0cmF0ZSBtb2RlICovXSA9Ci17Ci0gICAgezQ3NTAsIDUxNTAsIDU5MDAsICA2NzAwLCAgNzQwMCwgIDc5NTAsICAxMDIwMCwgMTIyMDAsIDB9LAotICAgIHs2NjAwLCA4ODUwLCAxMjY1MCwgMTQyNTAsIDE1ODUwLCAxODI1MCwgMTk4NTAsIDIzMDUwLCAyMzg1MH0KLX07Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Ci0gKiBAYnJpZWY6VGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udGV4dCBvZiB0aGUgU3RhZ2VGcmlnaHQgM0dQIHNoZWxsIFJlYWRlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc3A8RGF0YVNvdXJjZT4gICAgICAgICAgICAgIG1EYXRhU291cmNlOwotICAgIHNwPE1lZGlhRXh0cmFjdG9yPiAgICAgICAgICBtRXh0cmFjdG9yOwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgICAgICBtQXVkaW9Tb3VyY2U7Ci0gICAgc3A8TWVkaWFTb3VyY2U+ICAgICAgICAgICAgIG1WaWRlb1NvdXJjZTsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiAgICAgICAgICAgbVZpZGVvU3RyZWFtSGFuZGxlcjsKLSAgICBNNFNZU19BY2Nlc3NVbml0ICAgICAgICAgICAgbUF1ZGlvQXU7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIG1WaWRlb0F1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgICBtTWF4RHVyYXRpb247Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgIG1GaWxlU2l6ZTsKLSAgICBNNF9TdHJlYW1UeXBlICAgICAgICAgICAgICAgbVN0cmVhbVR5cGU7Ci0gICAgTTRPU0FfVUludDMyICAgICAgICAgICAgICAgIG1TdHJlYW1JZDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbVRyYWNrczsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUN1cnJUcmFjazsKLSAgICBNNE9TQV9Cb29sICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vla2luZzsKLSAgICBNNE9TQV9UaW1lICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vla1RpbWU7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIG1WaWRlb1NlZWtpbmc7Ci0gICAgTTRPU0FfVGltZSAgICAgICAgICAgICAgICAgIG1WaWRlb1NlZWtUaW1lOwotCi19IFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQ7Ci0KLSNpZmRlZiBWSURFT0VESVRPUl9CSVRTVFJFQU1fUEFSU0VSCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0Ci0gKiBAYnJpZWYgICAgICAgSW50ZXJuYWwgQml0U3RyZWFtUGFyc2VyIGNvbnRleHQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTTRPU0FfVUludDMyKiAgIG1QYml0U3RyZWFtOyAgIC8qKjwgYml0c3RyZWFtIHBvaW50ZXIgKDMyYml0cyBhbGlnbmVkKSAqLwotICAgIE00T1NBX0ludDMyICAgICBtU2l6ZTsgICAgICAgICAvKio8IGJpdHN0cmVhbSBzaXplIGluIGJ5dGVzICovCi0gICAgTTRPU0FfSW50MzIgICAgIG1JbmRleDsgICAgICAgIC8qKjwgYnl0ZSBpbmRleCAqLwotICAgIE00T1NBX0ludDMyICAgICBtQml0SW5kZXg7ICAgICAvKio8IGJpdCBpbmRleCAqLwotICAgIE00T1NBX0ludDMyICAgICBtU3RydWN0U2l6ZTsgICAvKio8IHNpemUgb2Ygc3RydWN0dXJlICovCi19IFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQ7Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIEFsbG9jYXRlcyB0aGUgY29udGV4dCBhbmQgaW5pdGlhbGl6ZXMgaW50ZXJuYWwgZGF0YS4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgIChPVVQpICBQb2ludGVyIHRvIHRoZSBCaXRTdHJlYW1QYXJzZXIgY29udGV4dCB0byBjcmVhdGUuCi0gKiBAcGFyYW0gICBiaXRTdHJlYW0gICBBIHBvaW50ZXIgdG8gdGhlIGJpdHN0cmVhbQotICogQHBhcmFtICAgc2l6ZSAgICAgICAgVGhlIHNpemUgb2YgdGhlIGJpdHN0cmVhbSBpbiBieXRlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgdm9pZCBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJJbml0KHZvaWQqKiBwQ29udGV4dCwKLSAgICAgICAgdm9pZCogcEJpdFN0cmVhbSwgTTRPU0FfSW50MzIgc2l6ZSkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0OwotCi0gICAgKnBDb250ZXh0PU00T1NBX05VTEw7Ci0gICAgcFN0cmVhbUNvbnRleHQgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBzaXplb2YoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCksIE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikiM0dQIEJpdFN0cmVhbVBhcnNlciBDb250ZXh0Iik7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwU3RyZWFtQ29udGV4dC0+bVBiaXRTdHJlYW09KE00T1NBX1VJbnQzMiopcEJpdFN0cmVhbTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bVNpemU9c2l6ZTsKLSAgICBwU3RyZWFtQ29udGV4dC0+bUluZGV4PTA7Ci0gICAgcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleD0wOwotICAgIHBTdHJlYW1Db250ZXh0LT5tU3RydWN0U2l6ZSA9Ci0gICAgICAgIHNpemVvZihWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KTsKLQotICAgICpwQ29udGV4dD1wU3RyZWFtQ29udGV4dDsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIENsZWFuIHVwIGNvbnRleHQKLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgIChJTi9PVVQpICBCaXRTdHJlYW1QYXJzZXIgY29udGV4dC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ2xlYW5VcCh2b2lkKiBwQ29udGV4dCkgewotICAgIGZyZWUoKE00T1NBX0ludDMyKilwQ29udGV4dCk7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgUmVhZCB0aGUgbmV4dCA8bGVuZ3RoPiBiaXRzIGluIHRoZSBiaXRzdHJlYW0uCi0gKiBAbm90ZSAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgdXBkYXRlIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KLSAqIEBwYXJhbSAgIHBDb250ZXh0ICAgIChJTi9PVVQpIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHBhcmFtICAgbGVuZ3RoICAgICAgKElOKSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gZXh0cmFjdCBmcm9tIHRoZSBiaXRzdHJlYW0KLSAqIEByZXR1cm4gIHRoZSByZWFkIGJpdHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyBNNE9TQV9VSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHModm9pZCogcENvbnRleHQsCi0gICAgICAgIE00T1NBX0ludDMyIGxlbmd0aCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotCi0gICAgTTRPU0FfVUludDMyIHVfbWFzazsKLSAgICBNNE9TQV9VSW50MzIgcmV0dmFsOwotICAgIE00T1NBX0ludDMyIGlfb3ZmOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wU3RyZWFtQ29udGV4dCksIDAsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0czppbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcmV0dmFsPShNNE9TQV9VSW50MzIpR0VUX01FTU9SWTMyKHBTdHJlYW1Db250ZXh0LT5cCi0gICAgICAgIG1QYml0U3RyZWFtWyBwU3RyZWFtQ29udGV4dC0+bUluZGV4IF0pOwotICAgIGlfb3ZmID0gcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleCArIGxlbmd0aCAtIDMyOwotICAgIHVfbWFzayA9IChsZW5ndGggPj0gMzIpID8gMHhmZmZmZmZmZjogKDEgPDwgbGVuZ3RoKSAtIDE7Ci0KLSAgICAvKiBkbyB3ZSBoYXZlIGVub3VnaCBiaXRzIGF2YWlsYmxlIGluIHRoZSBjdXJyZW50IHdvcmQoMzJiaXRzKSovCi0gICAgaWYgKGlfb3ZmIDw9IDApIHsKLSAgICAgICAgcmV0dmFsPShyZXR2YWwgPj4gKC0gaV9vdmYpKSAmIHVfbWFzazsKLSAgICB9IGVsc2UgewotICAgICAgICBNNE9TQV9VSW50MzIgdV9uZXh0d29yZCA9IChNNE9TQV9VSW50MzIpR0VUX01FTU9SWTMyKAotICAgICAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1QYml0U3RyZWFtWyBwU3RyZWFtQ29udGV4dC0+bUluZGV4ICsgMSBdKTsKLSAgICAgICAgTTRPU0FfVUludDMyIHVfbXNiX21hc2ssIHVfbXNiX3ZhbHVlLCB1X2xzYl9tYXNrLCB1X2xzYl92YWx1ZTsKLQotICAgICAgICB1X21zYl9tYXNrID0gKCgxIDw8ICgzMiAtIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXgpKSAtIDEpIDw8IGlfb3ZmOwotICAgICAgICB1X21zYl92YWx1ZSA9IHJldHZhbCA8PCBpX292ZjsKLSAgICAgICAgdV9sc2JfbWFzayA9ICgxIDw8IGlfb3ZmKSAtIDE7Ci0gICAgICAgIHVfbHNiX3ZhbHVlID0gdV9uZXh0d29yZCA+PiAoMzIgLSBpX292Zik7Ci0gICAgICAgIHJldHZhbD0gKHVfbXNiX3ZhbHVlICYgdV9tc2JfbWFzayApIHwgKHVfbHNiX3ZhbHVlICYgdV9sc2JfbWFzayk7Ci0gICAgfQotICAgIC8qIHJldHVybiB0aGUgYml0cy4uLiovCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgSW5jcmVtZW50IHRoZSBiaXRzdHJlYW0gcG9pbnRlciBvZiA8bGVuZ3RoPiBiaXRzLgotICogQHBhcmFtICAgcENvbnRleHQgICAgKElOL09VVCkgQml0U3RyZWFtUGFyc2VyIGNvbnRleHQuCi0gKiBAcGFyYW0gICBsZW5ndGggICAgICAoSU4pIFRoZSBudW1iZXIgb2YgYml0IHRvIHNoaWZ0IHRoZSBiaXRzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgdm9pZCBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHModm9pZCogcENvbnRleHQsCi0gICAgICAgIE00T1NBX0ludDMyIGxlbmd0aCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0PSgKLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfSW50MzIgdmFsOwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB2YWw9cFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleCArIGxlbmd0aDsKLSAgICAvKiB1cGRhdGUgdGhlIGJpdHMuLi4qLwotICAgIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXggKz0gbGVuZ3RoOwotCi0gICAgaWYgKHZhbCAtIDMyID49IDApIHsKLSAgICAgICAgLyogdXBkYXRlIHRoZSBiaXRzLi4uKi8KLSAgICAgICAgcFN0cmVhbUNvbnRleHQtPm1CaXRJbmRleCAtPSAzMjsKLSAgICAgICAgLyogdXBkYXRlIHRoZSB3b3JkcyovCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tSW5kZXgrKzsKLSAgICB9Ci19Ci0KLXN0YXRpYyBNNE9TQV9VSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyR2V0Qml0cygKLSAgICAgICAgdm9pZCogcENvbnRleHQsTTRPU0FfSW50MzIgYml0UG9zLCBNNE9TQV9JbnQzMiBiaXRMZW5ndGgpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KiBwU3RyZWFtQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDb250ZXh0KilwQ29udGV4dDsKLQotICAgIE00T1NBX0ludDMyIGJpdExvY2F0aW9uLCBiaXRJbmRleDsKLSAgICBNNE9TQV9VSW50MzIgcmV0dmFsPTA7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEw9PXBTdHJlYW1Db250ZXh0KSwgMCwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckdldEJpdHM6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICAvKiBjb21wdXRlcyB0aGUgd29yZCBsb2NhdGlvbiovCi0gICAgYml0TG9jYXRpb249Yml0UG9zLzMyOwotICAgIGJpdEluZGV4PShiaXRQb3MpICUgMzI7Ci0KLSAgICBpZiAoYml0TG9jYXRpb24gPCBwU3RyZWFtQ29udGV4dC0+bVNpemUpIHsKLSAgICAgICAgTTRPU0FfVUludDMyIHVfbWFzazsKLSAgICAgICAgTTRPU0FfSW50MzIgaV9vdmYgPSBiaXRJbmRleCArIGJpdExlbmd0aCAtIDMyOwotICAgICAgICByZXR2YWw9KE00T1NBX1VJbnQzMilHRVRfTUVNT1JZMzIoCi0gICAgICAgICAgICBwU3RyZWFtQ29udGV4dC0+bVBiaXRTdHJlYW1bIGJpdExvY2F0aW9uIF0pOwotCi0gICAgICAgIHVfbWFzayA9IChiaXRMZW5ndGggPj0gMzIpID8gMHhmZmZmZmZmZjogKDEgPDwgYml0TGVuZ3RoKSAtIDE7Ci0KLSAgICAgICAgaWYgKGlfb3ZmIDw9IDApIHsKLSAgICAgICAgICAgIHJldHZhbD0ocmV0dmFsID4+ICgtIGlfb3ZmKSkgJiB1X21hc2s7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIgdV9uZXh0d29yZCA9IChNNE9TQV9VSW50MzIpR0VUX01FTU9SWTMyKAotICAgICAgICAgICAgICAgIHBTdHJlYW1Db250ZXh0LT5tUGJpdFN0cmVhbVsgYml0TG9jYXRpb24gKyAxIF0pOwotICAgICAgICAgICAgTTRPU0FfVUludDMyIHVfbXNiX21hc2ssIHVfbXNiX3ZhbHVlLCB1X2xzYl9tYXNrLCB1X2xzYl92YWx1ZTsKLQotICAgICAgICAgICAgdV9tc2JfbWFzayA9ICgoMSA8PCAoMzIgLSBiaXRJbmRleCkpIC0gMSkgPDwgaV9vdmY7Ci0gICAgICAgICAgICB1X21zYl92YWx1ZSA9IHJldHZhbCA8PCBpX292ZjsKLSAgICAgICAgICAgIHVfbHNiX21hc2sgPSAoMSA8PCBpX292ZikgLSAxOwotICAgICAgICAgICAgdV9sc2JfdmFsdWUgPSB1X25leHR3b3JkID4+ICgzMiAtIGlfb3ZmKTsKLSAgICAgICAgICAgIHJldHZhbD0gKHVfbXNiX3ZhbHVlICYgdV9tc2JfbWFzayApIHwgKHVfbHNiX3ZhbHVlICYgdV9sc2JfbWFzayk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyUmVzdGFydCh2b2lkKiBwQ29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotCi0gICAgaWYgKE00T1NBX05VTEwgPT0gcFN0cmVhbUNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvKiByZXNldHMgdGhlIGJpdHN0cmVhbSBwb2ludGVycyovCi0gICAgcFN0cmVhbUNvbnRleHQtPm1JbmRleD0wOwotICAgIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXg9MDsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgR2V0IGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIHBvaW50ZWQgYnkgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgotICogQG5vdGUgICBJdCBzaG91bGQgYmUgdXNlZCBjYXJlZnVsbHkgYXMgdGhlIHBvaW50ZXIgaXMgaW4gdGhlIGJpdHN0cmVhbSBpdHNlbGYKLSAqICAgICAgICAgYW5kIG5vIGNvcHkgaXMgbWFkZS4KLSAqIEBwYXJhbSAgcENvbnRleHQgICAgKElOL09VVCkgIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBiaXRzdHJlYW0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIE00T1NBX1VJbnQ4KiAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfR2V0Q3VycmVudGJpdFN0cmVhbVBvaW50ZXIoCi0gICAgICAgIHZvaWQqIHBDb250ZXh0KSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCogcFN0cmVhbUNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wU3RyZWFtQ29udGV4dCksIDAsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgcmV0dXJuIChNNE9TQV9VSW50OCopKChNNE9TQV9VSW50OCopcFN0cmVhbUNvbnRleHQtPm1QYml0U3RyZWFtICsgXAotICAgICAgICBwU3RyZWFtQ29udGV4dC0+bUluZGV4ICogc2l6ZW9mKE00T1NBX1VJbnQzMikgKyBcCi0gICAgICAgIHBTdHJlYW1Db250ZXh0LT5tQml0SW5kZXgvOCkgOwotfQotCi1zdGF0aWMgTTRPU0FfSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyR2V0U2l6ZSh2b2lkKiBwQ29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqIHBTdHJlYW1Db250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNvbnRleHQqKXBDb250ZXh0OwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTD09cFN0cmVhbUNvbnRleHQpLCAwLCAiaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLQotICAgIHJldHVybiBwU3RyZWFtQ29udGV4dC0+bVNpemU7Ci19Ci0KLQotc3RhdGljIHZvaWQgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfTVBFRzRCaXRTdHJlYW1QYXJzZXJJbml0KHZvaWQqKiBwQ29udGV4dCwKLSAgICAgICAgdm9pZCogcEJpdFN0cmVhbSwgTTRPU0FfSW50MzIgc2l6ZSkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckluaXQocENvbnRleHQsIHBCaXRTdHJlYW0sIHNpemUpOwotfQotc3RhdGljIE00T1NBX0ludDMyIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0dldE1wZWdMZW5ndGhGcm9tSW50ZWdlcih2b2lkKiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIHZhbCkgewotICAgIE00T1NBX1VJbnQzMiBsZW5ndGg9MDsKLSAgICBNNE9TQV9VSW50MzIgbnVtQnl0ZXM9MDsKLSAgICBNNE9TQV9VSW50MzIgYj0wOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wQ29udGV4dCksIDAsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogdGhlIGxlbmd0aCBpcyBlbmNvZGVkIGFzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuIFRoZSBoaWdoZXN0IGJpdCBpcyB1c2VkCi0gICAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbGVuZ3RoIGNvbnRpbnVlcyBvbiB0aGUgbmV4dCBieXRlLgotCi0gICAgVGhlIGxlbmd0aCBjYW4gYmU6IDB4ODAgMHg4MCAweDgwIDB4MjIKLSAgICBvZiBqdXN0ICAgICAgICAgICAgMHgyMiAoaGlnaGVzdCBiaXQgbm90IHNldCkKLQotICAgICovCi0KLSAgICBkbyB7Ci0gICAgICAgIGI9KHZhbCAmICgoMHhmZik8PCAoOCAqIG51bUJ5dGVzKSkpPj4gKDggKiBudW1CeXRlcyk7Ci0gICAgICAgIGxlbmd0aD0obGVuZ3RoIDw8IDcpIHwgKGIgJiAweDdmKTsKLSAgICAgICAgbnVtQnl0ZXMrKzsKLSAgICB9IHdoaWxlICgoYiAmIDB4ODApICYmIG51bUJ5dGVzIDwgNCk7Ci0KLSAgICByZXR1cm4gbGVuZ3RoOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgIERlY29kZSBhbiBNUEVHNCBTeXN0ZW1zIGRlc2NyaXB0b3Igc2l6ZSBmcm9tIGFuIGVuY29kZWQgU0RMIHNpemUgZGF0YQotICogQG5vdGUgICBUaGUgdmFsdWUgaXMgcmVhZCBmcm9tIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBsb2NhdGlvbi4KLSAqIEBwYXJhbSAgcENvbnRleHQgICAgKElOL09VVCkgIEJpdFN0cmVhbVBhcnNlciBjb250ZXh0LgotICogQHJldHVybiBTaXplIGluIGEgaHVtYW4gcmVhZGFibGUgZm9ybQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgTTRPU0FfSW50MzIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfR2V0TXBlZ0xlbmd0aEZyb21TdHJlYW0odm9pZCogcENvbnRleHQpewotICAgIE00T1NBX1VJbnQzMiBsZW5ndGg9MDsKLSAgICBNNE9TQV9VSW50MzIgbnVtQnl0ZXM9MDsKLSAgICBNNE9TQV9VSW50MzIgYj0wOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMPT1wQ29udGV4dCksIDAsICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotCi0gICAgLyogdGhlIGxlbmd0aCBpcyBlbmNvZGVkIGFzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuIFRoZSBoaWdoZXN0IGJpdCBpcyB1c2VkCi0gICAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbGVuZ3RoIGNvbnRpbnVlcyBvbiB0aGUgbmV4dCBieXRlLgotCi0gICAgVGhlIGxlbmd0aCBjYW4gYmU6IDB4ODAgMHg4MCAweDgwIDB4MjIKLSAgICBvZiBqdXN0ICAgICAgICAgICAgMHgyMiAoaGlnaGVzdCBiaXQgbm90IHNldCkKLSAgICAqLwotCi0gICAgZG8gewotICAgICAgICBiPVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKHBDb250ZXh0LCA4KTsKLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBDb250ZXh0LCA4KTsKLSAgICAgICAgbGVuZ3RoPShsZW5ndGggPDwgNykgfCAoYiAmIDB4N2YpOwotICAgICAgICBudW1CeXRlcysrOwotICAgIH0gd2hpbGUgKChiICYgMHg4MCkgJiYgbnVtQnl0ZXMgPCA0KTsKLQotICAgIHJldHVybiBsZW5ndGg7Ci19Ci0jZW5kaWYgLyogVklERU9FRElUT1JfQklUU1RSRUFNX1BBUlNFUiAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgM2dwIHJlYWRlcgotICogQG5vdGUgICAgYWxsb2NhdGVzIHRoZSBjb250ZXh0Ci0gKgotICogQHBhcmFtICAgcENvbnRleHQ6ICAgICAgIChPVVQpICAgcG9pbnRlciBvbiBhIHJlYWRlciBjb250ZXh0Ci0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0FMTE9DICAgICAgICAgICAgIGEgbWVtb3J5IGFsbG9jYXRpb24gaGFzIGZhaWxlZAotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgdmFsaWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2NyZWF0ZShNNE9TQV9Db250ZXh0ICpwQ29udGV4dCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDID0gTlVMTDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0ICwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jcmVhdGUgYmVnaW4iKTsKLQotICAgIC8qIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uICovCi0gICAgU0FGRV9NQUxMT0MocEMsIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQsIDEsICJWaWRlb0VkaXRvcjNncFJlYWRlciIpOwotCi0gICAgbWVtc2V0KHBDLCBzaXplb2YoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCksIDApOwotCi0gICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIgID0gTTRPU0FfTlVMTDsKLSAgICBwQy0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyICA9IE00T1NBX05VTEw7Ci0gICAgcEMtPm1WaWRlb0F1LmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLQotICAgIHBDLT5tQXVkaW9TZWVraW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1BdWRpb1NlZWtUaW1lID0gMDsKLQotICAgIHBDLT5tVmlkZW9TZWVraW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgcEMtPm1WaWRlb1NlZWtUaW1lID0gMDsKLQotICAgIHBDLT5tTWF4RHVyYXRpb24gPSAwOwotCi0gICAgKnBDb250ZXh0PXBDOwotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY3JlYXRlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY3JlYXRlIGVuZCAiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgICBkZXN0cm95IHRoZSBpbnN0YW5jZSBvZiB0aGUgM2dwIHJlYWRlcgotKiBAbm90ZSBhZnRlciB0aGlzIGNhbGwgdGhlIGNvbnRleHQgaXMgaW52YWxpZAotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgcENvbnRleHQgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveShNNE9TQV9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Rlc3Ryb3kgYmVnaW4iKTsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBTQUZFX0ZSRUUocEMtPm1BdWRpb0F1LmRhdGFBZGRyZXNzKTsKLSAgICBwQy0+bUF1ZGlvQXUuZGF0YUFkZHJlc3MgPSBNNE9TQV9OVUxMOwotICAgIFNBRkVfRlJFRShwQy0+bVZpZGVvQXUuZGF0YUFkZHJlc3MpOwotICAgIHBDLT5tVmlkZW9BdS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgU0FGRV9GUkVFKHBDKTsKLSAgICBwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveSBubyBlcnJvciIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZGVzdHJveSBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIG9wZW4gdGhlIHJlYWRlciBhbmQgaW5pdGlhbGl6ZXMgaXRzIGNyZWF0ZWQgaW5zdGFuY2UKLSogQG5vdGUgICAgIHRoaXMgZnVuY3Rpb24gb3BlbiB0aGUgbWVkaWEgZmlsZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgcEZpbGVEZXNjcmlwdG9yOiAgICAoSU4pICAgIFBvaW50ZXIgdG8gcHJvcHJpZXRhcnkgZGF0YSBpZGVudGlmeWluZwotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZWRpYSB0byBvcGVuCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0qIEByZXR1cm4gICBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lZGlhIGlzIERSTSBwcm90ZWN0ZWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbiBzdGFydCAiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbjogaW52YWxpZCBjb250ZXh0IHBvaW50ZXIiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEZpbGVEZXNjcmlwdG9yKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbjogaW52YWxpZCBwb2ludGVyIHBGaWxlRGVzY3JpcHRvciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBzdGFydCAlcyIsCi0gICAgICAgIChjaGFyKilwRmlsZURlc2NyaXB0b3IpOwotICAgIC8vcEMtPm1EYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgoY2hhciopcEZpbGVEZXNjcmlwdG9yKTsKLSAgICBwQy0+bURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSAoKGNoYXIqKXBGaWxlRGVzY3JpcHRvcik7Ci0KLSAgICBpZiAocEMtPm1EYXRhU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBlcnJvciIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHBDLT5tRXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShwQy0+bURhdGFTb3VyY2UsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7Ci0KLSAgICBpZiAocEMtPm1FeHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbiBleHRyYWN0b3IgZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGlzRFJNUHJvdGVjdGVkID0gMDsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHBDLT5tRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOwotICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5SXNEUk0sICZpc0RSTVByb3RlY3RlZCk7Ci0gICAgaWYgKGlzRFJNUHJvdGVjdGVkKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGVycm9yIC0gRFJNIFByb3RlY3RlZCIpOwotICAgICAgICByZXR1cm4gTTRFUlJfVU5TVVBQT1JURURfTUVESUFfVFlQRTsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfb3BlbiBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGNsb3NlIHRoZSByZWFkZXIKLSogQG5vdGUgICAgIGNsb3NlIHRoZSAzR1AgZmlsZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgdGhlIGNvbnRleHQgaXMgTlVMTAotKiBAcmV0dXJuICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9jbG9zZShNNE9TQV9Db250ZXh0IGNvbnRleHQpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0ICpwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEgKnBBdWRpb1NiclVzZXJEYXRhOwotICAgIE00X0FjY2Vzc1VuaXQgKnBBVTsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9jbG9zZSBiZWdpbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChNNE9TQV9OVUxMID09IHBDKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2U6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBpZiAocEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlIEF1ZGlvIik7Ci0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICYmIChNNE9TQV9OVUxMICE9IHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BVc2VyRGF0YSkpIHsKLSAgICAgICAgICAgIHBBdWRpb1NiclVzZXJEYXRhID0gKE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEqKShcCi0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhKTsKLQotICAgICAgICAgICAgcEFVID0gKE00X0FjY2Vzc1VuaXQqKXBBdWRpb1NiclVzZXJEYXRhLT5tX3BGaXJzdEFVOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcEFVKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQVUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwQXVkaW9TYnJVc2VyRGF0YS0+bV9wQWFjRGVjb2RlclVzZXJDb25maWcpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHBBdWRpb1NiclVzZXJEYXRhLT5cCi0gICAgICAgICAgICAgICAgICAgIG1fcEFhY0RlY29kZXJVc2VyQ29uZmlnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUocEF1ZGlvU2JyVXNlckRhdGEpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8gIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgZnJlZShwQy0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8pOwotICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRmluYWxseSBkZXN0cm95IHRoZSBzdHJlYW0gaGFuZGxlciAqLwotICAgICAgICBmcmVlKHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPSBNNE9TQV9OVUxMOwotCi0gICAgICAgIHBDLT5tQXVkaW9Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgcEMtPm1BdWRpb1NvdXJjZS5jbGVhcigpOwotICAgIH0KLSAgICBpZiAocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2Nsb3NlIFZpZGVvICIpOwotCi0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgICAgIGZyZWUocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKE00T1NBX05VTEwgIT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvKSB7Ci0gICAgICAgICAgICBmcmVlKHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgbV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8pOwotICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8gIT0gTTRPU0FfTlVMTCkgewotICAgICAgICAgICAgZnJlZShwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRVNEU0luZm8pOwotICAgICAgICAgICAgcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPm1fcEVTRFNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX0VTRFNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5hbGx5IGRlc3Ryb3kgdGhlIHN0cmVhbSBoYW5kbGVyICovCi0gICAgICAgIGZyZWUocEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlciA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgcEMtPm1WaWRlb1NvdXJjZS0+c3RvcCgpOwotICAgICAgICBwQy0+bVZpZGVvU291cmNlLmNsZWFyKCk7Ci0gICAgfQotICAgIHBDLT5tRXh0cmFjdG9yLmNsZWFyKCk7Ci0gICAgcEMtPm1EYXRhU291cmNlLmNsZWFyKCk7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2UgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGdldCBhbiBvcHRpb24gZnJvbSB0aGUgM2dwIHJlYWRlcgotKiBAbm90ZSAgICAgaXQgYWxsb3dzIHRoZSBjYWxsZXIgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZToKLSoKLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgb3B0aW9uSWQ6ICAgICAgIChJTikgICAgaW5kaWNhdGVzIHRoZSBvcHRpb24gdG8gZ2V0Ci0qIEBwYXJhbSAgICBwVmFsdWU6ICAgICAgICAgKE9VVCkgICBwb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB1c2VyKSB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0qCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKiBAcmV0dXJuICAgTTRFUlJfQkFEX09QVElPTl9JRCAgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgTTRFUlJfVklERU9fTk9UX0gyNjMgICAgTm8gdmlkZW8gc3RyZWFtIEgyNjMgaW4gZmlsZS4KLSogQHJldHVybiAgIE00RVJSX05PX1ZJREVPX1NUUkVBTV9SRVRSSUVWRURfWUVUCi0qICAgICAgICAgICBGdW5jdGlvbiAzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gYmVnaW4gJWQiLCBvcHRpb25JZCk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb246IGludmFsaWQgcG9pbnRlciBvbiB2YWx1ZSIpOwotCi0gICAgc3dpdGNoIChvcHRpb25JZCkgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0R1cmF0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIGR1cmF0aW9uICVkIixwQy0+bU1heER1cmF0aW9uKTsKLSAgICAgICAgICAgICooTTRPU0FfVGltZSopcFZhbHVlID0gcEMtPm1NYXhEdXJhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uOiBNNFJFQURFUl9rT3B0aW9uSURfVmVyc2lvbiIpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0NvcHlyaWdodDoKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIj4+Pj4+Pj4gICBNNFJFQURFUl9rT3B0aW9uSURfQ29weXJpZ2h0Iik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfQ3JlYXRpb25UaW1lOgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIE00UkVBREVSX2tPcHRpb25JRF9DcmVhdGlvblRpbWUiKTsKLSAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0JpdHJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiogcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKilwVmFsdWU7Ci0KLSAgICAgICAgICAgIGlmIChwQy0+bU1heER1cmF0aW9uICE9IDApIHsKLSAgICAgICAgICAgICAgICBNNE9TQV9VSW50MzIgdWkzMlRtcCA9IChNNE9TQV9VSW50MzIpcEMtPm1NYXhEdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAqcEJpdHJhdGUgPSAoTTRPU0FfVUludDMyKShwQy0+bUZpbGVTaXplICogODAwMC4wIC8gcEMtPm1NYXhEdXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIGJpdHJhdGUgJWxkIiwgKnBCaXRyYXRlKTsKLSAgICAgICAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgTTRSRUFERVJfM0dQX2tPcHRpb25JRF9IMjYzUHJvcGVydGllczoKLSAgICAgICAgewotICAgICAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcikgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gbm8gdmlkZW9TdHJlYW0gcmV0cmlldmVkIik7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9OT19WSURFT19TVFJFQU1fUkVUUklFVkVEX1lFVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKChNNERBX1N0cmVhbVR5cGVWaWRlb0gyNjMgIT0gcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICBtX3N0cmVhbVR5cGUpIHx8IChwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPCA3KSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gRFNJIFNpemUgJWQiLAotICAgICAgICAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9WSURFT19OT1RfSDI2MzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogTUFHSUNBTCBpbiB0aGUgZGVjb2RlciBjb25maSBIMjYzOiB0aGUgN3RoIGJ5dGUgaXMgdGhlIHByb2ZpbGUKLSAgICAgICAgICAgICAqIG51bWJlciwgNnRoIGJ5dGUgaXMgdGhlIGxldmVsIG51bWJlciAqLwotICAgICAgICAgICAgKChNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgKilwVmFsdWUpLT51aVByb2ZpbGUgPQotICAgICAgICAgICAgICAgIHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvWzZdOwotICAgICAgICAgICAgKChNNFJFQURFUl8zR1BfSDI2M1Byb3BlcnRpZXMgKilwVmFsdWUpLT51aUxldmVsID0KLSAgICAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mb1s1XTsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gTTRSRUFERVJfM0dQX2tPcHRpb25JRF9cCi0gICAgICAgICAgICBIMjYzUHJvcGVydGllcyBlbmQiKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE00UkVBREVSXzNHUF9rT3B0aW9uSURfUHVycGxlTGFic0RybToKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyT3B0aW9uIE00UkVBREVSXzNHUF9rT3B0aW9uSURfUHVycGxlTGFic0RybSIpOwotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0dldE51bWJlck9mQXVkaW9BdToKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVPcHRpb24gTTRSRUFERVJfa09wdGlvbklEX0dldE51bWJlck9mQXVkaW9BdSIpOwotICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfR2V0TnVtYmVyT2ZWaWRlb0F1OgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIDpHZXROdW1iZXJPZlZpZGVvQXUiKTsKLSAgICBicmVhazsKLQotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0dldE1ldGFkYXRhOgotICAgICAgICAvKiBub3QgdXNlZCAqLwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIE00UkVBREVSX2tPcHRpb25JRF9HZXRNZXRhZGF0YSIpOwotICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfM2dwRnR5cEJveDoKLSAgICAgICAgLyogdXNlZCBvbmx5IGZvciBTRU1DICovCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gTTRSRUFERVJfa09wdGlvbklEXzNncEZ0eXBCb3giKTsKLSAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsgLy9jaGVjayB0aGlzCi0gICAgICAgIGJyZWFrOwotCi0jaWZkZWYgT1BUSU9OSURfR0VUX05FWFRfVklERU9fQ1RTCi0gICAgY2FzZSBNNFJFQURFUl8zR1Bfa09wdGlvbklEX2dldE5leHRWaWRlb0NUUzoKLSAgICAgICAgLyogbm90IHVzZWQgKi8KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE9wdGlvbjogZ2V0TmV4dFZpZGVvQ1RTIik7Ci0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRPcHRpb24gTTRFUlJfQkFEX09QVElPTl9JRCIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uIGVuZDogb3B0aW9uSUQ6IHgleCIsIG9wdGlvbklkKTsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIHNldCBhbiBvcHRpb24gb24gdGhlIDNncCByZWFkZXIKLSogQG5vdGUgTm8gb3B0aW9uIGNhbiBiZSBzZXQgeWV0LgotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEBwYXJhbSAgICBvcHRpb25JZDogICAgICAgKElOKSAgICBpbmRpY2F0ZXMgdGhlIG9wdGlvbiB0byBzZXQKLSogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAoSU4pICAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHVzZXIpIHdoZXJlIG9wdGlvbiBpcyBzdG9yZWQKLSogQHJldHVybiAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9CQURfQ09OVEVYVCAgICAgICBwcm92aWRlZCBjb250ZXh0IGlzIG5vdCBhIHZhbGlkIG9uZQotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0qIEByZXR1cm4gICBNNEVSUl9CQURfT1BUSU9OX0lEICAgICB3aGVuIHRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7Ci0gICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCogcEMgPSAoVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcEMpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9zZXRPcHRpb24gYmVnaW4gJWQiLG9wdGlvbklkKTsKLQotICAgIHN3aXRjaChvcHRpb25JZCkgewotICAgICAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0cjoKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxNNE9TQV9PcHRpb25JRD4oTTRSRUFERVJfM0dQX2tPcHRpb25JRF9BdWRpb09ubHkpOgotICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHN0YXRpY19jYXN0PE00T1NBX09wdGlvbklEPihNNFJFQURFUl8zR1Bfa09wdGlvbklEX1ZpZGVvT25seSk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8TTRPU0FfT3B0aW9uSUQ+KE00UkVBREVSXzNHUF9rT3B0aW9uSURfRmFzdE9wZW5Nb2RlKToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxNNE9TQV9PcHRpb25JRD4oTTRSRUFERVJfa09wdGlvbklEX01heE1ldGFkYXRhU2l6ZSk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9zZXRPcHRpb246IHJldHVybnMgTTRFUlJfQkFEX09QVElPTl9JRCIpOwotICAgICAgICAgICAgZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3NldE9wdGlvbiBlbmQgIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgZmlsbCB0aGUgYWNjZXNzIHVuaXQgc3RydWN0dXJlIHdpdGggaW5pdGlhbGl6YXRpb24gdmFsdWVzCi0gKiBAcGFyYW0gICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlcjogKElOKSAgICAgcG9pbnRlciB0byB0aGUgc3RyZWFtIGhhbmRsZXIgdG8gd2hpY2gKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWNjZXNzIHVuaXQgd2lsbCBiZSBhc3NvY2lhdGVkCi0gKiBAcGFyYW0gICBwQWNjZXNzVW5pdDogICAgKElOL09VVCkgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQgKGFsbG9jYXRlZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBjYWxsZXIpIHRvIGluaXRpYWxpemUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3QoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnI9IE00Tk9fRVJST1I7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBDID09IDApLCAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjIGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwQWNjZXNzVW5pdCA9PSAwKSwgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZmlsbEF1U3RydWN0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfQWNjZXNzVW5pdCIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjdCBiZWdpbiIpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBwQWNjZXNzVW5pdCBzdHJ1Y3R1cmUgKi8KLSAgICBwQWNjZXNzVW5pdC0+bV9zaXplICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0NUUyAgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fRFRTICAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzICA9IE00T1NBX05VTEw7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fbWF4c2l6ZSAgICAgID0gcFN0cmVhbUhhbmRsZXItPm1fbWF4QVVTaXplOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cmVhbUlEICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHBBY2Nlc3NVbml0LT5tX3N0cnVjdFNpemUgICA9IHNpemVvZihNNF9BY2Nlc3NVbml0KTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9maWxsQXVTdHJ1Y3QgZW5kIik7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGJyaWVmICAgIGp1bXAgaW50byB0aGUgc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgdGltZQotKiBAbm90ZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAoSU4pICAgdGhlIHN0cmVhbSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0qIEBwYXJhbSAgICBwVGltZSAgICAgICAgICAgKEkvTylJTiAgdGhlIHRpbWUgdG8ganVtcCB0byAoaW4gbXMpCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQgdGhlIHRpbWUgdG8gd2hpY2ggdGhlIHN0cmVhbSByZWFsbHkganVtcGVkCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0qIEByZXR1cm4gICBNNEVSUl9QQVJBTUVURVIgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNE9TQV9JbnQzMiogcFRpbWUpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQyA9IChWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBNNE9TQV9UaW1lIHRpbWU2NDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgocEMgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXA6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXA6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfanVtcDogaW52YWxpZCB0aW1lIHBvaW50ZXIiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIGJlZ2luIik7Ci0KLSAgICBpZiAoKnBUaW1lID09IChwU3RyZWFtSGFuZGxlci0+bV9kdXJhdGlvbikpIHsKLSAgICAgICAgKnBUaW1lIC09IDE7Ci0gICAgfQotICAgIHRpbWU2NCA9IChNNE9TQV9UaW1lKSpwVGltZTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIHRpbWUgdXMgJWxkICIsIHRpbWU2NCk7Ci0KLSAgICBpZiAoKHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyICE9IE00T1NBX05VTEwpICYmCi0gICAgICAgICAgICAocFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQgPT0gcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fc3RyZWFtSWQpKQotICAgICAgICAgICAgewotICAgICAgICBwQXUgPSAmcEMtPm1BdWRpb0F1OwotICAgICAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICAgICAgcEF1LT5EVFMgPSB0aW1lNjQ7Ci0KLSAgICAgICAgdGltZTY0ID0gdGltZTY0ICogMTAwMDsgLyogQ29udmVydCB0aGUgdGltZSBpbnRvIG1pY3JvIHNlYyAqLwotICAgICAgICBwQy0+bUF1ZGlvU2Vla2luZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgIHBDLT5tQXVkaW9TZWVrVGltZSA9IHRpbWU2NDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgQVVESU8gdGltZSB1cyAlbGQgIiwgdGltZTY0KTsKLSAgICB9IGVsc2UgaWYgKChwQy0+bVZpZGVvU3RyZWFtSGFuZGxlciAhPSBNNE9TQV9OVUxMKSAmJgotICAgICAgICAgICAgKHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkID09IHBDLT5tVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tVmlkZW9BdTsKLSAgICAgICAgcEF1LT5DVFMgPSB0aW1lNjQ7Ci0gICAgICAgIHBBdS0+RFRTID0gdGltZTY0OwotCi0gICAgICAgIHRpbWU2NCA9IHRpbWU2NCAqIDEwMDA7IC8qIENvbnZlcnQgdGhlIHRpbWUgaW50byBtaWNybyBzZWMgKi8KLSAgICAgICAgcEMtPm1WaWRlb1NlZWtpbmcgPSBNNE9TQV9UUlVFOwotICAgICAgICBwQy0+bVZpZGVvU2Vla1RpbWUgPSB0aW1lNjQ7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIFZJREVPIHRpbWUgdXMgJWxkICIsIHRpbWU2NCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgdGltZTY0ID0gdGltZTY0IC8gMTAwMDsgLyogQ29udmVydCB0aGUgdGltZSBpbnRvIG1pbGxpIHNlYyAqLwotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wIHRpbWUgbXMgYmVmb3JlIHNlZWtzZXQgJWxkICIsIHRpbWU2NCk7Ci0KLSAgICAqcFRpbWUgPSAoTTRPU0FfSW50MzIpdGltZTY0OwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2p1bXAgZW5kIik7Ci0gICAgZXJyID0gTTROT19FUlJPUjsKLSAgICByZXR1cm4gZXJyOwotfQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgcmVzZXQgdGhlIHN0cmVhbSwgdGhhdCBpcyBzZWVrIGl0IHRvIGJlZ2lubmluZyBhbmQgbWFrZSBpdCByZWFkeQotKiBAbm90ZQotKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0qIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlciAgKElOKSAgICBUaGUgc3RyZWFtIGhhbmRsZXIgb2YgdGhlIHN0cmVhbSB0byByZXNldAotKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcikgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNFNZU19BY2Nlc3NVbml0KiBwQXU7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQgPSAwOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQ6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0IGJlZ2luIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgIHBBdSA9ICZwQy0+bUF1ZGlvQXU7Ci0gICAgfSBlbHNlIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1WaWRlb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgcEF1ID0gJnBDLT5tVmlkZW9BdTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQgcGFzc2VkIFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICBwQXUtPkRUUyA9IHRpbWU2NDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9yZXNldCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBicmllZiAgR2V0cyBhbiBhY2Nlc3MgdW5pdCAoQVUpIGZyb20gdGhlIHN0cmVhbSBoYW5kbGVyIHNvdXJjZS4KLSogQG5vdGUgICBBbiBBVSBpcyB0aGUgc21hbGxlc3QgcG9zc2libGUgYW1vdW50IG9mIGRhdGEgdG8gYmUgZGVjb2RlZCBieSBkZWNvZGVyCi0qCi0qIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSogQHBhcmFtICAgIHBTdHJlYW1IYW5kbGVyICAoSU4pIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotKiBAcGFyYW0gICAgcEFjY2Vzc1VuaXQgICAgIChJTykgUG9pbnRlciB0byBhY2Nlc3MgdW5pdCB0byBmaWxsIHdpdGggcmVhZCBkYXRhCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0qIEByZXR1cm5zICBNNEVSUl9BTExPQyAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQKLSogQHJldHVybnMgIE00V0FSX05PX01PUkVfQVUgICAgIHRoZXJlIGFyZSBubyBtb3JlIGFjY2VzcyB1bml0IGluIHRoZSBzdHJlYW0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCkgewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqIHBDPShWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBpbnQ2NF90IHRlbXBUaW1lNjQgPSAwOwotICAgIE1lZGlhQnVmZmVyICptTWVkaWFCdWZmZXIgPSBOVUxMOwotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgIE00T1NBX0Jvb2wgZmxhZyA9IE00T1NBX0ZBTFNFOwotICAgIHN0YXR1c190IGVycm9yOwotICAgIGludDMyX3QgaTMyVG1wID0gMDsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoIHBDPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdTogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgYmVnaW4iKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBhdWRpbyBzdHJlYW0iKTsKLSAgICAgICAgcEF1ID0gJnBDLT5tQXVkaW9BdTsKLSAgICAgICAgaWYgKHBDLT5tQXVkaW9TZWVraW5nID09IE00T1NBX1RSVUUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgYXVkaW8gc2VlayB0aW1lOiAlbGQiLAotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TZWVrVGltZSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhwQy0+bUF1ZGlvU2Vla1RpbWUpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NvdXJjZS0+cmVhZCgmbU1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwKLSAgICAgICAgICAgICAgICAoaW50NjRfdCopJnRlbXBUaW1lNjQpOwotICAgICAgICAgICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NlZWtpbmcgPSBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgIGZsYWcgPSBNNE9TQV9UUlVFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSBhdWRpbyBubyBzZWVrOiIpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NvdXJjZS0+cmVhZCgmbU1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICBpZiAobU1lZGlhQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsCi0gICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KikmdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcikgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IHZpZGVvIHN0ZXJhbSAiKTsKLSAgICAgICAgcEF1ID0gJnBDLT5tVmlkZW9BdTsKLSAgICAgICAgaWYocEMtPm1WaWRlb1NlZWtpbmcgPT0gTTRPU0FfVFJVRSkgewotICAgICAgICAgICAgZmxhZyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IHNlZWs6ICVsZCIscEMtPm1WaWRlb1NlZWtUaW1lKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHBDLT5tVmlkZW9TZWVrVGltZSwKLSAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IGZyZWUgdGhlIE1lZGlhQnVmZmVyIik7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnJvciA9IHBDLT5tVmlkZW9Tb3VyY2UtPnJlYWQoJm1NZWRpYUJ1ZmZlciwgJm9wdGlvbnMpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWRTNncFJlYWRlcl9nZXROZXh0QXUgTWVkaWFCdWZmZXIgJXggLCBlcnJvciAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlciwgZXJyb3IpOwotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFCdWZmZXIgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgJmkzMlRtcCkgJiYgaTMyVG1wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlNZTkMgRlJBTUUgRk9VTkQtLSVkIiwgaTMyVG1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBdS0+YXR0cmlidXRlID0gQVVfUkFQOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcEF1LT5hdHRyaWJ1dGUgPSBBVV9QX0ZyYW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KikmdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgICAgIH0gd2hpbGUodGVtcFRpbWU2NCA8IHBDLT5tVmlkZW9TZWVrVGltZSk7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJWRTNncFJlYWRlcl9nZXROZXh0QXU6IHZpZGVvICB0aW1lIHdpdGggc2VlayAgPSAlbGxkOiIsCi0gICAgICAgICAgICAgICAgdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU2Vla2luZyA9IE00T1NBX0ZBTFNFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdSB2aWRlbyBubyBzZWVrOiIpOwotICAgICAgICAgICAgcEMtPm1WaWRlb1NvdXJjZS0+cmVhZCgmbU1lZGlhQnVmZmVyLCAmb3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIGlmKG1NZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICZpMzJUbXApICYmIGkzMlRtcCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiU1lOQyBGUkFNRSBGT1VORC0tJWQiLCBpMzJUbXApOwotICAgICAgICAgICAgICAgICAgICBwQXUtPmF0dHJpYnV0ZSA9IEFVX1JBUDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBBdS0+YXR0cmlidXRlID0gQVVfUF9GcmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLAotICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCopJnRlbXBUaW1lNjQpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWRTNncFJlYWRlcl9nZXROZXh0QXU6IHZpZGVvIG5vIHNlZWsgdGltZSA9ICVsbGQ6IiwKLSAgICAgICAgICAgICAgICAgICAgdGVtcFRpbWU2NCk7Ci0gICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZFM2dwUmVhZGVyX2dldE5leHRBdTp2aWRlbyBubyBzZWVrIHRpbWUgYnVmZmVyIGlzIE5VTEwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgTTRFUlJfUEFSQU1FVEVSIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgfQotCi0gICAgaWYgKG1NZWRpYUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmKCAocEF1LT5kYXRhQWRkcmVzcyA9PSBOVUxMKSB8fCAgKHBBdS0+c2l6ZSA8IFwKLSAgICAgICAgICAgIG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpKSB7Ci0gICAgICAgICAgICBpZihwQXUtPmRhdGFBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmcmVlKChNNE9TQV9JbnQzMiopcEF1LT5kYXRhQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiQnVmZmVyIGxlbmdodCA9ICVkICwlZCIsKG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgK1wKLSAgICAgICAgICAgICAgICAzKSAmIH4weDMsKG1NZWRpYUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpKTsKLQotICAgICAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IChNNE9TQV9JbnQzMiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgIChtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpICsgMykgJiB+MHgzLE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyIgKTsKLSAgICAgICAgICAgIGlmKHBBdS0+ZGF0YUFkZHJlc3MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0QXUgbWFsbG9jIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQXUtPnNpemUgPSBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotCi0gICAgICAgIG1lbWNweSgodm9pZCAqKXBBdS0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKSgoY29uc3QgY2hhciAqKW1NZWRpYUJ1ZmZlci0+ZGF0YSgpICsgbU1lZGlhQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSksCi0gICAgICAgICAgICBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICBpZiggKHBTdHJlYW1IYW5kbGVyID09IChNNF9TdHJlYW1IYW5kbGVyKilwQy0+bVZpZGVvU3RyZWFtSGFuZGxlcikgICYmCi0gICAgICAgICAgICAocFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSA9PSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjKSApIHsKLSAgICAgICAgICAgIE00T1NBX1VJbnQzMiBzaXplID0gbU1lZGlhQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgICAgIE00T1NBX1VJbnQ4ICpsYnVmZmVyOwotCi0gICAgICAgICAgICBsYnVmZmVyID0gKE00T1NBX1VJbnQ4ICopIHBBdS0+ZGF0YUFkZHJlc3M7Ci0gICAgICAgICAgICBBTE9HVigicEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3Mgc2l6ZSA9ICV4IixzaXplKTsKLQotICAgICAgICAgICAgbGJ1ZmZlclswXSA9IChzaXplID4+IDI0KSAmIDB4RkY7Ci0gICAgICAgICAgICBsYnVmZmVyWzFdID0gKHNpemUgPj4gMTYpICYgMHhGRjsKLSAgICAgICAgICAgIGxidWZmZXJbMl0gPSAoc2l6ZSA+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICBsYnVmZmVyWzNdID0gKHNpemUpICYgMHhGRjsKLSAgICAgICAgfQotCi0gICAgICAgIHBBdS0+Q1RTID0gdGVtcFRpbWU2NDsKLQotICAgICAgICBwQXUtPkNUUyA9IHBBdS0+Q1RTIC8gMTAwMDsgLy9jb252ZXJ0aW5nIHRoZSBtaWNyb3NlYyB0byBtaWxsaXNlYwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IENUUyA9ICVsZCIscEF1LT5DVFMpOwotCi0gICAgICAgIHBBdS0+RFRTICA9IHBBdS0+Q1RTOwotICAgICAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgICAgICBwQXUtPmF0dHJpYnV0ZSA9IE00U1lTX2tGcmFnQXR0ck9rOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYUJ1ZmZlci0+cmVsZWFzZSgpOwotCi0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzID0gKE00T1NBX0ludDgqKSBwQXUtPmRhdGFBZGRyZXNzOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9zaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9tYXhzaXplID0gcEF1LT5zaXplOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9DVFMgPSBwQXUtPkNUUzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fRFRTID0gcEF1LT5EVFM7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX2F0dHJpYnV0ZSA9IHBBdS0+YXR0cmlidXRlOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRBdTogTTRXQVJfTk9fTU9SRV9BVSAoRU9TKSByZWFjaGVkIik7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgPSAwOwotICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLSAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0KLSAgICBwQXUtPm5iRnJhZyA9IDA7Ci0gICAgbU1lZGlhQnVmZmVyID0gTlVMTDsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1IGVuZCAiKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBTcGxpdCB0aGUgQVZDIERTSSBpbiBpdHMgZGlmZmVyZW50IGNvbXBvbmVudHMgYW5kIHdyaXRlIGl0IGluCi0gKiAgICAgICAgICBPTkUgbWVtb3J5IGJ1ZmZlcgotICogQG5vdGUKLSAqIEBwYXJhbSAgIHBTdHJlYW1IYW5kbGVyOiAgICAgICAgIChJTi9PVVQpIFRoZSBNUEVHNC1BVkMgc3RyZWFtCi0gKiBAcGFyYW0gICBwRGVjb2RlckNvbmZpZ0xvY2FsOiAgICAoSU4pIFRoZSBEU0kgYnVmZmVyCi0gKiBAcGFyYW0gICBkZWNvZGVyQ29uZmlnU2l6ZUxvY2FsOiAoSU4pIFRoZSBEU0kgYnVmZmVyIHNpemUKLSAqIEByZXR1cm4gIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBFUlJfRklMRV9TWU5UQVhfRVJST1IgICBwRGVjb2RlckNvbmZpZ0xvY2FsIGlzIE5VTEwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIE00T1NBX0VSUiBWaWRlb0VkaXRvcjNncFJlYWRlcl9BbmFseXNlQXZjRHNpKAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRPU0FfSW50MzIqIHBEZWNvZGVyQ29uZmlnTG9jYWwsCi0gICAgICAgIE00T1NBX0ludDMyIGRlY29kZXJDb25maWdTaXplTG9jYWwpIHsKLSAgICBzdHJ1Y3QgX2F2Y1NwZWNpZmljSW5mbyAqcEF2Y1NwZWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9VSW50MzIgdWlTcGVjSW5mb1NpemU7Ci0gICAgTTRPU0FfQ29udGV4dCBwQml0UGFyc2VyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfTWVtQWRkcjggcFBvczsKLQotICAgIC8qKgotICAgICAqIEZpcnN0IHBhcnNpbmcgdG8gZ2V0IHRoZSB0b3RhbCBhbGxvY2F0aW9uIHNpemUgKHdlIG11c3Qgbm90IGRvCi0gICAgICogbXVsdGlwbGUgbWFsbG9jLCBidXQgb25seSBvbmUgaW5zdGVhZCkgKi8KLSAgICB7Ci0gICAgICAgIE00T1NBX0ludDMyIHZhbDsKLSAgICAgICAgTTRPU0FfVUludDMyIGksajsKLSAgICAgICAgTTRPU0FfVUludDggbmFsVW5pdExlbmd0aDsKLSAgICAgICAgTTRPU0FfVUludDggIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzOwotICAgICAgICBNNE9TQV9VSW50MzIgdWlUb3RhbFNpemVPZlNQUyA9IDA7Ci0gICAgICAgIE00T1NBX1VJbnQ4ICBudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzOwotICAgICAgICBNNE9TQV9VSW50MzIgdWlUb3RhbFNpemVPZlBQUyA9IDA7Ci0gICAgICAgIE00T1NBX1VJbnQzMiB1aVNpemU7Ci0gICAgICAgIHN0cnVjdCBfYXZjU3BlY2lmaWNJbmZvIGF2Y1NwSWY7Ci0KLSAgICAgICAgYXZjU3BJZi5tX25hbFVuaXRMZW5ndGggPSAwOwotCi0gICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBEZWNvZGVyQ29uZmlnTG9jYWwpIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9SRUFERVIzR1BfREVDT0RFUl9DT05GSUdfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9NUEVHNEJpdFN0cmVhbVBhcnNlckluaXQoJnBCaXRQYXJzZXJDb250ZXh0LAotICAgICAgICAgICAgcERlY29kZXJDb25maWdMb2NhbCwgZGVjb2RlckNvbmZpZ1NpemVMb2NhbCk7Ci0KLSAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEJpdFBhcnNlckNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgfQotCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gY29uZmlndXJhdGlvbiB2ZXJzaW9uICovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gYXZjIHByb2ZpbGUgaW5kaWNhdGlvbiovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gcHJvZmlsZSBjb21wYXRpYmlsaXR5ICovCi0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4IGJpdHMgLS0gYXZjIGxldmVsIGluZGljYXRpb24qLwotICAgICAgICB2YWw9VmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgICAgICAgICAvKiA2IGJpdHMgcmVzZXJ2ZWQgMTExMTExYiAyIGJpdHMgbGVuZ3RoIFNpemUgbWludXMgb25lKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1fbmFsVW5pdExlbmd0aCAqLwotCi0gICAgICAgIG5hbFVuaXRMZW5ndGggPSAoTTRPU0FfVUludDgpKCh2YWwgJiAweDAzKSArIDEpOy8qMGIxMTExMTEwMCovCi0gICAgICAgIGlmIChuYWxVbml0TGVuZ3RoID4gNCkgewotICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyQ2xlYW5VcChwQml0UGFyc2VyQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNQUyB0YWJsZSAqLwotICAgICAgICAgICAgdmFsPVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKHBCaXRQYXJzZXJDb250ZXh0LAotICAgICAgICAgICAgOCk7LyogMyBiaXRzLXJlc2VydmVkIDExMWItNSBiaXRzIG51bWJlciBvZiBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Ki8KLSAgICAgICAgICAgIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzID0gdmFsICYgMHgxRjsKLSAgICAgICAgICAgIC8qMUYgaW5zdGVhZCBvZiBFMCovIC8qMGIxMTEwMDAwMCovIC8qTnVtYmVyIG9mIHNlcSBwYXJhbWV0ZXIgc2V0cyovCi0gICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBudW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogR2V0IHRoZSBzaXplIG9mIHRoaXMgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgIHVpU2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMoCi0gICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICAgICAgdWlUb3RhbFNpemVPZlNQUyArPSB1aVNpemU7Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgMTYpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqUmVhZCB0aGUgZWxlbWVudChkb250IGtlZXAgaXQsIHdlIG9ubHkgd2FudCBzaXplIHJpZ2h0IG5vdykgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajx1aVNpemU7IGorKykgewotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNQUyB0YWJsZSAqLwotICAgICAgICAgICAgbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0cz0oTTRPU0FfVUludDgpXAotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKHBCaXRQYXJzZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICA4KTsKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaSA8IG51bU9mUGljdHVyZVBhcmFtZXRlclNldHM7IGkrKykgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGlzIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICB1aVNpemUgPSAoTTRPU0FfVUludDMyKQotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDE2KTsKLSAgICAgICAgICAgICAgICB1aVRvdGFsU2l6ZU9mUFBTICs9IHVpU2l6ZTsKLSAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICpSZWFkIHRoZSBlbGVtZW50KGRvbnQga2VlcCBpdCx3ZSBvbmx5IHdhbnQgc2l6ZSByaWdodCBub3cpKi8KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajx1aVNpemU7IGorKykgewotICAgICAgICAgICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGZ1bGwgYnVmZmVyICovCi0gICAgICAgICAgICB1aVNwZWNJbmZvU2l6ZSA9IHNpemVvZihzdHJ1Y3QgX2F2Y1NwZWNpZmljSW5mbykgKwotICAgICAgICAgICAgICAgICAgICAgbnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHMgKiBzaXplb2Yoc3RydWN0IF9wYXJhbWV0ZXJTZXQpCi0gICAgICAgICAgICAgICAgICAgICArIC8qKjwgc2l6ZSBvZiB0aGUgdGFibGUgb2YgU1BTIGVsZW1lbnRzICovCi0gICAgICAgICAgICAgICAgICAgICBudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzICAqIHNpemVvZihzdHJ1Y3QgX3BhcmFtZXRlclNldCkKLSAgICAgICAgICAgICAgICAgICAgICsgLyoqPCBzaXplIG9mIHRoZSB0YWJsZSBvZiBQUFMgZWxlbWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgIHVpVG90YWxTaXplT2ZTUFMgKwotICAgICAgICAgICAgICAgICAgICAgdWlUb3RhbFNpemVPZlBQUzsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQWxsb2NhdGUgdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvID0oc3RydWN0IF9hdmNTcGVjaWZpY0luZm8qKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYyh1aVNwZWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiTVBFRy00IEFWQyBEZWNvZGVyU3BlY2lmaWMiKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBBdmNTcGVjSW5mbykgewotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTZXQgdGhlIHBvaW50ZXJzIHRvIHRoZSBjb3JyZWN0IHBhcnQgb2YgdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX25hbFVuaXRMZW5ndGggPSBuYWxVbml0TGVuZ3RoOwotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX251bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzID0KLSAgICAgICAgICAgICAgICBudW1PZlNlcXVlbmNlUGFyYW1ldGVyU2V0czsKLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9udW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzICA9Ci0gICAgICAgICAgICAgICAgbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0czsKLQotICAgICAgICAgICAgLyogV2UgcGxhY2UgdGhlIFNQUyBwYXJhbSBzZXRzIHRhYmxlIGFmdGVyIG1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQgKi8KLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXQ9IChzdHJ1Y3QgX3BhcmFtZXRlclNldCopKAotICAgICAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOCkoJnBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldCkgKwotICAgICAgICAgICAgICAgIHNpemVvZihwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQpKTsKLSAgICAgICAgICAgIC8qV2UgcGxhY2UgdGhlIFBQUyBwYXJhbSBzZXRzIHRhYmxlIGFmdGVyIHRoZSBTUFMgcGFyYW0gc2V0cyB0YWJsZSovCi0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQgPSAoc3RydWN0IF9wYXJhbWV0ZXJTZXQqKSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfTWVtQWRkcjgpKHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXQpICsKLSAgICAgICAgICAgICAgICAobnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHMgKiBzaXplb2Yoc3RydWN0IF9wYXJhbWV0ZXJTZXQpKSk7Ci0gICAgICAgICAgICAvKio8IFRoZSBkYXRhIHdpbGwgYmUgcGxhY2VkIGFmdGVyIHRoZSBQUFMgcGFyYW0gc2V0cyB0YWJsZSAqLwotICAgICAgICAgICAgcFBvcyA9IChNNE9TQV9NZW1BZGRyOClwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXQgKwotICAgICAgICAgICAgICAgIChudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzICogc2l6ZW9mKHN0cnVjdCBfcGFyYW1ldGVyU2V0KSk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogcmVzZXQgdGhlIGJpdCBwYXJzZXIgKi8KLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2Vjb25kIHBhcnNpbmcgdG8gY29weSB0aGUgZGF0YSAqLwotICAgIGlmIChNNE9TQV9OVUxMICE9IHBBdmNTcGVjSW5mbykgewotICAgICAgICBNNE9TQV9JbnQzMiBpLGo7Ci0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfTVBFRzRCaXRTdHJlYW1QYXJzZXJJbml0KCZwQml0UGFyc2VyQ29udGV4dCwKLSAgICAgICAgICAgIHBEZWNvZGVyQ29uZmlnTG9jYWwsIGRlY29kZXJDb25maWdTaXplTG9jYWwpOwotCi0gICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBCaXRQYXJzZXJDb250ZXh0KSB7Ci0gICAgICAgICAgICBmcmVlKHBBdmNTcGVjSW5mbyk7Ci0gICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgIH0KLQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIGNvbmZpZ3VyYXRpb24gdmVyc2lvbiAqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIGF2YyBwcm9maWxlIGluZGljYXRpb24qLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIHByb2ZpbGUgY29tcGF0aWJpbGl0eSAqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogOCBiaXRzIC0tIGF2YyBsZXZlbCBpbmRpY2F0aW9uKi8KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKHBCaXRQYXJzZXJDb250ZXh0LCA4KTsKLSAgICAgICAgICAgIC8qIG1fbmFsVW5pdExlbmd0aCAqLwotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAvKiAzIGJpdHMgLS0gcmVzZXJ2ZWQgMTExYiAtLSA1IGJpdHMgbnVtYmVyIG9mIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQqLwotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgcEF2Y1NwZWNJbmZvLT5tX251bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzOyBpKyspIHsKLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXRbaV0ubV9sZW5ndGggPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MTYpVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyU2hvd0JpdHMoCi0gICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDE2KTsKLSAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cyhwQml0UGFyc2VyQ29udGV4dCwxNik7Ci0KLSAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwUG9zOyAgLyoqPCBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgIHBQb3MgKz0gcEF2Y1NwZWNJbmZvLT5tX3BTZXF1ZW5jZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aDsKLSAgICAgICAgICAgICAgICAvKio8IGluY3JlbWVudCB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgZm9yIChqPTA7IGo8cEF2Y1NwZWNJbmZvLT5tX3BTZXF1ZW5jZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aDtqKyspewotICAgICAgICAgICAgICAgIHBBdmNTcGVjSW5mby0+bV9wU2VxdWVuY2VQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdFtqXT0KLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQml0U3RyZWFtUGFyc2VyRmx1c2hCaXRzKAotICAgICAgICAgICAgICAgICAgICBwQml0UGFyc2VyQ29udGV4dCwgOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgLyogbnVtYmVyIG9mIHDDrmN0dXJlIHBhcmFtZXRlciBzZXQqLwotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgcEF2Y1NwZWNJbmZvLT5tX251bU9mUGljdHVyZVBhcmFtZXRlclNldHM7IGkrKykgewotICAgICAgICAgICAgcEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0W2ldLm1fbGVuZ3RoID0KLSAgICAgICAgICAgICAgICAoTTRPU0FfVUludDE2KVZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlclNob3dCaXRzKAotICAgICAgICAgICAgICAgIHBCaXRQYXJzZXJDb250ZXh0LCAxNik7Ci0gICAgICAgICAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJGbHVzaEJpdHMocEJpdFBhcnNlckNvbnRleHQsMTYpOwotCi0gICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdCA9Ci0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwUG9zOyAgIC8qKjwgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICBwUG9zICs9IHBBdmNTcGVjSW5mby0+bV9wUGljdHVyZVBhcmFtZXRlclNldFtpXS5tX2xlbmd0aDsKLSAgICAgICAgICAgICAgICAvKio8IGluY3JlbWVudCB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgZm9yIChqPTA7IGo8cEF2Y1NwZWNJbmZvLT5tX3BQaWN0dXJlUGFyYW1ldGVyU2V0W2ldLm1fbGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBwQXZjU3BlY0luZm8tPm1fcFBpY3R1cmVQYXJhbWV0ZXJTZXRbaV0ubV9wUGFyYW1ldGVyU2V0VW5pdFtqXSA9Ci0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OClWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJTaG93Qml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckZsdXNoQml0cygKLSAgICAgICAgICAgICAgICAgICAgcEJpdFBhcnNlckNvbnRleHQsIDgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0JpdFN0cmVhbVBhcnNlckNsZWFuVXAocEJpdFBhcnNlckNvbnRleHQpOwotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IHVpU3BlY0luZm9TaXplOwotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IChNNE9TQV9VSW50OCopcEF2Y1NwZWNJbmZvOwotICAgIH0KLSAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgID0gIGRlY29kZXJDb25maWdTaXplTG9jYWw7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvICA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBkZWNvZGVyQ29uZmlnU2l6ZUxvY2FsLCBNNFJFQURFUl8zR1AsCi0gICAgICAgIChNNE9TQV9DaGFyKikiTVBFRy00IEFWQyBEZWNvZGVyU3BlY2lmaWMiKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8pIHsKLSAgICAgICAgZ290byBjbGVhbnVwOwotICAgIH0KLQotICAgIG1lbWNweSgodm9pZCAqICkgcFN0cmVhbUhhbmRsZXItPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvLAotICAgICAgICAodm9pZCAqIClwRGVjb2RlckNvbmZpZ0xvY2FsLAotICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotY2xlYW51cDoKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9CaXRTdHJlYW1QYXJzZXJDbGVhblVwKHBCaXRQYXJzZXJDb250ZXh0KTsKLSAgICByZXR1cm4gTTRFUlJfUkVBREVSM0dQX0RFQ09ERVJfQ09ORklHX0VSUk9SOwotfQotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAYnJpZWYgICAgR2V0IHRoZSBuZXh0IHN0cmVhbSBmb3VuZCBpbiB0aGUgM2dwIGZpbGUKLSogQG5vdGUKLSogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotKiBAcGFyYW0gICAgcE1lZGlhRmFtaWx5OiBPVVQpICAgcG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSB0aGF0IHdpbGwgYmUgZmlsbGVkCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBtZWRpYSBmYW1pbHkgb2YgdGhlIGZvdW5kIHN0cmVhbQotKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6KE9VVCkgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBmaWxsZWQgd2l0aCB0aGUgZm91bmQgc3RyZWFtIGRlc2NyaXB0aW9uCi0qIEByZXR1cm4gICBNNE5PX0VSUk9SICAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotKiBAcmV0dXJuICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgcHJvdmlkZWQgY29udGV4dCBpcyBub3QgYSB2YWxpZCBvbmUKLSogQHJldHVybiAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotKiBAcmV0dXJuICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0gICAgbm8gbW9yZSBhdmFpbGFibGUgc3RyZWFtIGluIHRoZSBtZWRpYQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICoqcFN0cmVhbUhhbmRsZXIpIHsKLSAgICBWaWRlb0VkaXRvcjNncFJlYWRlcl9Db250ZXh0KiBwQz0oVmlkZW9FZGl0b3IzZ3BSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00U1lTX1N0cmVhbURlc2NyaXB0aW9uIHN0cmVhbURlc2M7Ci0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgIE00X1ZpZGVvU3RyZWFtSGFuZGxlciogcFZpZGVvU3RyZWFtSGFuZGxlcjsKLSAgICBNNE9TQV9JbnQ4ICpEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICBNNE9TQV9JbnQzMiBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9MCwgbWF4QVVTaXplID0gMDsKLQotICAgIE00X1N0cmVhbVR5cGUgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVVua25vd247Ci0gICAgTTRPU0FfVUludDggdGVtcCwgaSwgdHJhY2tDb3VudDsKLSAgICBNNE9TQV9Cb29sIGhhdmVBdWRpbyA9IE00T1NBX0ZBTFNFOwotICAgIE00T1NBX0Jvb2wgaGF2ZVZpZGVvID0gTTRPU0FfRkFMU0U7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgID0gTlVMTDsKLSAgICBpbnQ2NF90IER1cmF0aW9uID0gMDsKLSAgICBNNE9TQV9VSW50OCogRGVjb2RlclNwZWNpZmljID0gTTRPU0FfTlVMTCA7Ci0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpkYXRhOwotICAgIHNpemVfdCBzaXplOwotICAgIGNvbnN0IHZvaWQgKmNvZGVjX3NwZWNpZmljX2RhdGE7Ci0gICAgc2l6ZV90IGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZTsKLSAgICBNNE9TQV9JbnQzMiAgcHRlbXBUaW1lOwotICAgIE00T1NBX0ludDMyICBhdmdGUFM9MDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBiZWdpbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXI6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocE1lZGlhRmFtaWx5ICAgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImdldE5leHRTdHJlYW1IYW5kbGVyOiBpbnZhbGlkIHBvaW50ZXIgdG8gTWVkaWFGYW1pbHkiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJnZXROZXh0U3RyZWFtSGFuZGxlcjogaW52YWxpZCBwb2ludGVyIHRvIFN0cmVhbUhhbmRsZXIiKTsKLQotICAgIHRyYWNrQ291bnQgPSBwQy0+bUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKLSAgICB0ZW1wID0gcEMtPm1DdXJyVHJhY2s7Ci0KLSAgICBpZih0ZW1wID49IHRyYWNrQ291bnQpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyIGVycm9yID0gJWQiLAotICAgICAgICAgICAgTTRXQVJfTk9fTU9SRV9TVFJFQU0pOwotICAgICAgICByZXR1cm4gKE00V0FSX05PX01PUkVfU1RSRUFNKTsKLSAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBtZXRhID0gcEMtPm1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEodGVtcCk7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgICAgICBpZiAoIWhhdmVWaWRlbyAmJiAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7Ci0gICAgICAgICAgICBwQy0+bVZpZGVvU291cmNlID0gcEMtPm1FeHRyYWN0b3ItPmdldFRyYWNrKHRlbXApOwotICAgICAgICAgICAgcEMtPm1WaWRlb1NvdXJjZS0+c3RhcnQoKTsKLQotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseVZpZGVvOwotICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBnZXRUcmFjayBjYWxsZWQiKTsKLSAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlckdldE5leHRTdHJlYW1IYW5kbGVyIHN0cmVhbVR5cGVOT05FIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXI6IHN0cmVhbSB0eXBlOiAlZCAiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUpOwotCi0gICAgICAgICAgICBpZihzdHJlYW1UeXBlICE9IE00REFfU3RyZWFtVHlwZVVua25vd24pIHsKLSAgICAgICAgICAgICAgICBwQy0+bVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgICAgICAgICAgICAgIHBDLT5tU3RyZWFtSWQgPSBwQy0+bUN1cnJUcmFjazsKLQotICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXIgPSAoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MKLSAgICAgICAgICAgICAgICAgICAgKHNpemVvZihNNF9WaWRlb1N0cmVhbUhhbmRsZXIpLCBNNFJFQURFUl8zR1AsCi0gICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRfVmlkZW9TdHJlYW1IYW5kbGVyIik7Ci0gICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcFZpZGVvU3RyZWFtSGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXItPm1fc3RydWN0U2l6ZT1zaXplb2YoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKTsKLQotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIChpbnQzMl90KikmKHBWaWRlb1N0cmVhbUhhbmRsZXItPm1fdmlkZW9XaWR0aCkpOwotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCopJihwVmlkZW9TdHJlYW1IYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0KSk7Ci0KLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKSAgPSAoTTRfU3RyZWFtSGFuZGxlciopKHBWaWRlb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sIChpbnQ2NF90KikmKER1cmF0aW9uKSk7Ci0gICAgICAgICAgICAgICAgKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2R1cmF0aW9uKSA9IChpbnQzMl90KSgoRHVyYXRpb24pLzEwMDApOyAvLyBjb252ZXJzaW9uIHRvIG1TCi0gICAgICAgICAgICAgICAgcEMtPm1NYXhEdXJhdGlvbiA9ICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kdXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKHBDLT5tTWF4RHVyYXRpb24gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgdG9vIHNob3J0OiAlbGxkIFVzIiwgRHVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFZpZGVvU3RyZWFtSGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBtX2R1cmF0aW9uICVkIiwKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24pOwotCi0gICAgICAgICAgICAgICAgb2ZmNjRfdCBmaWxlU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgcEMtPm1EYXRhU291cmNlLT5nZXRTaXplKCZmaWxlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgcEMtPm1GaWxlU2l6ZSAgPSBmaWxlU2l6ZTsKLQotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtSGFuZGxlciBtX2ZpbGVTaXplICVkIiwKLSAgICAgICAgICAgICAgICAgICAgcEMtPm1GaWxlU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBtZXRhLT5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgKGludDMyX3QqKSYobWF4QVVTaXplKSk7Ci0gICAgICAgICAgICAgICAgaWYobWF4QVVTaXplID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4QVVTaXplID0gNzAwMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX21heEFVU2l6ZSA9IG1heEFVU2l6ZTsKLSAgICAgICAgICAgICAgICBBTE9HVigiPDw8PDw8PDw8PCAgIHZpZGVvOiBtTWF4QVVTaXplIGZyb20gTVA0IGV4dHJhY3RvcjogJWQiLAotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9tYXhBVVNpemUpOwotCi0gICAgICAgICAgICAgICAgKChNNF9TdHJlYW1IYW5kbGVyKilwVmlkZW9TdHJlYW1IYW5kbGVyKS0+bV9hdmVyYWdlQml0UmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAocEMtPm1GaWxlU2l6ZSAqIDgwMDApL3BDLT5tTWF4RHVyYXRpb247Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW1IYW5kbGVyIG1fYXZlcmFnZUJpdHJhdGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAoKE00X1N0cmVhbUhhbmRsZXIqKXBWaWRlb1N0cmVhbUhhbmRsZXIpLT5tX2F2ZXJhZ2VCaXRSYXRlKTsKLQotCi0gICAgICAgICAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgIChpbnQzMl90KikmKGF2Z0ZQUykpOwotICAgICAgICAgICAgICAgIEFMT0dWKCI8PDw8PDw8PDw8ICAgdmlkZW86IEF2ZXJhZ2UgRlBTIGZyb20gTVA0IGV4dHJhY3RvcjogJWQiLAotICAgICAgICAgICAgICAgICAgICBhdmdGUFMpOwotCi0gICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlID0oTTRPU0FfRmxvYXQpIGF2Z0ZQUzsKLSAgICAgICAgICAgICAgICBBTE9HVigiPDw8PDw8PDw8PCAgIHZpZGVvOiBBdmVyYWdlIEZQUyBmcm9tIE1QNCBleHRyYWN0b3IgaW4gRkxPQVQ6ICVmIiwKLSAgICAgICAgICAgICAgICAgICAgcFZpZGVvU3RyZWFtSGFuZGxlci0+bV9hdmVyYWdlRnJhbWVSYXRlKTsKLQotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgdmlkZW8gcm90YXRpb24gZGVncmVlCi0gICAgICAgICAgICAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZTsKLSAgICAgICAgICAgICAgICBpZighbWV0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJnJvdGF0aW9uRGVncmVlKSkgewotICAgICAgICAgICAgICAgICAgICByb3RhdGlvbkRlZ3JlZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBWaWRlb1N0cmVhbUhhbmRsZXItPnZpZGVvUm90YXRpb25EZWdyZWVzID0gcm90YXRpb25EZWdyZWU7Ci0KLSAgICAgICAgICAgICAgICBwQy0+bVZpZGVvU3RyZWFtSGFuZGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKikocFZpZGVvU3RyZWFtSGFuZGxlcik7Ci0KLSAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIERTSSBpbmZvICovCi0gICAgICAgICAgICAgICAgaWYoTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzID09IHN0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlEMjYzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSXzNHUCwoTTRPU0FfQ2hhciopIkgyNjMgRFNJIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gRGVjb2RlclNwZWNpZmljKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEgyNjREZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0gyNjRkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVkVfZ2V0TmV4dFN0cmVhbUhhbmRsZXI6IEgyNjMgZHNpIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BIMjY0RGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNEF2YyA9PSBzdHJlYW1UeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1ldGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJTcGVjaWZpY0luZm9TaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWNJbmZvID0gKE00T1NBX0ludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlclNwZWNpZmljSW5mb1NpemUsIE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJIMjY0IERlY29kZXJTcGVjaWZpYyIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWNJbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncF9nZXROZXh0U3RyZWFtIGlzIE5VTEwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilkYXRhLCBkZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJEU0kgU2l6ZSAlZCIsIGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX0FuYWx5c2VBdmNEc2koKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAoTTRPU0FfSW50MzIqKURlY29kZXJTcGVjaWZpY0luZm8sIGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImRlY3NpemUgJWQsIGgyNjRkZWNzaXplICVkOiAlZCIsICgqcFN0cmVhbUhhbmRsZXIpLT5cCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLCAoKnBTdHJlYW1IYW5kbGVyKS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgbV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKE00T1NBX05VTEwgIT0gRGVjb2RlclNwZWNpZmljSW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShEZWNvZGVyU3BlY2lmaWNJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKCAoTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNCA9PSBzdHJlYW1UeXBlKSApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRVNEUyBlc2RzKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9FU0RTSW5mb1NpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcEVTRFNJbmZvID0gKE00T1NBX1VJbnQ4KilcCi0gICAgICAgICAgICAgICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIk00ViBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRVNEU0luZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoKnBTdHJlYW1IYW5kbGVyKS0+XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEVTRFNJbmZvLCAodm9pZCAqKWRhdGEsIHNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKCZjb2RlY19zcGVjaWZpY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZFIE1QNCBkc2lzaXplOiAlZCwgJXgiLCBjb2RlY19zcGVjaWZpY19kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19zcGVjaWZpY19kYXRhX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZXJTcGVjaWZpYyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIiBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gRGVjb2RlclNwZWNpZmljKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopRGVjb2RlclNwZWNpZmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9IMjY0ZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldE5leHRTdHJlYW0gTk8gdmlkZW8gc3RyZWFtIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbSBOTyB2aWRlbyBzdHJlYW0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmICghaGF2ZUF1ZGlvICYmICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWFtIGF1ZGlvIGdldFRyYWNrIGNhbGxlZCIpOwotICAgICAgICAgICAgcEMtPm1BdWRpb1NvdXJjZSA9IHBDLT5tRXh0cmFjdG9yLT5nZXRUcmFjayhwQy0+bUN1cnJUcmFjayk7Ci0gICAgICAgICAgICBwQy0+bUF1ZGlvU291cmNlLT5zdGFydCgpOwotICAgICAgICAgICAgKnBNZWRpYUZhbWlseSA9IE00UkVBREVSX2tNZWRpYUZhbWlseUF1ZGlvOwotCi0gICAgICAgICAgICBpZighc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZDsKLSAgICAgICAgICAgIH0gZWxzZSBpZighc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yV2lkZUJhbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gTTREQV9TdHJlYW1UeXBlQXVkaW9BYWM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXROZXh0U3RyZWEgc3RyZWFtdHlwZSBVbmtub3duICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoc3RyZWFtVHlwZSAhPSBNNERBX1N0cmVhbVR5cGVVbmtub3duKSB7Ci0gICAgICAgICAgICAgICAgcEMtPm1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgICAgICAgICBwQy0+bVN0cmVhbUlkID0gcEMtPm1DdXJyVHJhY2s7Ci0KLSAgICAgICAgICAgICAgICBBTE9HVigiVkUgc3RyZWFtdHlwZSAlZCAsaWQgJWQiLCAgc3RyZWFtVHlwZSwgcEMtPm1DdXJyVHJhY2spOwotCi0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlciA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYwotICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlciksIE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAgICAgKE00T1NBX0NoYXIqKSJNNF9BdWRpb1N0cmVhbUhhbmRsZXIiKTsKLSAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQXVkaW9TdHJlYW1IYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zdHJ1Y3RTaXplPXNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemUgICA9IDA7Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzICAgICAgID0gMDsKLSAgICAgICAgICAgICAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5PSAwOwotICAgICAgICAgICAgICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZUZyYW1lTGVuZ3RoICA9IDA7Ci0KLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKSA9IChNNF9TdHJlYW1IYW5kbGVyKikocEF1ZGlvU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPQotICAgICAgICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopKHBBdWRpb1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2F2ZXJhZ2VCaXRSYXRlID0gMDsKLSAgICAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyPShNNF9TdHJlYW1IYW5kbGVyKilwQXVkaW9TdHJlYW1IYW5kbGVyOwotICAgICAgICAgICAgICAgIHBDLT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3BFU0RTSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgcEMtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fRVNEU0luZm9TaXplID0gMDsKLQotICAgICAgICAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAoaW50MzJfdCopJihtYXhBVVNpemUpKTsKLSAgICAgICAgICAgICAgICBpZihtYXhBVVNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtYXhBVVNpemUgPSA3MDAwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fbWF4QVVTaXplID0gbWF4QVVTaXplOwotICAgICAgICAgICAgICAgIEFMT0dWKCJWRSBBdWRpbyBtTWF4QVVTaXplIGZyb20gTVA0IGV4dHJhY3RvcjogJWQiLCBtYXhBVVNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKE00REFfU3RyZWFtVHlwZUF1ZGlvQW1yTmFycm93QmFuZCA9PSBzdHJlYW1UeXBlKSB8fAotICAgICAgICAgICAgICAgIChNNERBX1N0cmVhbVR5cGVBdWRpb0FtcldpZGVCYW5kID09IHN0cmVhbVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGZyZXFJbmRleCA9IDA7IC8qKjwgQU1SIE5CICovCi0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIG1vZGVTZXQ7Ci0gICAgICAgICAgICAgICAgTTRPU0FfVUludDMyIGk7Ci0gICAgICAgICAgICAgICAgTTRPU0FfQ29udGV4dCBwQml0UGFyc2VyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICAgICAgICAgICAgICBpZihNNERBX1N0cmVhbVR5cGVBdWRpb0FtcldpZGVCYW5kID09IHN0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlcUluZGV4ID0gMTsgLyoqPCBBTVIgV0IgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICAgICAgICAgIGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oJmNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFJFQURFUl8zR1AsIChNNE9TQV9DaGFyKikiQU1SIERlY29kZXJTcGVjaWZpYyIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IERlY29kZXJTcGVjaWZpYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKURlY29kZXJTcGVjaWZpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNvZGVjX3NwZWNpZmljX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBNNE9TQV9VQ2hhciBBbXJEc2lbXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB7J1AnLCdIJywnTCcsJ1AnLDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDEsfTsKLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSA5OwotICAgICAgICAgICAgICAgICAgICBEZWNvZGVyU3BlY2lmaWMgPSAoTTRPU0FfVUludDgqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIlBITFAgRGVjb2RlclNwZWNpZmljIiApOwotICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihmcmVxSW5kZXggPT0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbXJEc2lbOF0gPSAweDAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQW1yRHNpWzhdID0gMHgwMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGk8IDk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljW2ldID0gQW1yRHNpW2ldOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gRGVjb2RlclNwZWNpZmljOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9hdmVyYWdlQml0UmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0FtckJpdFJhdGVbZnJlcUluZGV4XVs3XTsKLSAgICAgICAgICAgIH0gZWxzZSBpZigoTTREQV9TdHJlYW1UeXBlQXVkaW9BYWMgPT0gc3RyZWFtVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVTRFMgZXNkcygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOwotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShlc2RzLkluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX0VTRFNJbmZvU2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICAgICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbyA9IChNNE9TQV9VSW50OCopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fRVNEU0luZm9TaXplLCBNNFJFQURFUl8zR1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIkFBQyBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09ICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKSgqcFN0cmVhbUhhbmRsZXIpLT5tX3BFU0RTSW5mbywKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilkYXRhLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygmY29kZWNfc3BlY2lmaWNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY19zcGVjaWZpY19kYXRhX3NpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWRWRzaSAlZCwleCIsY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplOwotICAgICAgICAgICAgICAgICAgICBpZiAoKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljID0gKE00T1NBX1VJbnQ4KilNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIkFBQyBEZWNvZGVyU3BlY2lmaWMiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBEZWNvZGVyU3BlY2lmaWMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilEZWNvZGVyU3BlY2lmaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljb2RlY19zcGVjaWZpY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3NwZWNpZmljX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9wRGVjb2RlclNwZWNpZmljSW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlclNwZWNpZmljOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPSBNNE9TQV9OVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbSBtU3RyZWFtVHlwZTogbm9uZSAiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiVkUgbm9hdWRpby12aWRlbyBzdHJlYW06cEMtPm1DdXJyVHJhY2sgPSAlZCAiLHBDLT5tQ3VyclRyYWNrKTsKLSAgICAgICAgICAgIHBDLT5tQ3VyclRyYWNrKys7IC8vSW5jcmVtZW50IGN1cnJlbnQgdHJhY2sgdG8gZ2V0IHRoZSBuZXh0IHRyYWNrCi0gICAgICAgICAgICByZXR1cm4gTTRFUlJfUkVBREVSX1VOS05PV05fU1RSRUFNX1RZUEU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZFIFN0cmVhbVR5cGU6ICVkLCBzdHJlbWhhbmRsZXIgJXgiLHN0cmVhbVR5cGUsICpwU3RyZWFtSGFuZGxlciApOwotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9zdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fc3RyZWFtSWQgICA9IHBDLT5tU3RyZWFtSWQ7Ci0gICAgICAgICgqcFN0cmVhbUhhbmRsZXIpLT5tX3BVc2VyRGF0YSAgPSBNNE9TQV9OVUxMOwotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9zdHJ1Y3RTaXplID0gc2l6ZW9mKE00X1N0cmVhbUhhbmRsZXIpOwotICAgICAgICAoKnBTdHJlYW1IYW5kbGVyKS0+bV9iU3RyZWFtSXNPSyA9IE00T1NBX1RSVUU7Ci0KLSAgICAgICAgbWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwKLSAgICAgICAgICAgIChpbnQ2NF90KikmKER1cmF0aW9uKSk7Ci0KLSAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24gPSAoaW50MzJfdCkoRHVyYXRpb24gLyAxMDAwKTsKLQotICAgICAgICBwQy0+bU1heER1cmF0aW9uID0gKCgqcFN0cmVhbUhhbmRsZXIpLT5tX2R1cmF0aW9uKTsKLSAgICAgICAgQUxPR1YoIlZFIHN0ciBkdXJhdGlvbiBkdXJhdGlvbjogJWQgIiwgKCpwU3RyZWFtSGFuZGxlciktPm1fZHVyYXRpb24pOwotCi0gICAgICAgIC8qIEluIEFBQyBjYXNlOiBQdXQgdGhlIGZpcnN0IEFVIGluIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhCi0gICAgICAgICAqc2luY2UgZGVjb2RlciBoYXMgdG8ga25vdyBpZiBzdHJlYW0gY29udGFpbnMgU0JSIGRhdGEoSW1wbGljaXQgc2lnKSAqLwotICAgICAgICBpZihNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PSAoKnBTdHJlYW1IYW5kbGVyKS0+bV9zdHJlYW1UeXBlKSB7Ci0gICAgICAgICAgICBNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhKiAgcEF1ZGlvU2JyVXNlcmRhdGE7Ci0KLSAgICAgICAgICAgIHBBdWRpb1NiclVzZXJkYXRhID0gKE00UkVBREVSX0F1ZGlvU2JyVXNlcmRhdGEqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSksTTRSRUFERVJfM0dQLAotICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikiTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSIpOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgPT0gcEF1ZGlvU2JyVXNlcmRhdGEpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKCpwU3RyZWFtSGFuZGxlciktPm1fcFVzZXJEYXRhID0gcEF1ZGlvU2JyVXNlcmRhdGE7Ci0gICAgICAgICAgICBwQXVkaW9TYnJVc2VyZGF0YS0+bV9iSXNTYnJFbmFibGVkID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAgICAgICAgIHBBdWRpb1NiclVzZXJkYXRhLT5tX3BGaXJzdEFVID0gKE00X0FjY2Vzc1VuaXQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgICAgICBzaXplb2YoTTRfQWNjZXNzVW5pdCksTTRSRUFERVJfM0dQLCAoTTRPU0FfQ2hhciopIjFzdCBBQUMgQVUiKTsKLSAgICAgICAgICAgIGlmIChNNE9TQV9OVUxMID09IHBBdWRpb1NiclVzZXJkYXRhLT5tX3BGaXJzdEFVKSB7Ci0gICAgICAgICAgICAgICAgcEF1ZGlvU2JyVXNlcmRhdGEtPm1fcEFhY0RlY29kZXJVc2VyQ29uZmlnID0gTTRPU0FfTlVMTDsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEF1ZGlvU2JyVXNlcmRhdGEtPm1fcEFhY0RlY29kZXJVc2VyQ29uZmlnID0gKE00X0FhY0RlY29kZXJDb25maWcqKVwKLSAgICAgICAgICAgICAgICBNNE9TQV8zMmJpdEFsaWduZWRNYWxsb2Moc2l6ZW9mKE00X0FhY0RlY29kZXJDb25maWcpLE00UkVBREVSXzNHUCwKLSAgICAgICAgICAgICAgICAoTTRPU0FfQ2hhciopIm1fcEFhY0RlY29kZXJVc2VyQ29uZmlnIik7Ci0gICAgICAgICAgICBpZiAoTTRPU0FfTlVMTCA9PSBwQXVkaW9TYnJVc2VyZGF0YS0+bV9wQWFjRGVjb2RlclVzZXJDb25maWcpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKE00REFfU3RyZWFtVHlwZUF1ZGlvQWFjID09ICgqcFN0cmVhbUhhbmRsZXIpLT5tX3N0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcEF1ZGlvU3RyZWFtSGFuZGxlciA9Ci0gICAgICAgICAgICAgICAgKE00X0F1ZGlvU3RyZWFtSGFuZGxlciopKCpwU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgICAgICBNNFJFQURFUl9BdWRpb1NiclVzZXJkYXRhKiBwVXNlckRhdGEgPSAoTTRSRUFERVJfQXVkaW9TYnJVc2VyZGF0YSopXAotICAgICAgICAgICAgICAgIChwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5tX3BVc2VyRGF0YSk7Ci0KLSAgICAgICAgICAgIGVyciA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2ZpbGxBdVN0cnVjdChwQywgKCpwU3RyZWFtSGFuZGxlciksCi0gICAgICAgICAgICAgICAgKE00X0FjY2Vzc1VuaXQqKXBVc2VyRGF0YS0+bV9wRmlyc3RBVSk7Ci0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1KHBDLCAoKnBTdHJlYW1IYW5kbGVyKSwKLSAgICAgICAgICAgICAgICAoTTRfQWNjZXNzVW5pdCopcFVzZXJEYXRhLT5tX3BGaXJzdEFVKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIDEuICJNNFdBUl9OT19NT1JFX0FVID09IGVyciIgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8gbW9yZQotICAgICAgICAgICAgICogYWNjZXNzIHVuaXQgZnJvbSB0aGUgY3VycmVudCB0cmFjay4gSW4gb3RoZXIgd29yZHMsIHRoZXJlCi0gICAgICAgICAgICAgKiBpcyBvbmx5IGEgc2luZ2xlIGFjY2VzcyB1bml0IGZyb20gdGhlIGN1cnJlbnQgdHJhY2ssIGFuZAotICAgICAgICAgICAgICogdGhlIHBhcnNpbmcgb2YgdGhpcyB0cmFjayBoYXMgcmVhY2hlZCBFT1MuIFRoZSByZWFzb24gd2h5Ci0gICAgICAgICAgICAgKiB0aGUgZmlyc3QgYWNjZXNzIHVuaXQgbmVlZHMgdG8gYmUgcGFyc2VkIGhlcmUgaXMgYmVjYXVzZSBmb3IKLSAgICAgICAgICAgICAqIHNvbWUgYXVkaW8gY29kZWMgKGxpa2UgQUFDKSwgdGhlIHZlcnkgZmlyc3QgYWNjZXNzIHVuaXQKLSAgICAgICAgICAgICAqIG11c3QgYmUgZGVjb2RlZCBiZWZvcmUgaXRzIGNvbmZpZ3VyYXRpb24vZW5jb2RpbmcgcGFyYW1ldGVycwotICAgICAgICAgICAgICogKHN1Y2ggYXMgIyBvZiBjaGFubmVscyBhbmQgc2FtcGxlIHJhdGUpIGNhbiBiZSBjb3JyZWN0bHkKLSAgICAgICAgICAgICAqIGRldGVybWluZWQuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogMi4gInRyYWNrQ291bnQgPiBwQy0+bUN1cnJUcmFjayIgaW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIG90aGVyCi0gICAgICAgICAgICAgKiB0cmFja3MgdG8gYmUgcGFyc2VkLCBpbiBhZGRpdGlvbiB0byB0aGUgY3VycmVudCB0cmFjay4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBXaGVuIGJvdGggY29uZGl0aW9ucyAxICYgMiBob2xkLCBvdGhlciB0cmFja3Mgc2hvdWxkIGJlCi0gICAgICAgICAgICAgKiBwYXJzZWQuIFRodXMsIHdlIHNob3VsZCBub3QgYmFpbCBvdXQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChNNFdBUl9OT19NT1JFX0FVID09IGVyciAmJiB0cmFja0NvdW50ID4gcEMtPm1DdXJyVHJhY2spIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoTTROT19FUlJPUiAhPSBlcnIpIHsKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfcmVzZXQocEMsICgqcFN0cmVhbUhhbmRsZXIpKTsKLSAgICAgICAgICAgIGlmIChNNE5PX0VSUk9SICE9IGVycikgewotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcEMtPm1DdXJyVHJhY2srKzsgLy9JbmNyZW1lbnQgdGhlIGN1cnJlbnQgdHJhY2sgdG8gZ2V0IG5leHQgdHJhY2sKLSAgICBBTE9HVigicEMtPm1DdXJyVHJhY2sgPSAlZCIscEMtPm1DdXJyVHJhY2spOwotCi0gICAgaWYgKCFoYXZlQXVkaW8gJiYgIWhhdmVWaWRlbykgewotICAgICAgICAqcE1lZGlhRmFtaWx5PU00UkVBREVSX2tNZWRpYUZhbWlseVVua25vd247Ci0gICAgICAgIHJldHVybiBNNEVSUl9SRUFERVJfVU5LTk9XTl9TVFJFQU1fVFlQRTsKLSAgICB9Ci1FcnJvcjoKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXIgZW5kIGVycm9yID0gJWQiLGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRPU0FfSW50MzIqIHBUaW1lKQotewotICAgIFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQgKnBDID0gKFZpZGVvRWRpdG9yM2dwUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTWVkaWFCdWZmZXIgKm1NZWRpYUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgTTRPU0FfVGltZSB0aW1lNjQ7Ci0gICAgaW50NjRfdCB0ZW1wVGltZTY0ID0gMDsKLSAgICBzdGF0dXNfdCBlcnJvcjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZSBiZWdpbiIpOwotCi0gICAgTTRPU0FfREVCVUdfSUYxKChwQyA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWU6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lIGludmFsaWQgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwVGltZSA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWU6IGludmFsaWQgdGltZSBwb2ludGVyIik7Ci0gICAgaWYgKCpwVGltZSA9PSAocFN0cmVhbUhhbmRsZXItPm1fZHVyYXRpb24pKSB7Ci0gICAgICAgICpwVGltZSAtPSAxOwotICAgIH0KLQotICAgIHRpbWU2NCA9IChNNE9TQV9UaW1lKSpwVGltZSAqIDEwMDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWUgc2VlayB0aW1lOiAlbGQiLHRpbWU2NCk7Ci0gICAgb3B0aW9ucy5zZXRTZWVrVG8odGltZTY0LCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgZXJyb3IgPSBwQy0+bVZpZGVvU291cmNlLT5yZWFkKCZtTWVkaWFCdWZmZXIsICZvcHRpb25zKTsKLSAgICBpZiAoZXJyb3IgIT0gT0spIHsKLSAgICAgICAgLy9DYW4gbm90IGdldCB0aGUgcHJldmlvdXMgU3luYy4KLSAgICAgICAgLy9NdXN0IGJlIGVuZCBvZiBzdHJlYW0uCi0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLQotICAgIG1NZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgKGludDY0X3QqKSZ0ZW1wVGltZTY0KTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWUgcmVhZCB0aW1lICVsZCwgJXgiLCB0ZW1wVGltZTY0LAotICAgICAgICBtTWVkaWFCdWZmZXIpOwotCi0gICAgKnBUaW1lID0gKE00T1NBX0ludDMyKSh0ZW1wVGltZTY0IC8gMTAwMCk7Ci0KLSAgICBpZihtTWVkaWFCdWZmZXIgIT0gTTRPU0FfTlVMTCkgewotICAgICAgICBBTE9HVigiIG1NZWRpYUJ1ZmZlciBzaXplID0gJWQgbGVuZ3RoICVkIiwgbU1lZGlhQnVmZmVyLT5zaXplKCksCi0gICAgICAgICAgICBtTWVkaWFCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgbU1lZGlhQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1NZWRpYUJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIG9wdGlvbnMuY2xlYXJTZWVrVG8oKTsKLQotICAgIGlmKGVycm9yICE9IE9LKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRQcmV2UmFwVGltZSBlbmQgXAotICAgICAgICAgICAgTTRXQVJfUkVBREVSX0lORk9STUFUSU9OX05PVF9QUkVTRU5UIik7Ci0gICAgICAgIHJldHVybiBNNFdBUl9SRUFERVJfSU5GT1JNQVRJT05fTk9UX1BSRVNFTlQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldFByZXZSYXBUaW1lIGVuZDogZXJyICV4IiwgZXJyKTsKLSAgICAgICAgZXJyID0gTTROT19FUlJPUjsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci19Ci0KLWV4dGVybiAiQyIgewotTTRPU0FfRVJSIFZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZShNNFJFQURFUl9NZWRpYVR5cGUgKnBNZWRpYVR5cGUsCi0gICAgICAgIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSAqKnBSZHJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKipwUmRyRGF0YUludGVyZmFjZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBNZWRpYVR5cGUsICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBSZHJHbG9iYWxJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmRyRGF0YUludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvcjNncFJlYWRlcl9nZXRJbnRlcmZhY2UgYmVnaW4iKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlICVkIDB4JXggMHgleCIsICpwTWVkaWFUeXBlLAotICAgICAgICAqcFJkckdsb2JhbEludGVyZmFjZSwqcFJkckRhdGFJbnRlcmZhY2UpOwotCi0gICAgU0FGRV9NQUxMT0MoKnBSZHJHbG9iYWxJbnRlcmZhY2UsIE00UkVBREVSX0dsb2JhbEludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSIpOwotICAgIFNBRkVfTUFMTE9DKCpwUmRyRGF0YUludGVyZmFjZSwgTTRSRUFERVJfRGF0YUludGVyZmFjZSwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSIpOwotCi0gICAgKnBNZWRpYVR5cGUgPSBNNFJFQURFUl9rTWVkaWFUeXBlM0dQUDsKLQotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX2NyZWF0ZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3REZXN0cm95ICAgICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9kZXN0cm95OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdE9wZW4gICAgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX29wZW47Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q2xvc2UgICAgICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfY2xvc2U7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0T3B0aW9uICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFNldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX3NldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0U3RyZWFtID0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dFN0cmVhbUhhbmRsZXI7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0RmlsbEF1U3RydWN0ID0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZmlsbEF1U3RydWN0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFN0YXJ0ICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RvcCAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RKdW1wICAgICAgICAgPSBWaWRlb0VkaXRvcjNncFJlYWRlcl9qdW1wOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFJlc2V0ICAgICAgICA9IFZpZGVvRWRpdG9yM2dwUmVhZGVyX3Jlc2V0OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEdldFByZXZSYXBUaW1lID0KLSAgICAgICAgVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0UHJldlJhcFRpbWU7Ci0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcEZjdEdldE5leHRBdSAgICAgID0gVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0TmV4dEF1OwotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3JlYWRlckNvbnRleHQgICAgICA9IE00T1NBX05VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3IzZ3BSZWFkZXJfZ2V0SW50ZXJmYWNlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgU0FGRV9GUkVFKCpwUmRyR2xvYmFsSW50ZXJmYWNlKTsKLSAgICAgICAgU0FGRV9GUkVFKCpwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yM2dwUmVhZGVyX2dldEludGVyZmFjZSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi19ICAvKiBleHRlcm4gIkMiICovCi0KLX0gIC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCi0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRGVjb2Rlci5jcHAgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTRjN2VhMS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBAZmlsZSAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEF1ZGlvIERlY29kZXIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZJREVPRURJVE9SX0FVRElPREVDT0RFUiIKLQotI2luY2x1ZGUgIk00T1NBX0RlYnVnLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclV0aWxzLmgiCi0jaW5jbHVkZSAiTTRNQ1NfSW50ZXJuYWxUeXBlcy5oIgotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgIERFRklOSVRJT05TICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLS8vIFZlcnNpb24KLSNkZWZpbmUgVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01BSk9SIDEKLSNkZWZpbmUgVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01JTk9SIDAKLSNkZWZpbmUgVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX1JFViAgIDAKLQotLy8gRm9yY2UgdXNpbmcgc29mdHdhcmUgZGVjb2RlciBhcyBlbmdpbmUgZG9lcyBub3Qgc3VwcG9ydCBwcmVmZXRjaAotI2RlZmluZSBWSURFT0VESVRPUl9GT1JDRUNPREVDIGtTb2Z0d2FyZUNvZGVjc09ubHkKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIHNwPFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlPiBDcmVhdGUoCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBmb3JtYXQsIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB+VmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UoKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGVudW0gU3RhdGUgewotICAgICAgICAgICAgQ1JFQVRFRCwKLSAgICAgICAgICAgIFNUQVJURUQsCi0gICAgICAgICAgICBFUlJPUgotICAgICAgICB9OwotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZShjb25zdCBzcDxNZXRhRGF0YT4mIGZvcm1hdCwKLSAgICAgICAgIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpOwotICAgICAgICBzcDxNZXRhRGF0YT4gbUZvcm1hdDsKLSAgICAgICAgVmVjdG9yPE1lZGlhQnVmZmVyKj4gbUJ1ZmZlcnM7Ci0gICAgICAgIE11dGV4IG1Mb2NrOyAgLy8gcHJvdGVjdHMgbUJ1ZmZlcnMKLSAgICAgICAgYm9vbCBtSXNFT1M7Ci0gICAgICAgIFN0YXRlIG1TdGF0ZTsKLSAgICAgICAgdm9pZCogbURlY1NoZWxsQ29udGV4dDsKLSAgICAgICAgLy8gRG9uJ3QgY2FsbCBtZS4KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UoY29uc3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UmKTsKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2UmIG9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlICYpOwotfTsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dAotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRleHQgb2YgdGhlIFN0YWdlRnJpZ2h0IGF1ZGlvIGRlY29kZXIKLSAqICAgICAgICAgICBzaGVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIE00QURfVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY29kZXJUeXBlOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogICAgICAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICBzcDxWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZT4gIG1EZWNvZGVyU291cmNlOwotICAgIE9NWENsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudDsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgICAgICAgIG1EZWNvZGVyOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5iT3V0cHV0Q2hhbm5lbHM7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmJJbnB1dEZyYW1lczsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYk91dHB1dEZyYW1lczsKLSAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICAqbV9wUmVhZGVyOwotICAgIE00X0FjY2Vzc1VuaXQqIG1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGU7Ci0gICAgTTRPU0FfRVJSIHJlYWRlckVyckNvZGU7Ci0gICAgaW50MzJfdCB0aW1lU3RhbXBNczsKLQotfSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0OwotCi1zcDxWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZT4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBmb3JtYXQsIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpIHsKLQotICAgIHNwPFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlPiBhU291cmNlID0KLSAgICAgICAgbmV3IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlKGZvcm1hdCwgZGVjb2RlclNoZWxsQ29udGV4dCk7Ci0KLSAgICByZXR1cm4gYVNvdXJjZTsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlKAotICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIGZvcm1hdCwgdm9pZCogZGVjb2RlclNoZWxsQ29udGV4dCk6Ci0gICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgICAgbUlzRU9TKGZhbHNlKSwKLSAgICAgICAgbVN0YXRlKENSRUFURUQpLAotICAgICAgICBtRGVjU2hlbGxDb250ZXh0KGRlY29kZXJTaGVsbENvbnRleHQpIHsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZSgpIHsKLQotICAgIGlmKCBTVEFSVEVEID09IG1TdGF0ZSApIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICptZXRhKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBpZiggQ1JFQVRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RhcnQ6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBTVEFSVEVEOwotCi1jbGVhblVwOgotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RhcnQgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3AoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RvcCBiZWdpbiIpOwotCi0gICAgaWYoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3A6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoIW1CdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgaW50IG4gPSBtQnVmZmVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICBtQnVmZmVycy5pdGVtQXQoaSktPnJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVygiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3AgOiAlZCBidWZmZXIgcmVtYWluZWQiLCBuKTsKLSAgICAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBDUkVBVEVEOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdG9wIEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXNwPE1ldGFEYXRhPiBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpnZXRGb3JtYXQiKTsKLSAgICByZXR1cm4gbUZvcm1hdDsKLX0KLQotc3RhdGljIE1lZGlhQnVmZmVyKiByZWFkQnVmZmVyRnJvbVJlYWRlcigKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY0NvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRfQWNjZXNzVW5pdCogcEFjY2Vzc1VuaXQgPSBwRGVjQ29udGV4dC0+bV9wTmV4dEFjY2Vzc1VuaXRUb0RlY29kZTsKLQotICAgIC8vIEdldCBuZXh0IEFVIGZyb20gcmVhZGVyLgotICAgIGxlcnIgPSBwRGVjQ29udGV4dC0+bV9wUmVhZGVyLT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICBwRGVjQ29udGV4dC0+bV9wUmVhZGVyLT5tX3JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAoTTRfU3RyZWFtSGFuZGxlciopcERlY0NvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIsCi0gICAgICAgICAgICAgICBwQWNjZXNzVW5pdCk7Ci0KLSAgICBpZiAobGVyciA9PSBNNFdBUl9OT19NT1JFX0FVKSB7Ci0gICAgICAgIEFMT0dWKCJyZWFkQnVmZmVyRnJvbVJlYWRlciA6IEVPUyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBwRGVjQ29udGV4dC0+dGltZVN0YW1wTXMgPSBwQWNjZXNzVW5pdC0+bV9DVFM7Ci0KLSAgICBNZWRpYUJ1ZmZlciogbmV3QnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKChzaXplX3QpcEFjY2Vzc1VuaXQtPm1fc2l6ZSk7Ci0gICAgbWVtY3B5KCh2b2lkICopKChNNE9TQV9JbnQ4KiluZXdCdWZmZXItPmRhdGEoKSArIG5ld0J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkpLAotICAgICAgICAodm9pZCAqKXBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzLCBwQWNjZXNzVW5pdC0+bV9zaXplKTsKLSAgICBuZXdCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgKHBBY2Nlc3NVbml0LT5tX0NUUyAqIDEwMDBMTCkpOwotICAgIHJldHVybiBuZXdCdWZmZXI7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpyZWFkKE1lZGlhQnVmZmVyICoqYnVmZmVyLAotICAgICAgICBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIHJlYWRPcHRpb25zOwotCi0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY0NvbnRleHQgPQotICAgICAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCAqKW1EZWNTaGVsbENvbnRleHQ7Ci0KLSAgICBpZiAoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnJlYWQgaW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSByZWFkZXIgaWYgd2UgZG9uJ3QgaGF2ZSBhbnkKLSAgICBpZihtQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBuZXdCdWZmZXIgPSByZWFkQnVmZmVyRnJvbVJlYWRlcihwRGVjQ29udGV4dCk7Ci0gICAgICAgIGlmICghbmV3QnVmZmVyKSB7Ci0gICAgICAgICAgICAqYnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHBEZWNDb250ZXh0LT5yZWFkZXJFcnJDb2RlID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0gICAgICAgIG1CdWZmZXJzLnB1c2gobmV3QnVmZmVyKTsKLSAgICB9Ci0gICAgKmJ1ZmZlciA9IG1CdWZmZXJzLml0ZW1BdCgwKTsKLSAgICBtQnVmZmVycy5yZW1vdmVBdCgwKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBWaWRlb0VkaXRvckF1ZGlvRGVjb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY0NvbnRleHQgPQotICAgICAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCAqKW1EZWNTaGVsbENvbnRleHQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyIGJlZ2luIik7Ci0KLSAgICAvLyBJZiB0aGUgdXNlciBkaWRuJ3QgZ2l2ZSB1cyBhIGJ1ZmZlciwgZ2V0IGl0IGZyb20gdGhlIHJlYWRlci4KLSAgICBpZihidWZmZXIgPT0gTlVMTCkgewotICAgICAgICBNZWRpYUJ1ZmZlciogbmV3QnVmZmVyID0gcmVhZEJ1ZmZlckZyb21SZWFkZXIocERlY0NvbnRleHQpOwotICAgICAgICBpZiAoIW5ld0J1ZmZlcikgewotICAgICAgICAgICAgcERlY0NvbnRleHQtPnJlYWRlckVyckNvZGUgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICBtQnVmZmVycy5wdXNoKGJ1ZmZlcik7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlciBFTkQiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgIFRPT0xTICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMoTTRPU0FfSW50OCogcERhdGEsCi0gICAgICAgIE00T1NBX1VJbnQzMiBkYXRhU2l6ZSwgTTRPU0FfVUludDggbmJCaXRzLCBNNE9TQV9JbnQzMiogcFJlc3VsdCwKLSAgICAgICAgTTRPU0FfVUludDMyKiBwT2Zmc2V0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNE9TQV9VSW50MzIgc3RhcnRCeXRlID0gMDsKLSAgICBNNE9TQV9VSW50MzIgc3RhcnRCaXQgPSAwOwotICAgIE00T1NBX1VJbnQzMiBlbmRCeXRlID0gMDsKLSAgICBNNE9TQV9VSW50MzIgZW5kQml0ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgY3VycmVudEJ5dGUgPSAwOwotICAgIE00T1NBX1VJbnQzMiByZXN1bHQgPSAwOwotICAgIE00T1NBX1VJbnQzMiB1aTMyVG1wID0gMDsKLSAgICBNNE9TQV9VSW50MzIgdWkzMk1hc2sgPSAwOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERhdGEsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwT2Zmc2V0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKDMyID49IG5iQml0cywgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygoKnBPZmZzZXQgKyBuYkJpdHMpIDw9IDgqZGF0YVNpemUsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0Qml0cyBiZWdpbiIpOwotCi0gICAgc3RhcnRCeXRlICAgPSAoKnBPZmZzZXQpID4+IDM7Ci0gICAgZW5kQnl0ZSAgICAgPSAoKnBPZmZzZXQgKyBuYkJpdHMpID4+IDM7Ci0gICAgc3RhcnRCaXQgICAgPSAoKnBPZmZzZXQpICUgODsKLSAgICBlbmRCaXQgICAgICA9ICgqcE9mZnNldCArIG5iQml0cykgJSA4OwotICAgIGN1cnJlbnRCeXRlID0gc3RhcnRCeXRlOwotCi0gICAgLy8gRXh0cmFjdCB0aGUgcmVxdWVzdGVkIG51bmJlciBvZiBiaXRzIGZyb20gbWVtb3J5Ci0gICAgd2hpbGUoIGN1cnJlbnRCeXRlIDw9IGVuZEJ5dGUpIHsKLSAgICAgICAgdWkzMk1hc2sgPSAweDAwMDAwMEZGOwotICAgICAgICBpZiggY3VycmVudEJ5dGUgPT0gc3RhcnRCeXRlICkgewotICAgICAgICAgICAgdWkzMk1hc2sgPj49IHN0YXJ0Qml0OwotICAgICAgICB9Ci0gICAgICAgIHVpMzJUbXAgPSB1aTMyTWFzayAmICgoTTRPU0FfVUludDMyKXBEYXRhW2N1cnJlbnRCeXRlXSk7Ci0gICAgICAgIGlmKCBjdXJyZW50Qnl0ZSA9PSBlbmRCeXRlICkgewotICAgICAgICAgICAgdWkzMlRtcCA+Pj0gKDgtZW5kQml0KTsKLSAgICAgICAgICAgIHJlc3VsdCA8PD0gZW5kQml0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0IDw8PSA4OwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCB8PSB1aTMyVG1wOwotICAgICAgICBjdXJyZW50Qnl0ZSsrOwotICAgIH0KLQotICAgICpwUmVzdWx0ID0gcmVzdWx0OwotICAgICpwT2Zmc2V0ICs9IG5iQml0czsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRCaXRzIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRCaXRzIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotI2RlZmluZSBGUkVRX1RBQkxFX1NJWkUgMTYKLWNvbnN0IE00T1NBX1VJbnQzMiBBRF9BQUNfRlJFUV9UQUJMRVtGUkVRX1RBQkxFX1NJWkVdID0KLSAgICB7OTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLAotICAgIDMyMDAwLCAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsIDczNTAsIDAsIDAsIDB9OwotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wYXJzZV9BQUNfRFNJKE00T1NBX0ludDgqIHBEU0ksCi0gICAgICAgIE00T1NBX1VJbnQzMiBkc2lTaXplLCBBQUNfREVDX1NUUkVBTV9QUk9QUyogcFByb3BlcnRpZXMpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiBvZmZzZXQgPSAwOwotICAgIE00T1NBX0ludDMyIHJlc3VsdCA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSSBiZWdpbiIpOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERTSSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBQcm9wZXJ0aWVzLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLy8gR2V0IHRoZSBvYmplY3QgdHlwZQotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMocERTSSwgZHNpU2l6ZSwgNSwgJnJlc3VsdCwgJm9mZnNldCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgc3dpdGNoKCByZXN1bHQgKSB7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIC8qIEF1ZGlvIE9iamVjdCBUeXBlIGlzIDIgKEFBQyBMb3cgQ29tcGxleGl0eSkgKi8KLSAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5hUFNQcmVzZW50ICA9IDA7Ci0gICAgICAgICAgICBwUHJvcGVydGllcy0+YVNCUlByZXNlbnQgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIC8qIEF1ZGlvIE9iamVjdCBUeXBlIGlzIDUgKFNwZWN0cmFsIEJhbmQgUmVwbGljYXRpb24pICovCi0gICAgICAgICAgICBwUHJvcGVydGllcy0+YVBTUHJlc2VudCAgPSAwOwotICAgICAgICAgICAgcFByb3BlcnRpZXMtPmFTQlJQcmVzZW50ID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgLyogQXVkaW8gT2JqZWN0IFR5cGUgaXMgMjkgKFBhcmFtZXRyaWMgU3RlcmVvKSAqLwotICAgICAgICAgICAgcFByb3BlcnRpZXMtPmFQU1ByZXNlbnQgID0gMTsKLSAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5hU0JSUHJlc2VudCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJwYXJzZV9BQUNfRFNJIEVSUk9SIDogb2JqZWN0IHR5cGUgJWQgaXMgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiaW52YWxpZCBBQUMgb2JqZWN0IHR5cGUiLCBNNEVSUl9CQURfT1BUSU9OX0lEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwUHJvcGVydGllcy0+YUF1ZGlvT2JqZWN0VHlwZSA9IChNNE9TQV9JbnQzMilyZXN1bHQ7Ci0KLSAgICAvLyBHZXQgdGhlIGZyZXF1ZW5jeSBpbmRleAotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEJpdHMocERTSSwgZHNpU2l6ZSwgNCwgJnJlc3VsdCwgJm9mZnNldCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soKDAgPD0gcmVzdWx0KSAmJiAoRlJFUV9UQUJMRV9TSVpFID4gcmVzdWx0KSwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwUHJvcGVydGllcy0+YVNhbXBGcmVxID0gQURfQUFDX0ZSRVFfVEFCTEVbcmVzdWx0XTsKLSAgICBwUHJvcGVydGllcy0+YUV4dGVuc2lvblNhbXBGcmVxID0gMDsKLQotICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0Qml0cyhwRFNJLCBkc2lTaXplLCA0LCAmcmVzdWx0LCAmb2Zmc2V0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICBwUHJvcGVydGllcy0+YU51bUNoYW4gPSAoTTRPU0FfVUludDMyKXJlc3VsdDsKLQotICAgIC8vIFNldCB0aGUgbWF4IFBDTSBzYW1wbGVzIHBlciBjaGFubmVsCi0gICAgcFByb3BlcnRpZXMtPmFNYXhQQ01TYW1wbGVzUGVyQ2ggPSAocFByb3BlcnRpZXMtPmFTQlJQcmVzZW50KSA/IDIwNDggOiAxMDI0OwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3BhcnNlX0FBQ19EU0kgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3BhcnNlX0FBQ19EU0kgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiBFTkdJTkUgSU5URVJGQUNFICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2Rlc3Ryb3koTTRBRF9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95IGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRGVjb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBTdG9wIHRoZSBncmFwaAotICAgIGlmKCBNNE9TQV9OVUxMICE9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXIuZ2V0KCkgKSB7Ci0gICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPnN0b3AoKTsKLSAgICB9Ci0KLSAgICAvLyBEZXN0cm95IHRoZSBncmFwaAotICAgIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXJTb3VyY2UuY2xlYXIoKTsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyLmNsZWFyKCk7Ci0gICAgcERlY29kZXJDb250ZXh0LT5tQ2xpZW50LmRpc2Nvbm5lY3QoKTsKLQotICAgIFNBRkVfRlJFRShwRGVjb2RlckNvbnRleHQpOwotICAgIHBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZGVzdHJveSA6IERPTkUiKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2Rlc3Ryb3kgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95IDogZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZShNNEFEX1R5cGUgZGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfQ29udGV4dCogcENvbnRleHQsIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXIsCi0gICAgICAgIHZvaWQqIHBVc2VyRGF0YSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgQUFDX0RFQ19TVFJFQU1fUFJPUFMgYWFjUHJvcGVydGllczsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLSAgICBzcDxNZXRhRGF0YT4gZGVjb2Rlck1ldGFEYXRhID0gTlVMTDsKLSAgICBjb25zdCBjaGFyKiBtaW1lID0gTlVMTDsKLSAgICB1aW50MzJfdCBjb2RlY0ZsYWdzID0gMDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgYmVnaW46IGRlY29kZXJUeXBlICVkIiwgZGVjb2RlclR5cGUpOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwU3RyZWFtSGFuZGxlciwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uCi0gICAgU0FGRV9NQUxMT0MocERlY29kZXJDb250ZXh0LCBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0LCAxLAotICAgICAgICAiQXVkaW9EZWNvZGVyIik7Ci0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBkZWNvZGVyVHlwZTsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIgPSBwU3RyZWFtSGFuZGxlcjsKLQotICAgIHBEZWNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgID0gMDsKLSAgICBwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcyA9IDA7Ci0gICAgcERlY29kZXJDb250ZXh0LT5yZWFkZXJFcnJDb2RlID0gTTROT19FUlJPUjsKLSAgICBwRGVjb2RlckNvbnRleHQtPnRpbWVTdGFtcE1zID0gLTE7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlIDogbWF4QVVTaXplICVkIiwKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2Jhc2ljUHJvcGVydGllcy5tX21heEFVU2l6ZSk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIG1ldGEgZGF0YSBmb3IgdGhlIGRlY29kZXIKLSAgICBkZWNvZGVyTWV0YURhdGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgc3dpdGNoKCBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyVHlwZSApIHsKLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQU1STkI6Ci0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COwotICAgICAgICAgICAgLy8gRW5naW5lIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggPSAxNjA7Ci0gICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZQotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID0gMjsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IDgwMDA7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa1R5cGVBTVJXQjoKLSAgICAgICAgICAgIC8vIFN0YWdlRnJpZ2h0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0I7Ci0KLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggPSAxNjA7Ci0gICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZQotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID0gMjsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IDE2MDAwOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQUFDOgotICAgICAgICAgICAgLy8gUmVqZWN0IEFEVFMgJiBBRElGIChvciBhbnkgaW5jb3JyZWN0IHR5cGUpCi0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNERBX1N0cmVhbVR5cGVBdWRpb0FhYyA9PQotICAgICAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fc3RyZWFtVHlwZSxNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwotCi0gICAgICAgICAgICBkZWNvZGVyTWV0YURhdGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMubV9wRVNEU0luZm8sCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLm1fRVNEU0luZm9TaXplKTsKLQotICAgICAgICAgICAgLy8gRW5naW5lIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIC8vIFJldHJpZXZlIHNhbXBsaW5nIGZyZXF1ZW5jeSBhbmQgbnVtYmVyIG9mIGNoYW5uZWxzIGZyb20gdGhlIERTSQotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcGFyc2VfQUFDX0RTSSgKLSAgICAgICAgICAgICAgICAoTTRPU0FfSW50OCopcFN0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLlwKLSAgICAgICAgICAgICAgICAgICAgbV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmYWFjUHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVGcmFtZUxlbmd0aCA9IDEwMjQ7Ci0gICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZQotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX2J5dGVTYW1wbGVTaXplID0gMjsKLSAgICAgICAgICAgIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9Ci0gICAgICAgICAgICAgICAgYWFjUHJvcGVydGllcy5hU2FtcEZyZXE7Ci0gICAgICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA9Ci0gICAgICAgICAgICAgICAgYWFjUHJvcGVydGllcy5hTnVtQ2hhbjsKLQotICAgICAgICAgICAgLy8gQ29weSB0aGUgc3RyZWFtIHByb3BlcnRpZXMgaW50byB1c2VyZGF0YQotICAgICAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcFVzZXJEYXRhICkgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmYWFjUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEFBQ19ERUNfU1RSRUFNX1BST1BTKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa1R5cGVNUDM6Ci0gICAgICAgICAgICAvLyBTdGFnZUZyaWdodCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBtaW1lID0gTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIkF1ZGlvRGVjb2Rlcl9vcGVuIDogaW5jb3JyZWN0IGlucHV0IGZvcm1hdCIsCi0gICAgICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlY29kZXJNZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOwotICAgIGRlY29kZXJNZXRhRGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsCi0gICAgICAgIChpbnQzMl90KXBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSk7Ci0gICAgZGVjb2Rlck1ldGFEYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LAotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyk7Ci0gICAgZGVjb2Rlck1ldGFEYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sCi0gICAgICAgIChpbnQ2NF90KXBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2R1cmF0aW9uKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgZGVjb2RlciBzb3VyY2UKLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyU291cmNlID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgZGVjb2Rlck1ldGFEYXRhLCAodm9pZCAqKXBEZWNvZGVyQ29udGV4dCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyU291cmNlLmdldCgpLAotICAgICAgICBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgcmVzdWx0ID0gcERlY29kZXJDb250ZXh0LT5tQ2xpZW50LmNvbm5lY3QoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgT01YIGNvZGVjCi0jaWZkZWYgVklERU9FRElUT1JfRk9SQ0VDT0RFQwotICAgIGNvZGVjRmxhZ3MgfD0gT01YQ29kZWM6OlZJREVPRURJVE9SX0ZPUkNFQ09ERUM7Ci0jZW5kaWYgLyogVklERU9FRElUT1JfRk9SQ0VDT0RFQyAqLwotCi0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUocERlY29kZXJDb250ZXh0LT5cCi0gICAgICAgIG1DbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgIGRlY29kZXJNZXRhRGF0YSwgZmFsc2UsIHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXJTb3VyY2UsIE5VTEwsCi0gICAgICAgICAgICBjb2RlY0ZsYWdzKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhOVUxMICE9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXIuZ2V0KCksIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIEdldCB0aGUgb3V0cHV0IGNoYW5uZWxzLCB0aGUgZGVjb2RlciBtaWdodCBvdmVyd3JpdGUgdGhlIGlucHV0IG1ldGFkYXRhCi0gICAgcERlY29kZXJDb250ZXh0LT5tRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LAotICAgICAgICAmcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyk7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSA6IG91dHB1dCBjaGFuICVkIiwKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyk7Ci0KLSAgICAvLyBTdGFydCB0aGUgZGVjb2RlcgotICAgIHJlc3VsdCA9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPnN0YXJ0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICAqcENvbnRleHQgPSBwRGVjb2RlckNvbnRleHQ7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSA6IERPTkUiKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9kZXN0cm95KHBEZWNvZGVyQ29udGV4dCk7Ci0gICAgICAgICpwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGVfQUFDKE00QURfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcFN0cmVhbUhhbmRsZXIsIHZvaWQqIHBVc2VyRGF0YSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZSgKLSAgICAgICAgTTRBRF9rVHlwZUFBQywgcENvbnRleHQsIHBTdHJlYW1IYW5kbGVyLHBVc2VyRGF0YSk7Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9BTVJOQihNNEFEX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyLCB2b2lkKiBwVXNlckRhdGEpIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUoCi0gICAgICAgIE00QURfa1R5cGVBTVJOQiwgcENvbnRleHQsIHBTdHJlYW1IYW5kbGVyLCBwVXNlckRhdGEpOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGVfQU1SV0IoTTRBRF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiBwU3RyZWFtSGFuZGxlciwgdm9pZCogcFVzZXJEYXRhKSB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlKAotICAgICAgICBNNEFEX2tUeXBlQU1SV0IsIHBDb250ZXh0LCBwU3RyZWFtSGFuZGxlciwgcFVzZXJEYXRhKTsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX01QMyhNNEFEX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICBNNF9BdWRpb1N0cmVhbUhhbmRsZXIqIHBTdHJlYW1IYW5kbGVyLCB2b2lkKiBwVXNlckRhdGEpIHsKLQotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9jcmVhdGUoCi0gICAgICAgIE00QURfa1R5cGVNUDMsIHBDb250ZXh0LCBwU3RyZWFtSGFuZGxlciwgcFVzZXJEYXRhKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlcigKLSAgICAgICAgTTRBRF9Db250ZXh0IHBDb250ZXh0LCBNNEFEX0J1ZmZlciogcElucHV0QnVmZmVyKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNZWRpYUJ1ZmZlciogYnVmZmVyID0gTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcElucHV0QnVmZmVyICkgewotICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoKHNpemVfdClwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKSgoTTRPU0FfSW50OCopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgICh2b2lkICopcElucHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzLCBwSW5wdXRCdWZmZXItPm1fYnVmZmVyU2l6ZSk7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBwSW5wdXRCdWZmZXItPm1fdGltZVN0YW1wVXMpOwotICAgIH0KLSAgICBwRGVjb2RlckNvbnRleHQtPm1EZWNvZGVyU291cmNlLT5zdG9yZUJ1ZmZlcihidWZmZXIpOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIoTTRBRF9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyLCBNNEFEX0J1ZmZlciogcE91cHV0QnVmZmVyKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBpbnQzMl90IGkzMlRtcCA9IDA7Ci0gICAgaW50NjRfdCBpNjRUbXAgPSAwOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IGJ1ZmZlciwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBPdXB1dEJ1ZmZlciwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBEZWNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIC8vIFByb2Nlc3MgdGhlIHJldHVybmVkIGRhdGEKLSAgICBpZiggMCA9PSBidWZmZXItPnJhbmdlX2xlbmd0aCgpICkgewotICAgICAgICAvLyBEZWNvZGVyIGhhcyBubyBkYXRhIHlldCwgbm90aGluZyB1bnVzdWFsCi0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0KLSAgICBwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcysrOwotCi0gICAgaWYoIHBEZWNvZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9uYkNoYW5uZWxzID09Ci0gICAgICAgIChNNE9TQV9VSW50MzIpcERlY29kZXJDb250ZXh0LT5tTmJPdXRwdXRDaGFubmVscyApIHsKLSAgICAgICAgLy8gSnVzdCBjb3B5IHRoZSBQQ01zCi0gICAgICAgIHBPdXB1dEJ1ZmZlci0+bV9idWZmZXJTaXplID0gKE00T1NBX1VJbnQzMilidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3VwdXRCdWZmZXItPm1fZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAodm9pZCAqKSgoKE00T1NBX01lbUFkZHI4KWJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIH0gZWxzZSBpZiggcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHMgPAotICAgICAgICAoTTRPU0FfVUludDMyKXBEZWNvZGVyQ29udGV4dC0+bU5iT3V0cHV0Q2hhbm5lbHMgKSB7Ci0gICAgICAgIC8vIFRoZSBkZWNvZGVyIGZvcmNlcyBzdGVyZW8gb3V0cHV0LCBkb3duc2FtcGxlCi0gICAgICAgIHBPdXB1dEJ1ZmZlci0+bV9idWZmZXJTaXplID0gKE00T1NBX1VJbnQzMikoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKS8yKTsKLSAgICAgICAgTTRPU0FfSW50MTYqIHBEYXRhSW4gID0gKChNNE9TQV9JbnQxNiopYnVmZmVyLT5kYXRhKCkpICsKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0gICAgICAgIE00T1NBX0ludDE2KiBwRGF0YU91dCA9IChNNE9TQV9JbnQxNiopcE91cHV0QnVmZmVyLT5tX2RhdGFBZGRyZXNzOwotICAgICAgICBNNE9TQV9JbnQxNiogcERhdGFFbmQgPSBwRGF0YUluICsgXAotICAgICAgICAgICAgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkvc2l6ZW9mKE00T1NBX0ludDE2KSk7Ci0gICAgICAgIHdoaWxlKCBwRGF0YUluIDwgcERhdGFFbmQgKSB7Ci0gICAgICAgICAgICAqcERhdGFPdXQgPSAqcERhdGFJbjsKLSAgICAgICAgICAgIHBEYXRhSW4rPTI7Ci0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhlIGRlY29kZXIgZm9yY2VzIG1vbm8gb3V0cHV0LCBub3Qgc3VwcG9ydGVkCi0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICAvLyBSZWxlYXNlIHRoZSBidWZmZXIKLSAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcE91cHV0QnVmZmVyLT5tX2J1ZmZlclNpemUgPSAwOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3N0ZXAoTTRBRF9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNEFEX0J1ZmZlciogcElucHV0QnVmZmVyLCBNNEFEX0J1ZmZlciogcE91dHB1dEJ1ZmZlciwKLSAgICAgICAgTTRPU0FfQm9vbCBiSnVtcCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqIHBEZWNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0gICAgTWVkaWFCdWZmZXIqIG91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcCBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIHBEZWNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLQotICAgIC8vIFB1c2ggdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgZGVjb2RlciBzb3VyY2UKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIocERlY29kZXJDb250ZXh0LAotICAgICAgICBwSW5wdXRCdWZmZXIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgLy8gUmVhZAotICAgIHJlc3VsdCA9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPnJlYWQoJm91dHB1dEJ1ZmZlciwgTlVMTCk7Ci0gICAgaWYgKElORk9fRk9STUFUX0NIQU5HRUQgPT0gcmVzdWx0KSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwOiBBdWRpbyBkZWNvZGVyIFwKLSAgICAgICAgIHJldHVybmVkIElORk9fRk9STUFUX0NIQU5HRUQiKTsKLSAgICAgICAgQ0hFQ0sob3V0cHV0QnVmZmVyID09IE5VTEwpOwotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IHBEZWNvZGVyQ29udGV4dC0+bURlY29kZXItPmdldEZvcm1hdCgpOwotICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudDsKLQotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmY2hhbm5lbENvdW50KSk7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwOiBzYW1wbGluZ0ZyZXEgPSAlZCIsIHNhbXBsZVJhdGUpOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcDogY2hhbm5lbENudCA9ICVkIiwgY2hhbm5lbENvdW50KTsKLSAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0KLSAgICAgICAgICh1aW50MzJfdClzYW1wbGVSYXRlOwotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyA9Ci0gICAgICAgICAodWludDMyX3QpY2hhbm5lbENvdW50OwotICAgICAgICBwRGVjb2RlckNvbnRleHQtPm1OYk91dHB1dENoYW5uZWxzID0gY2hhbm5lbENvdW50OwotCi0gICAgICAgIHJldHVybiBNNFdBUl9JTkZPX0ZPUk1BVF9DSEFOR0U7Ci0gICAgfSBlbHNlIGlmIChFUlJPUl9FTkRfT0ZfU1RSRUFNID09IHJlc3VsdCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcDogQXVkaW8gZGVjb2RlciBcCi0gICAgICAgICByZXR1cm5lZCBFUlJPUl9FTkRfT0ZfU1RSRUFNIik7Ci0gICAgICAgIHBEZWNvZGVyQ29udGV4dC0+cmVhZGVyRXJyQ29kZSA9IE00V0FSX05PX01PUkVfQVU7Ci0gICAgICAgIHJldHVybiBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0gZWxzZSBpZiAoT0sgIT0gcmVzdWx0KSB7Ci0gICAgICAgIHJldHVybiBNNEVSUl9TVEFURTsKLSAgICB9Ci0KLSAgICAvLyBDb252ZXJ0IHRoZSBQQ00gYnVmZmVyCi0gICAgZXJyID0gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcihwRGVjb2RlckNvbnRleHQsCi0gICAgICAgIG91dHB1dEJ1ZmZlciwgcE91dHB1dEJ1ZmZlcik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zdGVwIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcCBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbihNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbiBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBWZXJzaW9uSW5mbywgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciAgICAgID0gVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01BSk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9taW5vciAgICAgID0gVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX01JTk9SOwotICAgIHBWZXJzaW9uSW5mby0+bV9yZXZpc2lvbiAgID0gVklERU9FRElUT1JfQVVESU9fREVDT0RFUl9WRVJTSU9OX1JFVjsKLSAgICBwVmVyc2lvbkluZm8tPm1fc3RydWN0U2l6ZSA9IHNpemVvZihNNF9WZXJzaW9uSW5mbyk7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbiBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRWZXJzaW9uIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc2V0T3B0aW9uKE00QURfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9Db250ZXh0KiBwRGVjb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX3NldE9wdGlvbiBiZWdpbiAweCVYIiwgb3B0aW9uSUQpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcERlY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgc3dpdGNoKCBvcHRpb25JRCApIHsKLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDxNNE9TQV9VSW50MzI+KE00QURfa09wdGlvbklEX1VzZXJQYXJhbSk6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJzZXRPcHRpb24gVXNlclBhcmFtIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIGVyciA9IE00RVJSX05PVF9JTVBMRU1FTlRFRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRBRF9rT3B0aW9uSURfM2dwUmVhZGVySW50ZXJmYWNlOgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyc2V0T3B0aW9uIDNncFJlYWRlckludGVyZmFjZSIpOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tX3BSZWFkZXIgPQotICAgICAgICAgICAgIChNNFJFQURFUl9EYXRhSW50ZXJmYWNlICopb3B0aW9uVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEX0F1ZGlvQVU6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJzZXRPcHRpb24gQXVkaW9BVSIpOwotICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlID0KLSAgICAgICAgICAgICAoTTRfQWNjZXNzVW5pdCAqKW9wdGlvblZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24gIHVuc3VwcG9ydGVkIG9wdGlvbklkIDB4JVgiLAotICAgICAgICAgICAgICAgIG9wdGlvbklEKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9CQURfT1BUSU9OX0lEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICBpZiggKChNNE9TQV9VSW50MzIpTTROT19FUlJPUiA9PSBlcnIpIHx8ICgoTTRPU0FfVUludDMyKU00RVJSX05PVF9JTVBMRU1FTlRFRCA9PSBlcnIpICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc2V0T3B0aW9uIGVycm9yIDB4JVgiLCBlcnIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb24gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbihNNEFEX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00T1NBX1VJbnQzMiBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiBvcHRpb25WYWx1ZSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCogcERlY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRPcHRpb24gYmVnaW46IG9wdGlvbklEIDB4JVgiLCBvcHRpb25JRCk7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRGVjb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotCi0gICAgICAgIGNhc2UgTTRBRF9rT3B0aW9uSURfR2V0QXVkaW9BVUVyckNvZGU6Ci0gICAgICAgICAgICAqKHVpbnQzMl90ICopb3B0aW9uVmFsdWUgPSBwRGVjb2RlckNvbnRleHQtPnJlYWRlckVyckNvZGU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEX0F1ZGlvTmJDaGFubmVsczoKLSAgICAgICAgICAgICoodWludDMyX3QgKilvcHRpb25WYWx1ZSA9Ci0gICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX25iQ2hhbm5lbHM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE00QURfa09wdGlvbklEX0F1ZGlvU2FtcEZyZXF1ZW5jeToKLSAgICAgICAgICAgICoodWludDMyX3QgKilvcHRpb25WYWx1ZSA9Ci0gICAgICAgICAgICAgcERlY29kZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNNEFEX2tPcHRpb25JRF9BdUNUUzoKLSAgICAgICAgICAgICoodWludDMyX3QgKilvcHRpb25WYWx1ZSA9IHBEZWNvZGVyQ29udGV4dC0+dGltZVN0YW1wTXM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbiB1bnN1cHBvcnRlZCBvcHRpb25JZCAweCVYIiwKLSAgICAgICAgICAgICAgICBvcHRpb25JRCk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfQkFEX09QVElPTl9JRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0T3B0aW9uIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbiBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldE9wdGlvbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlKE00QURfVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERlY29kZXJUeXBlLCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERlY29kZXJJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlIGJlZ2luICVkIDB4JXggMHgleCIsCi0gICAgICAgIGRlY29kZXJUeXBlLCBwRGVjb2RlclR5cGUsIHBEZWNvZGVySW50ZXJmYWNlKTsKLQotICAgIFNBRkVfTUFMTE9DKCpwRGVjb2RlckludGVyZmFjZSwgTTRBRF9JbnRlcmZhY2UsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvckF1ZGlvRGVjb2RlciIpOwotCi0gICAgKnBEZWNvZGVyVHlwZSA9IGRlY29kZXJUeXBlOwotCi0gICAgc3dpdGNoKCBkZWNvZGVyVHlwZSApIHsKLSAgICAgICAgY2FzZSBNNEFEX2tUeXBlQU1STkI6Ci0gICAgICAgICAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgPQotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9BTVJOQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00QURfa1R5cGVBTVJXQjoKLSAgICAgICAgICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyA9Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX0FNUldCOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRBRF9rVHlwZUFBQzoKLSAgICAgICAgICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RDcmVhdGVBdWRpb0RlYyA9Ci0gICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfY3JlYXRlX0FBQzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00QURfa1R5cGVNUDM6Ci0gICAgICAgICAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0Q3JlYXRlQXVkaW9EZWMgPQotICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2NyZWF0ZV9NUDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWRUFEX2dldEludGVyZmFjZSBFUlJPUjogdW5zdXBwb3J0ZWQgdHlwZSAlZCIsIGRlY29kZXJUeXBlKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdERlc3Ryb3lBdWRpb0RlYyAgID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZGVzdHJveTsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0UmVzZXRBdWRpb0RlYyAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcERlY29kZXJJbnRlcmZhY2UpLT5tX3BGY3RTdGFydEF1ZGlvRGVjICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdFN0ZXBBdWRpb0RlYyAgICAgID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfc3RlcDsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0R2V0VmVyc2lvbkF1ZGlvRGVjID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0VmVyc2lvbjsKLSAgICAoKnBEZWNvZGVySW50ZXJmYWNlKS0+bV9wRmN0U2V0T3B0aW9uQXVkaW9EZWMgPQotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9zZXRPcHRpb247Ci0gICAgKCpwRGVjb2RlckludGVyZmFjZSktPm1fcEZjdEdldE9wdGlvbkF1ZGlvRGVjID0KLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0T3B0aW9uOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpwRGVjb2RlckludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotCi1leHRlcm4gIkMiIHsKLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZV9BQUMoTTRBRF9UeXBlKiBwRGVjb2RlclR5cGUsCi0gICAgICAgIE00QURfSW50ZXJmYWNlKiogcERlY29kZXJJbnRlcmZhY2UpIHsKLSAgICBBTE9HVigiVEVTVDogQUFDIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIHJldHVybiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00QURfa1R5cGVBQUMsIHBEZWNvZGVyVHlwZSwgcERlY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUk5CKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0gICAgQUxPR1YoIlRFU1Q6IEFNUiBWaWRlb0VkaXRvckF1ZGlvRGVjb2Rlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEFEX2tUeXBlQU1STkIsIHBEZWNvZGVyVHlwZSwgcERlY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX0FNUldCKE00QURfVHlwZSogcERlY29kZXJUeXBlLAotICAgICAgICBNNEFEX0ludGVyZmFjZSoqIHBEZWNvZGVySW50ZXJmYWNlKSB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEFEX2tUeXBlQU1SV0IsIHBEZWNvZGVyVHlwZSwgcERlY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0RlY29kZXJfZ2V0SW50ZXJmYWNlX01QMyhNNEFEX1R5cGUqIHBEZWNvZGVyVHlwZSwKLSAgICAgICAgTTRBRF9JbnRlcmZhY2UqKiBwRGVjb2RlckludGVyZmFjZSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9EZWNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRBRF9rVHlwZU1QMywgcERlY29kZXJUeXBlLCBwRGVjb2RlckludGVyZmFjZSk7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5MWYzZWUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlci5jcHAKLSogQGJyaWVmICBTdGFnZUZyaWdodCBzaGVsbCBBdWRpbyBFbmNvZGVyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0jZGVmaW5lIExPR19OREVCVUcgMQotI2RlZmluZSBMT0dfVEFHICJWSURFT0VESVRPUl9BVURJT0VOQ09ERVIiCi0KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyLmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotCi0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLQotLyoqKiBERUZJTklUSU9OUyAqKiovCi0vLyBGb3JjZSB1c2luZyBzb2Z0d2FyZSBlbmNvZGVyIGFzIGVuZ2luZSBkb2VzIG5vdCBzdXBwb3J0IHByZWZldGNoCi0jZGVmaW5lIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMga1NvZnR3YXJlQ29kZWNzT25seQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1zdHJ1Y3QgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIHNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBDcmVhdGUoCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBpbnQzMl90IHN0b3JlQnVmZmVyKE1lZGlhQnVmZmVyICpidWZmZXIpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIH5WaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3RydWN0IE1lZGlhQnVmZmVyQ2hhaW4gewotICAgICAgICAgICAgTWVkaWFCdWZmZXIqIGJ1ZmZlcjsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG5leHRMaW5rOwotICAgICAgICB9OwotICAgICAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgICAgIENSRUFURUQsCi0gICAgICAgICAgICBTVEFSVEVELAotICAgICAgICAgICAgRVJST1IKLSAgICAgICAgfTsKLQotICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBtRmlyc3RCdWZmZXJMaW5rOwotICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBtTGFzdEJ1ZmZlckxpbms7Ci0gICAgICAgIGludDMyX3QgbU5iQnVmZmVyOwotICAgICAgICBTdGF0ZSBtU3RhdGU7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtRW5jRm9ybWF0OwotCi0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KTsKLQotICAgICAgICAvLyBEb24ndCBjYWxsIG1lLgotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZShjb25zdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSYpOwotICAgICAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSYgb3BlcmF0b3I9KAotICAgICAgICAgICAgY29uc3QgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2UmKTsKLX07Ci0KLXNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKAotICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KSB7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OkNyZWF0ZSIpOwotICAgIHNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBhU291cmNlID0KLSAgICAgICAgbmV3IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKGZvcm1hdCk7Ci0KLSAgICByZXR1cm4gYVNvdXJjZTsKLX0KLQotVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlKAotICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KToKLSAgICAgICAgbUZpcnN0QnVmZmVyTGluayhOVUxMKSwKLSAgICAgICAgbUxhc3RCdWZmZXJMaW5rKE5VTEwpLAotICAgICAgICBtTmJCdWZmZXIoMCksCi0gICAgICAgIG1TdGF0ZShDUkVBVEVEKSwKLSAgICAgICAgbUVuY0Zvcm1hdChmb3JtYXQpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlIik7Ci19Ci0KLQotVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSgpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZSIpOwotCi0gICAgaWYoIFNUQVJURUQgPT0gbVN0YXRlICkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKm1ldGEpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RhcnQiKTsKLQotICAgIGlmKCBDUkVBVEVEICE9IG1TdGF0ZSApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdGFydCBFUlJPUiA6IGludmFsaWQgc3RhdGUgJWQiLAotICAgICAgICAgICAgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gU1RBUlRFRDsKLQotY2xlYW5VcDoKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0YXJ0IEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9wKCkgewotICAgIHN0YXR1c190IGVyciA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9wIik7Ci0KLSAgICBpZiggU1RBUlRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RvcCBFUlJPUjogaW52YWxpZCBzdGF0ZSAlZCIsCi0gICAgICAgICAgICBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGkgPSAwOwotICAgIE1lZGlhQnVmZmVyQ2hhaW4qIHRtcExpbmsgPSBOVUxMOwotICAgIHdoaWxlKCBtRmlyc3RCdWZmZXJMaW5rICkgewotICAgICAgICBpKys7Ci0gICAgICAgIHRtcExpbmsgPSBtRmlyc3RCdWZmZXJMaW5rOwotICAgICAgICBtRmlyc3RCdWZmZXJMaW5rID0gbUZpcnN0QnVmZmVyTGluay0+bmV4dExpbms7Ci0gICAgICAgIGRlbGV0ZSB0bXBMaW5rOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0b3AgOiAlZCBidWZmZXIgcmVtYWluZWQiLCBpKTsKLSAgICBtRmlyc3RCdWZmZXJMaW5rID0gTlVMTDsKLSAgICBtTGFzdEJ1ZmZlckxpbmsgPSBOVUxMOwotCi0gICAgbVN0YXRlID0gQ1JFQVRFRDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6c3RvcCBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zcDxNZXRhRGF0YT4gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OmdldEZvcm1hdCIpOwotICAgIHJldHVybiBtRW5jRm9ybWF0OwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgcmVhZE9wdGlvbnM7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgTWVkaWFCdWZmZXJDaGFpbiogdG1wTGluayA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnJlYWQiKTsKLQotICAgIGlmICggU1RBUlRFRCAhPSBtU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZCBFUlJPUiA6IGludmFsaWQgc3RhdGUgJWQiLAotICAgICAgICAgICAgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgaWYoIE5VTEwgPT0gbUZpcnN0QnVmZmVyTGluayApIHsKLSAgICAgICAgKmJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZCA6IEVPUyIpOwotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0gICAgKmJ1ZmZlciA9IG1GaXJzdEJ1ZmZlckxpbmstPmJ1ZmZlcjsKLQotICAgIHRtcExpbmsgPSBtRmlyc3RCdWZmZXJMaW5rOwotICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBtRmlyc3RCdWZmZXJMaW5rLT5uZXh0TGluazsKLSAgICBpZiggTlVMTCA9PSBtRmlyc3RCdWZmZXJMaW5rICkgewotICAgICAgICBtTGFzdEJ1ZmZlckxpbmsgPSBOVUxMOwotICAgIH0KLSAgICBkZWxldGUgdG1wTGluazsKLSAgICBtTmJCdWZmZXItLTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6cmVhZCBFTkQgKDB4JXgpIiwgZXJyKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQzMl90IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyIik7Ci0KLSAgICBNZWRpYUJ1ZmZlckNoYWluKiBuZXdMaW5rID0gbmV3IE1lZGlhQnVmZmVyQ2hhaW47Ci0gICAgbmV3TGluay0+YnVmZmVyID0gYnVmZmVyOwotICAgIG5ld0xpbmstPm5leHRMaW5rID0gTlVMTDsKLSAgICBpZiggTlVMTCAhPSBtTGFzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgIG1MYXN0QnVmZmVyTGluay0+bmV4dExpbmsgPSBuZXdMaW5rOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlckxpbmsgPSBuZXdMaW5rOwotICAgIH0KLSAgICBtTGFzdEJ1ZmZlckxpbmsgPSBuZXdMaW5rOwotICAgIG1OYkJ1ZmZlcisrOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlciBFTkQiKTsKLSAgICByZXR1cm4gbU5iQnVmZmVyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UgKgotICoqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBzdHJ1Y3R1cmUgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dAotICogQGJyaWVmICAgIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGNvbnRleHQgb2YgdGhlIFN0YWdlRnJpZ2h0IGF1ZGlvCi0gKiAgICAgICAgICAgZW5jb2RlciBzaGVsbAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQgICAgICAgICAgICAgbUZvcm1hdDsKLSAgICBNNEVOQ09ERVJfQXVkaW9QYXJhbXMqICAgICAgICAgICAgbUNvZGVjUGFyYW1zOwotICAgIE00RU5DT0RFUl9BdWRpb0RlY1NwZWNpZmljSW5mbyAgICBtRFNJOwotICAgIHNwPFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyU291cmNlPiBtRW5jb2RlclNvdXJjZTsKLSAgICBPTVhDbGllbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudDsKLSAgICBzcDxNZWRpYVNvdXJjZT4gICAgICAgICAgICAgICAgICAgbUVuY29kZXI7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYklucHV0RnJhbWVzOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTmJPdXRwdXRGcmFtZXM7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdE91dHB1dEN0czsKLSAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RPdXRwdXRDdHM7Ci19IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQ7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbGVhbnVwKE00T1NBX0NvbnRleHQgcENvbnRleHQpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xlYW51cCBiZWdpbiIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dC0+bURTSS5wSW5mbyk7Ci0gICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dCk7Ci0gICAgcENvbnRleHQgPSBNNE9TQV9OVUxMOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xlYW51cCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgTTRPU0FfQ29udGV4dCogcENvbnRleHQsIE00T1NBX1ZvaWQqIHBVc2VyRGF0YSkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdCBiZWdpbjogZm9ybWF0ICVkIiwgZm9ybWF0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgU0FGRV9NQUxMT0MocEVuY29kZXJDb250ZXh0LCBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0LCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXIiKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICAqcENvbnRleHQgPSBwRW5jb2RlckNvbnRleHQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2NsZWFudXAocEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X0FBQyhNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tBQUMsIHBDb250ZXh0LCBwVXNlckRhdGEpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdF9BTVJOQihNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tBTVJOQiwgcENvbnRleHQsIHBVc2VyRGF0YSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X01QMyhNNE9TQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcFVzZXJEYXRhKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX2tNUDMsIHBDb250ZXh0LCBwVXNlckRhdGEpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2UoTTRPU0FfQ29udGV4dCBwQ29udGV4dCkgewotCi0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbG9zZSBiZWdpbiIpOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMpOwotCi0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+c3RvcCgpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIuY2xlYXIoKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1DbGllbnQuZGlzY29ubmVjdCgpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UuY2xlYXIoKTsKLQotICAgIEFMT0dWKCJBdWRpb0VuY29kZXJfY2xvc2U6SU4gJWQgZnJhbWVzLE9VVCAlZCBmcmFtZXMgZnJvbSAlbGxkIHRvICVsbGQiLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcywgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMsCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMpOwotCi0gICAgaWYoIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgIT0gcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlOnNvbWUgZnJhbWVzIHdlcmUgbm90IGVuY29kZWQgJWQgJWQiLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcywgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyk7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2UgYmVnaW4gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4oTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvUGFyYW1zICpwUGFyYW1zLCBNNEVOQ09ERVJfQXVkaW9EZWNTcGVjaWZpY0luZm8gKnBEU0ksCi0gICAgICAgIE00T1NBX0NvbnRleHQgcEdyYWJiZXJDb250ZXh0KSB7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIHNwPE1ldGFEYXRhPiBlbmNvZGVyTWV0YWRhdGEgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBOVUxMOwotICAgIGludDMyX3QgaU5iQ2hhbm5lbCA9IDA7Ci0gICAgdWludDMyX3QgY29kZWNGbGFncyA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbiBiZWdpbiIpOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBQYXJhbXMsICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcERTSSwgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgcERTSS0+cEluZm8gPSBNNE9TQV9OVUxMOwotICAgIHBEU0ktPmluZm9TaXplID0gMDsKLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgID0gMDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcyA9IDA7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgPSAtMTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0T3V0cHV0Q3RzICA9IC0xOwotCi0gICAgLy8gQWxsb2NhdGUgJiBpbml0aWFsaXplIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4gOiBwYXJhbXMgRj0lZCBDTj0lZCBCUj0lZCBGPSVkIiwKLSAgICAgICAgcFBhcmFtcy0+RnJlcXVlbmN5LCBwUGFyYW1zLT5DaGFubmVsTnVtLCBwUGFyYW1zLT5CaXRyYXRlLAotICAgICAgICBwUGFyYW1zLT5Gb3JtYXQpOwotICAgIFNBRkVfTUFMTE9DKHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLCBNNEVOQ09ERVJfQXVkaW9QYXJhbXMsIDEsCi0gICAgICAgICJWSURFT0VESVRPUiBDb2RlY1BhcmFtcyIpOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmVxdWVuY3kgID0gcFBhcmFtcy0+RnJlcXVlbmN5OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5DaGFubmVsTnVtID0gcFBhcmFtcy0+Q2hhbm5lbE51bTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Qml0cmF0ZSAgICA9IHBQYXJhbXMtPkJpdHJhdGU7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCAgICAgPSBwUGFyYW1zLT5Gb3JtYXQ7Ci0KLSAgICAvLyBDaGVjayBvdXRwdXQgZm9ybWF0IGNvbnNpc3RlbmN5Ci0gICAgVklERU9FRElUT1JfQ0hFQ0socEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZvcm1hdCA9PQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFnZUZyaWdodCBncmFwaCBidWlsZGluZwotICAgICAqLwotICAgIC8vIENyZWF0ZSB0aGUgbWV0YSBkYXRhIGZvciB0aGUgZW5jb2RlcgotICAgIGVuY29kZXJNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBQUM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE00RU5DT0RFUl9rQU1STkI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIkF1ZGlvRW5jb2Rlcl9vcGVuIDogaW5jb3JyZWN0IGlucHV0IGZvcm1hdCIsCi0gICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwKLSAgICAgICAgKGludDMyX3QpcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyZXF1ZW5jeSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwKLSAgICAgICAgKGludDMyX3QpcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkJpdHJhdGUpOwotCi0gICAgc3dpdGNoKCBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Q2hhbm5lbE51bSApIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01vbm86Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlOYkNoYW5uZWwgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa1N0ZXJlbzoKLSAgICAgICAgewotICAgICAgICAgICAgaU5iQ2hhbm5lbCA9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIkF1ZGlvRW5jb2Rlcl9vcGVuIDogaW5jb3JyZWN0IGNoYW5uZWwgbnVtYmVyIiwKLSAgICAgICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGlOYkNoYW5uZWwpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBlbmNvZGVyIHNvdXJjZQotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2RlclNvdXJjZTo6Q3JlYXRlKAotICAgICAgICBlbmNvZGVyTWV0YWRhdGEpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZS5nZXQoKSwKLSAgICAgICAgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gQ29ubmVjdCB0byB0aGUgT01YIGNsaWVudAotICAgIHJlc3VsdCA9IHBFbmNvZGVyQ29udGV4dC0+bUNsaWVudC5jb25uZWN0KCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIE9NWCBjb2RlYwotI2lmZGVmIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMKLSAgICBjb2RlY0ZsYWdzIHw9IE9NWENvZGVjOjpWSURFT0VESVRPUl9GT1JDRUNPREVDOwotI2VuZGlmIC8qIFZJREVPRURJVE9SX0ZPUkNFQ09ERUMgKi8KLSAgICAvLyBGSVhNRToKLSAgICAvLyBXZSBhcmUgbW92aW5nIGF3YXkgdG8gdXNlIHNvZnR3YXJlIEFBQ0VuY29kZXIgYW5kIGluc3RlYWQgdXNlIE9NWC1iYXNlZAotICAgIC8vIHNvZnR3YXJlIEFBQyBhdWRpbyBlbmNvZGVyLiBXZSB3YW50IHRvIHVzZSBBQUNFbmNvZGVyIGZvciBub3cuIEFmdGVyIHdlCi0gICAgLy8gZml4IHRoZSBpbnRlcmZhY2UgaXNzdWUgd2l0aCB0aGUgT01YLWJhc2VkIEFBQyBhdWRpbyBlbmNvZGVyLCB3ZSBzaG91bGQKLSAgICAvLyB0aGVuIHNldCB0aGUgY29tcG9uZW50IG5hbWUgYmFjayB0byBOVUxMIHRvIGFsbG93IHRoZSBzeXN0ZW0gdG8gcGljayB1cAotICAgIC8vIHRoZSByaWdodCBBQUMgYXVkaW8gZW5jb2Rlci4KLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNsaWVudC5pbnRlcmZhY2UoKSwgZW5jb2Rlck1ldGFkYXRhLCB0cnVlLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZSwgIkFBQ0VuY29kZXIiIC8qIGNvbXBvbmVudCBuYW1lICovLAotICAgICAgICAgICAgY29kZWNGbGFncyk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLmdldCgpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBTdGFydCB0aGUgZ3JhcGgKLSAgICByZXN1bHQgPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLT5zdGFydCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gR2V0IEFBQyBEU0ksIHRoaXMgY29kZSBjYW4gb25seSB3b3JrIHdpdGggc29mdHdhcmUgZW5jb2RlcgotICAgIGlmKCBNNEVOQ09ERVJfa0FBQyA9PSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ICkgewotICAgICAgICBpbnQzMl90ICAgICAgaXNDb2RlY0NvbmZpZyA9IDA7Ci0gICAgICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgICAgICAgID0gTlVMTDsKLQotICAgICAgICAvLyBSZWFkIG9uY2UgdG8gZ2V0IHRoZSBEU0kKLSAgICAgICAgcmVzdWx0ID0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+cmVhZCgmYnVmZmVyLCBOVUxMKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywKLSAgICAgICAgICAgICZpc0NvZGVjQ29uZmlnKSAmJiBpc0NvZGVjQ29uZmlnLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAgICAgLy8gU2F2ZSB0aGUgRFNJCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bURTSS5pbmZvU2l6ZSA9IChNNE9TQV9VSW50MzIpYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgU0FGRV9NQUxMT0MocEVuY29kZXJDb250ZXh0LT5tRFNJLnBJbmZvLCBNNE9TQV9JbnQ4LAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRFNJLmluZm9TaXplLCAiRW5jb2RlciBoZWFkZXIiKTsKLQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwRW5jb2RlckNvbnRleHQtPm1EU0kucEluZm8sCi0gICAgICAgICAgICAodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpKGJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bURTSS5pbmZvU2l6ZSk7Ci0KLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICpwRFNJID0gcEVuY29kZXJDb250ZXh0LT5tRFNJOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbiA6IERPTkUiKTsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9vcGVuIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfY2xvc2UocEVuY29kZXJDb250ZXh0KTsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX29wZW4gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9vcGVuIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIoTTRPU0FfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvQnVmZmVyKiBwSW5CdWZmZXIpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfSW50OCogcERhdGEgPSBNNE9TQV9OVUxMOwotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgPSBOVUxMOwotICAgIGludDMyX3QgbmJCdWZmZXIgPSAwOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBiZWdpbiIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5DaGFubmVsTnVtICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rTW9ubzoKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa1N0ZXJlbzoKLSAgICAgICAgICAgIC8vIExldCB0aGUgTWVkaWFCdWZmZXIgb3duIHRoZSBkYXRhIHNvIHdlIGRvbid0IGhhdmUgdG8gZnJlZSBpdAotICAgICAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKChzaXplX3QpcEluQnVmZmVyLT5wVGFibGVCdWZmZXJTaXplWzBdKTsKLSAgICAgICAgICAgIHBEYXRhID0gKE00T1NBX0ludDgqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBEYXRhLCAodm9pZCAqKXBJbkJ1ZmZlci0+cFRhYmxlQnVmZmVyWzBdLAotICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+cFRhYmxlQnVmZmVyU2l6ZVswXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWRUFFX3Byb2Nlc3NJbnB1dEJ1ZmZlciB1bnN1cHBvcnRlZCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gJWQiLAotICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5DaGFubmVsTnVtKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX0ZBTFNFLCBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciA6IHN0b3JlICVkIGJ5dGVzIiwKLSAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgLy8gUHVzaCB0aGUgYnVmZmVyIHRvIHRoZSBzb3VyY2UKLSAgICBuYkJ1ZmZlciA9IHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXJTb3VyY2UtPnN0b3JlQnVmZmVyKGJ1ZmZlcik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYoIE5VTEwgIT0gYnVmZmVyICkgewotICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNZWRpYUJ1ZmZlciogYnVmZmVyLCBNNEVOQ09ERVJfQXVkaW9CdWZmZXIqIHBPdXRCdWZmZXIpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRPU0FfVUludDMyIEN0cyA9IDA7Ci0gICAgaW50MzJfdCBpMzJUbXAgPSAwOwotICAgIGludDY0X3QgaTY0VG1wID0gMDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIGJlZ2luIik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gYnVmZmVyLCAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBPdXRCdWZmZXIsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBQcm9jZXNzIHRoZSByZXR1cm5lZCBBVQotICAgIGlmKCAwID09IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKSB7Ci0gICAgICAgIC8vIEVuY29kZXIgaGFzIG5vIGRhdGEgeWV0LCBub3RoaW5nIHVudXN1YWwKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgOiBidWZmZXIgaXMgZW1wdHkiKTsKLSAgICAgICAgcE91dEJ1ZmZlci0+cFRhYmxlQnVmZmVyU2l6ZVswXSA9IDA7Ci0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0gICAgaWYoIGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgJmkzMlRtcCkgJiYgaTMyVG1wICkgewotICAgICAgICAvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHdpdGggc29mdHdhcmUgZW5jb2RlciwKLSAgICAgICAgICogRFNJIHdhcyByZXRyaWV2ZWQgYmVmb3JlaGFuZCAqLwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfU1RBVEUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENoZWNrIHRoZSBDVFMKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmaTY0VG1wKSwKLSAgICAgICAgICAgIE00RVJSX1NUQVRFKTsKLSAgICAgICAgQ3RzID0gKE00T1NBX0ludDMyKShpNjRUbXAvMTAwMCk7Ci0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMrKzsKLSAgICAgICAgaWYoIDAgPiBwRW5jb2RlckNvbnRleHQtPm1GaXJzdE91dHB1dEN0cyApIHsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzID0gaTY0VG1wOwotICAgICAgICB9Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RPdXRwdXRDdHMgPSBpNjRUbXA7Ci0KLSAgICAgICAgLy8gRm9ybWF0IHRoZSBBVQotICAgICAgICBtZW1jcHkoKHZvaWQgKilwT3V0QnVmZmVyLT5wVGFibGVCdWZmZXJbMF0sCi0gICAgICAgICAgICAodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpKGJ1ZmZlci0+ZGF0YSgpKStidWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICBwT3V0QnVmZmVyLT5wVGFibGVCdWZmZXJTaXplWzBdID0gKE00T1NBX1VJbnQzMilidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgIH0KLQotY2xlYW5VcDoKLSAgICAvLyBSZWxlYXNlIHRoZSBidWZmZXIKLSAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9zdGVwKE00T1NBX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0J1ZmZlciogcEluQnVmZmVyLCBNNEVOQ09ERVJfQXVkaW9CdWZmZXIqIHBPdXRCdWZmZXIpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgPSBOVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXAgYmVnaW4iKTsKLQotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBJbkJ1ZmZlciwgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwT3V0QnVmZmVyLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMrKzsKLQotICAgIC8vIFB1c2ggdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgZW5jb2RlciBzb3VyY2UKLSAgICBlcnIgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIocEVuY29kZXJDb250ZXh0LHBJbkJ1ZmZlcik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAvLyBSZWFkCi0gICAgcmVzdWx0ID0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+cmVhZCgmYnVmZmVyLCBOVUxMKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIFByb3ZpZGUgdGhlIGVuY29kZWQgQVUgdG8gdGhlIHdyaXRlcgotICAgIGVyciA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIocEVuY29kZXJDb250ZXh0LCBidWZmZXIsCi0gICAgICAgIHBPdXRCdWZmZXIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXAgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfc3RlcCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX3N0ZXAgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbihNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JRCwgTTRPU0FfRGF0YU9wdGlvbiogb3B0aW9uVmFsdWUpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbiBiZWdpbiBvcHRpb25JRCAweCVYIiwgb3B0aW9uSUQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBzd2l0Y2goIG9wdGlvbklEICkgewotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbjogdW5zdXBwb3J0ZWQgb3B0aW9uSWQgMHglWCIsCi0gICAgICAgICAgICAgICAgb3B0aW9uSUQpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfRkFMU0UsIE00RVJSX0JBRF9PUFRJT05fSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbiBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRPcHRpb24gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRPcHRpb24gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0IGZvcm1hdCwgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcEZvcm1hdCwgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwRW5jb2RlckludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2UgMHgleCAweCV4IixwRm9ybWF0LAotICAgICAgICBwRW5jb2RlckludGVyZmFjZSk7Ci0gICAgU0FGRV9NQUxMT0MoKnBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UsIDEsCi0gICAgICAgICJBdWRpb0VuY29kZXIiKTsKLQotICAgICpwRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgc3dpdGNoKCBmb3JtYXQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tBQUM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0SW5pdCA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2luaXRfQUFDOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa0FNUk5COgotICAgICAgICB7Ci0gICAgICAgICAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEluaXQgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9pbml0X0FNUk5COwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QMzoKLSAgICAgICAgewotICAgICAgICAgICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RJbml0ID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfaW5pdF9NUDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlOiB1bnN1cHBvcnRlZCBmb3JtYXQgJWQiLAotICAgICAgICAgICAgICAgIGZvcm1hdCk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RDbGVhblVwICAgICAgPSBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9jbGVhbnVwOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0T3BlbiAgICAgICAgID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfb3BlbjsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdENsb3NlICAgICAgICA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2Nsb3NlOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0U3RlcCAgICAgICAgID0gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfc3RlcDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdEdldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldE9wdGlvbjsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICAqcEVuY29kZXJJbnRlcmZhY2UgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotZXh0ZXJuICJDIiB7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfQUFDKAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9BdWRpb0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRFTkNPREVSX2tBQUMsIHBGb3JtYXQsIHBFbmNvZGVySW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZV9BTVJOQigKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSkgewotCi0gICAgcmV0dXJuIFZpZGVvRWRpdG9yQXVkaW9FbmNvZGVyX2dldEludGVyZmFjZSgKLSAgICAgICAgTTRFTkNPREVSX2tBTVJOQiwgcEZvcm1hdCwgcEVuY29kZXJJbnRlcmZhY2UpOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlX01QMygKLSAgICAgICAgTTRFTkNPREVSX0F1ZGlvRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfQXVkaW9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSkgewotICAgIEFMT0dWKCJWaWRlb0VkaXRvckF1ZGlvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVAzIG5vIGVycm9yIik7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JBdWRpb0VuY29kZXJfZ2V0SW50ZXJmYWNlKAotICAgICAgICBNNEVOQ09ERVJfa01QMywgcEZvcm1hdCwgcEVuY29kZXJJbnRlcmZhY2UpOwotfQotCi19ICAvLyBleHRlcm4gIkMiCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQnVmZmVyLmMgYi9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yQnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhN2IyOGUuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvckJ1ZmZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JCdWZmZXIuYwotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIEJ1ZmZlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSN1bmRlZiBNNE9TQV9UUkFDRV9MRVZFTAotI2RlZmluZSBNNE9TQV9UUkFDRV9MRVZFTCAxCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JCdWZmZXIuaCIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLQotI2RlZmluZSBWSURFT0VESVRPUl9CVUZGRVBPT0xfTUFYX05BTUVfU0laRSA0MAotCi0jZGVmaW5lIFZJREVPRURJVE9SX1NBRkVfRlJFRShwKSBcCi17IFwKLSAgICBpZihNNE9TQV9OVUxMICE9IHApIFwKLSAgICB7IFwKLSAgICAgICAgZnJlZShwKTsgXAotICAgICAgICBwID0gTTRPU0FfTlVMTDsgXAotICAgIH0gXAotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBNNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCoqIHBwb29sLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00T1NBX1VJbnQzMiBuYkJ1ZmZlcnMpCi0gKiBAYnJpZWYgICBBbGxvY2F0ZSBhIHBvb2wgb2YgbmJCdWZmZXJzIGJ1ZmZlcnMKLSAqCi0gKiBAcGFyYW0gICBwcG9vbCAgICAgIDogSU4gVGhlIGJ1ZmZlciBwb29sIHRvIGNyZWF0ZQotICogQHBhcmFtICAgbmJCdWZmZXJzICA6IElOIFRoZSBudW1iZXIgb2YgYnVmZmVycyBpbiB0aGUgcG9vbAotICogQHBhcmFtICAgcG9vbE5hbWUgICA6IElOIGEgbmFtZSBnaXZlbiB0byB0aGUgcG9vbAotICogQHJldHVybiAgRXJyb3IgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiogcHBvb2wsCi0gICAgICAgIE00T1NBX1VJbnQzMiBuYkJ1ZmZlcnMsIE00T1NBX0NoYXIqIHBvb2xOYW1lKQotewotICAgIE00T1NBX0VSUiBsZXJyID0gTTROT19FUlJPUjsKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcG9vbDsKLSAgICBNNE9TQV9VSW50MzIgaW5kZXg7Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbCA6IHBwb29sID0gJXAgbmJCdWZmZXJzID0gJSIgUFJJdTMyLAotICAgICAgICBwcG9vbCwgbmJCdWZmZXJzKTsKLQotICAgIHBvb2wgPSBNNE9TQV9OVUxMOwotICAgIHBvb2wgPSAoVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIHNpemVvZihWSURFT0VESVRPUl9CVUZGRVJfUG9vbCksIFZJREVPRURJVE9SX0JVRkZFUl9FWFRFUk5BTCwKLSAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2w6IHBvb2wiKSk7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcG9vbCkKLSAgICB7Ci0gICAgICAgIGxlcnIgPSBNNEVSUl9BTExPQzsKLSAgICAgICAgZ290byBWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sX0NsZWFudXA7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2wgOiBBbGxvY2F0aW5nIFBvb2wgYnVmZmVycyIpOwotICAgIHBvb2wtPnBOWFBCdWZmZXIgPSBNNE9TQV9OVUxMOwotICAgIHBvb2wtPnBOWFBCdWZmZXIgPSAoVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKSpuYkJ1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0VYVEVSTkFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNNE9TQV9DaGFyKikoIkJVRkZFUl9hbGxvY2F0ZVBvb2w6IHBOWFBCdWZmZXIiKSk7Ci0gICAgaWYoTTRPU0FfTlVMTCA9PSBwb29sLT5wTlhQQnVmZmVyKQotICAgIHsKLSAgICAgICAgbGVyciA9IE00RVJSX0FMTE9DOwotICAgICAgICBnb3RvIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2xfQ2xlYW51cDsKLSAgICB9Ci0KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBuYkJ1ZmZlcnM7IGluZGV4KyspCi0gICAgewotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgfQotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2wgOiBBbGxvY2F0aW5nIFBvb2wgbmFtZSBidWZmZXIiKTsKLSAgICBwb29sLT5wb29sTmFtZSA9IE00T1NBX05VTEw7Ci0gICAgcG9vbC0+cG9vbE5hbWUgPSAoTTRPU0FfQ2hhciopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVBPT0xfTUFYX05BTUVfU0laRSxWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwsCi0gICAgICAgIChNNE9TQV9DaGFyKikoIlZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2w6IHBvb2xuYW1lIikpOwotICAgIGlmKHBvb2wtPnBvb2xOYW1lID09IE00T1NBX05VTEwpCi0gICAgewotICAgICAgICBsZXJyID0gTTRFUlJfQUxMT0M7Ci0gICAgICAgIGdvdG8gVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbF9DbGVhbnVwOwotICAgIH0KLQotICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sIDogQXNzaWduaW5nIFBvb2wgbmFtZSBidWZmZXIiKTsKLQotICAgIG1lbXNldCgodm9pZCAqKXBvb2wtPnBvb2xOYW1lLCAwLFZJREVPRURJVE9SX0JVRkZFUE9PTF9NQVhfTkFNRV9TSVpFKTsKLSAgICBtZW1jcHkoKHZvaWQgKilwb29sLT5wb29sTmFtZSwgKHZvaWQgKilwb29sTmFtZSwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVQT09MX01BWF9OQU1FX1NJWkUtMSk7Ci0KLSAgICBwb29sLT5OQiA9IG5iQnVmZmVyczsKLQotVklERU9FRElUT1JfQlVGRkVSX2FsbG9jYXRlUG9vbF9DbGVhbnVwOgotICAgIGlmKE00Tk9fRVJST1IgIT0gbGVycikKLSAgICB7Ci0gICAgICAgIFZJREVPRURJVE9SX1NBRkVfRlJFRShwb29sLT5wTlhQQnVmZmVyKTsKLSAgICAgICAgVklERU9FRElUT1JfU0FGRV9GUkVFKHBvb2wtPnBvb2xOYW1lKTsKLSAgICAgICAgVklERU9FRElUT1JfU0FGRV9GUkVFKHBvb2wpOwotICAgIH0KLSAgICAqcHBvb2wgPSBwb29sOwotICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfYWxsb2NhdGVQb29sIEVORCIpOwotCi0gICAgcmV0dXJuIGxlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZnJlZVBvb2woVklERU9FRElUT1JfQlVGRkVSX1Bvb2wqIHBwb29sKQotICogQGJyaWVmICAgRGVhbGxvY2F0ZSBhIGJ1ZmZlciBwb29sCi0gKgotICogQHBhcmFtICAgcHBvb2wgICAgICA6IElOIFRoZSBidWZmZXIgcG9vbCB0byBmcmVlCi0gKiBAcmV0dXJuICBFcnJvciBjb2RlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbChWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcHBvb2wpCi17Ci0gICAgTTRPU0FfRVJSIGVycjsKLSAgICBNNE9TQV9VSW50MzIgIGogPSAwOwotCi0gICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbCA6IHBwb29sID0gJXAiLCBwcG9vbCk7Ci0KLSAgICBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgZm9yIChqID0gMDsgaiA8IHBwb29sLT5OQjsgaisrKQotICAgIHsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwcG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgZnJlZShwcG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSk7Ci0gICAgICAgICAgICBwcG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwcG9vbCAhPSBNNE9TQV9OVUxMKQotICAgIHsKLSAgICAgICAgU0FGRV9GUkVFKHBwb29sLT5wTlhQQnVmZmVyKTsKLSAgICAgICAgU0FGRV9GUkVFKHBwb29sLT5wb29sTmFtZSk7Ci0gICAgICAgIFNBRkVfRlJFRShwcG9vbCk7Ci0gICAgfQotCi0gICAgcmV0dXJuKGVycik7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIE00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZ2V0QnVmZmVyKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCwKLSAqICAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcioqIHBOWFBCdWZmZXIpCi0gKiBAYnJpZWYgICBSZXR1cm5zIGEgYnVmZmVyIGluIGEgZ2l2ZW4gc3RhdGUKLSAqCi0gKiBAcGFyYW0gICBwcG9vbCAgICAgIDogSU4gVGhlIGJ1ZmZlciBwb29sCi0gKiBAcGFyYW0gICBkZXNpcmVkU3RhdGUgOiBJTiBUaGUgYnVmZmVyIHN0YXRlCi0gKiBAcGFyYW0gICBwTlhQQnVmZmVyIDogSU4gVGhlIHNlbGVjdGVkIGJ1ZmZlcgotICogQHJldHVybiAgRXJyb3IgY29kZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZ2V0QnVmZmVyKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sKiBwcG9vbCwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX1N0YXRlIGRlc2lyZWRTdGF0ZSwKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX0J1ZmZlcioqIHBOWFBCdWZmZXIpCi17Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfQm9vbCBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLSAgICBNNE9TQV9VSW50MzIgaSwgaWJ1ZjsKLQotICAgIEFMT0dWKCJWSURFT0VESVRPUl9CVUZGRVJfZ2V0QnVmZmVyIGZyb20gJXMgaW4gc3RhdGU9JWQiLAotICAgICAgICBwcG9vbC0+cG9vbE5hbWUsIGRlc2lyZWRTdGF0ZSk7Ci0KLSAgICBpYnVmID0gMDsKLQotICAgIGZvciAoaT0wOyBpIDwgcHBvb2wtPk5COyBpKyspCi0gICAgewotICAgICAgICBiRm91bmQgPSAocHBvb2wtPnBOWFBCdWZmZXJbaV0uc3RhdGUgPT0gZGVzaXJlZFN0YXRlKTsKLSAgICAgICAgaWYgKGJGb3VuZCkKLSAgICAgICAgewotICAgICAgICAgICAgaWJ1ZiA9IGk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKCFiRm91bmQpCi0gICAgewotICAgICAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlciBObyBidWZmZXIgYXZhaWxhYmxlIGluIHN0YXRlICVkIiwKLSAgICAgICAgICAgIGRlc2lyZWRTdGF0ZSk7Ci0gICAgICAgICpwTlhQQnVmZmVyID0gTTRPU0FfTlVMTDsKLSAgICAgICAgcmV0dXJuIE00RVJSX05PX0JVRkZFUl9BVkFJTEFCTEU7Ci0gICAgfQotCi0gICAgLyogY2FzZSB3aGVyZSBhIGJ1ZmZlciBoYXMgYmVlbiBmb3VuZCAqLwotICAgICpwTlhQQnVmZmVyID0gJihwcG9vbC0+cE5YUEJ1ZmZlcltpYnVmXSk7Ci0KLSAgICBBTE9HVigiVklERU9FRElUT1JfQlVGRkVSX2dldEJ1ZmZlcjogaWR4ID0gJSIgUFJJdTMyLCBpYnVmKTsKLQotICAgIHJldHVybihlcnIpOwotfQotCi1NNE9TQV9FUlIgVklERU9FRElUT1JfQlVGRkVSX2luaXRQb29sQnVmZmVycyhWSURFT0VESVRPUl9CVUZGRVJfUG9vbCogcG9vbCwKLSAgICBNNE9TQV9VSW50MzIgbFNpemUpCi17Ci0gICAgTTRPU0FfRVJSICAgICBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00T1NBX1VJbnQzMiAgaW5kZXgsIGo7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgcG9vbCAqLwotICAgIGZvcihpbmRleCA9IDA7IGluZGV4IDwgcG9vbC0+TkI7IGluZGV4KyspCi0gICAgewotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnBEYXRhID0gKE00T1NBX1ZvaWQqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgICAgIGxTaXplLCBWSURFT0VESVRPUl9CVUZGRVJfRVhURVJOQUwsCi0gICAgICAgICAgICAoTTRPU0FfQ2hhciopKCJCVUZGRVJfaW5pdFBvb2xCdWZmZXJzOiBCdWZmZXIgZGF0YSIpKTsKLSAgICAgICAgaWYoTTRPU0FfTlVMTCA9PSBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5wRGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGluZGV4OyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoTTRPU0FfTlVMTCAhPSBwb29sLT5wTlhQQnVmZmVyW2pdLnBEYXRhKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwb29sLT5wTlhQQnVmZmVyW2pdLnBEYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgcG9vbC0+cE5YUEJ1ZmZlcltqXS5wRGF0YSA9IE00T1NBX05VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLnNpemUgPSAwOwotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5zdGF0ZSA9IFZJREVPRURJVE9SX0JVRkZFUl9rRW1wdHk7Ci0gICAgICAgIHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLmlkeCA9IGluZGV4OwotICAgICAgICBwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5idWZmQ1RTID0gLTE7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWSURFT0VESVRPUl9CVUZGRVJfZ2V0T2xkZXN0QnVmZmVyKFZJREVPRURJVE9SX0JVRkZFUl9Qb29sICpwb29sLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfU3RhdGUgZGVzaXJlZFN0YXRlLAotICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiogcE5YUEJ1ZmZlcikKLXsKLSAgICBNNE9TQV9FUlIgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRPU0FfVUludDMyICBpbmRleCwgajsKLSAgICBNNF9NZWRpYVRpbWUgIGNhbmRpZGF0ZVRpbWVTdGFtcCA9IChNNF9NZWRpYVRpbWUpMHg3ZmZmZmZmOwotICAgIE00T1NBX0Jvb2wgICAgYkZvdW5kID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAqcE5YUEJ1ZmZlciA9IE00T1NBX05VTEw7Ci0gICAgZm9yKGluZGV4ID0gMDsgaW5kZXg8IHBvb2wtPk5COyBpbmRleCsrKQotICAgIHsKLSAgICAgICAgaWYocG9vbC0+cE5YUEJ1ZmZlcltpbmRleF0uc3RhdGUgPT0gZGVzaXJlZFN0YXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwb29sLT5wTlhQQnVmZmVyW2luZGV4XS5idWZmQ1RTIDw9IGNhbmRpZGF0ZVRpbWVTdGFtcCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiRm91bmQgPSBNNE9TQV9UUlVFOwotICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVRpbWVTdGFtcCA9IHBvb2wtPnBOWFBCdWZmZXJbaW5kZXhdLmJ1ZmZDVFM7Ci0gICAgICAgICAgICAgICAgICAgICpwTlhQQnVmZmVyID0gJihwb29sLT5wTlhQQnVmZmVyW2luZGV4XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoTTRPU0FfRkFMU0UgPT0gYkZvdW5kKQotICAgIHsKLSAgICAgICAgQUxPR1YoIlZJREVPRURJVE9SX0JVRkZFUl9nZXRPbGRlc3RCdWZmZXIgV0FSTklORyBubyBidWZmZXIgYXZhaWxhYmxlIik7Ci0gICAgICAgIGVyciA9IE00RVJSX05PX0JVRkZFUl9BVkFJTEFCTEU7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yTXAzUmVhZGVyLmNwcCBiL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JNcDNSZWFkZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZTBkMDVkLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JNcDNSZWFkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JNcDNSZWFkZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgTVAzIFJlYWRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZJREVPRURJVE9SX01QM1JFQURFUiIKLQotLyoqCi0gKiBIRUFERVJTCi0gKgotICovCi0jaW5jbHVkZSAiTTRPU0FfRGVidWcuaCIKLSNpbmNsdWRlICJNNFNZU19BY2Nlc3NVbml0LmgiCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JNcDNSZWFkZXIuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclV0aWxzLmgiCi0KLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLS8qKgotICogU09VUkNFIENMQVNTCi0gKi8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLyoqCi0gKiBFTkdJTkUgSU5URVJGQUNFCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udGV4dCBvZiB0aGUgU0YgTVAzIHJlYWRlciBzaGVsbC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc3A8RGF0YVNvdXJjZT4gICAgICAgICAgICAgIG1EYXRhU291cmNlOwotICAgIHNwPE1lZGlhRXh0cmFjdG9yPiAgICAgICAgICBtRXh0cmFjdG9yOwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgICAgICBtTWVkaWFTb3VyY2U7Ci0gICAgTTRfQXVkaW9TdHJlYW1IYW5kbGVyKiAgICAgIG1BdWRpb1N0cmVhbUhhbmRsZXI7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCAgICAgICAgICAgIG1BdWRpb0F1OwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgICBtTWF4RHVyYXRpb247Ci0gICAgTTRPU0FfVUludDggICAgICAgICAgICAgICAgIG1TdHJlYW1OdW1iZXI7Ci0gICAgTTRPU0FfQm9vbCAgICAgICAgICAgICAgICAgIG1TZWVraW5nOwotICAgIE00T1NBX1RpbWUgICAgICAgICAgICAgICAgICBtU2Vla1RpbWU7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIG1FeHRyYWN0b3JGbGFnczsKLX0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dDsKLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgTVAzIHJlYWRlcgotICogQG5vdGUgICAgIGFsbG9jYXRlcyB0aGUgY29udGV4dAotICoKLSAqIEBwYXJhbSAgICBwQ29udGV4dDogICAgICAgIChPVVQpICAgIHBvaW50ZXIgb24gYSByZWFkZXIgY29udGV4dAotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfQUxMT0MgICAgICAgICAgICAgICAgYSBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgZmFpbGVkCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHZhbGlkCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9jcmVhdGUoTTRPU0FfQ29udGV4dCAqcENvbnRleHQpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZSBiZWdpbiIpOwotCi0gICAgLyogQ29udGV4dCBhbGxvY2F0aW9uICYgaW5pdGlhbGl6YXRpb24gKi8KLSAgICBTQUZFX01BTExPQyhwUmVhZGVyQ29udGV4dCwgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCwgMSwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyIik7Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlciAgPSBNNE9TQV9OVUxMOwotICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdS5kYXRhQWRkcmVzcyA9IE00T1NBX05VTEw7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1NYXhEdXJhdGlvbiA9IDA7Ci0gICAgKnBDb250ZXh0ID0gcFJlYWRlckNvbnRleHQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKE00Tk9fRVJST1IgPT0gZXJyKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9jcmVhdGUgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfY3JlYXRlIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICAgZGVzdHJveSB0aGUgaW5zdGFuY2Ugb2YgdGhlIE1QMyByZWFkZXIKLSAqIEBub3RlICAgICAgYWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb250ZXh0IGlzIGludmFsaWQKLSAqIEBwYXJhbSAgICAgY29udGV4dDogICAgICAgIChJTikgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICAgIFRoZSBpbnB1dCBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZGVzdHJveShNNE9TQV9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBSZWFkZXJDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95IGJlZ2luIik7Ci0KLSAgICBTQUZFX0ZSRUUocFJlYWRlckNvbnRleHQpOwotY2xlYW5VcDoKLSAgICBpZiAoTTROT19FUlJPUiA9PSBlcnIpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3kgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZGVzdHJveSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2Rlc3Ryb3kgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIG9wZW4gdGhlIHJlYWRlciBhbmQgaW5pdGlhbGl6ZXMgaXRzIGNyZWF0ZWQgaW5zdGFuY2UKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gb3BlbnMgdGhlIE1QMyBmaWxlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIHBGaWxlRGVzY3JpcHRvcjogICAgKElOKSAgICBQb2ludGVyIHRvIHByb3ByaWV0YXJ5IGRhdGEgaWRlbnRpZnlpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lZGlhIHRvIG9wZW4KLQotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgICAgICAgIHRoZSBjb250ZXh0IGlzIE5VTEwKLSAqIEByZXR1cm4gICAgTTRFUlJfQkFEX0NPTlRFWFQgICAgICAgICAgICAgIHByb3ZpZGVkIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICAgIE00RVJSX1VOU1VQUE9SVEVEX01FRElBX1RZUEUgICB0aGUgbWVkaWEgaXMgRFJNIHByb3RlY3RlZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcEZpbGVEZXNjcmlwdG9yKXsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBiZWdpbiIpOwotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMqLwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmVhZGVyQ29udGV4dCksICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuOiBpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwRmlsZURlc2NyaXB0b3IpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuOiBpbnZhbGlkIHBvaW50ZXIgcEZpbGVEZXNjcmlwdG9yIik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBEYXRhc291cmNlIHN0YXJ0ICVzIiwKLSAgICAgICAgKGNoYXIqKXBGaWxlRGVzY3JpcHRvcik7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1EYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UgKChjaGFyKilwRmlsZURlc2NyaXB0b3IpOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIERhdGFzb3VyY2UgZW5kIik7Ci0KLSAgICBpZiAocFJlYWRlckNvbnRleHQtPm1EYXRhU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gRGF0YXNvdXJjZSBlcnJvciIpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBleHRyYWN0b3Igc3RhcnQiKTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoCi0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZSxNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBleHRyYWN0b3IgZW5kIik7Ci0KLSAgICBpZiAocFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3IgPT0gTlVMTCkgICAgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfb3BlbiBleHRyYWN0b3IgZXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotICAgIHBSZWFkZXJDb250ZXh0LT5tU3RyZWFtTnVtYmVyID0gMDsKLQotICAgIGludDMyX3QgaXNEUk1Qcm90ZWN0ZWQgPSAwOwotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7Ci0gICAgbWV0YS0+ZmluZEludDMyKGtLZXlJc0RSTSwgJmlzRFJNUHJvdGVjdGVkKTsKLSAgICBpZiAoaXNEUk1Qcm90ZWN0ZWQpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW4gZXJyb3IgLSBEUk0gUHJvdGVjdGVkIik7Ci0gICAgICAgIHJldHVybiBNNEVSUl9VTlNVUFBPUlRFRF9NRURJQV9UWVBFOwotICAgIH0KLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9vcGVuIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGJyaWVmICAgIGNsb3NlIHRoZSByZWFkZXIKLSAqIEBub3RlICAgIHRoaXMgZnVuY3Rpb24gY2xvc2VzIHRoZSBNUDMgcmVhZGVyCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAgIChJTikgICAgICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgICB0aGUgY29udGV4dCBpcyBOVUxMCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfY2xvc2UoTTRPU0FfQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9jbG9zZSBiZWdpbiIpOwotICAgIC8qIENoZWNrIGZ1bmN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJlYWRlckNvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfY2xvc2U6IGludmFsaWQgY29udGV4dCBwb2ludGVyIik7Ci0KLSAgICBpZiAocFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgICBpZiAoTTRPU0FfTlVMTCAhPSBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX3BEZWNvZGVyU3BlY2lmaWNJbmZvKSB7Ci0gICAgICAgICAgICBmcmVlKHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbyk7Ci0gICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+bV9iYXNpY1Byb3BlcnRpZXMuXAotICAgICAgICAgICAgICAgIG1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUgPSAwOwotICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXItPm1fYmFzaWNQcm9wZXJ0aWVzLlwKLSAgICAgICAgICAgICAgICBtX3BEZWNvZGVyU3BlY2lmaWNJbmZvID0gTTRPU0FfTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbmFsbHkgZGVzdHJveSB0aGUgc3RyZWFtIGhhbmRsZXIgKi8KLSAgICAgICAgZnJlZShwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlcik7Ci0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyID0gTTRPU0FfTlVMTDsKLQotICAgICAgICBpZiAocFJlYWRlckNvbnRleHQtPm1BdWRpb0F1LmRhdGFBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGZyZWUocFJlYWRlckNvbnRleHQtPm1BdWRpb0F1LmRhdGFBZGRyZXNzKTsKLSAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdS5kYXRhQWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwUmVhZGVyQ29udGV4dC0+bU1lZGlhU291cmNlLT5zdG9wKCk7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1NZWRpYVNvdXJjZS5jbGVhcigpOwotICAgIHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yLmNsZWFyKCk7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1EYXRhU291cmNlLmNsZWFyKCk7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfY2xvc2UgZW5kICIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBnZXQgYW4gb3B0aW9uIHZhbHVlIGZyb20gdGhlIHJlYWRlcgotICogQG5vdGUKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHJldHJpZXZlIGEgcHJvcGVydHkgdmFsdWU6Ci0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgIG9wdGlvbklkOiAgICAgICAoSU4pICAgIGluZGljYXRlcyB0aGUgb3B0aW9uIHRvIGdldAotICogQHBhcmFtICAgIHBWYWx1ZTogICAgICAgICAoT1VUKSAgIHBvaW50ZXIgdG8gc3RydWN0dXJlIG9yIHZhbHVlIChhbGxvY2F0ZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB1c2VyKSB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJuICAgIE00RVJSX0JBRF9PUFRJT05fSUQgICAgd2hlbiB0aGUgb3B0aW9uIElEIGlzIG5vdCBhIHZhbGlkIG9uZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgIE00T1NBX09wdGlvbklEIG9wdGlvbklkLCBNNE9TQV9EYXRhT3B0aW9uIHBWYWx1ZSkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uIGJlZ2luOiBvcHRpb25JZD0gJWQgIiwoaW50KW9wdGlvbklkKTsKLQotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwUmVhZGVyQ29udGV4dCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgImludmFsaWQgdmFsdWUgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaChvcHRpb25JZCkgewotICAgIGNhc2UgTTRSRUFERVJfa09wdGlvbklEX0R1cmF0aW9uOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigiTXAzUmVhZGVyIGR1cmF0aW9uPSVsZCIscFJlYWRlckNvbnRleHQtPm1NYXhEdXJhdGlvbik7Ci0gICAgICAgICAgICAqKE00T1NBX1RpbWUqKXBWYWx1ZSA9IHBSZWFkZXJDb250ZXh0LT5tTWF4RHVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9CaXRyYXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICBNNE9TQV9VSW50MzIqIHBCaXRyYXRlID0gKE00T1NBX1VJbnQzMiopcFZhbHVlOwotICAgICAgICAgICAgaWYgKE00T1NBX05VTEwgIT0gcFJlYWRlckNvbnRleHQtPm1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICAqcEJpdHJhdGUgPSBwUmVhZGVyQ29udGV4dC0+bUF1ZGlvU3RyZWFtSGFuZGxlci0+XAotICAgICAgICAgICAgICAgICAgICBtX2Jhc2ljUHJvcGVydGllcy5tX2F2ZXJhZ2VCaXRSYXRlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwQml0cmF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgZXJyID0gTTRFUlJfUEFSQU1FVEVSOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfTXAzSWQzdjFUYWc6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfTXAzSWQzdjJUYWc6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNNFJFQURFUl9rT3B0aW9uSURfR2V0TWV0YWRhdGE6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRPcHRpb246ICBNNEVSUl9CQURfT1BUSU9OX0lEIik7Ci0gICAgICAgICAgICBlcnIgPSBNNEVSUl9CQURfT1BUSU9OX0lEOwotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRPcHRpb24gZW5kICIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgIHNldCBhbiBvcHRpb24gdmFsdWUgb2YgdGhlIHJlYWRlcgotICogQG5vdGUKLSAqICAgICAgICAgIGl0IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlOgotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgIChJTikgICAgICAgIENvbnRleHQgb2YgdGhlIHJlYWRlcgotICogQHBhcmFtICAgb3B0aW9uSWQ6ICAgKElOKSAgICAgICAgSWRlbnRpZmllciBpbmRpY2F0aW5nIHRoZSBvcHRpb24gdG8gc2V0Ci0gKiBAcGFyYW0gICBwVmFsdWU6ICAgICAoSU4pICAgICAgICBQb2ludGVyIHRvIHN0cnVjdHVyZSBvciB2YWx1ZSAoYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB1c2VyKSB3aGVyZSBvcHRpb24gaXMgc3RvcmVkCi0gKgotICogQHJldHVybiAgTTROT19FUlJPUiAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00RVJSX0JBRF9PUFRJT05fSUQgICAgIFRoZSBvcHRpb24gSUQgaXMgbm90IGEgdmFsaWQgb25lCi0gKiBAcmV0dXJuICBNNEVSUl9TVEFURSAgICAgICAgICAgICBTdGF0ZSBhdXRvbWF0b24gaXMgbm90IGFwcGxpZWQKLSAqIEByZXR1cm4gIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIFRoZSBvcHRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0IGJlZ2luOiBvcHRpb25JZDogJXUgVmFsdWU6ICVwICIsCi0gICAgICAgICAgb3B0aW9uSWQsIHBWYWx1ZSk7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKE00T1NBX05VTEwgPT0gcFJlYWRlckNvbnRleHQpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIGNvbnRleHQgcG9pbnRlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgoTTRPU0FfTlVMTCA9PSBwVmFsdWUpLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJpbnZhbGlkIHZhbHVlIHBvaW50ZXIiKTsKLQotICAgIHN3aXRjaChvcHRpb25JZCkgewotICAgICAgICBjYXNlIE00UkVBREVSX2tPcHRpb25JRF9TZXRPc2FGaWxlUmVhZGVyRmN0c1B0cjoKLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgZW5kICIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBqdW1wIGludG8gdGhlIHN0cmVhbSBhdCB0aGUgc3BlY2lmaWVkIHRpbWUKLSAqIEBub3RlCi0gKiBAcGFyYW0gICAgY29udGV4dDogICAgICAoSU4pICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXIoSU4pICAgc3RyZWFtIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJlYW0gdG8gbWFrZSBqdW1wCi0gKiBAcGFyYW0gICAgcFRpbWUgICAgICAgICAoSS9PKUlOOnRoZSB0aW1lIHRvIGp1bXAgdG8gKGluIG1zKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQ6IHRoZSB0aW1lIHRvIHdoaWNoIHRoZSBzdHJlYW0gcmVhbGx5IGp1bXBlZAotICogQHJldHVybiAgICBNNE5PX0VSUk9SICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNEVSUl9QQVJBTUVURVIgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcChNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLCBNNE9TQV9JbnQzMiogcFRpbWUpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00U1lTX1N0cmVhbUlEIHN0cmVhbUlkQXJyYXlbMl07Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogcEF1OwotICAgIE00T1NBX1RpbWUgdGltZTY0ID0gKE00T1NBX1RpbWUpKnBUaW1lOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXAgYmVnaW4iKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZWFkZXJDb250ZXh0ID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wOiBpbnZhbGlkIGNvbnRleHQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wOiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFRpbWUgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXA6IGludmFsaWQgdGltZSBwb2ludGVyIik7Ci0KLSAgICBpZihwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcFJlYWRlckNvbnRleHQtPlwKLSAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcil7Ci0gICAgICAgIHBBdSA9ICZwUmVhZGVyQ29udGV4dC0+bUF1ZGlvQXU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXA6IHBhc3NlZCBTdHJlYW1IYW5kbGVyIGlzIG5vdCBrbm93biIpOwotICAgICAgICByZXR1cm4gTTRFUlJfUEFSQU1FVEVSOwotICAgIH0KLQotICAgIHN0cmVhbUlkQXJyYXlbMF0gPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBzdHJlYW1JZEFycmF5WzFdID0gMDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9qdW1wIHRpbWUgbXMgJWxkICIsIHRpbWU2NCk7Ci0KLSAgICBwQXUtPkNUUyA9IHRpbWU2NDsKLSAgICBwQXUtPkRUUyA9IHRpbWU2NDsKLQotICAgIHRpbWU2NCA9IHRpbWU2NCAqIDEwMDA7IC8qIENvbnZlcnQgdGhlIHRpbWUgaW50byBtaWNybyBzZWMgKi8KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfanVtcCB0aW1lIHVzICVsZCAiLCB0aW1lNjQpOwotCi0gICAgcFJlYWRlckNvbnRleHQtPm1TZWVraW5nID0gTTRPU0FfVFJVRTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bVNlZWtUaW1lID0gdGltZTY0OwotCi0gICAgdGltZTY0ID0gdGltZTY0IC8gMTAwMDsgLyogQ29udmVydCB0aGUgdGltZSBpbnRvIG1pbGxpIHNlYyAqLwotICAgICpwVGltZSA9IChNNE9TQV9JbnQzMil0aW1lNjQ7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXAgZW5kICIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXQgdGhlIG5leHQgc3RyZWFtIGZvdW5kIGluIHRoZSBtZWRpYSBmaWxlCi0gKgotICogQHBhcmFtICAgIGNvbnRleHQ6ICAgICAgICAoSU4pICBDb250ZXh0IG9mIHRoZSByZWFkZXIKLSAqIEBwYXJhbSAgICBwTWVkaWFGYW1pbHk6ICAgKE9VVCkgcG9pbnRlciB0byBhIHVzZXIgYWxsb2NhdGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00UkVBREVSX01lZGlhRmFtaWx5IHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVkaWEgZmFtaWx5IG9mIHRoZSBmb3VuZCBzdHJlYW0KLSAqIEBwYXJhbSAgICBwU3RyZWFtSGFuZGxlcjogKE9VVCkgcG9pbnRlciB0byBhIHN0cmVhbSBoYW5kbGVyIHRoYXQgd2lsbCBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYW5kIGZpbGxlZCB3aXRoIHN0cmVhbSBkZXNjcmlwdGlvbgotICoKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgICAgICB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgICBNNFdBUl9OT19NT1JFX1NUUkVBTSAgIG5vIG1vcmUgYXZhaWxhYmxlIHN0cmVhbSBpbiB0aGUgbWVkaWEKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIGlzIG5vdCBwcm9wZXJseSBzZXQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNFJFQURFUl9NZWRpYUZhbWlseSAqcE1lZGlhRmFtaWx5LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICoqcFN0cmVhbUhhbmRsZXJQYXJhbSkgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgTTRTWVNfU3RyZWFtSUQgc3RyZWFtSWRBcnJheVsyXTsKLSAgICBNNFNZU19TdHJlYW1EZXNjcmlwdGlvbiBzdHJlYW1EZXNjOwotICAgIE00X0F1ZGlvU3RyZWFtSGFuZGxlciogcEF1ZGlvU3RyZWFtSGFuZGxlcjsKLSAgICBNNF9TdHJlYW1IYW5kbGVyKiBwU3RyZWFtSGFuZGxlcjsKLSAgICBNNE9TQV9VSW50OCB0eXBlLCB0ZW1wOwotICAgIE00T1NBX0Jvb2wgaGF2ZUF1ZGlvID0gTTRPU0FfRkFMU0U7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBOVUxMOwotICAgIGludDY0X3QgRHVyYXRpb247Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBiZWdpbiIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJlYWRlckNvbnRleHQgPT0gMCksICAgICAgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbTogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwTWVkaWFGYW1pbHkgPT0gMCksICAgICAgICBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtOiBpbnZhbGlkIHBvaW50ZXIgdG8gTWVkaWFGYW1pbHkiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBTdHJlYW1IYW5kbGVyUGFyYW0gPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW06IGludmFsaWQgcG9pbnRlciB0byBTdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBzdHJlYW0gbnVtYmVyID0gJWQiLAotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bVN0cmVhbU51bWJlcik7Ci0gICAgaWYgKHBSZWFkZXJDb250ZXh0LT5tU3RyZWFtTnVtYmVyID49IDEpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0gbWF4IG51bWJlciBvZiBzdHJlYW0gcmVhY2hlZCIpOwotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9TVFJFQU07Ci0gICAgfQotICAgIHBSZWFkZXJDb250ZXh0LT5tU3RyZWFtTnVtYmVyID0gcFJlYWRlckNvbnRleHQtPm1TdHJlYW1OdW1iZXIgKyAxOwotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0U3RyZWFtIG51bWJlciBvZiBUcmFja3MlZCIsCi0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpKTsKLSAgICBmb3IgKHRlbXAgPSAwOyB0ZW1wIDwgcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7IHRlbXArKykgewotICAgICAgICBtZXRhID0gcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEodGVtcCk7Ci0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgICAgICBpZiAoIWhhdmVBdWRpbyAmJiAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7Ci0gICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bU1lZGlhU291cmNlID0KLSAgICAgICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bUV4dHJhY3Rvci0+Z2V0VHJhY2sodGVtcCk7Ci0gICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bU1lZGlhU291cmNlLT5zdGFydCgpOwotICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXZlQXVkaW8pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFoYXZlQXVkaW8pIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0gbm8gbW9yZSBzdHJlYW0gIik7Ci0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tRGF0YVNvdXJjZS5jbGVhcigpOwotICAgICAgICByZXR1cm4gTTRXQVJfTk9fTU9SRV9TVFJFQU07Ci0gICAgfQotCi0gICAgcFJlYWRlckNvbnRleHQtPm1FeHRyYWN0b3JGbGFncyA9IHBSZWFkZXJDb250ZXh0LT5tRXh0cmFjdG9yLT5mbGFncygpOwotICAgICpwTWVkaWFGYW1pbHkgPSBNNFJFQURFUl9rTWVkaWFGYW1pbHlBdWRpbzsKLQotICAgIHN0cmVhbURlc2MuZHVyYXRpb24gPSBtZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmRHVyYXRpb24pOwotICAgIHN0cmVhbURlc2MuZHVyYXRpb24gPSAoTTRPU0FfVGltZSlEdXJhdGlvbi8xMDAwOwotCi0gICAgbWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAoaW50MzJfdCopJnN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGUpOwotICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgKGludDMyX3QqKSZzdHJlYW1EZXNjLnRpbWVTY2FsZSk7Ci0gICAgQUxPR1YoIkJpdHJhdGUgPSAlZCwgU2FtcGxlUmF0ZSA9ICVkIGR1cmF0aW9uID0gJWxsZCIsCi0gICAgICAgIHN0cmVhbURlc2MuYXZlcmFnZUJpdHJhdGUsc3RyZWFtRGVzYy50aW1lU2NhbGUsRHVyYXRpb24vMTAwMCk7Ci0KLSAgICBzdHJlYW1EZXNjLnN0cmVhbVR5cGUgPSBNNFNZU19rTVAzOwotICAgIHN0cmVhbURlc2MucHJvZmlsZUxldmVsID0gMHhGRiA7Ci0gICAgc3RyZWFtRGVzYy5zdHJlYW1JRCA9IHBSZWFkZXJDb250ZXh0LT5tU3RyZWFtTnVtYmVyOwotICAgIHN0cmVhbURlc2MuZGVjb2RlclNwZWNpZmljSW5mbyA9IE00T1NBX05VTEw7Ci0gICAgc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSA9IDA7Ci0gICAgc3RyZWFtRGVzYy5tYXhCaXRyYXRlID0gc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZTsKLQotICAgIC8qICAgIEFsbG9jYXRlIHRoZSBhdWRpbyBzdHJlYW0gaGFuZGxlciBhbmQgc2V0IGl0cyBwYXJhbWV0ZXJzICAgICovCi0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlciA9IChNNF9BdWRpb1N0cmVhbUhhbmRsZXIqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgc2l6ZW9mKE00X0F1ZGlvU3RyZWFtSGFuZGxlciksIE00UkVBREVSX01QMywKLSAgICAgICAgKE00T1NBX0NoYXIqKSJNNF9BdWRpb1N0cmVhbUhhbmRsZXIiKTsKLQotICAgIGlmIChwQXVkaW9TdHJlYW1IYW5kbGVyID09IE00T1NBX05VTEwpIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0gbWFsbG9jIGZhaWxlZCIpOwotICAgICAgICBwUmVhZGVyQ29udGV4dC0+bU1lZGlhU291cmNlLT5zdG9wKCk7Ci0gICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgcFJlYWRlckNvbnRleHQtPm1EYXRhU291cmNlLmNsZWFyKCk7Ci0KLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLSAgICBwU3RyZWFtSGFuZGxlciA9KE00X1N0cmVhbUhhbmRsZXIqKShwQXVkaW9TdHJlYW1IYW5kbGVyKTsKLSAgICAqcFN0cmVhbUhhbmRsZXJQYXJhbSA9IHBTdHJlYW1IYW5kbGVyOwotICAgIHBSZWFkZXJDb250ZXh0LT5tQXVkaW9TdHJlYW1IYW5kbGVyID0gcEF1ZGlvU3RyZWFtSGFuZGxlcjsKLQotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fc3RydWN0U2l6ZSA9IHNpemVvZihNNF9BdWRpb1N0cmVhbUhhbmRsZXIpOwotCi0gICAgaWYgKG1ldGEgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbSBtZXRhIGlzIE5VTEwiKTsKLSAgICB9Ci0KLSAgICBwQXVkaW9TdHJlYW1IYW5kbGVyLT5tX3NhbXBsaW5nRnJlcXVlbmN5ID0gc3RyZWFtRGVzYy50aW1lU2NhbGU7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fcERlY29kZXJTcGVjaWZpY0luZm8gPQotICAgICAgICAoTTRPU0FfVUludDgqKShzdHJlYW1EZXNjLmRlY29kZXJTcGVjaWZpY0luZm8pOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX2RlY29kZXJTcGVjaWZpY0luZm9TaXplID0KLSAgICAgICAgc3RyZWFtRGVzYy5kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZTsKLQotICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LAotICAgICAgICAoaW50MzJfdCopJnBBdWRpb1N0cmVhbUhhbmRsZXItPm1fbmJDaGFubmVscyk7Ci0gICAgcEF1ZGlvU3RyZWFtSGFuZGxlci0+bV9ieXRlRnJhbWVMZW5ndGggPSAxMTUyOwotICAgIHBBdWRpb1N0cmVhbUhhbmRsZXItPm1fYnl0ZVNhbXBsZVNpemUgPSAyOwotCi0gICAgcFN0cmVhbUhhbmRsZXItPm1fcFVzZXJEYXRhID0gTlVMTDsKLSAgICBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZCA9IHN0cmVhbURlc2Muc3RyZWFtSUQ7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fZHVyYXRpb24gPSBzdHJlYW1EZXNjLmR1cmF0aW9uOwotICAgIHBSZWFkZXJDb250ZXh0LT5tTWF4RHVyYXRpb24gPSBzdHJlYW1EZXNjLmR1cmF0aW9uOwotICAgIHBTdHJlYW1IYW5kbGVyLT5tX2F2ZXJhZ2VCaXRSYXRlID0gc3RyZWFtRGVzYy5hdmVyYWdlQml0cmF0ZTsKLQotICAgIHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZSA9IDA7Ci0gICAgcFN0cmVhbUhhbmRsZXItPm1fc3RyZWFtVHlwZSA9IE00REFfU3RyZWFtVHlwZUF1ZGlvTXAzOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRTdHJlYW0gZW5kICIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBicmllZiAgICBmaWxsIHRoZSBhY2Nlc3MgdW5pdCBzdHJ1Y3R1cmUgd2l0aCBpbml0aWFsaXphdGlvbiB2YWx1ZXMKLSAqIEBwYXJhbSAgICBjb250ZXh0OiAgICAgICAgKElOKSAgICAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgcFN0cmVhbUhhbmRsZXI6IChJTikgICAgIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBoYW5kbGVyIHRvIHdoaWNoCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY2Nlc3MgdW5pdCB3aWxsIGJlIGFzc29jaWF0ZWQKLSAqIEBwYXJhbSAgICBwQWNjZXNzVW5pdDogICAgKElOL09VVCkgcG9pbnRlciB0byB0aGUgYWNjZXNzIHVuaXQgKGFsbG9jYXRlZCBieQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2FsbGVyKSB0byBpbml0aWFsaXplCi0gKiBAcmV0dXJuICAgTTROT19FUlJPUiAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgTTRFUlJfUEFSQU1FVEVSICAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZmlsbEF1U3RydWN0KE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRfU3RyZWFtSGFuZGxlciAqcFN0cmVhbUhhbmRsZXIsIE00X0FjY2Vzc1VuaXQgKnBBY2Nlc3NVbml0KSB7Ci0gICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCAqcFJlYWRlckNvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JNcDNSZWFkZXJfQ29udGV4dCopY29udGV4dDsKLSAgICBNNFNZU19BY2Nlc3NVbml0ICpwQXU7Ci0KLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZWFkZXJDb250ZXh0ID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3Q6IGludmFsaWQgY29udGV4dCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFN0cmVhbUhhbmRsZXIgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdCBpbnZhbGlkIHBvaW50ZXIgdG8gU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2ZpbGxBdVN0cnVjdDogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3Qgc3RhcnQgIik7Ci0gICAgaWYocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBSZWFkZXJDb250ZXh0LT5cCi0gICAgICAgIG1BdWRpb1N0cmVhbUhhbmRsZXIpewotICAgICAgICBwQXUgPSAmcFJlYWRlckNvbnRleHQtPm1BdWRpb0F1OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3QgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHBBdSBzdHJ1Y3R1cmUgKi8KLSAgICBwQXUtPmRhdGFBZGRyZXNzID0gTTRPU0FfTlVMTDsKLSAgICBwQXUtPnNpemUgICAgICAgID0gMDsKLSAgICBwQXUtPkNUUyAgICAgICAgID0gMDsKLSAgICBwQXUtPkRUUyAgICAgICAgID0gMDsKLSAgICBwQXUtPmF0dHJpYnV0ZSAgID0gMDsKLSAgICBwQXUtPm5iRnJhZyAgICAgID0gMDsKLQotICAgIC8qIEluaXRpYWxpemUgcEFjY2Vzc1VuaXQgc3RydWN0dXJlICovCi0gICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZSAgICAgICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9DVFMgICAgICAgICAgPSAwOwotICAgIHBBY2Nlc3NVbml0LT5tX0RUUyAgICAgICAgICA9IDA7Ci0gICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlICAgID0gMDsKLSAgICBwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyAgPSBNNE9TQV9OVUxMOwotICAgIHBBY2Nlc3NVbml0LT5tX21heHNpemUgICAgICA9IHBTdHJlYW1IYW5kbGVyLT5tX21heEFVU2l6ZTsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJlYW1JRCAgICAgPSBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1JZDsKLSAgICBwQWNjZXNzVW5pdC0+bV9zdHJ1Y3RTaXplICAgPSBzaXplb2YoTTRfQWNjZXNzVW5pdCk7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZmlsbEF1U3RydWN0IGVuZCIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgcmVzZXQgdGhlIHN0cmVhbSwgaS5lIHNlZWsgaXQgdG8gdGhlIGJlZ2lubmluZwotICogQG5vdGUKLSAqIEBwYXJhbSAgICAgY29udGV4dDogICAgICAgICAgKElOKSAgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICAgIHBTdHJlYW1IYW5kbGVyICAgIChJTikgIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIHJlc2V0Ci0gKiBAcmV0dXJuICAgIE00Tk9fRVJST1IgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICAgIE00RVJSX1BBUkFNRVRFUiAgICAgICAgIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgaXMgbm90IHByb3Blcmx5IHNldAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlcikgewotICAgIFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQgKnBSZWFkZXJDb250ZXh0ID0KLSAgICAgICAgKFZpZGVvRWRpdG9yTXAzUmVhZGVyX0NvbnRleHQqKWNvbnRleHQ7Ci0KLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBNNFNZU19TdHJlYW1JRCBzdHJlYW1JZEFycmF5WzJdOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBNNE9TQV9UaW1lIHRpbWU2NCA9IDA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQgc3RhcnQiKTsKLSAgICBNNE9TQV9ERUJVR19JRjEoKHBSZWFkZXJDb250ZXh0ID09IDApLCBNNEVSUl9QQVJBTUVURVIsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9yZXNldDogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQ6IGludmFsaWQgcG9pbnRlciB0byBNNF9TdHJlYW1IYW5kbGVyIik7Ci0KLSAgICBpZiAocFN0cmVhbUhhbmRsZXIgPT0gKE00X1N0cmVhbUhhbmRsZXIqKXBSZWFkZXJDb250ZXh0LT5cCi0gICAgICAgIG1BdWRpb1N0cmVhbUhhbmRsZXIpIHsKLSAgICAgICAgcEF1ID0gJnBSZWFkZXJDb250ZXh0LT5tQXVkaW9BdTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQgU3RyZWFtSGFuZGxlciBpcyBub3Qga25vd24iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0gICAgc3RyZWFtSWRBcnJheVswXSA9IHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbUlkOwotICAgIHN0cmVhbUlkQXJyYXlbMV0gPSAwOwotICAgIHBBdS0+Q1RTID0gdGltZTY0OwotICAgIHBBdS0+RFRTID0gdGltZTY0OwotCi0gICAgcFJlYWRlckNvbnRleHQtPm1TZWVraW5nID0gTTRPU0FfVFJVRTsKLSAgICBwUmVhZGVyQ29udGV4dC0+bVNlZWtUaW1lID0gdGltZTY0OwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX3Jlc2V0IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICBHZXRzIGFuIGFjY2VzcyB1bml0IChBVSkgZnJvbSB0aGUgc3RyZWFtIGhhbmRsZXIgc291cmNlLgotICogQG5vdGUgICAgQVUgaXMgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGFtb3VudCBvZiBkYXRhIHRvIGJlIGRlY29kZWQgYnkgZGVjb2RlcgotICoKLSAqIEBwYXJhbSAgIGNvbnRleHQ6ICAgICAgIChJTikgQ29udGV4dCBvZiB0aGUgcmVhZGVyCi0gKiBAcGFyYW0gICBwU3RyZWFtSGFuZGxlciAoSU4pIFRoZSBzdHJlYW0gaGFuZGxlciBvZiB0aGUgc3RyZWFtIHRvIG1ha2UganVtcAotICogQHBhcmFtICAgcEFjY2Vzc1VuaXQgICAgKEkvTylQb2ludGVyIHRvIGFuIGFjY2VzcyB1bml0IHRvIGZpbGwgd2l0aCByZWFkIGRhdGEKLSAqIEByZXR1cm4gICAgTTROT19FUlJPUiAgICAgICAgdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gICAgTTRFUlJfUEFSQU1FVEVSICAgYXQgbGVhc3Qgb25lIHBhcmFtZXRlciBpcyBub3QgcHJvcGVybHkgc2V0Ci0gKiBAcmV0dXJucyAgIE00RVJSX0FMTE9DICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZAotICogQHJldHVybnMgICBNNFdBUl9OT19NT1JFX0FVICB0aGVyZSBhcmUgbm8gbW9yZSBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXUoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQpIHsKLSAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0ICpwUmVhZGVyQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvck1wM1JlYWRlcl9Db250ZXh0Kiljb250ZXh0OwotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBdTsKLSAgICBNZWRpYUJ1ZmZlciAqbUF1ZGlvQnVmZmVyOwotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdSBzdGFydCIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocFJlYWRlckNvbnRleHQgPT0gMCksIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdTogaW52YWxpZCBjb250ZXh0Iik7Ci0gICAgTTRPU0FfREVCVUdfSUYxKChwU3RyZWFtSGFuZGxlciA9PSAwKSwgTTRFUlJfUEFSQU1FVEVSLAotICAgICAgICAiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1OiBpbnZhbGlkIHBvaW50ZXIgdG8gTTRfU3RyZWFtSGFuZGxlciIpOwotICAgIE00T1NBX0RFQlVHX0lGMSgocEFjY2Vzc1VuaXQgPT0gMCksICAgIE00RVJSX1BBUkFNRVRFUiwKLSAgICAgICAgIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdTogaW52YWxpZCBwb2ludGVyIHRvIE00X0FjY2Vzc1VuaXQiKTsKLQotICAgIGlmIChwU3RyZWFtSGFuZGxlciA9PSAoTTRfU3RyZWFtSGFuZGxlciopcFJlYWRlckNvbnRleHQtPlwKLSAgICAgICAgbUF1ZGlvU3RyZWFtSGFuZGxlcikgewotICAgICAgICBwQXUgPSAmcFJlYWRlckNvbnRleHQtPm1BdWRpb0F1OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXU6IFN0cmVhbUhhbmRsZXIgaXMgbm90IGtub3duXG4iKTsKLSAgICAgICAgcmV0dXJuIE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICBpZiAocFJlYWRlckNvbnRleHQtPm1TZWVraW5nKSB7Ci0gICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKHBSZWFkZXJDb250ZXh0LT5tU2Vla1RpbWUpOwotICAgIH0KLQotICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UtPnJlYWQoJm1BdWRpb0J1ZmZlciwgJm9wdGlvbnMpOwotCi0gICAgaWYgKG1BdWRpb0J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgocEF1LT5kYXRhQWRkcmVzcyA9PSBOVUxMKSB8fAotICAgICAgICAgICAgKHBBdS0+c2l6ZSA8IG1BdWRpb0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpKSB7Ci0gICAgICAgICAgICBpZiAocEF1LT5kYXRhQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZSgoTTRPU0FfSW50MzIqKXBBdS0+ZGF0YUFkZHJlc3MpOwotICAgICAgICAgICAgICAgIHBBdS0+ZGF0YUFkZHJlc3MgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEF1LT5kYXRhQWRkcmVzcyA9IChNNE9TQV9JbnQzMiopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICAgICAgICAgIChtQXVkaW9CdWZmZXItPnJhbmdlX2xlbmd0aCgpICsgMykgJiB+MHgzLAotICAgICAgICAgICAgICAgIE00UkVBREVSX01QMywgKE00T1NBX0NoYXIqKSJwQWNjZXNzVW5pdC0+bV9kYXRhQWRkcmVzcyIgKTsKLQotICAgICAgICAgICAgaWYgKHBBdS0+ZGF0YUFkZHJlc3MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXUgbWFsbG9jIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHBSZWFkZXJDb250ZXh0LT5tTWVkaWFTb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgICAgICAgICBwUmVhZGVyQ29udGV4dC0+bU1lZGlhU291cmNlLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgcFJlYWRlckNvbnRleHQtPm1EYXRhU291cmNlLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcEF1LT5zaXplID0gbUF1ZGlvQnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgbWVtY3B5KChNNE9TQV9NZW1BZGRyOClwQXUtPmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiltQXVkaW9CdWZmZXItPmRhdGEoKSArIG1BdWRpb0J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICBtQXVkaW9CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICBtQXVkaW9CdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsIChpbnQ2NF90KikmcEF1LT5DVFMpOwotCi0KLSAgICAgICAgcEF1LT5DVFMgPSBwQXUtPkNUUyAvIDEwMDA7IC8qY29udmVydGluZyB0aGUgbWljcm9zZWMgdG8gbWlsbGlzZWMgKi8KLSAgICAgICAgcEF1LT5EVFMgID0gcEF1LT5DVFM7Ci0gICAgICAgIHBBdS0+YXR0cmlidXRlID0gTTRTWVNfa0ZyYWdBdHRyT2s7Ci0gICAgICAgIG1BdWRpb0J1ZmZlci0+cmVsZWFzZSgpOwotCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXROZXh0QXUgQVUgQ1RTID0gJWxkIixwQXUtPkNUUyk7Ci0KLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fZGF0YUFkZHJlc3MgPSAoTTRPU0FfSW50OCopIHBBdS0+ZGF0YUFkZHJlc3M7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX3NpemUgPSBwQXUtPnNpemU7Ci0gICAgICAgIHBBY2Nlc3NVbml0LT5tX0NUUyA9IHBBdS0+Q1RTOwotICAgICAgICBwQWNjZXNzVW5pdC0+bV9EVFMgPSBwQXUtPkRUUzsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fYXR0cmlidXRlID0gcEF1LT5hdHRyaWJ1dGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldE5leHRBdSBFT1MgcmVhY2hlZC4iKTsKLSAgICAgICAgcEFjY2Vzc1VuaXQtPm1fc2l6ZT0wOwotICAgICAgICBlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgIH0KLSAgICBwQXUtPm5iRnJhZyA9IDA7Ci0KLSAgICBvcHRpb25zLmNsZWFyU2Vla1RvKCk7Ci0gICAgcFJlYWRlckNvbnRleHQtPm1TZWVraW5nID0gTTRPU0FfRkFMU0U7Ci0gICAgbUF1ZGlvQnVmZmVyID0gTlVMTDsKLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1IGVuZCIpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotZXh0ZXJuICJDIiB7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2UoCi0gICAgICAgIE00UkVBREVSX01lZGlhVHlwZSAqcE1lZGlhVHlwZSwKLSAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICoqcFJkckdsb2JhbEludGVyZmFjZSwKLSAgICAgICAgTTRSRUFERVJfRGF0YUludGVyZmFjZSAqKnBSZHJEYXRhSW50ZXJmYWNlKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0SW50ZXJmYWNlOiBiZWdpbiIpOwotICAgIC8qIElucHV0IHBhcmFtZXRlcnMgY2hlY2sgKi8KLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBNZWRpYVR5cGUsICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBSZHJHbG9iYWxJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwUmRyRGF0YUludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIFNBRkVfTUFMTE9DKCpwUmRyR2xvYmFsSW50ZXJmYWNlLCBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2UiKTsKLSAgICBTQUZFX01BTExPQygqcFJkckRhdGFJbnRlcmZhY2UsIE00UkVBREVSX0RhdGFJbnRlcmZhY2UsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2UiKTsKLQotICAgICpwTWVkaWFUeXBlID0gTTRSRUFERVJfa01lZGlhVHlwZU1QMzsKLQotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdENyZWF0ZSAgICAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX2NyZWF0ZTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3REZXN0cm95ICAgICAgPSBWaWRlb0VkaXRvck1wM1JlYWRlcl9kZXN0cm95OwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdE9wZW4gICAgICAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX29wZW47Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0Q2xvc2UgICAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfY2xvc2U7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0T3B0aW9uICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0T3B0aW9uOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdFNldE9wdGlvbiAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX3NldE9wdGlvbjsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RHZXROZXh0U3RyZWFtID0KLSAgICAgICAgVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dFN0cmVhbTsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RGaWxsQXVTdHJ1Y3QgPQotICAgICAgICBWaWRlb0VkaXRvck1wM1JlYWRlcl9maWxsQXVTdHJ1Y3Q7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0U3RhcnQgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICAoKnBSZHJHbG9iYWxJbnRlcmZhY2UpLT5tX3BGY3RTdG9wICAgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcFJkckdsb2JhbEludGVyZmFjZSktPm1fcEZjdEp1bXAgICAgICAgICA9IFZpZGVvRWRpdG9yTXAzUmVhZGVyX2p1bXA7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0UmVzZXQgICAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfcmVzZXQ7Ci0gICAgKCpwUmRyR2xvYmFsSW50ZXJmYWNlKS0+bV9wRmN0R2V0UHJldlJhcFRpbWUgPSBNNE9TQV9OVUxMOwotCi0gICAgKCpwUmRyRGF0YUludGVyZmFjZSktPm1fcEZjdEdldE5leHRBdSAgICAgID0gVmlkZW9FZGl0b3JNcDNSZWFkZXJfZ2V0TmV4dEF1OwotICAgICgqcFJkckRhdGFJbnRlcmZhY2UpLT5tX3JlYWRlckNvbnRleHQgICAgICA9IE00T1NBX05VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvck1wM1JlYWRlcl9nZXRJbnRlcmZhY2Ugbm8gZXJyb3IiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgU0FGRV9GUkVFKCpwUmRyR2xvYmFsSW50ZXJmYWNlKTsKLSAgICAgICAgU0FGRV9GUkVFKCpwUmRyRGF0YUludGVyZmFjZSk7Ci0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yTXAzUmVhZGVyX2dldEludGVyZmFjZTogZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLX0gIC8qIGV4dGVybiAiQyIgKi8KLX0gIC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVXRpbHMuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclV0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDI2NGEyZS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3Mvc3RhZ2VmcmlnaHRzaGVsbHMvc3JjL1ZpZGVvRWRpdG9yVXRpbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQGZpbGUgICBWaWRlb0VkaXRvclV0aWxzLmNwcAotKiBAYnJpZWYgIFN0YWdlRnJpZ2h0IHNoZWxsIFV0aWxpdGllcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlNGX3V0aWxzIgotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotCi0jaW5jbHVkZSAiVmlkZW9FZGl0b3JVdGlscy5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+Ci0KLS8qIEFuZHJvaWQgaW5jbHVkZXMqLwotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPG1lbW9yeS5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAgREVCVUcgTEVWRUwgU0VUVVAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIExPRzEgQUxPR0UgICAgLypFUlJPUlMgTG9nZ2luZyovCi0jZGVmaW5lIExPRzIgQUxPR0kgICAgLypXQVJOSU5HIExvZ2dpbmcqLwotI2RlZmluZSBMT0czIC8vQUxPR1YgIC8qQ09NTUVOVFMgTG9nZ2luZyovCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdm9pZCBkaXNwbGF5TWV0YURhdGEoY29uc3Qgc3A8TWV0YURhdGE+IG1ldGEpIHsKLQotICAgIGNvbnN0IGNoYXIqIGNoYXJEYXRhOwotICAgIGludDMyX3QgaW50MzJEYXRhOwotICAgIGludDY0X3QgaW50NjREYXRhOwotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCogZGF0YTsKLSAgICB2b2lkKiBwdHI7Ci0gICAgc2l6ZV90IHNpemU7Ci0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5TUlNRVR5cGUgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVdpZHRoICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUhlaWdodCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUlGcmFtZXNJbnRlcnZhbCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlJRnJhbWVzSW50ZXJ2YWwgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlTdHJpZGUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5U3RyaWRlICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5U2xpY2VIZWlnaHQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5U2xpY2VIZWlnaHQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5Q2hhbm5lbENvdW50ICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlTYW1wbGVSYXRlICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlCaXRSYXRlICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUVTRFMgdHlwZT0lZCBzaXplPSV6dSIsIHR5cGUsIHNpemUpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5QVZDQyBkYXRhPTB4JVggdHlwZT0lZCBzaXplPSV6dSIsCi0gICAgICAgICAgICAqKCh1bnNpZ25lZCBpbnQqKWRhdGEpLCB0eXBlLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVZvcmJpc0luZm8gdHlwZT0lZCBzaXplPSV6dSIsIHR5cGUsIHNpemUpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZERhdGEoa0tleVZvcmJpc0Jvb2tzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVZvcmJpc0Jvb2tzIHR5cGU9JWQgc2l6ZT0lenUiLCB0eXBlLCBzaXplKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5V2FudHNOQUxGcmFnbWVudHMsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5V2FudHNOQUxGcmFnbWVudHMgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlJc1N5bmNGcmFtZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUlzQ29kZWNDb25maWcsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5SXNDb2RlY0NvbmZpZyAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRpbWUsICZpbnQ2NERhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VGltZSAlbGxkIiwgaW50NjREYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5RHVyYXRpb24sICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5RHVyYXRpb24gJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvckZvcm1hdCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlDb2xvckZvcm1hdCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kUG9pbnRlcihrS2V5UGxhdGZvcm1Qcml2YXRlLCAmcHRyKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVBsYXRmb3JtUHJpdmF0ZSBwb2ludGVyPSVwIiwgcHRyKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5RGVjb2RlckNvbXBvbmVudCAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5QnVmZmVySUQsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5QnVmZmVySUQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5TWF4SW5wdXRTaXplICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgJmludDY0RGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlUaHVtYm5haWxUaW1lICVsbGQiLCBpbnQ2NERhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUFsYnVtLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5QWxidW0gJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5QXJ0aXN0LCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5QXJ0aXN0ICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUFsYnVtQXJ0aXN0LCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5QWxidW1BcnRpc3QgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5Q29tcG9zZXIsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlDb21wb3NlciAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlHZW5yZSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUdlbnJlICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleVRpdGxlLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VGl0bGUgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5WWVhciwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVllYXIgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5QWxidW1BcnQsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5QWxidW1BcnQgdHlwZT0lZCBzaXplPSV6dSIsIHR5cGUsIHNpemUpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUFsYnVtQXJ0TUlNRSAlcyIsIGNoYXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlBdXRob3IsICZjaGFyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlBdXRob3IgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5Q0RUcmFja051bWJlciwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleUNEVHJhY2tOdW1iZXIgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGlzY051bWJlciwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleURpc2NOdW1iZXIgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5RGF0ZSwgJmNoYXJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleURhdGUgJXMiLCBjaGFyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5V3JpdGVyLCAmY2hhckRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5V3JpdGVyICVzIiwgY2hhckRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlUaW1lU2NhbGUsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VGltZVNjYWxlICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVZpZGVvUHJvZmlsZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVZpZGVvTGV2ZWwsICZpbnQzMkRhdGEpKSB7Ci0gICAgICAgIExPRzEoImRpc3BsYXlNZXRhRGF0YSBrS2V5VmlkZW9MZXZlbCAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleTY0Qml0RmlsZU9mZnNldCwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXk2NEJpdEZpbGVPZmZzZXQgJWQiLCBpbnQzMkRhdGEpOwotICAgIH0KLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlGaWxlVHlwZSwgJmludDMyRGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlGaWxlVHlwZSAlZCIsIGludDMyRGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRyYWNrVGltZVN0YXR1cywgJmludDY0RGF0YSkpIHsKLSAgICAgICAgTE9HMSgiZGlzcGxheU1ldGFEYXRhIGtLZXlUcmFja1RpbWVTdGF0dXMgJWxsZCIsIGludDY0RGF0YSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVJlYWxUaW1lUmVjb3JkaW5nLCAmaW50MzJEYXRhKSkgewotICAgICAgICBMT0cxKCJkaXNwbGF5TWV0YURhdGEga0tleVJlYWxUaW1lUmVjb3JkaW5nICVkIiwgaW50MzJEYXRhKTsKLSAgICB9Ci19Ci0KLS8qKgotICogVGhpcyBjb2RlIHdhcyBleHRyYWN0ZWQgZnJvbSBTdGFnZUZyaWdodCBNUEVHNCB3cml0ZXIKLSAqIElzIGlzIHVzZWQgdG8gcGFyc2UgYW5kIGZvcm1hdCB0aGUgQVZDIGNvZGVjIHNwZWNpZmljIGluZm8gcmVjZWl2ZWQKLSAqIGZyb20gU3RhZ2VGcmlnaHQgZW5jb2RlcnMKLSAqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQgPSAweDA3Owotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05hbFVuaXRUeXBlUGljUGFyYW1TZXQgPSAweDA4Owotc3RydWN0IEFWQ1BhcmFtU2V0IHsKLSAgICBBVkNQYXJhbVNldCh1aW50MTZfdCBsZW5ndGgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEpCi0gICAgICAgIDogbUxlbmd0aChsZW5ndGgpLCBtRGF0YShkYXRhKSB7fQotCi0gICAgdWludDE2X3QgbUxlbmd0aDsKLSAgICBjb25zdCB1aW50OF90ICptRGF0YTsKLX07Ci1zdHJ1Y3QgQVZDQ29kZWNTcGVjaWZpY0NvbnRleHQgewotICAgIExpc3Q8QVZDUGFyYW1TZXQ+IG1TZXFQYXJhbVNldHM7Ci0gICAgTGlzdDxBVkNQYXJhbVNldD4gbVBpY1BhcmFtU2V0czsKLSAgICB1aW50OF90IG1Qcm9maWxlSWRjOwotICAgIHVpbnQ4X3QgbVByb2ZpbGVDb21wYXRpYmxlOwotICAgIHVpbnQ4X3QgbUxldmVsSWRjOwotfTsKLQotY29uc3QgdWludDhfdCAqcGFyc2VQYXJhbVNldChBVkNDb2RlY1NwZWNpZmljQ29udGV4dCogcEMsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW5ndGgsIGludCB0eXBlLCBzaXplX3QgKnBhcmFtU2V0TGVuKSB7Ci0gICAgQ0hFQ0sodHlwZSA9PSBrTmFsVW5pdFR5cGVTZXFQYXJhbVNldCB8fAotICAgICAgICAgIHR5cGUgPT0ga05hbFVuaXRUeXBlUGljUGFyYW1TZXQpOwotCi0gICAgc2l6ZV90IGJ5dGVzTGVmdCA9IGxlbmd0aDsKLSAgICB3aGlsZSAoYnl0ZXNMZWZ0ID4gNCAgJiYKLSAgICAgICAgICAgIG1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsICZkYXRhW2xlbmd0aCAtIGJ5dGVzTGVmdF0sIDQpKSB7Ci0gICAgICAgIC0tYnl0ZXNMZWZ0OwotICAgIH0KLSAgICBpZiAoYnl0ZXNMZWZ0IDw9IDQpIHsKLSAgICAgICAgYnl0ZXNMZWZ0ID0gMDsgLy8gTGFzdCBwYXJhbWV0ZXIgc2V0Ci0gICAgfQotICAgIGNvbnN0IHVpbnQ4X3QgKm5leHRTdGFydENvZGUgPSAmZGF0YVtsZW5ndGggLSBieXRlc0xlZnRdOwotICAgICpwYXJhbVNldExlbiA9IG5leHRTdGFydENvZGUgLSBkYXRhOwotICAgIGlmICgqcGFyYW1TZXRMZW4gPT0gMCkgewotICAgICAgICBBTE9HRSgiUGFyYW0gc2V0IGlzIG1hbGZvcm1lZCwgc2luY2UgaXRzIGxlbmd0aCBpcyAwIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIEFWQ1BhcmFtU2V0IHBhcmFtU2V0KCpwYXJhbVNldExlbiwgZGF0YSk7Ci0gICAgaWYgKHR5cGUgPT0ga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQpIHsKLSAgICAgICAgaWYgKCpwYXJhbVNldExlbiA8IDQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJTZXEgcGFyYW1ldGVyIHNldCBtYWxmb3JtZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQy0+bVNlcVBhcmFtU2V0cy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBwQy0+bVByb2ZpbGVJZGMgPSBkYXRhWzFdOwotICAgICAgICAgICAgcEMtPm1Qcm9maWxlQ29tcGF0aWJsZSA9IGRhdGFbMl07Ci0gICAgICAgICAgICBwQy0+bUxldmVsSWRjID0gZGF0YVszXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwQy0+bVByb2ZpbGVJZGMgIT0gZGF0YVsxXSB8fAotICAgICAgICAgICAgICAgIHBDLT5tUHJvZmlsZUNvbXBhdGlibGUgIT0gZGF0YVsyXSB8fAotICAgICAgICAgICAgICAgIHBDLT5tTGV2ZWxJZGMgIT0gZGF0YVszXSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJJbmNvbnNpc3RlbnQgcHJvZmlsZS9sZXZlbCBmb3VuZCBpbiBzZXEgcGFyYW1ldGVyIHNldHMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQy0+bVNlcVBhcmFtU2V0cy5wdXNoX2JhY2socGFyYW1TZXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDLT5tUGljUGFyYW1TZXRzLnB1c2hfYmFjayhwYXJhbVNldCk7Ci0gICAgfQotICAgIHJldHVybiBuZXh0U3RhcnRDb2RlOwotfQotCi1zdGF0dXNfdCBidWlsZEFWQ0NvZGVjU3BlY2lmaWNEYXRhKHVpbnQ4X3QgKipwT3V0cHV0RGF0YSwgc2l6ZV90ICpwT3V0cHV0U2l6ZSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIE1ldGFEYXRhICpwYXJhbSkKLXsKLSAgICAvL0FMT0dWKCJidWlsZEFWQ0NvZGVjU3BlY2lmaWNEYXRhIik7Ci0KLSAgICBpZiAoIChwT3V0cHV0RGF0YSA9PSBOVUxMKSB8fCAocE91dHB1dFNpemUgPT0gTlVMTCkgKSB7Ci0gICAgICAgIEFMT0dFKCJvdXRwdXQgaXMgaW52YWxpZCIpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgIH0KLQotICAgIGlmICgqcE91dHB1dERhdGEgIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQWxyZWFkeSBoYXZlIGNvZGVjIHNwZWNpZmljIGRhdGEiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgQUxPR0UoIkNvZGVjIHNwZWNpZmljIGRhdGEgbGVuZ3RoIHRvbyBzaG9ydDogJXp1Iiwgc2l6ZSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgfQotCi0gICAgLy8gRGF0YSBpcyBpbiB0aGUgZm9ybSBvZiBBVkNDb2RlY1NwZWNpZmljRGF0YQotICAgIGlmIChtZW1jbXAoIlx4MDBceDAwXHgwMFx4MDEiLCBkYXRhLCA0KSkgewotICAgICAgICAvLyAyIGJ5dGVzIGZvciBlYWNoIG9mIHRoZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aCBmaWVsZAotICAgICAgICAvLyBwbHVzIHRoZSA3IGJ5dGVzIGZvciB0aGUgaGVhZGVyCi0gICAgICAgIGlmIChzaXplIDwgNCArIDcpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb2RlYyBzcGVjaWZpYyBkYXRhIGxlbmd0aCB0b28gc2hvcnQ6ICV6dSIsIHNpemUpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgICpwT3V0cHV0U2l6ZSA9IHNpemU7Ci0gICAgICAgICpwT3V0cHV0RGF0YSA9ICh1aW50OF90KiltYWxsb2Moc2l6ZSk7Ci0gICAgICAgIG1lbWNweSgqcE91dHB1dERhdGEsIGRhdGEsIHNpemUpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgQVZDQ29kZWNTcGVjaWZpY0NvbnRleHQgY3R4OwotICAgIHVpbnQ4X3QgKm91dHB1dERhdGEgPSBOVUxMOwotICAgIHNpemVfdCBvdXRwdXRTaXplID0gMDsKLQotICAgIC8vIENoZWNrIGlmIHRoZSBkYXRhIGlzIHZhbGlkCi0gICAgdWludDhfdCB0eXBlID0ga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQ7Ci0gICAgYm9vbCBnb3RTcHMgPSBmYWxzZTsKLSAgICBib29sIGdvdFBwcyA9IGZhbHNlOwotICAgIGNvbnN0IHVpbnQ4X3QgKnRtcCA9IGRhdGE7Ci0gICAgY29uc3QgdWludDhfdCAqbmV4dFN0YXJ0Q29kZSA9IGRhdGE7Ci0gICAgc2l6ZV90IGJ5dGVzTGVmdCA9IHNpemU7Ci0gICAgc2l6ZV90IHBhcmFtU2V0TGVuID0gMDsKLSAgICBvdXRwdXRTaXplID0gMDsKLSAgICB3aGlsZSAoYnl0ZXNMZWZ0ID4gNCAmJiAhbWVtY21wKCJceDAwXHgwMFx4MDBceDAxIiwgdG1wLCA0KSkgewotICAgICAgICB0eXBlID0gKCoodG1wICsgNCkpICYgMHgxRjsKLSAgICAgICAgaWYgKHR5cGUgPT0ga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQpIHsKLSAgICAgICAgICAgIGlmIChnb3RQcHMpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiU1BTIG11c3QgY29tZSBiZWZvcmUgUFBTIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZ290U3BzKSB7Ci0gICAgICAgICAgICAgICAgZ290U3BzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5leHRTdGFydENvZGUgPSBwYXJzZVBhcmFtU2V0KCZjdHgsIHRtcCArIDQsIGJ5dGVzTGVmdCAtIDQsIHR5cGUsCi0gICAgICAgICAgICAgICAgJnBhcmFtU2V0TGVuKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGtOYWxVbml0VHlwZVBpY1BhcmFtU2V0KSB7Ci0gICAgICAgICAgICBpZiAoIWdvdFNwcykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJTUFMgbXVzdCBjb21lIGJlZm9yZSBQUFMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFnb3RQcHMpIHsKLSAgICAgICAgICAgICAgICBnb3RQcHMgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV4dFN0YXJ0Q29kZSA9IHBhcnNlUGFyYW1TZXQoJmN0eCwgdG1wICsgNCwgYnl0ZXNMZWZ0IC0gNCwgdHlwZSwKLSAgICAgICAgICAgICAgICAmcGFyYW1TZXRMZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIk9ubHkgU1BTIGFuZCBQUFMgTmFsIHVuaXRzIGFyZSBleHBlY3RlZCIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZXh0U3RhcnRDb2RlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNb3ZlIG9uIHRvIGZpbmQgdGhlIG5leHQgcGFyYW1ldGVyIHNldAotICAgICAgICBieXRlc0xlZnQgLT0gbmV4dFN0YXJ0Q29kZSAtIHRtcDsKLSAgICAgICAgdG1wID0gbmV4dFN0YXJ0Q29kZTsKLSAgICAgICAgb3V0cHV0U2l6ZSArPSAoMiArIHBhcmFtU2V0TGVuKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIG9uIHRoZSBudW1iZXIgb2Ygc2VxIHBhcmFtZXRlciBzZXRzCi0gICAgICAgIHNpemVfdCBuU2VxUGFyYW1TZXRzID0gY3R4Lm1TZXFQYXJhbVNldHMuc2l6ZSgpOwotICAgICAgICBpZiAoblNlcVBhcmFtU2V0cyA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bmQgbm90IGZpbmQgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuU2VxUGFyYW1TZXRzID4gMHgxRikgewotICAgICAgICAgICAgQUxPR0UoIlRvbyBtYW55IHNlcSBwYXJhbWV0ZXIgc2V0cyAoJXp1KSBmb3VuZCIsIG5TZXFQYXJhbVNldHMpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgb24gdGhlIG51bWJlciBvZiBwaWMgcGFyYW1ldGVyIHNldHMKLSAgICAgICAgc2l6ZV90IG5QaWNQYXJhbVNldHMgPSBjdHgubVBpY1BhcmFtU2V0cy5zaXplKCk7Ci0gICAgICAgIGlmIChuUGljUGFyYW1TZXRzID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VuZCBub3QgZmluZCBwaWN0dXJlIHBhcmFtZXRlciBzZXQiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5QaWNQYXJhbVNldHMgPiAweEZGKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVG9vIG1hbnkgcGljIHBhcmFtZXRlciBzZXRzICglenUpIGZvdW5kIiwgblBpY1BhcmFtU2V0cyk7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gSVNPIDE0NDk2LTE1OiBBVkMgZmlsZSBmb3JtYXQKLSAgICBvdXRwdXRTaXplICs9IDc7ICAvLyA3IG1vcmUgYnl0ZXMgaW4gdGhlIGhlYWRlcgotICAgIG91dHB1dERhdGEgPSAodWludDhfdCAqKW1hbGxvYyhvdXRwdXRTaXplKTsKLSAgICB1aW50OF90ICpoZWFkZXIgPSBvdXRwdXREYXRhOwotICAgIGhlYWRlclswXSA9IDE7ICAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbgotICAgIGhlYWRlclsxXSA9IGN0eC5tUHJvZmlsZUlkYzsgICAgICAgICAgIC8vIHByb2ZpbGUgaW5kaWNhdGlvbgotICAgIGhlYWRlclsyXSA9IGN0eC5tUHJvZmlsZUNvbXBhdGlibGU7ICAgIC8vIHByb2ZpbGUgY29tcGF0aWJpbGl0eQotICAgIGhlYWRlclszXSA9IGN0eC5tTGV2ZWxJZGM7Ci0KLSAgICAvLyA2LWJpdCAnMTExMTExJyBmb2xsb3dlZCBieSAyLWJpdCB0byBsZW5ndGhTaXplTWludXVzT25lCi0gICAgaW50MzJfdCB1c2UyQnl0ZU5hbExlbmd0aCA9IDA7Ci0gICAgaWYgKHBhcmFtICYmCi0gICAgICAgIHBhcmFtLT5maW5kSW50MzIoa0tleTJCeXRlTmFsTGVuZ3RoLCAmdXNlMkJ5dGVOYWxMZW5ndGgpICYmCi0gICAgICAgIHVzZTJCeXRlTmFsTGVuZ3RoKSB7Ci0gICAgICAgIGhlYWRlcls0XSA9IDB4ZmMgfCAxOyAgLy8gbGVuZ3RoIHNpemUgPT0gMiBieXRlcwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGhlYWRlcls0XSA9IDB4ZmMgfCAzOyAgLy8gbGVuZ3RoIHNpemUgPT0gNCBieXRlcwotICAgIH0KLQotICAgIC8vIDMtYml0ICcxMTEnIGZvbGxvd2VkIGJ5IDUtYml0IG51bVNlcXVlbmNlUGFyYW1ldGVyU2V0cwotICAgIGludCBuU2VxdWVuY2VQYXJhbVNldHMgPSBjdHgubVNlcVBhcmFtU2V0cy5zaXplKCk7Ci0gICAgaGVhZGVyWzVdID0gMHhlMCB8IG5TZXF1ZW5jZVBhcmFtU2V0czsKLSAgICBoZWFkZXIgKz0gNjsKLSAgICBmb3IgKExpc3Q8QVZDUGFyYW1TZXQ+OjppdGVyYXRvciBpdCA9IGN0eC5tU2VxUGFyYW1TZXRzLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBjdHgubVNlcVBhcmFtU2V0cy5lbmQoKTsgKytpdCkgewotICAgICAgICAvLyAxNi1iaXQgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBsZW5ndGgKLSAgICAgICAgdWludDE2X3Qgc2VxUGFyYW1TZXRMZW5ndGggPSBpdC0+bUxlbmd0aDsKLSAgICAgICAgaGVhZGVyWzBdID0gc2VxUGFyYW1TZXRMZW5ndGggPj4gODsKLSAgICAgICAgaGVhZGVyWzFdID0gc2VxUGFyYW1TZXRMZW5ndGggJiAweGZmOwotICAgICAgICAvL0FMT0dFKCIjIyMgU1BTICVkICVkICVkIiwgc2VxUGFyYW1TZXRMZW5ndGgsIGhlYWRlclswXSwgaGVhZGVyWzFdKTsKLQotICAgICAgICAvLyBTUFMgTkFMIHVuaXQgKHNlcXVlbmNlIHBhcmFtZXRlciBsZW5ndGggYnl0ZXMpCi0gICAgICAgIG1lbWNweSgmaGVhZGVyWzJdLCBpdC0+bURhdGEsIHNlcVBhcmFtU2V0TGVuZ3RoKTsKLSAgICAgICAgaGVhZGVyICs9ICgyICsgc2VxUGFyYW1TZXRMZW5ndGgpOwotICAgIH0KLQotICAgIC8vIDgtYml0IG5QaWN0dXJlUGFyYW1ldGVyU2V0cwotICAgIGludCBuUGljdHVyZVBhcmFtU2V0cyA9IGN0eC5tUGljUGFyYW1TZXRzLnNpemUoKTsKLSAgICBoZWFkZXJbMF0gPSBuUGljdHVyZVBhcmFtU2V0czsKLSAgICBoZWFkZXIgKz0gMTsKLSAgICBmb3IgKExpc3Q8QVZDUGFyYW1TZXQ+OjppdGVyYXRvciBpdCA9IGN0eC5tUGljUGFyYW1TZXRzLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBjdHgubVBpY1BhcmFtU2V0cy5lbmQoKTsgKytpdCkgewotICAgICAgICAvLyAxNi1iaXQgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aAotICAgICAgICB1aW50MTZfdCBwaWNQYXJhbVNldExlbmd0aCA9IGl0LT5tTGVuZ3RoOwotICAgICAgICBoZWFkZXJbMF0gPSBwaWNQYXJhbVNldExlbmd0aCA+PiA4OwotICAgICAgICBoZWFkZXJbMV0gPSBwaWNQYXJhbVNldExlbmd0aCAmIDB4ZmY7Ci0vL0FMT0dFKCIjIyMgUFBTICVkICVkICVkIiwgcGljUGFyYW1TZXRMZW5ndGgsIGhlYWRlclswXSwgaGVhZGVyWzFdKTsKLQotICAgICAgICAvLyBQUFMgTmFsIHVuaXQgKHBpY3R1cmUgcGFyYW1ldGVyIHNldCBsZW5ndGggYnl0ZXMpCi0gICAgICAgIG1lbWNweSgmaGVhZGVyWzJdLCBpdC0+bURhdGEsIHBpY1BhcmFtU2V0TGVuZ3RoKTsKLSAgICAgICAgaGVhZGVyICs9ICgyICsgcGljUGFyYW1TZXRMZW5ndGgpOwotICAgIH0KLQotICAgICpwT3V0cHV0U2l6ZSA9IG91dHB1dFNpemU7Ci0gICAgKnBPdXRwdXREYXRhID0gb3V0cHV0RGF0YTsKLSAgICByZXR1cm4gT0s7Ci19Ci19Ly8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlOTE3MzEuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRGVjb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgdmlkZW8gZGVjb2RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZJREVPRURJVE9SX1ZJREVPREVDT0RFUiIKLS8qKioqKioqKioqKioqKioqKioqCi0gKiAgICAgSEVBREVSUyAgICAgKgotICoqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVXRpbHMuaCIKLSNpbmNsdWRlICJNNFZEX1Rvb2xzLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0vKioqKioqKioqKioqKioqKioqKioKLSAqICAgREVGSU5JVElPTlMgICAgKgotICoqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNQVhfREVDX0JVRkZFUlMgMTAKLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgIFNPVVJDRSBDTEFTUyAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotc3RhdGljIE00T1NBX0VSUiBjb3B5QnVmZmVyVG9RdWV1ZSgKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0LAotICAgIE1lZGlhQnVmZmVyKiBwRGVjb2RlZEJ1ZmZlcik7Ci0KLWNsYXNzIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCwKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NvZGVjVHlwZSBjb2RlY1R5cGUsCi0gICAgICAgICAgICB2b2lkICpkZWNvZGVyU2hlbGxDb250ZXh0KTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKLQotICAgIHByb3RlY3RlZCA6Ci0gICAgICAgIHZpcnR1YWwgflZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlKCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzcDxNZXRhRGF0YT4gbUZvcm1hdDsKLSAgICAgICAgTWVkaWFCdWZmZXIqIG1CdWZmZXI7Ci0gICAgICAgIE1lZGlhQnVmZmVyR3JvdXAqIG1Hcm91cDsKLSAgICAgICAgTXV0ZXggbUxvY2s7Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIG1wRGVjU2hlbGxDb250ZXh0OwotICAgICAgICBpbnQzMl90IG1NYXhBVVNpemU7Ci0gICAgICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0gICAgICAgIFZJREVPRURJVE9SX0NvZGVjVHlwZSBtQ29kZWNUeXBlOwotCi0gICAgICAgIC8vIERvbid0IGNhbGwgbWUKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UoY29uc3QgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UgJik7Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlICZvcGVyYXRvcj0oCi0gICAgICAgICAgICBjb25zdCBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSAmKTsKLX07Ci0KLVZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlOjpWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQsIFZJREVPRURJVE9SX0NvZGVjVHlwZSBjb2RlY1R5cGUsCi0gICAgICAgIHZvaWQgKmRlY29kZXJTaGVsbENvbnRleHQpIDoKLSAgICAgICAgbUZvcm1hdChmb3JtYXQpLAotICAgICAgICBtQnVmZmVyKE5VTEwpLAotICAgICAgICBtR3JvdXAoTlVMTCksCi0gICAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgICAgbUNvZGVjVHlwZShjb2RlY1R5cGUpIHsKLSAgICBtcERlY1NoZWxsQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KikgZGVjb2RlclNoZWxsQ29udGV4dDsKLX0KLQotVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2U6On5WaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZSgpIHsKLSAgICBpZiAobVN0YXJ0ZWQgPT0gdHJ1ZSkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZTo6c3RhcnQoCi0gICAgICAgIE1ldGFEYXRhICpwYXJhbXMpIHsKLQotICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgaWYgKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmbU1heEFVU2l6ZSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZmluZCBrS2V5TWF4SW5wdXRTaXplIik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgICAgIGlmIChtR3JvdXAgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIkZBVEFMOiBtZW1vcnkgbGltaXRhdGlvbiAhICIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIobU1heEFVU2l6ZSkpOwotCi0gICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZTo6c3RvcCgpIHsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgewotCi0gICAgICAgICAgICAvLyBGSVhNRToKLSAgICAgICAgICAgIC8vIFdoeSBkbyB3ZSBuZWVkIHRvIGNoZWNrIG9uIHRoZSByZWYgY291bnQ/Ci0gICAgICAgICAgICBpbnQgcmVmX2NvdW50ID0gbUJ1ZmZlci0+cmVmY291bnQoKTsKLSAgICAgICAgICAgIEFMT0dWKCJNZWRpYUJ1ZmZlciByZWZjb3VudCBpcyAlZCIscmVmX2NvdW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmX2NvdW50OyArK2kpIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgICAgIG1Hcm91cCA9IE5VTEw7Ci0gICAgICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLQotICAgIHJldHVybiBtRm9ybWF0OwotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRGVjb2RlclNvdXJjZTo6cmVhZChNZWRpYUJ1ZmZlcioqIGJ1ZmZlcl9vdXQsCi0gICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwotICAgIGlmIChvcHRpb25zICE9IE5VTEwpIHsKLSAgICAgICAgaW50NjRfdCB0aW1lX3VzOwotICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7Ci0gICAgICAgIG9wdGlvbnMtPmdldFNlZWtUbygmdGltZV91cywgJm1vZGUpOwotICAgICAgICBpZiAobW9kZSAhPSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQykgewotICAgICAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgcmVhZCBvcHRpb25zIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgTTRPU0FfRVJSIGVycjsKLSAgICAgICAgTTRPU0FfSW50MzIgcmFwVGltZSA9IHRpbWVfdXMgLyAxMDAwOwotCi0gICAgICAgIC8qLS0tIFJldHJpZXZlIHRoZSBwcmV2aW91cyBSQVAgdGltZSAtLS0qLwotICAgICAgICBlcnIgPSBtcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyR2xvYmFsLT5tX3BGY3RHZXRQcmV2UmFwVGltZSgKLSAgICAgICAgICAgICAgICAgIG1wRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXItPm1fcmVhZGVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKiltcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLAotICAgICAgICAgICAgICAgICAgJnJhcFRpbWUpOwotCi0gICAgICAgIGlmIChlcnIgPT0gTTRXQVJfUkVBREVSX0lORk9STUFUSU9OX05PVF9QUkVTRU5UKSB7Ci0gICAgICAgICAgICAvKiBObyBSQVAgdGFibGUsIGp1bXAgYmFja3dhcmQgYW5kIHByZWRlY29kZSAqLwotICAgICAgICAgICAgcmFwVGltZSAtPSA0MDAwMDsKLSAgICAgICAgICAgIGlmKHJhcFRpbWUgPCAwKSByYXBUaW1lID0gMDsKLSAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJnZXQgcmFwIHRpbWUgZXJyb3IgPSAweCV4XG4iLCAodWludDMyX3QpZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyID0gbXBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlckdsb2JhbC0+bV9wRmN0SnVtcCgKLSAgICAgICAgICAgICAgICAgICBtcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyLT5tX3JlYWRlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgKE00X1N0cmVhbUhhbmRsZXIqKW1wRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgJnJhcFRpbWUpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJqdW1wIGVyciA9IDB4JXhcbiIsICh1aW50MzJfdCllcnIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpidWZmZXJfb3V0ID0gTlVMTDsKLQotICAgIE00T1NBX0VSUiBsZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7Ci0gICAgaWYgKGxlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGxlcnI7Ci0gICAgfQotICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5jbGVhcigpOyAgLy8gY2xlYXIgYWxsIHRoZSBtZXRhIGRhdGEKLQotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAvL2dldE5leHQgQVUgZnJvbSByZWFkZXIuCi0gICAgICAgIE00X0FjY2Vzc1VuaXQqIHBBY2Nlc3NVbml0ID0gbXBEZWNTaGVsbENvbnRleHQtPm1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGU7Ci0gICAgICAgIGxlcnIgPSBtcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyLT5tX3BGY3RHZXROZXh0QXUoCi0gICAgICAgICAgICAgICAgICAgbXBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlci0+bV9yZWFkZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgIChNNF9TdHJlYW1IYW5kbGVyKiltcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLAotICAgICAgICAgICAgICAgICAgIHBBY2Nlc3NVbml0KTsKLSAgICAgICAgaWYgKGxlcnIgPT0gTTRXQVJfTk9fREFUQV9ZRVQgfHwgbGVyciA9PSBNNFdBUl9OT19NT1JFX0FVKSB7Ci0gICAgICAgICAgICAqYnVmZmVyX291dCA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vY29weSB0aGUgcmVhZGVyIEFVIGJ1ZmZlciB0byBtQnVmZmVyCi0gICAgICAgIE00T1NBX1VJbnQzMiBsU2l6ZSAgPSAocEFjY2Vzc1VuaXQtPm1fc2l6ZSA+IChNNE9TQV9VSW50MzIpbU1heEFVU2l6ZSlcCi0gICAgICAgICAgICA/IChNNE9TQV9VSW50MzIpbU1heEFVU2l6ZSA6IHBBY2Nlc3NVbml0LT5tX3NpemU7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKW1CdWZmZXItPmRhdGEoKSwodm9pZCAqKXBBY2Nlc3NVbml0LT5tX2RhdGFBZGRyZXNzLAotICAgICAgICAgICAgbFNpemUpOwotCi0gICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBsU2l6ZSk7Ci0gICAgICAgIGludDY0X3QgZnJhbWVUaW1lVXMgPSAoaW50NjRfdCkgKHBBY2Nlc3NVbml0LT5tX0NUUyAqIDEwMDApOwotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIGZyYW1lVGltZVVzKTsKLQotICAgICAgICAvLyBSZXBsYWNlIHRoZSBBVSBzdGFydCBjb2RlIGZvciBIMjY0Ci0gICAgICAgIGlmIChWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjID09IG1Db2RlY1R5cGUpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0gICAgICAgICAgICBkYXRhWzBdPTA7Ci0gICAgICAgICAgICBkYXRhWzFdPTA7Ci0gICAgICAgICAgICBkYXRhWzJdPTA7Ci0gICAgICAgICAgICBkYXRhWzNdPTE7Ci0gICAgICAgIH0KLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwKLSAgICAgICAgICAgIChwQWNjZXNzVW5pdC0+bV9hdHRyaWJ1dGUgPT0gMHgwNCk/IDEgOiAwKTsKLSAgICAgICAgKmJ1ZmZlcl9vdXQgPSBtQnVmZmVyOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBNNE9TQV9VSW50MzIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgIFZJREVPRURJVE9SX1ZJREVPX0JpdHN0cmVhbV9jdHh0KiBwYXJzaW5nQ3R4dCwgTTRPU0FfVUludDMyIG5iX2JpdHMpIHsKLSAgICByZXR1cm4gKE00VkRfVG9vbHNfR2V0Qml0c0Zyb21NZW1vcnkoKE00VlNfQml0c3RyZWFtX2N0eHQqKSBwYXJzaW5nQ3R4dCwKLSAgICAgICAgICAgIG5iX2JpdHMpKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2ludGVybmFsUGFyc2VWaWRlb0RTSShNNE9TQV9VSW50OCogcFZvbCwKLSAgICAgICAgTTRPU0FfSW50MzIgYVZvbFNpemUsIE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyogcERjaSwKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvU2l6ZSogcFZpZGVvU2l6ZSkgewotCi0gICAgVklERU9FRElUT1JfVklERU9fQml0c3RyZWFtX2N0eHQgcGFyc2luZ0N0eHQ7Ci0gICAgTTRPU0FfVUludDMyIGNvZGUsIGo7Ci0gICAgTTRPU0FfTWVtQWRkcjggc3RhcnQ7Ci0gICAgTTRPU0FfVUludDggaTsKLSAgICBNNE9TQV9VSW50MzIgdGltZV9pbmNyX2xlbmd0aDsKLSAgICBNNE9TQV9VSW50OCB2b2xfdmVyaWQ9MCwgYl9oaWVyYXJjaHlfdHlwZTsKLQotICAgIC8qIFBhcnNpbmcgdmFyaWFibGVzICovCi0gICAgTTRPU0FfVUludDggdmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID0gMDsKLSAgICBNNE9TQV9VSW50OCBzcHJpdGVfZW5hYmxlID0gMDsKLSAgICBNNE9TQV9VSW50OCByZWR1Y2VkX3Jlc29sdXRpb25fdm9wX2VuYWJsZSA9IDA7Ci0gICAgTTRPU0FfVUludDggc2NhbGFiaWxpdHkgPSAwOwotICAgIE00T1NBX1VJbnQ4IGVuaGFuY2VtZW50X3R5cGUgPSAwOwotICAgIE00T1NBX1VJbnQ4IGNvbXBsZXhpdHlfZXN0aW1hdGlvbl9kaXNhYmxlID0gMDsKLSAgICBNNE9TQV9VSW50OCBpbnRlcmxhY2VkID0gMDsKLSAgICBNNE9TQV9VSW50OCBzcHJpdGVfd2FycGluZ19wb2ludHMgPSAwOwotICAgIE00T1NBX1VJbnQ4IHNwcml0ZV9icmlnaHRuZXNzX2NoYW5nZSA9IDA7Ci0gICAgTTRPU0FfVUludDggcXVhbnRfcHJlY2lzaW9uID0gMDsKLQotICAgIC8qIEZpbGwgdGhlIHN0cnVjdHVyZSB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyAqLwotICAgIHBWaWRlb1NpemUtPm1fdWlXaWR0aCAgICAgID0gMDsKLSAgICBwVmlkZW9TaXplLT5tX3VpSGVpZ2h0ICAgICA9IDA7Ci0KLSAgICBwRGNpLT51aVRpbWVTY2FsZSAgICAgICAgICA9IDA7Ci0gICAgcERjaS0+dWlQcm9maWxlICAgICAgICAgICAgPSAwOwotICAgIHBEY2ktPnVpVXNlT2ZSZXN5bmNoTWFya2VyID0gMDsKLSAgICBwRGNpLT5iRGF0YVBhcnRpdGlvbiAgICAgICA9IE00T1NBX0ZBTFNFOwotICAgIHBEY2ktPmJVc2VPZlJWTEMgICAgICAgICAgID0gTTRPU0FfRkFMU0U7Ci0KLSAgICAvKiBSZXNldCB0aGUgYml0c3RyZWFtIGNvbnRleHQgKi8KLSAgICBwYXJzaW5nQ3R4dC5zdHJlYW1fYnl0ZSA9IDA7Ci0gICAgcGFyc2luZ0N0eHQuc3RyZWFtX2luZGV4ID0gODsKLSAgICBwYXJzaW5nQ3R4dC5pbiA9IChNNE9TQV9NZW1BZGRyOCkgcFZvbDsKLQotICAgIHN0YXJ0ID0gKE00T1NBX01lbUFkZHI4KSBwVm9sOwotCi0gICAgLyogU3RhcnQgcGFyc2luZyAqLwotICAgIHdoaWxlIChwYXJzaW5nQ3R4dC5pbiAtIHN0YXJ0IDwgYVZvbFNpemUpIHsKLSAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KCZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgIGlmIChjb2RlID09IDApIHsKLSAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsIDgpOwotICAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgmcGFyc2luZ0N0eHQsOCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCBjb2RlIGZvdW5kICovCi0gICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgOCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gMHgyMC4uMHgyRiA6IHZpZGVvX29iamVjdF9sYXllcl9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChjb2RlID4gMHgxRikgJiYgKGNvZGUgPCAweDMwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xfdmVyaWQgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDE1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAzMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVlZCB0byBzYXZlIGl0IGZvciB2b3AgcGFyc2luZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgICAgLyogb25seSByZWN0YW5ndWxhciBjYXNlIHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPnVpVGltZVNjYWxlID0gY29kZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcHV0ZXMgdGltZSBpbmNyZW1lbnQgbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgICAgICAgICBqICAgID0gY29kZSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IDMyKSAmJiAoaiAhPSAwKTsgaiA+Pj0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9pbmNyX2xlbmd0aCA9IChpID09IDApID8gMSA6IGk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIHRpbWVfaW5jcl9sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMSkgeyAvKiAxID0gQmluYXJ5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBNYXJrZXIgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTMpOy8qIFdpZHRoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaWRlb1NpemUtPm1fdWlXaWR0aCA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEzKTsvKiBIZWlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpZGVvU2l6ZS0+bV91aUhlaWdodCA9IGNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogaW50ZXJsYWNlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogT0JNQyBkaXNhYmxlICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZvbF92ZXJpZCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHNwcml0ZSBlbmFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfZW5hYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAyKTsvKiBzcHJpdGUgZW5hYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX2VuYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzcHJpdGVfZW5hYmxlID09IDEpIHx8IChzcHJpdGVfZW5hYmxlID09IDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwcml0ZV9lbmFibGUgIT0gMikgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMTMpOy8qIHNwcml0ZSB3aWR0aCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7Lyogc3ByaXRlIGhlaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7Lyogc3ByaXRlIGwgY29vcmRpbmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIE1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxMyk7Lyogc3ByaXRlIHRvcCBjb29yZGluYXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogTWFya2VyIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA2KTsvKiBzcHJpdGUgd2FycGluZyBwb2ludHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVfd2FycGluZ19wb2ludHMgPSAoTTRPU0FfVUludDgpY29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMik7Lyogc3ByaXRlIHdhcnBpbmcgYWNjdXJhY3kgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7Lyogc3ByaXRlIGJyaWdodG5lc3MgY2hhbmdlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX2JyaWdodG5lc3NfY2hhbmdlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwcml0ZV9lbmFibGUgIT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodm9sX3ZlcmlkICE9IDEpICYmICh2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgIT0gMCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHNhZGN0IGRpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7IC8qIG5vdCA4IGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOy8qIHF1YW50IHByZWNpc2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50X3ByZWNpc2lvbiA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA0KTsvKiBiaXRzIHBlciBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBncmV5c2NhbGUgbm90IHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHF1YW50IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIGxvYWQgaW50cmEgcXVhbnQgbWF0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsvKiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICAgID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCA2NCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogbG9hZCBub24gaW50cmEgcXVhbnQgbWF0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsvKiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICAgID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCA2NCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbF92ZXJpZCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHF1YXJ0ZXIgc2FtcGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIGNvbXBsZXhpdHkgZXN0aW1hdGlvbiBkaXNhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4aXR5X2VzdGltYXRpb25fZGlzYWJsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiByZXN5bmMgbWFya2VyIGRpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPnVpVXNlT2ZSZXN5bmNoTWFya2VyID0gKGNvZGUpID8gMCA6IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIGRhdGEgcGFydGl0aW9ubmVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGNpLT5iRGF0YVBhcnRpdGlvbiA9IChjb2RlKSA/IE00T1NBX1RSVUUgOiBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHJldmVyc2libGUgVkxDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERjaS0+YlVzZU9mUlZMQyA9IChjb2RlKSA/IE00T1NBX1RSVUUgOiBNNE9TQV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbF92ZXJpZCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIG5ld3ByZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiBNNEVSUl9QQVJBTUVURVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZWRfcmVzb2x1dGlvbl92b3BfZW5hYmxlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIHNjYWxhYmlsaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJpbGl0eSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogaGllcmFyY2h5IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX2hpZXJhcmNoeV90eXBlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDQpOy8qIHJlZiBsYXllciBpZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiByZWYgc2FtcGxpbmcgZGlyZWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDUpOy8qIGhvciBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsvKiBob3Igc2FtcGxpbmcgZmFjdG9yIE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7LyogdmVydCBzYW1wbGluZyBmYWN0b3IgTiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA1KTsvKiB2ZXJ0IHNhbXBsaW5nIGZhY3RvciBNICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDEpOy8qIGVuaGFuY2VtZW50IHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmhhbmNlbWVudF90eXBlID0gKE00T1NBX1VJbnQ4KWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghYl9oaWVyYXJjaHlfdHlwZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPT0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiB1c2UgcmVmIHNoYXBlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgMSk7LyogdXNlIHJlZiB0ZXh0dXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJzaW5nQ3R4dCwgNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLSAweEIwIDogdmlzdWFsX29iamVjdF9zZXF1ZW5jZV9zdGFydF9jb2RlIC0tLS0tICovCi0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjb2RlID09IDB4QjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDgpOy8qIHByb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEY2ktPnVpUHJvZmlsZSA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gMHhCNSA6IHZpc3VhbF9vYmplY3Rfc3RhcnRfY29kZSAtLS0tLSAqLwotCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoY29kZSA9PSAweEI1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfR2V0Qml0c0Zyb21NZW1vcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAxKTsvKiBpcyBvYmplY3QgbGF5ZXIgaWRlbnRpZmllciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCA0KTsgLyogdmlzdWFsIG9iamVjdCB2ZXJpZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbF92ZXJpZCA9IChNNE9TQV9VSW50OCljb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9HZXRCaXRzRnJvbU1lbW9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnNpbmdDdHh0LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0dldEJpdHNGcm9tTWVtb3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyc2luZ0N0eHQsIDcpOyAvKiBSZWFsaWduIG9uIGJ5dGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xfdmVyaWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogLS0tLS0gZW5kIC0tLS0tICovCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjb2RlID4+IDIpID09IDB4MjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEgyNjMgLi4uLT4gd3JvbmcqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00VklGSV9VSW50OCBNNFZJRklfU2VtaXBsYW5hcllWVTQyMHRvWVVWNDIwKHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgTTRWSUZJX1VJbnQ4ICppbnl1diwgTTRWSUZJX0ltYWdlUGxhbmUgKlBsYW5lT3V0ICkgewotICAgIE00VklGSV9VSW50OCByZXR1cm5fY29kZSA9IE00VklGSV9PSzsKLSAgICBNNFZJRklfVUludDggKm91dHl1diA9Ci0gICAgICAgICgoTTRWSUZJX1VJbnQ4KikmKFBsYW5lT3V0WzBdLnBhY19kYXRhW1BsYW5lT3V0WzBdLnVfdG9wbGVmdF0pKTsKLSAgICBpbnQzMl90IHdpZHRoID0gUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICBpbnQzMl90IGhlaWdodCA9IFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgaW50MzJfdCBvdXRZc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotICAgIHVpbnQzMl90ICpvdXR5ID0gICh1aW50MzJfdCAqKSBvdXR5dXY7Ci0gICAgdWludDE2X3QgKm91dGNiID0KLSAgICAgICAgKHVpbnQxNl90ICopICYoUGxhbmVPdXRbMV0ucGFjX2RhdGFbUGxhbmVPdXRbMV0udV90b3BsZWZ0XSk7Ci0gICAgdWludDE2X3QgKm91dGNyID0KLSAgICAgICAgKHVpbnQxNl90ICopICYoUGxhbmVPdXRbMl0ucGFjX2RhdGFbUGxhbmVPdXRbMl0udV90b3BsZWZ0XSk7Ci0KLSAgICAvKiBZIGNvcHlpbmcgKi8KLSAgICBtZW1jcHkoKHZvaWQgKilvdXR5LCAodm9pZCAqKWlueXV2LCBvdXRZc2l6ZSk7Ci0KLSAgICAvKiBVICYgViBjb3B5aW5nICovCi0gICAgdWludDMyX3QgKmlueXV2XzQgPSAodWludDMyX3QgKikgKGlueXV2ICsgb3V0WXNpemUpOwotICAgIGZvciAoaW50MzJfdCBpID0gaGVpZ2h0ID4+IDE7IGkgPiAwOyAtLWkpIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGogPSB3aWR0aCA+PiAyOyBqID4gMDsgLS1qKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gKmlueXV2XzQrKzsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXBVID0gdGVtcCAmIDB4RkY7Ci0gICAgICAgICAgICB0ZW1wVSA9IHRlbXBVIHwgKCh0ZW1wID4+IDgpICYgMHhGRjAwKTsKLQotICAgICAgICAgICAgdWludDMyX3QgdGVtcFYgPSAodGVtcCA+PiA4KSAmIDB4RkY7Ci0gICAgICAgICAgICB0ZW1wViA9IHRlbXBWIHwgKCh0ZW1wID4+IDE2KSAmIDB4RkYwMCk7Ci0KLSAgICAgICAgICAgIC8vIEZsaXAgVSBhbmQgVgotICAgICAgICAgICAgKm91dGNiKysgPSB0ZW1wVjsKLSAgICAgICAgICAgICpvdXRjcisrID0gdGVtcFU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldHVybl9jb2RlOwotfQotdm9pZCBsb2dTdXBwb3J0RGVjb2RlcnNBbmRDYXBhYmlsaXRpZXMoTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMqIGRlY29kZXJzKSB7Ci0gICAgVmlkZW9EZWNvZGVyICpwRGVjb2RlcjsKLSAgICBWaWRlb0NvbXBvbmVudENhcGFiaWxpdGllcyAqcE9teENvbXBvbmVudHMgPSBOVUxMOwotICAgIFZpZGVvUHJvZmlsZUxldmVsICpwUHJvZmlsZUxldmVsID0gTlVMTDsKLSAgICBwRGVjb2RlciA9IGRlY29kZXJzLT5kZWNvZGVyOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpPCBkZWNvZGVycy0+ZGVjb2Rlck51bWJlcjsgaSsrKSB7Ci0gICAgICAgIEFMT0dWKCJTdXBwb3J0ZWQgQ29kZWNbJWRdIDolZCIsIGksIHBEZWNvZGVyLT5jb2RlYyk7Ci0gICAgICAgIHBPbXhDb21wb25lbnRzID0gcERlY29kZXItPmNvbXBvbmVudDsKLSAgICAgICAgZm9yKHNpemVfdCBqID0gMDsgaiA8ICBwRGVjb2Rlci0+Y29tcG9uZW50TnVtYmVyOyBqKyspIHsKLSAgICAgICAgICAgcFByb2ZpbGVMZXZlbCA9IHBPbXhDb21wb25lbnRzLT5wcm9maWxlTGV2ZWw7Ci0gICAgICAgICAgIEFMT0dWKCItLT5jb21wb25lbnQgJWQiLCBqKTsKLSAgICAgICAgICAgZm9yKHNpemVfdCBrID0gMDsgayA8IHBPbXhDb21wb25lbnRzLT5wcm9maWxlTnVtYmVyOyBrKyspIHsKLSAgICAgICAgICAgICAgIEFMT0dWKCItLT5wcm9maWxlOiVsZCBtYXhMZXZlbDolbGQiLCBwUHJvZmlsZUxldmVsLT5tUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICBwUHJvZmlsZUxldmVsLT5tTGV2ZWwpOwotICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbCsrOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHBPbXhDb21wb25lbnRzKys7Ci0gICAgICAgIH0KLSAgICAgICAgcERlY29kZXIrKzsKLSAgICB9Ci19Ci0KLU00T1NBX0VSUiBxdWVyeVZpZGVvRGVjb2RlckNhcGFiaWxpdGllcwotICAgIChNNERFQ09ERVJfVmlkZW9EZWNvZGVycyoqIGRlY29kZXJzKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgY29uc3QgY2hhciAqa01pbWVUeXBlc1tdID0gewotICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LAotICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzCi0gICAgfTsKLQotICAgIGludDMyX3Qgc3VwcG9ydEZvcm1hdHMgPSBzaXplb2Yoa01pbWVUeXBlcykgLyBzaXplb2Yoa01pbWVUeXBlc1swXSk7Ci0gICAgTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMgKnBEZWNvZGVyczsKLSAgICBWaWRlb0RlY29kZXIgKnBEZWNvZGVyOwotICAgIFZpZGVvQ29tcG9uZW50Q2FwYWJpbGl0aWVzICpwT214Q29tcG9uZW50cyA9IE5VTEw7Ci0gICAgVmlkZW9Qcm9maWxlTGV2ZWwgKnBQcm9maWxlTGV2ZWwgPSBOVUxMOwotICAgIE9NWENsaWVudCBjbGllbnQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7Ci0gICAgU0FGRV9NQUxMT0MocERlY29kZXJzLCBNNERFQ09ERVJfVmlkZW9EZWNvZGVycywgMSwgIlZpZGVvRGVjb2RlcnMiKTsKLSAgICBTQUZFX01BTExPQyhwRGVjb2RlciwgVmlkZW9EZWNvZGVyLCBzdXBwb3J0Rm9ybWF0cywKLSAgICAgICAgIlZpZGVvRGVjb2RlciIpOwotICAgIHBEZWNvZGVycy0+ZGVjb2RlciA9IHBEZWNvZGVyOwotCi0gICAgcERlY29kZXJzLT5kZWNvZGVyTnVtYmVyPSBzdXBwb3J0Rm9ybWF0czsKLSAgICBzdGF0dXMgPSBjbGllbnQuY29ubmVjdCgpOwotICAgIENIRUNLKHN0YXR1cyA9PSBPSyk7Ci0gICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBzaXplb2Yoa01pbWVUeXBlcykgLyBzaXplb2Yoa01pbWVUeXBlc1swXSk7Ci0gICAgICAgICAgICAgKytrKSB7Ci0gICAgICAgICAgICBWZWN0b3I8Q29kZWNDYXBhYmlsaXRpZXM+IHJlc3VsdHM7Ci0gICAgICAgICAgICBDSEVDS19FUShRdWVyeUNvZGVjcyhjbGllbnQuaW50ZXJmYWNlKCksIGtNaW1lVHlwZXNba10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAvLyBxdWVyeURlY29kZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0cyksIChzdGF0dXNfdClPSyk7Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIFNBRkVfTUFMTE9DKHBPbXhDb21wb25lbnRzLCBWaWRlb0NvbXBvbmVudENhcGFiaWxpdGllcywKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5zaXplKCksICJWaWRlb0NvbXBvbmVudENhcGFiaWxpdGllcyIpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJLPSVkIixrKTsKLSAgICAgICAgICAgICAgICBwRGVjb2Rlci0+Y29tcG9uZW50ID0gcE9teENvbXBvbmVudHM7Ci0gICAgICAgICAgICAgICAgcERlY29kZXItPmNvbXBvbmVudE51bWJlciA9IHJlc3VsdHMuc2l6ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiICBkZWNvZGVyICclcycgc3VwcG9ydHMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tpXS5tQ29tcG9uZW50TmFtZS5zdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0c1tpXS5tUHJvZmlsZUxldmVscy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiTk9USElORy5cbiIpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSNpZiAwCi0gICAgICAgICAgICAgICAgLy8gRklYTUU6Ci0gICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGlnbm9yZSB0aGUgc29mdHdhcmUgY29kZWNzIGFuZCBtYWtlIElzU29mdHdhcmVDb2RlYygpCi0gICAgICAgICAgICAgICAgLy8gcGFydCBvZiBwdWJpYyBBUEkgZnJvbSBPTVhDb2RlYy5jcHAKLSAgICAgICAgICAgICAgICBpZiAoSXNTb2Z0d2FyZUNvZGVjKHJlc3VsdHNbaV0ubUNvbXBvbmVudE5hbWUuc3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJJZ25vcmUgc29mdHdhcmUgY29kZWMgJXMiLCByZXN1bHRzW2ldLm1Db21wb25lbnROYW1lLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICAvLyBDb3VudCB0aGUgc3VwcG9ydGVkIHByb2ZpbGVzCi0gICAgICAgICAgICAgICAgaW50MzJfdCBwcm9maWxlTnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHByb2ZpbGUgPSAtMTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlc3VsdHNbaV0ubVByb2ZpbGVMZXZlbHMuc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwgJnByb2ZpbGVMZXZlbCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldLm1Qcm9maWxlTGV2ZWxzW2pdOwotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogYXNzdW1lIHRoYXQgdGhlIHByb2ZpbGVzIGFyZSBvcmRlcmVkCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlTGV2ZWwubVByb2ZpbGUgIT0gcHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IHByb2ZpbGVMZXZlbC5tUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVOdW1iZXIrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTQUZFX01BTExPQyhwUHJvZmlsZUxldmVsLCBWaWRlb1Byb2ZpbGVMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZU51bWJlciwgIlZpZGVvUHJvZmlsZUxldmVsIik7Ci0gICAgICAgICAgICAgICAgcE9teENvbXBvbmVudHMtPnByb2ZpbGVMZXZlbCA9IHBQcm9maWxlTGV2ZWw7Ci0gICAgICAgICAgICAgICAgcE9teENvbXBvbmVudHMtPnByb2ZpbGVOdW1iZXIgPSBwcm9maWxlTnVtYmVyOwotCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBtYXggTGV2ZWwgZm9yIGVhY2ggcHJvZmlsZS4KLSAgICAgICAgICAgICAgICBpbnQzMl90IG1heExldmVsID0gLTE7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZSA9IC0xOwotICAgICAgICAgICAgICAgIHByb2ZpbGVOdW1iZXIgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVzdWx0c1tpXS5tUHJvZmlsZUxldmVscy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2RlY1Byb2ZpbGVMZXZlbCAmcHJvZmlsZUxldmVsID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0ubVByb2ZpbGVMZXZlbHNbal07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlID09IC0xICYmIG1heExldmVsID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlID0gcHJvZmlsZUxldmVsLm1Qcm9maWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBwcm9maWxlTGV2ZWwubUxldmVsOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbC0+bVByb2ZpbGUgPSBwcm9maWxlOwotICAgICAgICAgICAgICAgICAgICAgICAgcFByb2ZpbGVMZXZlbC0+bUxldmVsID0gbWF4TGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJWQgcHJvZmlsZTogJWxkLCBtYXggbGV2ZWw6ICVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sIHBQcm9maWxlTGV2ZWwtPm1Qcm9maWxlLCBwUHJvZmlsZUxldmVsLT5tTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlTGV2ZWwubVByb2ZpbGUgIT0gcHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IHByb2ZpbGVMZXZlbC5tUHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heExldmVsID0gcHJvZmlsZUxldmVsLm1MZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVOdW1iZXIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwtPm1Qcm9maWxlID0gcHJvZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwtPm1MZXZlbCA9IG1heExldmVsOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVkIHByb2ZpbGU6ICVsZCwgbWF4IGxldmVsOiAlbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBwUHJvZmlsZUxldmVsLT5tUHJvZmlsZSwgcFByb2ZpbGVMZXZlbC0+bUxldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlTGV2ZWwubUxldmVsID4gbWF4TGV2ZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heExldmVsID0gcHJvZmlsZUxldmVsLm1MZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwtPm1MZXZlbCA9IG1heExldmVsOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVkIHByb2ZpbGU6ICVsZCwgbWF4IGxldmVsOiAlbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBwUHJvZmlsZUxldmVsLT5tUHJvZmlsZSwgcFByb2ZpbGVMZXZlbC0+bUxldmVsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBPbXhDb21wb25lbnRzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIGtNaW1lVHlwZXNba10pKQotICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5jb2RlYyA9IE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwga01pbWVUeXBlc1trXSkpCi0gICAgICAgICAgICAgICAgcERlY29kZXItPmNvZGVjID0gTTREQV9TdHJlYW1UeXBlVmlkZW9NcGVnNDsKLSAgICAgICAgICAgIGlmICghc3RyY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsIGtNaW1lVHlwZXNba10pKQotICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5jb2RlYyA9IE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzsKLQotICAgICAgICAgICAgcERlY29kZXIrKzsKLSAgICB9Ci0KLSAgICBsb2dTdXBwb3J0RGVjb2RlcnNBbmRDYXBhYmlsaXRpZXMocERlY29kZXJzKTsKLSAgICAqZGVjb2RlcnMgPSBwRGVjb2RlcnM7Ci1jbGVhblVwOgotICAgIHJldHVybiBlcnI7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UgKgotICoqKioqKioqKioqKioqKioqKioqLwotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YShNNE9TQV9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNZXRhRGF0YSogbWV0YSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIGJvb2wgc3VjY2VzcyA9IE9LOwotICAgIGludDMyX3Qgd2lkdGggPSAwOwotICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKLSAgICBpbnQzMl90IGZyYW1lU2l6ZSA9IDA7Ci0gICAgaW50MzJfdCB2V2lkdGgsIHZIZWlnaHQ7Ci0gICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IG1ldGEsICAgICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSBiZWdpbiIpOwotCi0gICAgcERlY1NoZWxsQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIHN1Y2Nlc3MgPSBtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmdldpZHRoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhUUlVFID09IHN1Y2Nlc3MsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgc3VjY2VzcyA9IG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmdkhlaWdodCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soVFJVRSA9PSBzdWNjZXNzLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgQUxPR1YoInZXaWR0aCA9ICVkLCB2SGVpZ2h0ID0gJWQiLCB2V2lkdGgsIHZIZWlnaHQpOwotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggPSB2V2lkdGg7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuSGVpZ2h0ID0gdkhlaWdodDsKLQotICAgIGlmICghbWV0YS0+ZmluZFJlY3QoCi0gICAgICAgICAgICAgICAga0tleUNyb3BSZWN0LCAmY3JvcExlZnQsICZjcm9wVG9wLCAmY3JvcFJpZ2h0LCAmY3JvcEJvdHRvbSkpIHsKLQotICAgICAgICBjcm9wTGVmdCA9IGNyb3BUb3AgPSAwOwotICAgICAgICBjcm9wUmlnaHQgPSB2V2lkdGggLSAxOwotICAgICAgICBjcm9wQm90dG9tID0gdkhlaWdodCAtIDE7Ci0KLSAgICAgICAgQUxPR1YoImdvdCBkaW1lbnNpb25zIG9ubHkgJWQgeCAlZCIsIHdpZHRoLCBoZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJnb3QgY3JvcCByZWN0ICVkLCAlZCwgJWQsICVkIiwKLSAgICAgICAgICAgICBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tKTsKLSAgICB9Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ3JvcFJlY3QubGVmdCA9IGNyb3BMZWZ0OwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1Dcm9wUmVjdC5yaWdodCA9IGNyb3BSaWdodDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ3JvcFJlY3QudG9wID0gY3JvcFRvcDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ3JvcFJlY3QuYm90dG9tID0gY3JvcEJvdHRvbTsKLQotICAgIHdpZHRoID0gY3JvcFJpZ2h0IC0gY3JvcExlZnQgKyAxOwotICAgIGhlaWdodCA9IGNyb3BCb3R0b20gLSBjcm9wVG9wICsgMTsKLQotICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhIDogVz0lZCBIPSVkIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soKDAgIT0gd2lkdGgpICYmICgwICE9IGhlaWdodCksIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBpZiggKE00T1NBX05VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCkgJiYKLSAgICAgICAgKHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoICA9PSBcCi0gICAgICAgICAgICAodWludDMyX3Qpd2lkdGgpICYmCi0gICAgICAgIChwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQgPT0gXAotICAgICAgICAgICAgKHVpbnQzMl90KWhlaWdodCkgKSB7Ci0gICAgICAgIC8vIE5vIG5lZWQgdG8gcmVjb25maWd1cmUKLSAgICAgICAgZ290byBjbGVhblVwOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSAgcmVzZXQ6IFc9JWQgSD0lZCIsIHdpZHRoLCBoZWlnaHQpOwotICAgIC8vIFVwZGF0ZSB0aGUgc3RyZWFtIGhhbmRsZXIgcGFyYW1ldGVycwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoICA9IHdpZHRoOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodCA9IGhlaWdodDsKLSAgICBmcmFtZVNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKSAvIDI7Ci0KLSAgICAvLyBDb25maWd1cmUgdGhlIGJ1ZmZlciBwb29sCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgOiByZXNldCB0aGUgYnVmZmVyIHBvb2wiKTsKLSAgICAgICAgVklERU9FRElUT1JfQlVGRkVSX2ZyZWVQb29sKHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sID0gTTRPU0FfTlVMTDsKLSAgICB9Ci0gICAgZXJyID0gIFZJREVPRURJVE9SX0JVRkZFUl9hbGxvY2F0ZVBvb2woJnBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wsCi0gICAgICAgIE1BWF9ERUNfQlVGRkVSUywgKE00T1NBX0NoYXIqKSJWSURFT0VESVRPUl9EZWNvZGVkQnVmZmVyUG9vbCIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgIGVyciA9IFZJREVPRURJVE9SX0JVRkZFUl9pbml0UG9vbEJ1ZmZlcnMocERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCwKLSAgICAgICAgICAgICAgICBmcmFtZVNpemUgKyBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCAqIDIpOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY29uZmlndXJlRnJvbU1ldGFkYXRhIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYoIE00T1NBX05VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCApIHsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbChwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sKTsKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgPSBNNE9TQV9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3koTTRPU0FfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3kgYmVnaW4iKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLy8gUmVsZWFzZSB0aGUgY29sb3IgY29udmVydGVyCi0gICAgZGVsZXRlIHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXI7Ci0KLSAgICAvLyBEZXN0cm95IHRoZSBncmFwaAotICAgIGlmKCBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyICE9IE5VTEwgKSB7Ci0gICAgICAgIEFMT0dWKCIjIyMgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveSA6IHJlbGVhc2luZyBkZWNvZGVyIik7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPnN0b3AoKTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci5jbGVhcigpOwotICAgIH0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ2xpZW50LmRpc2Nvbm5lY3QoKTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tUmVhZGVyU291cmNlLmNsZWFyKCk7Ci0KLSAgICAvLyBSZWxlYXNlIG1lbW9yeQotICAgIGlmKCBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sICE9IE00T1NBX05VTEwgKSB7Ci0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9mcmVlUG9vbChwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sKTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRGVjQnVmZmVyUG9vbCA9IE00T1NBX05VTEw7Ci0gICAgfQotICAgIFNBRkVfRlJFRShwRGVjU2hlbGxDb250ZXh0KTsKLSAgICBwQ29udGV4dCA9IE5VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95IEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveSBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlKE00T1NBX0NvbnRleHQgKnBDb250ZXh0LAotICAgICAgICBNNF9TdHJlYW1IYW5kbGVyICpwU3RyZWFtSGFuZGxlciwKLSAgICAgICAgTTRSRUFERVJfR2xvYmFsSW50ZXJmYWNlICpwUmVhZGVyR2xvYmFsSW50ZXJmYWNlLAotICAgICAgICBNNFJFQURFUl9EYXRhSW50ZXJmYWNlICpwUmVhZGVyRGF0YUludGVyZmFjZSwKLSAgICAgICAgTTRfQWNjZXNzVW5pdCAqcEFjY2Vzc1VuaXQsIE00T1NBX1ZvaWQgKnBVc2VyRGF0YSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE9LOwotICAgIGJvb2wgc3VjY2VzcyA9IFRSVUU7Ci0gICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IDA7Ci0gICAgTTRPU0FfVUludDMyIHNpemUgPSAwOwotICAgIHNwPE1ldGFEYXRhPiBkZWNvZGVyTWV0YWRhdGEgPSBOVUxMOwotICAgIGludCBkZWNvZGVyT3V0cHV0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGUgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBTdHJlYW1IYW5kbGVyLCAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFJlYWRlckRhdGFJbnRlcmZhY2UsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvLyBDb250ZXh0IGFsbG9jYXRpb24gJiBpbml0aWFsaXphdGlvbgotICAgIFNBRkVfTUFMTE9DKHBEZWNTaGVsbENvbnRleHQsIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvclZpZGVvRGVjb2RlciIpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlciA9Ci0gICAgICAgIChNNF9WaWRlb1N0cmVhbUhhbmRsZXIqKXBTdHJlYW1IYW5kbGVyOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcE5leHRBY2Nlc3NVbml0VG9EZWNvZGUgPSBwQWNjZXNzVW5pdDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXJHbG9iYWwgPSBwUmVhZGVyR2xvYmFsSW50ZXJmYWNlOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFJlYWRlciA9IHBSZWFkZXJEYXRhSW50ZXJmYWNlOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgPSAtMTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3RSZW5kZXJDdHMgPSAtMTsKLSAgICBzd2l0Y2goIHBTdHJlYW1IYW5kbGVyLT5tX3N0cmVhbVR5cGUgKSB7Ci0gICAgICAgIGNhc2UgTTREQV9TdHJlYW1UeXBlVmlkZW9IMjYzOgotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlID0gVklERU9FRElUT1Jfa0gyNjNWaWRlb0RlYzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzQ6Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBWSURFT0VESVRPUl9rTXBlZzRWaWRlb0RlYzsKLSAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBWT0wgaGVhZGVyCi0gICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9pbnRlcm5hbFBhcnNlVmlkZW9EU0koCi0gICAgICAgICAgICAgICAgKE00T1NBX1VJbnQ4KilwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9wRGVjb2RlclNwZWNpZmljSW5mbywKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPlwKLSAgICAgICAgICAgICAgICAgICAgbV9iYXNpY1Byb3BlcnRpZXMubV9kZWNvZGVyU3BlY2lmaWNJbmZvU2l6ZSwKLSAgICAgICAgICAgICAgICAmcERlY1NoZWxsQ29udGV4dC0+bV9EY2ksICZwRGVjU2hlbGxDb250ZXh0LT5tX1ZpZGVvU2l6ZSk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvTXBlZzRBdmM6Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRGVjb2RlclR5cGUgPSBWSURFT0VESVRPUl9rSDI2NFZpZGVvRGVjOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyghIlZpZGVvRGVjb2Rlcl9jcmVhdGUgOiBpbmNvcnJlY3Qgc3RyZWFtIHR5cGUiLAotICAgICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJJbnB1dEZyYW1lcyAgICAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdElucHV0Q3RzICAgICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RJbnB1dEN0cyAgICAgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJSZW5kZXJlZEZyYW1lcyAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdFJlbmRlcmVkQ3RzICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bUxhc3RSZW5kZXJlZEN0cyAgID0gLTEuMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMgICAgPSAwOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdE91dHB1dEN0cyAgICA9IC0xOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0T3V0cHV0Q3RzICAgICA9IC0xOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wgICA9IE00T1NBX05VTEw7Ci0KLSAgICAvLyBDYWxjdWxhdGUgdGhlIGludGVydmFsIGJldHdlZW4gdHdvIHZpZGVvIGZyYW1lcy4KLSAgICBDSEVDSyhwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fYXZlcmFnZUZyYW1lUmF0ZSA+IDApOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1GcmFtZUludGVydmFsTXMgPQotICAgICAgICAgICAgMTAwMC4wIC8gcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX2F2ZXJhZ2VGcmFtZVJhdGU7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFnZUZyaWdodCBncmFwaCBidWlsZGluZwotICAgICAqLwotICAgIGRlY29kZXJNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBzd2l0Y2goIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSApIHsKLSAgICAgICAgY2FzZSBWSURFT0VESVRPUl9rSDI2M1ZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT0VESVRPUl9rTXBlZzRWaWRlb0RlYzoKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0RGF0YShrS2V5RVNEUywga1R5cGVFU0RTLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BFU0RTSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9FU0RTSW5mb1NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVklERU9FRElUT1Jfa0gyNjRWaWRlb0RlYzoKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldERhdGEoa0tleUFWQ0MsIGtUeXBlQVZDQywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJWaWRlb0RlY29kZXJfY3JlYXRlIDogaW5jb3JyZWN0IHN0cmVhbSB0eXBlIiwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBwU3RyZWFtSGFuZGxlci0+bV9tYXhBVVNpemUpOwotICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9XaWR0aCk7Ci0gICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBkZWNvZGVyIHNvdXJjZQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1SZWFkZXJTb3VyY2UgPSBuZXcgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UoCi0gICAgICAgIGRlY29kZXJNZXRhZGF0YSwgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlLAotICAgICAgICAodm9pZCAqKXBEZWNTaGVsbENvbnRleHQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZS5nZXQoKSwKLSAgICAgICAgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgLy8gQ29ubmVjdCB0byB0aGUgT01YIGNsaWVudAotICAgIHN0YXR1cyA9IHBEZWNTaGVsbENvbnRleHQtPm1DbGllbnQuY29ubmVjdCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHN0YXR1cywgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBkZWNvZGVyCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1DbGllbnQuaW50ZXJmYWNlKCksCi0gICAgICAgIGRlY29kZXJNZXRhZGF0YSwgZmFsc2UsIHBEZWNTaGVsbENvbnRleHQtPm1SZWFkZXJTb3VyY2UpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci5nZXQoKSwKLSAgICAgICAgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0KLSAgICAvLyBHZXQgdGhlIG91dHB1dCBjb2xvciBmb3JtYXQKLSAgICBzdWNjZXNzID0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMigKLSAgICAgICAga0tleUNvbG9yRm9ybWF0LCAmY29sb3JGb3JtYXQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKFRSVUUgPT0gc3VjY2VzcywgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5kZWNPdXB1dENvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWNvbG9yRm9ybWF0OwotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPnNldEludDMyKGtLZXlXaWR0aCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvV2lkdGgpOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5zZXRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQpOwotCi0gICAgLy8gR2V0IHRoZSBjb2xvciBjb252ZXJ0ZXIKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyID0gbmV3IEk0MjBDb2xvckNvbnZlcnRlcjsKLSAgICBpZiAocERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlci0+aXNMb2FkZWQoKSkgewotICAgICAgICBkZWNvZGVyT3V0cHV0ID0gcERlY1NoZWxsQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlci0+Z2V0RGVjb2Rlck91dHB1dEZvcm1hdCgpOwotICAgIH0KLQotICAgIGlmIChkZWNvZGVyT3V0cHV0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKLSAgICAgICAgZGVsZXRlIHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXI7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXIgPSBOVUxMOwotICAgIH0KLQotICAgIEFMT0dJKCJkZWNvZGVyIG91dHB1dCBmb3JtYXQgPSAweCVYXG4iLCBkZWNvZGVyT3V0cHV0KTsKLQotICAgIC8vIENvbmZpZ3VyZSB0aGUgYnVmZmVyIHBvb2wgZnJvbSB0aGUgbWV0YWRhdGEKLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEocERlY1NoZWxsQ29udGV4dCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCkuZ2V0KCkpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgLy8gU3RhcnQgdGhlIGdyYXBoCi0gICAgc3RhdHVzID0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+c3RhcnQoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSBzdGF0dXMsIE00RVJSX1NGX0RFQ09ERVJfUlNSQ19GQUlMKTsKLQotICAgICpwQ29udGV4dCA9IChNNE9TQV9Db250ZXh0KXBEZWNTaGVsbENvbnRleHQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveShwRGVjU2hlbGxDb250ZXh0KTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZSA6IERPTkUiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb1NvZnR3YXJlRGVjb2Rlcl9jcmVhdGUoTTRPU0FfQ29udGV4dCAqcENvbnRleHQsCi0gICAgICAgIE00X1N0cmVhbUhhbmRsZXIgKnBTdHJlYW1IYW5kbGVyLAotICAgICAgICBNNFJFQURFUl9HbG9iYWxJbnRlcmZhY2UgKnBSZWFkZXJHbG9iYWxJbnRlcmZhY2UsCi0gICAgICAgIE00UkVBREVSX0RhdGFJbnRlcmZhY2UgKnBSZWFkZXJEYXRhSW50ZXJmYWNlLAotICAgICAgICBNNF9BY2Nlc3NVbml0ICpwQWNjZXNzVW5pdCwgTTRPU0FfVm9pZCAqcFVzZXJEYXRhKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7Ci0gICAgYm9vbCBzdWNjZXNzID0gVFJVRTsKLSAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gMDsKLSAgICBNNE9TQV9VSW50MzIgc2l6ZSA9IDA7Ci0gICAgc3A8TWV0YURhdGE+IGRlY29kZXJNZXRhZGF0YSA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsICAgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwU3RyZWFtSGFuZGxlciwgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBSZWFkZXJEYXRhSW50ZXJmYWNlLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgLy8gQ29udGV4dCBhbGxvY2F0aW9uICYgaW5pdGlhbGl6YXRpb24KLSAgICBTQUZFX01BTExPQyhwRGVjU2hlbGxDb250ZXh0LCBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0LCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXIiKTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXIgPQotICAgICAgICAoTTRfVmlkZW9TdHJlYW1IYW5kbGVyKilwU3RyZWFtSGFuZGxlcjsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BOZXh0QWNjZXNzVW5pdFRvRGVjb2RlID0gcEFjY2Vzc1VuaXQ7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9wUmVhZGVyR2xvYmFsID0gcFJlYWRlckdsb2JhbEludGVyZmFjZTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BSZWFkZXIgPSBwUmVhZGVyRGF0YUludGVyZmFjZTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTID0gLTE7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0UmVuZGVyQ3RzID0gLTE7Ci0gICAgc3dpdGNoKCBwU3RyZWFtSGFuZGxlci0+bV9zdHJlYW1UeXBlICkgewotICAgICAgICBjYXNlIE00REFfU3RyZWFtVHlwZVZpZGVvSDI2MzoKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSA9IFZJREVPRURJVE9SX2tIMjYzVmlkZW9EZWM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0OgotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlID0gVklERU9FRElUT1Jfa01wZWc0VmlkZW9EZWM7Ci0gICAgICAgICAgICAvLyBQYXJzZSB0aGUgVk9MIGhlYWRlcgotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfaW50ZXJuYWxQYXJzZVZpZGVvRFNJKAotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50OCopcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fcERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5cCi0gICAgICAgICAgICAgICAgICAgIG1fYmFzaWNQcm9wZXJ0aWVzLm1fZGVjb2RlclNwZWNpZmljSW5mb1NpemUsCi0gICAgICAgICAgICAgICAgJnBEZWNTaGVsbENvbnRleHQtPm1fRGNpLCAmcERlY1NoZWxsQ29udGV4dC0+bV9WaWRlb1NpemUpOwotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERBX1N0cmVhbVR5cGVWaWRlb01wZWc0QXZjOgotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlID0gVklERU9FRElUT1Jfa0gyNjRWaWRlb0RlYzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJWaWRlb0RlY29kZXJfY3JlYXRlIDogaW5jb3JyZWN0IHN0cmVhbSB0eXBlIiwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iSW5wdXRGcmFtZXMgICAgID0gMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RJbnB1dEN0cyAgICAgPSAtMS4wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0SW5wdXRDdHMgICAgICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iUmVuZGVyZWRGcmFtZXMgID0gMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RSZW5kZXJlZEN0cyAgPSAtMS4wOwotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0UmVuZGVyZWRDdHMgICA9IC0xLjA7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzICAgID0gMDsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgICAgPSAtMTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdE91dHB1dEN0cyAgICAgPSAtMTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sICAgPSBNNE9TQV9OVUxMOwotCi0gICAgLy8gQ2FsY3VsYXRlIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIHR3byB2aWRlbyBmcmFtZXMuCi0gICAgaWYocERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX2F2ZXJhZ2VGcmFtZVJhdGUgPiAwKXsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUZyYW1lSW50ZXJ2YWxNcyA9Ci0gICAgICAgICAgICAxMDAwLjAgLyBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fYXZlcmFnZUZyYW1lUmF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFnZUZyaWdodCBncmFwaCBidWlsZGluZwotICAgICAqLwotICAgIGRlY29kZXJNZXRhZGF0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBzd2l0Y2goIHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSApIHsKLSAgICAgICAgY2FzZSBWSURFT0VESVRPUl9rSDI2M1ZpZGVvRGVjOgotICAgICAgICAgICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWSURFT0VESVRPUl9rTXBlZzRWaWRlb0RlYzoKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0RGF0YShrS2V5RVNEUywga1R5cGVFU0RTLAotICAgICAgICAgICAgICAgIHBTdHJlYW1IYW5kbGVyLT5tX3BFU0RTSW5mbywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9FU0RTSW5mb1NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVklERU9FRElUT1Jfa0gyNjRWaWRlb0RlYzoKLSAgICAgICAgICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgICAgICBkZWNvZGVyTWV0YWRhdGEtPnNldERhdGEoa0tleUFWQ0MsIGtUeXBlQVZDQywKLSAgICAgICAgICAgICAgICBwU3RyZWFtSGFuZGxlci0+bV9wSDI2NERlY29kZXJTcGVjaWZpY0luZm8sCi0gICAgICAgICAgICAgICAgcFN0cmVhbUhhbmRsZXItPm1fSDI2NGRlY29kZXJTcGVjaWZpY0luZm9TaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soISJWaWRlb0RlY29kZXJfY3JlYXRlIDogaW5jb3JyZWN0IHN0cmVhbSB0eXBlIiwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBwU3RyZWFtSGFuZGxlci0+bV9tYXhBVVNpemUpOwotICAgIGRlY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9XaWR0aCk7Ci0gICAgZGVjb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBkZWNvZGVyIHNvdXJjZQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1SZWFkZXJTb3VyY2UgPSBuZXcgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJTb3VyY2UoCi0gICAgICAgIGRlY29kZXJNZXRhZGF0YSwgcERlY1NoZWxsQ29udGV4dC0+bURlY29kZXJUeXBlLAotICAgICAgICAodm9pZCAqKXBEZWNTaGVsbENvbnRleHQpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bVJlYWRlclNvdXJjZS5nZXQoKSwKLSAgICAgICAgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgLy8gQ29ubmVjdCB0byB0aGUgT01YIGNsaWVudAotICAgIHN0YXR1cyA9IHBEZWNTaGVsbENvbnRleHQtPm1DbGllbnQuY29ubmVjdCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHN0YXR1cywgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgIEFMT0dJKCJVc2luZyBzb2Z0d2FyZSBjb2RlY3Mgb25seSIpOwotICAgIC8vIENyZWF0ZSB0aGUgZGVjb2RlcgotICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXIgPSBPTVhDb2RlYzo6Q3JlYXRlKAotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tQ2xpZW50LmludGVyZmFjZSgpLAotICAgICAgICBkZWNvZGVyTWV0YWRhdGEsIGZhbHNlLCBwRGVjU2hlbGxDb250ZXh0LT5tUmVhZGVyU291cmNlLE5VTEwsT01YQ29kZWM6OmtTb2Z0d2FyZUNvZGVjc09ubHkpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE5VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci5nZXQoKSwKLSAgICAgICAgTTRFUlJfU0ZfREVDT0RFUl9SU1JDX0ZBSUwpOwotCi0gICAgLy8gR2V0IHRoZSBvdXRwdXQgY29sb3IgZm9ybWF0Ci0gICAgc3VjY2VzcyA9IHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5maW5kSW50MzIoCi0gICAgICAgIGtLZXlDb2xvckZvcm1hdCwgJmNvbG9yRm9ybWF0KTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhUUlVFID09IHN1Y2Nlc3MsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcERlY1NoZWxsQ29udGV4dC0+ZGVjT3VwdXRDb2xvckZvcm1hdCA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSljb2xvckZvcm1hdDsKLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1WaWRlb0RlY29kZXItPmdldEZvcm1hdCgpLT5zZXRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoKTsKLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+c2V0SW50MzIoa0tleUhlaWdodCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wVmlkZW9TdHJlYW1oYW5kbGVyLT5tX3ZpZGVvSGVpZ2h0KTsKLQotICAgIC8vIENvbmZpZ3VyZSB0aGUgYnVmZmVyIHBvb2wgZnJvbSB0aGUgbWV0YWRhdGEKLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEocERlY1NoZWxsQ29udGV4dCwKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCkuZ2V0KCkpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgLy8gU3RhcnQgdGhlIGdyYXBoCi0gICAgc3RhdHVzID0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+c3RhcnQoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSBzdGF0dXMsIE00RVJSX1NGX0RFQ09ERVJfUlNSQ19GQUlMKTsKLQotICAgICpwQ29udGV4dCA9IChNNE9TQV9Db250ZXh0KXBEZWNTaGVsbENvbnRleHQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfY3JlYXRlIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVzdHJveShwRGVjU2hlbGxDb250ZXh0KTsKLSAgICAgICAgKnBDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2NyZWF0ZSA6IERPTkUiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRPcHRpb24oTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNE9TQV9PcHRpb25JRCBvcHRpb25JZCwgTTRPU0FfRGF0YU9wdGlvbiBwVmFsdWUpIHsKLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KikgY29udGV4dDsKLSAgICBNNF9WZXJzaW9uSW5mbyogcFZlcnNpb25JbmZvOwotICAgIE00REVDT0RFUl9WaWRlb1NpemUqIHBWaWRlb1NpemU7Ci0gICAgTTRPU0FfVUludDMyKiBwTmV4dEZyYW1lQ3RzOwotICAgIE00T1NBX1VJbnQzMiAqcGxhc3REZWNvZGVkRnJhbWVDdHM7Ci0gICAgTTRERUNPREVSX0FWQ1Byb2ZpbGVMZXZlbCogcHJvZmlsZTsKLSAgICBNNERFQ09ERVJfTVBFRzRfRGVjb2RlckNvbmZpZ0luZm8qIHBEZWNDb25mSW5mbzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRPcHRpb24gYmVnaW4iKTsKLQotICAgIHN3aXRjaCAob3B0aW9uSWQpIHsKLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX0FWQ0xhc3REZWNvZGVkRnJhbWVDVFM6Ci0gICAgICAgICAgICAgcGxhc3REZWNvZGVkRnJhbWVDdHMgPSAoTTRPU0FfVUludDMyICopIHBWYWx1ZTsKLSAgICAgICAgICAgICAqcGxhc3REZWNvZGVkRnJhbWVDdHMgPSBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTOwotICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9WZXJzaW9uOgotICAgICAgICAgICAgcFZlcnNpb25JbmZvID0gKE00X1ZlcnNpb25JbmZvKilwVmFsdWU7Ci0KLSAgICAgICAgICAgIHBWZXJzaW9uSW5mby0+bV9tYWpvciA9IFZJREVPRURJVE9SX1ZJREVDX1NIRUxMX1ZFUl9NQUpPUjsKLSAgICAgICAgICAgIHBWZXJzaW9uSW5mby0+bV9taW5vcj0gVklERU9FRElUT1JfVklERUNfU0hFTExfVkVSX01JTk9SOwotICAgICAgICAgICAgcFZlcnNpb25JbmZvLT5tX3JldmlzaW9uID0gVklERU9FRElUT1JfVklERUNfU0hFTExfVkVSX1JFVklTSU9OOwotICAgICAgICAgICAgcFZlcnNpb25JbmZvLT5tX3N0cnVjdFNpemU9c2l6ZW9mKE00X1ZlcnNpb25JbmZvKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9WaWRlb1NpemU6Ci0gICAgICAgICAgICAvKiogT25seSBWUFMgdXNlcyB0aGlzIE9wdGlvbiBJRC4gKi8KLSAgICAgICAgICAgIHBWaWRlb1NpemUgPSAoTTRERUNPREVSX1ZpZGVvU2l6ZSopcFZhbHVlOwotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMihrS2V5V2lkdGgsCi0gICAgICAgICAgICAgICAgKGludDMyX3QqKSgmcFZpZGVvU2l6ZS0+bV91aVdpZHRoKSk7Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlIZWlnaHQsCi0gICAgICAgICAgICAgICAgKGludDMyX3QqKSgmcFZpZGVvU2l6ZS0+bV91aUhlaWdodCkpOwotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbiA6IFc9JWQgSD0lZCIsCi0gICAgICAgICAgICAgICAgcFZpZGVvU2l6ZS0+bV91aVdpZHRoLCBwVmlkZW9TaXplLT5tX3VpSGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9OZXh0UmVuZGVyZWRGcmFtZUNUUzoKLSAgICAgICAgICAgIC8qKiBIb3cgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24uIFNGIGRlY29kZXIgZG9lcyBub3QgcHJvdmlkZSB0aGlzLiAqCi0gICAgICAgICAgICAqKiBMZXQgdXMgcHJvdmlkZSBsYXN0IGRlY29kZWQgZnJhbWUgQ1RTIGFzIG9mIG5vdy4gKgotICAgICAgICAgICAgKiogT25seSBWUFMgdXNlcyB0aGlzIE9wdGlvbiBJRC4gKi8KLSAgICAgICAgICAgIHBOZXh0RnJhbWVDdHMgPSAoTTRPU0FfVUludDMyICopcFZhbHVlOwotICAgICAgICAgICAgKnBOZXh0RnJhbWVDdHMgPSBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRERUNPREVSX01QRUc0X2tPcHRpb25JRF9EZWNvZGVyQ29uZmlnSW5mbzoKLSAgICAgICAgICAgIGlmKHBEZWNTaGVsbENvbnRleHQtPm1EZWNvZGVyVHlwZSA9PSBWSURFT0VESVRPUl9rTXBlZzRWaWRlb0RlYykgewotICAgICAgICAgICAgICAgICgqKE00REVDT0RFUl9NUEVHNF9EZWNvZGVyQ29uZmlnSW5mbyopcFZhbHVlKSA9Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fRGNpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBsZXJyID0gTTRFUlJfQkFEX09QVElPTl9JRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgfQotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbjogZW5kIHdpdGggZXJyID0gMHgleCIsIGxlcnIpOwotICAgIHJldHVybiBsZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfc2V0T3B0aW9uKE00T1NBX0NvbnRleHQgY29udGV4dCwKLSAgICAgICAgTTRPU0FfT3B0aW9uSUQgb3B0aW9uSWQsIE00T1NBX0RhdGFPcHRpb24gcFZhbHVlKSB7Ci0gICAgTTRPU0FfRVJSIGxlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQgKnBEZWNTaGVsbENvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCopIGNvbnRleHQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfc2V0T3B0aW9uIGJlZ2luIik7Ci0KLSAgICBzd2l0Y2ggKG9wdGlvbklkKSB7Ci0gICAgICAgIGNhc2UgTTRERUNPREVSX2tPcHRpb25JRF9PdXRwdXRGaWx0ZXI6IHsKLSAgICAgICAgICAgICAgICBNNERFQ09ERVJfT3V0cHV0RmlsdGVyKiBwT3V0cHV0RmlsdGVyID0KLSAgICAgICAgICAgICAgICAgICAgKE00REVDT0RFUl9PdXRwdXRGaWx0ZXIqKSBwVmFsdWU7Ci0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRmlsdGVyID0KLSAgICAgICAgICAgICAgICAgICAgKE00VklGSV9QbGFuQ29udmVydGVyRnVuY3Rpb25UeXBlKilwT3V0cHV0RmlsdGVyLT5cCi0gICAgICAgICAgICAgICAgICAgIG1fcEZpbHRlckZ1bmN0aW9uOwotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcEZpbHRlclVzZXJEYXRhID0KLSAgICAgICAgICAgICAgICAgICAgcE91dHB1dEZpbHRlci0+bV9wRmlsdGVyVXNlckRhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNNERFQ09ERVJfa09wdGlvbklEX0RlYmxvY2tpbmdGaWx0ZXI6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGxlcnIgPSBNNEVSUl9CQURfQ09OVEVYVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9zZXRPcHRpb246IGVuZCB3aXRoIGVyciA9IDB4JXgiLCBsZXJyKTsKLSAgICByZXR1cm4gbGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZShNNE9TQV9Db250ZXh0IGNvbnRleHQsCi0gICAgICAgIE00X01lZGlhVGltZSogcFRpbWUsIE00T1NBX0Jvb2wgYkp1bXAsIE00T1NBX1VJbnQzMiB0b2xlcmFuY2UpIHsKLSAgICBNNE9TQV9FUlIgbGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCogcERlY1NoZWxsQ29udGV4dCA9Ci0gICAgICAgIChWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KikgY29udGV4dDsKLSAgICBpbnQ2NF90IGxGcmFtZVRpbWU7Ci0gICAgTWVkaWFCdWZmZXIqIHBEZWNvZGVyQnVmZmVyID0gTlVMTDsKLSAgICBNZWRpYUJ1ZmZlciogcE5leHRCdWZmZXIgPSBOVUxMOwotICAgIHN0YXR1c190IGVyclN0YXR1czsKLSAgICBib29sIG5lZWRTZWVrID0gYkp1bXA7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlIGJlZ2luIik7Ci0KLSAgICBpZiggTTRPU0FfVFJVRSA9PSBwRGVjU2hlbGxDb250ZXh0LT5tUmVhY2hlZEVPUyApIHsKLSAgICAgICAgLy8gRG8gbm90IGNhbGwgcmVhZCgpLCBpdCBjb3VsZCBsZWFkIHRvIGEgZnJlZXplCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGUgOiBFT1MgYWxyZWFkeSByZWFjaGVkIik7Ci0gICAgICAgIGxlcnIgPSBNNFdBUl9OT19NT1JFX0FVOwotICAgICAgICBnb3RvIFZJREVPRURJVE9SX1ZpZGVvRGVjb2RlX2NsZWFuVVA7Ci0gICAgfQotICAgIGlmKHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgPj0gKnBUaW1lKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfZGVjb2RlOiBBbHJlYWR5IGRlY29kZWQgdXAgdG8gdGhpcyB0aW1lIENUUyA9ICVsZi4iLAotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyk7Ci0gICAgICAgIGdvdG8gVklERU9FRElUT1JfVmlkZW9EZWNvZGVfY2xlYW5VUDsKLSAgICB9Ci0gICAgaWYoTTRPU0FfVFJVRSA9PSBiSnVtcCkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlOiBKdW1wIGNhbGxlZCIpOwotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTID0gLTE7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0cyA9IC0xOwotICAgIH0KLQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1OYklucHV0RnJhbWVzKys7Ci0gICAgaWYgKDAgPiBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RJbnB1dEN0cyl7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1GaXJzdElucHV0Q3RzID0gKnBUaW1lOwotICAgIH0KLSAgICBwRGVjU2hlbGxDb250ZXh0LT5tTGFzdElucHV0Q3RzID0gKnBUaW1lOwotCi0gICAgd2hpbGUgKHBEZWNvZGVyQnVmZmVyID09IE5VTEwgfHwgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0RGVjb2RlZENUUyArIHRvbGVyYW5jZSA8ICpwVGltZSkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlLCBmcmFtZUNUUyA9ICVsZiwgRGVjb2RlVXBUbyA9ICVsZiIsCi0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTLCAqcFRpbWUpOwotCi0gICAgICAgIC8vIFJlYWQgdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdGFnZWZyaWdodCBkZWNvZGVyCi0gICAgICAgIGlmIChuZWVkU2VlaykgewotICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgICAgICBpbnQ2NF90IHRpbWVfdXMgPSAqcFRpbWUgKiAxMDAwOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8odGltZV91cywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpOwotICAgICAgICAgICAgZXJyU3RhdHVzID0gcERlY1NoZWxsQ29udGV4dC0+bVZpZGVvRGVjb2Rlci0+cmVhZCgmcE5leHRCdWZmZXIsICZvcHRpb25zKTsKLSAgICAgICAgICAgIG5lZWRTZWVrID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnJTdGF0dXMgPSBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5yZWFkKCZwTmV4dEJ1ZmZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBIYW5kbGUgRU9TIGFuZCBmb3JtYXQgY2hhbmdlCi0gICAgICAgIGlmIChlcnJTdGF0dXMgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgQUxPR1YoIkVuZCBvZiBzdHJlYW0gcmVhY2hlZCwgcmV0dXJuaW5nIE00V0FSX05PX01PUkVfQVUgIik7Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tUmVhY2hlZEVPUyA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICBsZXJyID0gTTRXQVJfTk9fTU9SRV9BVTsKLSAgICAgICAgICAgIC8vIElmIHdlIGRlY29kZWQgYSBidWZmZXIgYmVmb3JlIEVPUywgd2Ugc3RpbGwgbmVlZCB0byBwdXQgaXQKLSAgICAgICAgICAgIC8vIGludG8gdGhlIHF1ZXVlLgotICAgICAgICAgICAgaWYgKHBEZWNvZGVyQnVmZmVyICYmIGJKdW1wKSB7Ci0gICAgICAgICAgICAgICAgY29weUJ1ZmZlclRvUXVldWUocERlY1NoZWxsQ29udGV4dCwgcERlY29kZXJCdWZmZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ290byBWSURFT0VESVRPUl9WaWRlb0RlY29kZV9jbGVhblVQOwotICAgICAgICB9IGVsc2UgaWYgKElORk9fRk9STUFUX0NIQU5HRUQgPT0gZXJyU3RhdHVzKSB7Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9EZWNvZGVyX2RlY29kZSA6IHNvdXJjZSByZXR1cm5zIElORk9fRk9STUFUX0NIQU5HRUQiKTsKLSAgICAgICAgICAgIGxlcnIgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jb25maWd1cmVGcm9tTWV0YWRhdGEoCi0gICAgICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dCwKLSAgICAgICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tVmlkZW9EZWNvZGVyLT5nZXRGb3JtYXQoKS5nZXQoKSk7Ci0gICAgICAgICAgICBpZiggTTROT19FUlJPUiAhPSBsZXJyICkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIhISEgVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlIEVSUk9SIDogIgotICAgICAgICAgICAgICAgICAgICAiVmlkZW9EZWNvZGVyX2NvbmZpZ3VyZUZyb21NZXRhZGF0YSByZXR1cm5zIDB4JVgiLCBsZXJyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgaWYgKGVyclN0YXR1cyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2RlY29kZSBFUlJPUjoweCV4KCVkKSIsCi0gICAgICAgICAgICAgICAgZXJyU3RhdHVzLGVyclN0YXR1cyk7Ci0gICAgICAgICAgICBsZXJyID0gZXJyU3RhdHVzOwotICAgICAgICAgICAgZ290byBWSURFT0VESVRPUl9WaWRlb0RlY29kZV9jbGVhblVQOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIE9NWENvZGVjIGNsaWVudCBzaG91bGQgZXhwZWN0IHRvIHJlY2VpdmUgMC1sZW5ndGggYnVmZmVycwotICAgICAgICAvLyBhbmQgZHJvcCB0aGUgMC1sZW5ndGggYnVmZmVycy4KLSAgICAgICAgaWYgKHBOZXh0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBwTmV4dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgd2UgaGF2ZSBhIGdvb2QgbmV4dCBidWZmZXIsIHJlbGVhc2UgdGhlIHByZXZpb3VzIG9uZS4KLSAgICAgICAgaWYgKHBEZWNvZGVyQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHBEZWNvZGVyQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBwRGVjb2RlckJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcERlY29kZXJCdWZmZXIgPSBwTmV4dEJ1ZmZlcjsKLQotICAgICAgICAvLyBSZWNvcmQgdGhlIHRpbWVzdGFtcCBvZiBsYXN0IGRlY29kZWQgYnVmZmVyCi0gICAgICAgIHBEZWNvZGVyQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmbEZyYW1lVGltZSk7Ci0gICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgPSAoTTRfTWVkaWFUaW1lKShsRnJhbWVUaW1lLzEwMDApOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlLGRlY29kZWQgZnJhbWV0aW1lID0gJWxmLHNpemUgPSAlZCIsCi0gICAgICAgICAgICAoTTRfTWVkaWFUaW1lKWxGcmFtZVRpbWUsIHBEZWNvZGVyQnVmZmVyLT5zaXplKCkgKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBXZSBuZWVkIHRvIHNhdmUgYSBidWZmZXIgaWYgYkp1bXAgPT0gZmFsc2UgdG8gYSBxdWV1ZS4gVGhlc2UKLSAgICAgICAgICogYnVmZmVycyBoYXZlIGEgdGltZXN0YW1wID49IHRoZSB0YXJnZXQgdGltZSwgKnBUaW1lIChmb3IgaW5zdGFuY2UsCi0gICAgICAgICAqIHRoZSB0cmFuc2l0aW9uIGJldHdlZW4gdHdvIHZpZGVvcywgb3IgYSB0cmltbWluZyBwb3N0aW9uIGluc2lkZQotICAgICAgICAgKiBvbmUgdmlkZW8pLCBzaW5jZSB0aGV5IGFyZSBwYXJ0IG9mIHRoZSB0cmFuc2l0aW9uIGNsaXAgb3IgdGhlCi0gICAgICAgICAqIHRyaW1tZWQgdmlkZW8uCi0gICAgICAgICAqCi0gICAgICAgICAqIElmICpwVGltZSBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGFueSBvZiB0aGUgZXhpc3RpbmcKLSAgICAgICAgICogdmlkZW8gZnJhbWVzLCB3ZSB3b3VsZCBsaWtlIHRvIGdldCB0aGUgYnVmZmVyIHJpZ2h0IGJlZm9yZSAqcFRpbWUKLSAgICAgICAgICogYW5kIGluIHRoZSB0cmFuc2NvZGluZyBwaHJhc2UsIHRoaXMgdmlkZW8gZnJhbWUgd2lsbCBiZSBlbmNvZGVkCi0gICAgICAgICAqIGFzIGEga2V5IGZyYW1lIGFuZCBiZWNvbWVzIHRoZSBmaXJzdCB2aWRlbyBmcmFtZSBmb3IgdGhlIHRyYW5zaXRpb24gb3IgdGhlCi0gICAgICAgICAqIHRyaW1tZWQgdmlkZW8gdG8gYmUgZ2VuZXJhdGVkLiBUaGlzIGJ1ZmZlciBtdXN0IGFsc28gYmUgcXVldWVkLgotICAgICAgICAgKgotICAgICAgICAgKi8KLSAgICAgICAgaW50NjRfdCB0YXJnZXRUaW1lTXMgPQotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFMgKwotICAgICAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1GcmFtZUludGVydmFsTXMgKwotICAgICAgICAgICAgICAgIHRvbGVyYW5jZTsKLSAgICAgICAgaWYgKCFiSnVtcCB8fCB0YXJnZXRUaW1lTXMgPiAqcFRpbWUpIHsKLSAgICAgICAgICAgIGxlcnIgPSBjb3B5QnVmZmVyVG9RdWV1ZShwRGVjU2hlbGxDb250ZXh0LCBwRGVjb2RlckJ1ZmZlcik7Ci0gICAgICAgICAgICBpZiAobGVyciAhPSBNNE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZ290byBWSURFT0VESVRPUl9WaWRlb0RlY29kZV9jbGVhblVQOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzKys7Ci0gICAgaWYgKCAwID4gcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0T3V0cHV0Q3RzICkgewotICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgPSAqcFRpbWU7Ci0gICAgfQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0T3V0cHV0Q3RzID0gKnBUaW1lOwotCi1WSURFT0VESVRPUl9WaWRlb0RlY29kZV9jbGVhblVQOgotICAgICpwVGltZSA9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdERlY29kZWRDVFM7Ci0gICAgaWYgKHBEZWNvZGVyQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgcERlY29kZXJCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgcERlY29kZXJCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGU6IGVuZCB3aXRoIDB4JXgiLCBsZXJyKTsKLSAgICByZXR1cm4gbGVycjsKLX0KLQotc3RhdGljIE00T1NBX0VSUiBjb3B5QnVmZmVyVG9RdWV1ZSgKLSAgICBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9Db250ZXh0KiBwRGVjU2hlbGxDb250ZXh0LAotICAgIE1lZGlhQnVmZmVyKiBwRGVjb2RlckJ1ZmZlcikgewotCi0gICAgTTRPU0FfRVJSIGxlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZJREVPRURJVE9SX0JVRkZFUl9CdWZmZXIqIHRtcERlY0J1ZmZlcjsKLQotICAgIC8vIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSBxdWV1ZQotICAgIGxlcnIgPSBWSURFT0VESVRPUl9CVUZGRVJfZ2V0QnVmZmVyKHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wsCi0gICAgICAgIFZJREVPRURJVE9SX0JVRkZFUl9rRW1wdHksICZ0bXBEZWNCdWZmZXIpOwotICAgIGlmIChsZXJyID09IChNNE9TQV9VSW50MzIpTTRFUlJfTk9fQlVGRkVSX0FWQUlMQUJMRSkgewotICAgICAgICBsZXJyID0gVklERU9FRElUT1JfQlVGRkVSX2dldE9sZGVzdEJ1ZmZlcigKLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcERlY0J1ZmZlclBvb2wsCi0gICAgICAgICAgICBWSURFT0VESVRPUl9CVUZGRVJfa0ZpbGxlZCwgJnRtcERlY0J1ZmZlcik7Ci0gICAgICAgIHRtcERlY0J1ZmZlci0+c3RhdGUgPSBWSURFT0VESVRPUl9CVUZGRVJfa0VtcHR5OwotICAgICAgICBsZXJyID0gTTROT19FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAobGVyciAhPSBNNE5PX0VSUk9SKSByZXR1cm4gbGVycjsKLQotICAgIC8vIENvbG9yIGNvbnZlcnQgb3IgY29weSBmcm9tIHRoZSBnaXZlbiBNZWRpYUJ1ZmZlciB0byBvdXIgYnVmZmVyCi0gICAgaWYgKHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXIpIHsKLSAgICAgICAgaWYgKHBEZWNTaGVsbENvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXItPmNvbnZlcnREZWNvZGVyT3V0cHV0VG9JNDIwKAotICAgICAgICAgICAgKHVpbnQ4X3QgKilwRGVjb2RlckJ1ZmZlci0+ZGF0YSgpLC8vID8/ICsgcERlY29kZXJCdWZmZXItPnJhbmdlX29mZnNldCgpLCAgIC8vIGRlY29kZXJCaXRzCi0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCwgIC8vIGRlY29kZXJXaWR0aAotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuSGVpZ2h0LCAgLy8gZGVjb2RlckhlaWdodAotICAgICAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUNyb3BSZWN0LCAgLy8gZGVjb2RlclJlY3QKLSAgICAgICAgICAgIHRtcERlY0J1ZmZlci0+cERhdGEgLyogZHN0Qml0cyAqLykgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY29udmVydERlY29kZXJPdXRwdXRUb0k0MjAgZmFpbGVkIik7Ci0gICAgICAgICAgICBsZXJyID0gTTRFUlJfTk9UX0lNUExFTUVOVEVEOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChwRGVjU2hlbGxDb250ZXh0LT5kZWNPdXB1dENvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKLSAgICAgICAgaW50MzJfdCB3aWR0aCA9IHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoOwotICAgICAgICBpbnQzMl90IGhlaWdodCA9IHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodDsKLSAgICAgICAgaW50MzJfdCB5UGxhbmVTaXplID0gd2lkdGggKiBoZWlnaHQ7Ci0gICAgICAgIGludDMyX3QgdXZQbGFuZVNpemUgPSB3aWR0aCAqIGhlaWdodCAvIDQ7Ci0gICAgICAgIGludDMyX3Qgb2Zmc2V0U3JjID0gMDsKLQotICAgICAgICBpZiAoKCB3aWR0aCA9PSBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCApICAmJgotICAgICAgICAgICAgKCBoZWlnaHQgPT0gcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuSGVpZ2h0ICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IHBUbXBCdWZmID0gKE00T1NBX01lbUFkZHI4KXBEZWNvZGVyQnVmZmVyLT5kYXRhKCkgKyBwRGVjb2RlckJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXRtcERlY0J1ZmZlci0+cERhdGEsICh2b2lkICopcFRtcEJ1ZmYsIHlQbGFuZVNpemUpOwotCi0gICAgICAgICAgICBvZmZzZXRTcmMgKz0gcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggKiBwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQ7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoKE00T1NBX01lbUFkZHI4KXRtcERlY0J1ZmZlci0+cERhdGEgKyB5UGxhbmVTaXplKSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKShwVG1wQnVmZiArIG9mZnNldFNyYyksIHV2UGxhbmVTaXplKTsKLQotICAgICAgICAgICAgb2Zmc2V0U3JjICs9IChwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCA+PiAxKSAqIChwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQgPj4gMSk7Ci0gICAgICAgICAgICBtZW1jcHkoKHZvaWQgKikoKE00T1NBX01lbUFkZHI4KXRtcERlY0J1ZmZlci0+cERhdGEgKyB5UGxhbmVTaXplICsgdXZQbGFuZVNpemUpLAotICAgICAgICAgICAgICAgICh2b2lkICopKHBUbXBCdWZmICsgb2Zmc2V0U3JjKSwgdXZQbGFuZVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTTRPU0FfTWVtQWRkcjggcFRtcEJ1ZmYgPSAoTTRPU0FfTWVtQWRkcjgpcERlY29kZXJCdWZmZXItPmRhdGEoKSArIHBEZWNvZGVyQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAgICAgICAgIE00T1NBX01lbUFkZHI4IHBUbXBCdWZmRHN0ID0gKE00T1NBX01lbUFkZHI4KXRtcERlY0J1ZmZlci0+cERhdGE7Ci0gICAgICAgICAgICBpbnQzMl90IGluZGV4OwotCi0gICAgICAgICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgaGVpZ2h0OyBpbmRleCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBCdWZmRHN0LCAodm9pZCAqKXBUbXBCdWZmLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcFRtcEJ1ZmZEc3QgKz0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgcFRtcEJ1ZmYgKz0gcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBUbXBCdWZmICs9IChwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCAqICggcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuSGVpZ2h0IC0gaGVpZ2h0KSk7Ci0gICAgICAgICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgaGVpZ2h0ID4+IDE7IGluZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcFRtcEJ1ZmZEc3QsICh2b2lkICopcFRtcEJ1ZmYsIHdpZHRoID4+IDEpOwotICAgICAgICAgICAgICAgIHBUbXBCdWZmRHN0ICs9IHdpZHRoID4+IDE7Ci0gICAgICAgICAgICAgICAgcFRtcEJ1ZmYgKz0gcERlY1NoZWxsQ29udGV4dC0+bUdpdmVuV2lkdGggPj4gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcFRtcEJ1ZmYgKz0gKChwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5XaWR0aCAqIChwRGVjU2hlbGxDb250ZXh0LT5tR2l2ZW5IZWlnaHQgLSBoZWlnaHQpKSAvIDQpOwotICAgICAgICAgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGhlaWdodCA+PiAxOyBpbmRleCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBUbXBCdWZmRHN0LCAodm9pZCAqKXBUbXBCdWZmLCB3aWR0aCA+PiAxKTsKLSAgICAgICAgICAgICAgICBwVG1wQnVmZkRzdCArPSB3aWR0aCA+PiAxOwotICAgICAgICAgICAgICAgIHBUbXBCdWZmICs9IHBEZWNTaGVsbENvbnRleHQtPm1HaXZlbldpZHRoID4+IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiVmlkZW9EZWNvZGVyX2RlY29kZTogdW5leHBlY3RlZCBjb2xvciBmb3JtYXQgMHglWCIsCi0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5kZWNPdXB1dENvbG9yRm9ybWF0KTsKLSAgICAgICAgbGVyciA9IE00RVJSX1BBUkFNRVRFUjsKLSAgICB9Ci0KLSAgICB0bXBEZWNCdWZmZXItPmJ1ZmZDVFMgPSBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3REZWNvZGVkQ1RTOwotICAgIHRtcERlY0J1ZmZlci0+c3RhdGUgPSBWSURFT0VESVRPUl9CVUZGRVJfa0ZpbGxlZDsKLSAgICB0bXBEZWNCdWZmZXItPnNpemUgPSBwRGVjb2RlckJ1ZmZlci0+c2l6ZSgpOwotCi0gICAgcmV0dXJuIGxlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIoTTRPU0FfQ29udGV4dCBjb250ZXh0LAotICAgICAgICBNNF9NZWRpYVRpbWUqIHBUaW1lLCBNNFZJRklfSW1hZ2VQbGFuZSogcE91dHB1dFBsYW5lLAotICAgICAgICBNNE9TQV9Cb29sIGJGb3JjZVJlbmRlcikgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX0NvbnRleHQqIHBEZWNTaGVsbENvbnRleHQgPQotICAgICAgICAoVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfQ29udGV4dCopIGNvbnRleHQ7Ci0gICAgTTRPU0FfVUludDMyIGxpbmRleCwgaTsKLSAgICBNNE9TQV9VSW50OCogcF9idWZfc3JjLCAqcF9idWZfZGVzdDsKLSAgICBNNFZJRklfSW1hZ2VQbGFuZSB0bXBQbGFuZUluLCB0bXBQbGFuZU91dDsKLSAgICBWSURFT0VESVRPUl9CVUZGRVJfQnVmZmVyKiBwVG1wVklERU9FRElUT1JCdWZmZXIsICpwUmVuZGVyVklERU9FRElUT1JCdWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTTRPU0FfTlVMTDsKLSAgICBNNF9NZWRpYVRpbWUgY2FuZGlkYXRlVGltZVN0YW1wID0gLTE7Ci0gICAgTTRPU0FfQm9vbCBiRm91bmQgPSBNNE9TQV9GQUxTRTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBjb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcFRpbWUsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwT3V0cHV0UGxhbmUsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICAvLyBUaGUgb3V0cHV0IGJ1ZmZlciBpcyBhbHJlYWR5IGFsbG9jYXRlZCwganVzdCBjb3B5IHRoZSBkYXRhCi0gICAgaWYgKCAoKnBUaW1lIDw9IHBEZWNTaGVsbENvbnRleHQtPm1fbGFzdFJlbmRlckN0cykgJiYKLSAgICAgICAgICAgIChNNE9TQV9GQUxTRSA9PSBiRm9yY2VSZW5kZXIpICkgewotICAgICAgICBBTE9HVigiVklERU9FRElUT1JfVklERU9fcmVuZGVyIEZyYW1lIGluIHRoZSBwYXN0Iik7Ci0gICAgICAgIGVyciA9IE00V0FSX1ZJREVPUkVOREVSRVJfTk9fTkVXX0ZSQU1FOwotICAgICAgICBnb3RvIGNsZWFuVXA7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0RlY29kZXJfcmVuZGVyOiBsYXN0UmVuZGVyZWQgdGltZSA9ICVsZixyZXF1ZXN0ZWQgcmVuZGVyIHRpbWUgPSAiCi0gICAgICAgICIlbGYiLCBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3RSZW5kZXJDdHMsICpwVGltZSk7Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBidWZmZXIgYXBwcm9wcmlhdGUgZm9yIHJlbmRlcmluZy4gICovCi0gICAgZm9yIChpPTA7IGkgPCBwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sLT5OQjsgaSsrKSB7Ci0gICAgICAgIHBUbXBWSURFT0VESVRPUkJ1ZmZlciA9ICZwRGVjU2hlbGxDb250ZXh0LT5tX3BEZWNCdWZmZXJQb29sXAotICAgICAgICAgICAgLT5wTlhQQnVmZmVyW2ldOwotICAgICAgICBpZiAocFRtcFZJREVPRURJVE9SQnVmZmVyLT5zdGF0ZSA9PSBWSURFT0VESVRPUl9CVUZGRVJfa0ZpbGxlZCkgewotICAgICAgICAgICAgLyoqIEZyZWUgYWxsIHRob3NlIGJ1ZmZlcnMgb2xkZXIgdGhhbiBsYXN0IHJlbmRlcmVkIGZyYW1lLiAqLwotICAgICAgICAgICAgaWYgKHBUbXBWSURFT0VESVRPUkJ1ZmZlci0+YnVmZkNUUyA8IHBEZWNTaGVsbENvbnRleHQtPlwKLSAgICAgICAgICAgICAgICAgICAgbV9sYXN0UmVuZGVyQ3RzKSB7Ci0gICAgICAgICAgICAgICAgcFRtcFZJREVPRURJVE9SQnVmZmVyLT5zdGF0ZSA9IFZJREVPRURJVE9SX0JVRkZFUl9rRW1wdHk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKiBHZXQgdGhlIGJ1ZmZlciB3aXRoIGFwcHJvcHJpYXRlIHRpbWVzdGFtcCAgKi8KLSAgICAgICAgICAgIGlmICggKHBUbXBWSURFT0VESVRPUkJ1ZmZlci0+YnVmZkNUUyA+PSBwRGVjU2hlbGxDb250ZXh0LT5cCi0gICAgICAgICAgICAgICAgICAgIG1fbGFzdFJlbmRlckN0cykgJiYKLSAgICAgICAgICAgICAgICAocFRtcFZJREVPRURJVE9SQnVmZmVyLT5idWZmQ1RTIDw9ICpwVGltZSkgJiYKLSAgICAgICAgICAgICAgICAocFRtcFZJREVPRURJVE9SQnVmZmVyLT5idWZmQ1RTID4gY2FuZGlkYXRlVGltZVN0YW1wKSkgewotICAgICAgICAgICAgICAgIGJGb3VuZCA9IE00T1NBX1RSVUU7Ci0gICAgICAgICAgICAgICAgcFJlbmRlclZJREVPRURJVE9SQnVmZmVyID0gcFRtcFZJREVPRURJVE9SQnVmZmVyOwotICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVRpbWVTdGFtcCA9IHBUbXBWSURFT0VESVRPUkJ1ZmZlci0+YnVmZkNUUzsKLSAgICAgICAgICAgICAgICBBTE9HVigiVmlkZW9EZWNvZGVyX3JlbmRlcjogZm91bmQgYSBidWZmZXIgd2l0aCB0aW1lc3RhbXAgPSAlbGYiLAotICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVUaW1lU3RhbXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChNNE9TQV9GQUxTRSA9PSBiRm91bmQpIHsKLSAgICAgICAgZXJyID0gTTRXQVJfVklERU9SRU5ERVJFUl9OT19ORVdfRlJBTUU7Ci0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfcmVuZGVyIDMgb3VwdXQgJWQgJWQgJWQgJWQiLAotICAgICAgICBwT3V0cHV0UGxhbmVbMF0udV93aWR0aCwgcE91dHB1dFBsYW5lWzBdLnVfaGVpZ2h0LAotICAgICAgICBwT3V0cHV0UGxhbmVbMF0udV90b3BsZWZ0LCBwT3V0cHV0UGxhbmVbMF0udV9zdHJpZGUpOwotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bV9sYXN0UmVuZGVyQ3RzID0gY2FuZGlkYXRlVGltZVN0YW1wOwotCi0gICAgaWYoIE00T1NBX05VTEwgIT0gcERlY1NoZWxsQ29udGV4dC0+bV9wRmlsdGVyICkgewotICAgICAgICAvLyBGaWx0ZXJpbmcgd2FzIHJlcXVlc3RlZAotICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSB0bXBQbGFuZVszXTsKLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgb3V0cHV0IGltYWdlIGZvciBjb252ZXJzaW9uCi0gICAgICAgIHRtcFBsYW5lWzBdLnVfd2lkdGggICA9Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9XaWR0aDsKLSAgICAgICAgdG1wUGxhbmVbMF0udV9oZWlnaHQgID0KLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb0hlaWdodDsKLSAgICAgICAgdG1wUGxhbmVbMF0udV90b3BsZWZ0ID0gMDsKLSAgICAgICAgdG1wUGxhbmVbMF0udV9zdHJpZGUgID0gdG1wUGxhbmVbMF0udV93aWR0aDsKLSAgICAgICAgdG1wUGxhbmVbMF0ucGFjX2RhdGEgID0gKE00VklGSV9VSW50OCopcFJlbmRlclZJREVPRURJVE9SQnVmZmVyLT5wRGF0YTsKLSAgICAgICAgdG1wUGxhbmVbMV0udV93aWR0aCAgID0gdG1wUGxhbmVbMF0udV93aWR0aC8yOwotICAgICAgICB0bXBQbGFuZVsxXS51X2hlaWdodCAgPSB0bXBQbGFuZVswXS51X2hlaWdodC8yOwotICAgICAgICB0bXBQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICB0bXBQbGFuZVsxXS51X3N0cmlkZSAgPSB0bXBQbGFuZVswXS51X3N0cmlkZS8yOwotICAgICAgICB0bXBQbGFuZVsxXS5wYWNfZGF0YSAgPSB0bXBQbGFuZVswXS5wYWNfZGF0YSArCi0gICAgICAgICAgICAodG1wUGxhbmVbMF0udV9zdHJpZGUgKiB0bXBQbGFuZVswXS51X2hlaWdodCk7Ci0gICAgICAgIHRtcFBsYW5lWzJdLnVfd2lkdGggICA9IHRtcFBsYW5lWzFdLnVfd2lkdGg7Ci0gICAgICAgIHRtcFBsYW5lWzJdLnVfaGVpZ2h0ICA9IHRtcFBsYW5lWzFdLnVfaGVpZ2h0OwotICAgICAgICB0bXBQbGFuZVsyXS51X3RvcGxlZnQgPSAwOwotICAgICAgICB0bXBQbGFuZVsyXS51X3N0cmlkZSAgPSB0bXBQbGFuZVsxXS51X3N0cmlkZTsKLSAgICAgICAgdG1wUGxhbmVbMl0ucGFjX2RhdGEgID0gdG1wUGxhbmVbMV0ucGFjX2RhdGEgKwotICAgICAgICAgICAgKHRtcFBsYW5lWzFdLnVfc3RyaWRlICogdG1wUGxhbmVbMV0udV9oZWlnaHQpOwotCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgdyA9ICVkIEggPSAlZCIsCi0gICAgICAgICAgICB0bXBQbGFuZVswXS51X3dpZHRoLHRtcFBsYW5lWzBdLnVfaGVpZ2h0KTsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bV9wRmlsdGVyKE00T1NBX05VTEwsICZ0bXBQbGFuZVswXSwgcE91dHB1dFBsYW5lKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBKdXN0IGNvcHkgdGhlIFlVVjQyMFAgYnVmZmVyCi0gICAgICAgIE00T1NBX01lbUFkZHI4IHRlbXBCdWZmUHRyID0KLSAgICAgICAgICAgIChNNE9TQV9NZW1BZGRyOClwUmVuZGVyVklERU9FRElUT1JCdWZmZXItPnBEYXRhOwotICAgICAgICBNNE9TQV9VSW50MzIgdGVtcFdpZHRoID0KLSAgICAgICAgICAgIHBEZWNTaGVsbENvbnRleHQtPm1fcFZpZGVvU3RyZWFtaGFuZGxlci0+bV92aWRlb1dpZHRoOwotICAgICAgICBNNE9TQV9VSW50MzIgdGVtcEhlaWdodCA9Ci0gICAgICAgICAgICBwRGVjU2hlbGxDb250ZXh0LT5tX3BWaWRlb1N0cmVhbWhhbmRsZXItPm1fdmlkZW9IZWlnaHQ7Ci0KLSAgICAgICAgbWVtY3B5KCh2b2lkICopIHBPdXRwdXRQbGFuZVswXS5wYWNfZGF0YSwgKHZvaWQgKil0ZW1wQnVmZlB0ciwKLSAgICAgICAgICAgIHRlbXBXaWR0aCAqIHRlbXBIZWlnaHQpOwotICAgICAgICB0ZW1wQnVmZlB0ciArPSAodGVtcFdpZHRoICogdGVtcEhlaWdodCk7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKSBwT3V0cHV0UGxhbmVbMV0ucGFjX2RhdGEsICh2b2lkICopdGVtcEJ1ZmZQdHIsCi0gICAgICAgICAgICAodGVtcFdpZHRoLzIpICogKHRlbXBIZWlnaHQvMikpOwotICAgICAgICB0ZW1wQnVmZlB0ciArPSAoKHRlbXBXaWR0aC8yKSAqICh0ZW1wSGVpZ2h0LzIpKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopIHBPdXRwdXRQbGFuZVsyXS5wYWNfZGF0YSwgKHZvaWQgKil0ZW1wQnVmZlB0ciwKLSAgICAgICAgICAgICh0ZW1wV2lkdGgvMikgKiAodGVtcEhlaWdodC8yKSk7Ci0gICAgfQotCi0gICAgcERlY1NoZWxsQ29udGV4dC0+bU5iUmVuZGVyZWRGcmFtZXMrKzsKLSAgICBpZiAoIDAgPiBwRGVjU2hlbGxDb250ZXh0LT5tRmlyc3RSZW5kZXJlZEN0cyApIHsKLSAgICAgICAgcERlY1NoZWxsQ29udGV4dC0+bUZpcnN0UmVuZGVyZWRDdHMgPSAqcFRpbWU7Ci0gICAgfQotICAgIHBEZWNTaGVsbENvbnRleHQtPm1MYXN0UmVuZGVyZWRDdHMgPSAqcFRpbWU7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICAqcFRpbWUgPSBwRGVjU2hlbGxDb250ZXh0LT5tX2xhc3RSZW5kZXJDdHM7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXIgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfcmVuZGVyIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfcmVuZGVyIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoTTRERUNPREVSX1ZpZGVvVHlwZSBkZWNvZGVyVHlwZSwKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLCBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKSB7Ci0gICAgTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKiBwRGVjb2RlckludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0KLSAgICBwRGVjb2RlckludGVyZmFjZSA9IChNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqKU00T1NBXzMyYml0QWxpZ25lZE1hbGxvYygKLSAgICAgICAgc2l6ZW9mKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSksIE00REVDT0RFUl9FWFRFUk5BTCwKLSAgICAgICAgKE00T1NBX0NoYXIqKSJWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2UiICk7Ci0gICAgaWYgKE00T1NBX05VTEwgPT0gcERlY29kZXJJbnRlcmZhY2UpIHsKLSAgICAgICAgcmV0dXJuIE00RVJSX0FMTE9DOwotICAgIH0KLQotICAgICpwRGVjb2RlclR5cGUgPSBkZWNvZGVyVHlwZTsKLQotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3RDcmVhdGUgICAgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9jcmVhdGU7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdERlc3Ryb3kgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2Rlc3Ryb3k7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdEdldE9wdGlvbiA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldE9wdGlvbjsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0U2V0T3B0aW9uID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfc2V0T3B0aW9uOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3REZWNvZGUgICAgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZWNvZGU7Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdFJlbmRlciAgICA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3JlbmRlcjsKLQotICAgICpwRGVjSW50ZXJmYWNlID0gKE00T1NBX0NvbnRleHQpcERlY29kZXJJbnRlcmZhY2U7Ci0gICAgcmV0dXJuIE00Tk9fRVJST1I7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRTb2Z0d2FyZUludGVyZmFjZShNNERFQ09ERVJfVmlkZW9UeXBlIGRlY29kZXJUeXBlLAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKLSAgICBNNERFQ09ERVJfVmlkZW9JbnRlcmZhY2UqIHBEZWNvZGVySW50ZXJmYWNlID0gTTRPU0FfTlVMTDsKLQotICAgIHBEZWNvZGVySW50ZXJmYWNlID0gKE00REVDT0RFUl9WaWRlb0ludGVyZmFjZSopTTRPU0FfMzJiaXRBbGlnbmVkTWFsbG9jKAotICAgICAgICBzaXplb2YoTTRERUNPREVSX1ZpZGVvSW50ZXJmYWNlKSwgTTRERUNPREVSX0VYVEVSTkFMLAotICAgICAgICAoTTRPU0FfQ2hhciopIlZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZSIgKTsKLSAgICBpZiAoTTRPU0FfTlVMTCA9PSBwRGVjb2RlckludGVyZmFjZSkgewotICAgICAgICByZXR1cm4gTTRFUlJfQUxMT0M7Ci0gICAgfQotCi0gICAgKnBEZWNvZGVyVHlwZSA9IGRlY29kZXJUeXBlOwotCi0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdENyZWF0ZSAgICA9IFZpZGVvRWRpdG9yVmlkZW9Tb2Z0d2FyZURlY29kZXJfY3JlYXRlOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3REZXN0cm95ICAgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9kZXN0cm95OwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3RHZXRPcHRpb24gPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRPcHRpb247Ci0gICAgcERlY29kZXJJbnRlcmZhY2UtPm1fcEZjdFNldE9wdGlvbiA9IFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX3NldE9wdGlvbjsKLSAgICBwRGVjb2RlckludGVyZmFjZS0+bV9wRmN0RGVjb2RlICAgID0gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZGVjb2RlOwotICAgIHBEZWNvZGVySW50ZXJmYWNlLT5tX3BGY3RSZW5kZXIgICAgPSBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9yZW5kZXI7Ci0KLSAgICAqcERlY0ludGVyZmFjZSA9IChNNE9TQV9Db250ZXh0KXBEZWNvZGVySW50ZXJmYWNlOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotZXh0ZXJuICJDIiB7Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoCi0gICAgICAgIE00REVDT0RFUl9WaWRlb1R5cGUgKnBEZWNvZGVyVHlwZSwgTTRPU0FfQ29udGV4dCAqcERlY0ludGVyZmFjZSkgewotICAgIHJldHVybiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRJbnRlcmZhY2UoTTRERUNPREVSX2tWaWRlb1R5cGVNUEVHNCwKLSAgICAgICAgcERlY29kZXJUeXBlLCBwRGVjSW50ZXJmYWNlKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldEludGVyZmFjZV9IMjY0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0SW50ZXJmYWNlKE00REVDT0RFUl9rVmlkZW9UeXBlQVZDLAotICAgICAgICBwRGVjb2RlclR5cGUsIHBEZWNJbnRlcmZhY2UpOwotCi19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRTb2Z0d2FyZUludGVyZmFjZV9NUEVHNCgKLSAgICAgICAgTTRERUNPREVSX1ZpZGVvVHlwZSAqcERlY29kZXJUeXBlLCBNNE9TQV9Db250ZXh0ICpwRGVjSW50ZXJmYWNlKSB7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFNvZnR3YXJlSW50ZXJmYWNlKE00REVDT0RFUl9rVmlkZW9UeXBlTVBFRzQsCi0gICAgICAgIHBEZWNvZGVyVHlwZSwgcERlY0ludGVyZmFjZSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRGVjb2Rlcl9nZXRTb2Z0d2FyZUludGVyZmFjZV9IMjY0KAotICAgICAgICBNNERFQ09ERVJfVmlkZW9UeXBlICpwRGVjb2RlclR5cGUsIE00T1NBX0NvbnRleHQgKnBEZWNJbnRlcmZhY2UpIHsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0RlY29kZXJfZ2V0U29mdHdhcmVJbnRlcmZhY2UoTTRERUNPREVSX2tWaWRlb1R5cGVBVkMsCi0gICAgICAgIHBEZWNvZGVyVHlwZSwgcERlY0ludGVyZmFjZSk7Ci0KLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9EZWNvZGVyX2dldFZpZGVvRGVjb2RlcnNBbmRDYXBhYmlsaXRpZXMoCi0gICAgTTRERUNPREVSX1ZpZGVvRGVjb2RlcnMqKiBkZWNvZGVycykgewotICAgIHJldHVybiBxdWVyeVZpZGVvRGVjb2RlckNhcGFiaWxpdGllcyhkZWNvZGVycyk7Ci19Ci0KLX0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy9zdGFnZWZyaWdodHNoZWxscy9zcmMvVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuY3BwIGIvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhN2RiNjguLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3N0YWdlZnJpZ2h0c2hlbGxzL3NyYy9WaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEBmaWxlICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIuY3BwCi0qIEBicmllZiAgU3RhZ2VGcmlnaHQgc2hlbGwgdmlkZW8gZW5jb2RlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLSNkZWZpbmUgTE9HX05ERUJVRyAxCi0jZGVmaW5lIExPR19UQUcgIlZJREVPRURJVE9SX1ZJREVPRU5DT0RFUiIKLQotLyoqKioqKioqKioqKioqKioqKioKLSAqICAgICBIRUFERVJTICAgICAqCi0gKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJNNE9TQV9EZWJ1Zy5oIgotI2luY2x1ZGUgIk00U1lTX0FjY2Vzc1VuaXQuaCIKLSNpbmNsdWRlICJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlci5oIgotI2luY2x1ZGUgIlZpZGVvRWRpdG9yVXRpbHMuaCIKLSNpbmNsdWRlICJNZWRpYUJ1ZmZlclB1bGxlci5oIgotI2luY2x1ZGUgPEk0MjBDb2xvckNvbnZlcnRlci5oPgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSAidXRpbHMvTG9nLmgiCi0jaW5jbHVkZSAidXRpbHMvVmVjdG9yLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVByb2ZpbGVzLmg+Ci0jaW5jbHVkZSAiT01YX1ZpZGVvLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKgotICogICBERUZJTklUSU9OUyAgICAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0KLS8vIEZvcmNlIHVzaW5nIGhhcmR3YXJlIGVuY29kZXIKLSNkZWZpbmUgVklERU9FRElUT1JfRk9SQ0VDT0RFQyBrSGFyZHdhcmVDb2RlY3NPbmx5Ci0KLSNpZiAhZGVmaW5lZChWSURFT0VESVRPUl9GT1JDRUNPREVDKQotICAgICNlcnJvciAiQ2Fubm90IGZvcmNlIERTSSByZXRyaWV2YWwgaWYgY29kZWMgdHlwZSBpcyBub3QgZml4ZWQiCi0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqCi0gKiAgIFNPVVJDRSBDTEFTUyAgICoKLSAqKioqKioqKioqKioqKioqKioqKi8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIHNwPFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlPiBDcmVhdGUoCi0gICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwKLSAgICAgICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgaW50MzJfdCBzdG9yZUJ1ZmZlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKLSAgICAgICAgdmlydHVhbCBpbnQzMl90IGdldE51bWJlck9mQnVmZmVyc0luUXVldWUoKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB+VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2UoKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHN0cnVjdCBNZWRpYUJ1ZmZlckNoYWluIHsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyKiBidWZmZXI7Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlckNoYWluKiBuZXh0TGluazsKLSAgICAgICAgfTsKLSAgICAgICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgICAgICBDUkVBVEVELAotICAgICAgICAgICAgU1RBUlRFRCwKLSAgICAgICAgICAgIEVSUk9SCi0gICAgICAgIH07Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiAmZm9ybWF0KTsKLQotICAgICAgICAvLyBEb24ndCBjYWxsIG1lCi0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlKGNvbnN0IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlICYpOwotICAgICAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSAmb3BlcmF0b3I9KAotICAgICAgICAgICAgICAgIGNvbnN0IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlICYpOwotCi0gICAgICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG1GaXJzdEJ1ZmZlckxpbms7Ci0gICAgICAgIE1lZGlhQnVmZmVyQ2hhaW4qIG1MYXN0QnVmZmVyTGluazsKLSAgICAgICAgaW50MzJfdCAgICAgICAgICAgbU5iQnVmZmVyOwotICAgICAgICBib29sICAgICAgICAgICAgICBtSXNFT1M7Ci0gICAgICAgIFN0YXRlICAgICAgICAgICAgIG1TdGF0ZTsKLSAgICAgICAgc3A8TWV0YURhdGE+ICAgICAgbUVuY0Zvcm1hdDsKLSAgICAgICAgTXV0ZXggICAgICAgICAgICAgbUxvY2s7Ci0gICAgICAgIENvbmRpdGlvbiAgICAgICAgIG1CdWZmZXJDb25kOwotfTsKLQotc3A8VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U+IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpDcmVhdGUoCi0gICAgY29uc3Qgc3A8TWV0YURhdGE+ICZmb3JtYXQpIHsKLQotICAgIHNwPFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlPiBhU291cmNlID0KLSAgICAgICAgbmV3IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlKGZvcm1hdCk7Ci0gICAgcmV0dXJuIGFTb3VyY2U7Ci19Ci0KLVZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSgKLSAgICBjb25zdCBzcDxNZXRhRGF0YT4gJmZvcm1hdCk6Ci0gICAgICAgIG1GaXJzdEJ1ZmZlckxpbmsoTlVMTCksCi0gICAgICAgIG1MYXN0QnVmZmVyTGluayhOVUxMKSwKLSAgICAgICAgbU5iQnVmZmVyKDApLAotICAgICAgICBtSXNFT1MoZmFsc2UpLAotICAgICAgICBtU3RhdGUoQ1JFQVRFRCksCi0gICAgICAgIG1FbmNGb3JtYXQoZm9ybWF0KSB7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZSIpOwotfQotCi1WaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6flZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlKCkgewotCi0gICAgLy8gU2FmZXR5IGNsZWFuIHVwCi0gICAgaWYoIFNUQVJURUQgPT0gbVN0YXRlICkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKm1ldGEpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RhcnQoKSBiZWdpbiIpOwotCi0gICAgaWYoIENSRUFURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0YXJ0OiBpbnZhbGlkIHN0YXRlICVkIiwgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotICAgIG1TdGF0ZSA9IFNUQVJURUQ7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0YXJ0KCkgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3AoKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3AoKSBiZWdpbiIpOwotCi0gICAgaWYoIFNUQVJURUQgIT0gbVN0YXRlICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3A6IGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyBSZWxlYXNlIHRoZSBidWZmZXIgY2hhaW4KLSAgICBpbnQzMl90IGkgPSAwOwotICAgIE1lZGlhQnVmZmVyQ2hhaW4qIHRtcExpbmsgPSBOVUxMOwotICAgIHdoaWxlKCBtRmlyc3RCdWZmZXJMaW5rICkgewotICAgICAgICBpKys7Ci0gICAgICAgIHRtcExpbmsgPSBtRmlyc3RCdWZmZXJMaW5rOwotICAgICAgICBtRmlyc3RCdWZmZXJMaW5rID0gbUZpcnN0QnVmZmVyTGluay0+bmV4dExpbms7Ci0gICAgICAgIGRlbGV0ZSB0bXBMaW5rOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3AgOiAlZCBidWZmZXIgcmVtYWluZWQiLCBpKTsKLSAgICBtRmlyc3RCdWZmZXJMaW5rID0gTlVMTDsKLSAgICBtTGFzdEJ1ZmZlckxpbmsgPSBOVUxMOwotCi0gICAgbVN0YXRlID0gQ1JFQVRFRDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcCgpIEVORCAoMHgleCkiLCBlcnIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXNwPE1ldGFEYXRhPiBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6Z2V0Rm9ybWF0KCkgewotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpnZXRGb3JtYXQiKTsKLSAgICByZXR1cm4gbUVuY0Zvcm1hdDsKLX0KLQotc3RhdHVzX3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnJlYWQoTWVkaWFCdWZmZXIgKipidWZmZXIsCi0gICAgICAgIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgcmVhZE9wdGlvbnM7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgTWVkaWFCdWZmZXJDaGFpbiogdG1wTGluayA9IE5VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnJlYWQoKSBiZWdpbiIpOwotCi0gICAgaWYgKCBTVEFSVEVEICE9IG1TdGF0ZSApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpyZWFkOiBpbnZhbGlkIHN0YXRlICVkIiwgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgd2hpbGUgKG1GaXJzdEJ1ZmZlckxpbmsgPT0gTlVMTCAmJiAhbUlzRU9TKSB7Ci0gICAgICAgIG1CdWZmZXJDb25kLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIC8vIEVuZCBvZiBzdHJlYW0/Ci0gICAgaWYgKG1GaXJzdEJ1ZmZlckxpbmsgPT0gTlVMTCkgewotICAgICAgICAqYnVmZmVyID0gTlVMTDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpyZWFkIDogRU9TIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIC8vIEdldCBhIGJ1ZmZlciBmcm9tIHRoZSBjaGFpbgotICAgICpidWZmZXIgPSBtRmlyc3RCdWZmZXJMaW5rLT5idWZmZXI7Ci0gICAgdG1wTGluayA9IG1GaXJzdEJ1ZmZlckxpbms7Ci0gICAgbUZpcnN0QnVmZmVyTGluayA9IG1GaXJzdEJ1ZmZlckxpbmstPm5leHRMaW5rOwotCi0gICAgaWYgKCBOVUxMID09IG1GaXJzdEJ1ZmZlckxpbmsgKSB7Ci0gICAgICAgIG1MYXN0QnVmZmVyTGluayA9IE5VTEw7Ci0gICAgfQotICAgIGRlbGV0ZSB0bXBMaW5rOwotICAgIG1OYkJ1ZmZlci0tOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpyZWFkKCkgRU5EICgweCV4KSIsIGVycik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotaW50MzJfdCBWaWRlb0VkaXRvclZpZGVvRW5jb2RlclNvdXJjZTo6c3RvcmVCdWZmZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OnN0b3JlQnVmZmVyKCkgYmVnaW4iKTsKLQotICAgIGlmKCBOVUxMID09IGJ1ZmZlciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlciA6IHJlYWNoZWQgRU9TIik7Ci0gICAgICAgIG1Jc0VPUyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTWVkaWFCdWZmZXJDaGFpbiogbmV3TGluayA9IG5ldyBNZWRpYUJ1ZmZlckNoYWluOwotICAgICAgICBuZXdMaW5rLT5idWZmZXIgPSBidWZmZXI7Ci0gICAgICAgIG5ld0xpbmstPm5leHRMaW5rID0gTlVMTDsKLSAgICAgICAgaWYoIE5VTEwgIT0gbUxhc3RCdWZmZXJMaW5rICkgewotICAgICAgICAgICAgbUxhc3RCdWZmZXJMaW5rLT5uZXh0TGluayA9IG5ld0xpbms7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmlyc3RCdWZmZXJMaW5rID0gbmV3TGluazsKLSAgICAgICAgfQotICAgICAgICBtTGFzdEJ1ZmZlckxpbmsgPSBuZXdMaW5rOwotICAgICAgICBtTmJCdWZmZXIrKzsKLSAgICB9Ci0gICAgbUJ1ZmZlckNvbmQuc2lnbmFsKCk7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyU291cmNlOjpzdG9yZUJ1ZmZlcigpIGVuZCIpOwotICAgIHJldHVybiBtTmJCdWZmZXI7Ci19Ci0KLWludDMyX3QgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OmdldE51bWJlck9mQnVmZmVyc0luUXVldWUoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gbU5iQnVmZmVyOwotfQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN0cnVjdHVyZSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0Ci0gKiBAYnJpZWYgICAgVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29udGV4dCBvZiB0aGUgU3RhZ2VGcmlnaHQgdmlkZW8gZW5jb2RlcgotICogICAgICAgICAgIHNoZWxsCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotdHlwZWRlZiBlbnVtIHsKLSAgICBDUkVBVEVEICAgPSAweDEsCi0gICAgT1BFTkVEICAgID0gMHgyLAotICAgIFNUQVJURUQgICA9IDB4NCwKLSAgICBCVUZGRVJJTkcgPSAweDgsCi0gICAgUkVBRElORyAgID0gMHgxMAotfSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9TdGF0ZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX1N0YXRlICAgICBtU3RhdGU7Ci0gICAgTTRFTkNPREVSX0Zvcm1hdCAgICAgICAgICAgICAgICAgIG1Gb3JtYXQ7Ci0gICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogICAgICAgICAgIG1Xcml0ZXJEYXRhSW50ZXJmYWNlOwotICAgIE00VlBQX2FwcGx5X2ZjdCogICAgICAgICAgICAgICAgICBtUHJlUHJvY0Z1bmN0aW9uOwotICAgIE00VlBQX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICBtUHJlUHJvY0NvbnRleHQ7Ci0gICAgTTRTWVNfQWNjZXNzVW5pdCogICAgICAgICAgICAgICAgIG1BY2Nlc3NVbml0OwotICAgIE00RU5DT0RFUl9QYXJhbXMqICAgICAgICAgICAgICAgICBtQ29kZWNQYXJhbXM7Ci0gICAgTTRFTkNPREVSX0hlYWRlciAgICAgICAgICAgICAgICAgIG1IZWFkZXI7Ci0gICAgSDI2NE1DU19Qcm9jZXNzRW5jb2RlZE5BTFVfZmN0KiAgIG1IMjY0TkFMVVBvc3RQcm9jZXNzRmN0OwotICAgIE00T1NBX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICBtSDI2NE5BTFVQb3N0UHJvY2Vzc0N0eDsKLSAgICBNNE9TQV9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgbUxhc3RDVFM7Ci0gICAgc3A8VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U+IG1FbmNvZGVyU291cmNlOwotICAgIE9NWENsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50OwotICAgIHNwPE1lZGlhU291cmNlPiAgICAgICAgICAgICAgICAgICBtRW5jb2RlcjsKLSAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSAgICAgICAgICAgICAgbUVuY29kZXJDb2xvckZvcm1hdDsKLSAgICBNZWRpYUJ1ZmZlclB1bGxlciogICAgICAgICAgICAgICAgbVB1bGxlcjsKLSAgICBJNDIwQ29sb3JDb252ZXJ0ZXIqICAgICAgICAgICAgICAgbUk0MjBDb2xvckNvbnZlcnRlcjsKLQotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTmJJbnB1dEZyYW1lczsKLSAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0SW5wdXRDdHM7Ci0gICAgZG91YmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0SW5wdXRDdHM7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYk91dHB1dEZyYW1lczsKLSAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0T3V0cHV0Q3RzOwotICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdE91dHB1dEN0czsKLQotICAgIE1lZGlhUHJvZmlsZXMgKm1WaWRlb0VkaXRvclByb2ZpbGU7Ci0gICAgaW50MzJfdCBtTWF4UHJlZmV0Y2hGcmFtZXM7Ci19IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKgotICogICAgICBUT09MUyAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKiovCi0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXREU0koTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhRGF0YSkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqICBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIGludDMyX3QgbmJCdWZmZXIgPSAwOwotICAgIGludDMyX3Qgc3RyaWRlID0gMDsKLSAgICBpbnQzMl90IGhlaWdodCA9IDA7Ci0gICAgaW50MzJfdCBmcmFtZXJhdGUgPSAwOwotICAgIGludDMyX3QgaXNDb2RlY0NvbmZpZyA9IDA7Ci0gICAgc2l6ZV90IHNpemUgPSAwOwotICAgIHVpbnQzMl90IGNvZGVjRmxhZ3MgPSAwOwotICAgIE1lZGlhQnVmZmVyKiBpbnB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgTWVkaWFCdWZmZXIqIG91dHB1dEJ1ZmZlciA9IE5VTEw7Ci0gICAgc3A8VmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U+IGVuY29kZXJTb3VyY2UgPSBOVUxMOwotICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0gTlVMTDs7Ci0gICAgT01YQ2xpZW50IGNsaWVudDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXREU0kgYmVnaW4iKTsKLSAgICAvLyBJbnB1dCBwYXJhbWV0ZXJzIGNoZWNrCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQ29udGV4dCwgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IG1ldGFEYXRhLmdldCgpLCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIFZJREVPRURJVE9SX0NIRUNLKENSRUFURUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgZW5jb2RlciBzb3VyY2UKLSAgICBlbmNvZGVyU291cmNlID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OkNyZWF0ZShtZXRhRGF0YSk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBlbmNvZGVyU291cmNlLmdldCgpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgcmVzdWx0ID0gY2xpZW50LmNvbm5lY3QoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgT01YIGNvZGVjCi0gICAgLy8gVklERU9FRElUT1JfRk9SQ0VDT0RFQyBNVVNUIGJlIGRlZmluZWQgaGVyZQotICAgIGNvZGVjRmxhZ3MgfD0gT01YQ29kZWM6OlZJREVPRURJVE9SX0ZPUkNFQ09ERUM7Ci0gICAgZW5jb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoY2xpZW50LmludGVyZmFjZSgpLCBtZXRhRGF0YSwgdHJ1ZSwKLSAgICAgICAgZW5jb2RlclNvdXJjZSwgTlVMTCwgY29kZWNGbGFncyk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBlbmNvZGVyLmdldCgpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIGZha2UgZnJhbWVzIGFuZCByZXRyaWV2ZSB0aGUgRFNJCi0gICAgICovCi0gICAgLy8gU2VuZCBhIGZha2UgZnJhbWUgdG8gdGhlIHNvdXJjZQotICAgIG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVN0cmlkZSwgICAgICZzdHJpZGUpOwotICAgIG1ldGFEYXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgICAgICZoZWlnaHQpOwotICAgIG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZmcmFtZXJhdGUpOwotICAgIHNpemUgPSAoc2l6ZV90KShzdHJpZGUqaGVpZ2h0KjMpLzI7Ci0gICAgaW5wdXRCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoc2l6ZSk7Ci0gICAgaW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgMCk7Ci0gICAgbmJCdWZmZXIgPSBlbmNvZGVyU291cmNlLT5zdG9yZUJ1ZmZlcihpbnB1dEJ1ZmZlcik7Ci0gICAgZW5jb2RlclNvdXJjZS0+c3RvcmVCdWZmZXIoTlVMTCk7IC8vIFNpZ25hbCBFT1MKLQotICAgIC8vIENhbGwgcmVhZCBvbmNlIHRvIGdldCB0aGUgRFNJCi0gICAgcmVzdWx0ID0gZW5jb2Rlci0+c3RhcnQoKTs7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT0sgPT0gcmVzdWx0LCBNNEVSUl9TVEFURSk7Ci0gICAgcmVzdWx0ID0gZW5jb2Rlci0+cmVhZCgmb3V0cHV0QnVmZmVyLCBOVUxMKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhvdXRwdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoCi0gICAgICAgIGtLZXlJc0NvZGVjQ29uZmlnLCAmaXNDb2RlY0NvbmZpZykgJiYgaXNDb2RlY0NvbmZpZywgTTRFUlJfU1RBVEUpOwotCi0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCA9PSBwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIucEJ1ZiwgTTRFUlJfU1RBVEUpOwotICAgIGlmICggTTRFTkNPREVSX2tIMjY0ID09IHBFbmNvZGVyQ29udGV4dC0+bUZvcm1hdCApIHsKLSAgICAgICAgLy8gRm9yIEgyNjQsIGZvcm1hdCB0aGUgRFNJCi0gICAgICAgIHJlc3VsdCA9IGJ1aWxkQVZDQ29kZWNTcGVjaWZpY0RhdGEoCi0gICAgICAgICAgICAodWludDhfdCoqKSgmKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmKSksCi0gICAgICAgICAgICAoc2l6ZV90KikoJihwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIuU2l6ZSkpLAotICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKW91dHB1dEJ1ZmZlci0+ZGF0YSgpICsgb3V0cHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksIGVuY29kZXItPmdldEZvcm1hdCgpLmdldCgpKTsKLSAgICAgICAgb3V0cHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEZvciBNUEVHNCwganVzdCBjb3B5IHRoZSBEU0kKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLlNpemUgPQotICAgICAgICAgICAgKE00T1NBX1VJbnQzMilvdXRwdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBTQUZFX01BTExPQyhwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIucEJ1ZiwgTTRPU0FfSW50OCwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5TaXplLCAiRW5jb2RlciBoZWFkZXIiKTsKLSAgICAgICAgbWVtY3B5KCh2b2lkICopcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYsCi0gICAgICAgICAgICAodm9pZCAqKSgoTTRPU0FfTWVtQWRkcjgpKG91dHB1dEJ1ZmZlci0+ZGF0YSgpKStvdXRwdXRCdWZmZXItPnJhbmdlX29mZnNldCgpKSwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5TaXplKTsKLSAgICAgICAgb3V0cHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgcmVzdWx0ID0gZW5jb2Rlci0+c3RvcCgpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9LID09IHJlc3VsdCwgTTRFUlJfU1RBVEUpOwotCi1jbGVhblVwOgotICAgIC8vIERlc3Ryb3kgdGhlIGdyYXBoCi0gICAgaWYgKCBlbmNvZGVyICE9IE5VTEwgKSB7IGVuY29kZXIuY2xlYXIoKTsgfQotICAgIGNsaWVudC5kaXNjb25uZWN0KCk7Ci0gICAgaWYgKCBlbmNvZGVyU291cmNlICE9IE5VTEwgKSB7IGVuY29kZXJTb3VyY2UuY2xlYXIoKTsgfQotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXREU0kgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0RFNJIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0RFNJIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioKLSAqIEVOR0lORSBJTlRFUkZBQ0UgKgotICoqKioqKioqKioqKioqKioqKioqLwotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cChNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCkgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cCBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIFZJREVPRURJVE9SX0NIRUNLKENSRUFURUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIFJlbGVhc2UgbWVtb3J5Ci0gICAgU0FGRV9GUkVFKHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5wQnVmKTsKLSAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0KTsKLSAgICBwQ29udGV4dCA9IE00T1NBX05VTEw7Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2NsZWFudXAgbm8gZXJyb3IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2NsZWFudXAgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXQoTTRFTkNPREVSX0Zvcm1hdCBmb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgTTRXUklURVJfRGF0YUludGVyZmFjZSogcFdyaXRlckRhdGFJbnRlcmZhY2UsCi0gICAgICAgIE00VlBQX2FwcGx5X2ZjdCogcFZQUGZjdCwgTTRWUFBfQ29udGV4dCBwVlBQY3R4dCwKLSAgICAgICAgTTRPU0FfVm9pZCogcEV4dGVybmFsQVBJLCBNNE9TQV9Wb2lkKiBwVXNlckRhdGEpIHsKLQotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgaW50IGVuY29kZXJJbnB1dCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdCBiZWdpbjogZm9ybWF0ICAlZCIsIGZvcm1hdCk7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwV3JpdGVyRGF0YUludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBWUFBmY3QsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwVlBQY3R4dCwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8vIENvbnRleHQgYWxsb2NhdGlvbiAmIGluaXRpYWxpemF0aW9uCi0gICAgU0FGRV9NQUxMT0MocEVuY29kZXJDb250ZXh0LCBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0LCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIiKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IENSRUFURUQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tRm9ybWF0ID0gZm9ybWF0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVdyaXRlckRhdGFJbnRlcmZhY2UgPSBwV3JpdGVyRGF0YUludGVyZmFjZTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1QcmVQcm9jRnVuY3Rpb24gPSBwVlBQZmN0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVByZVByb2NDb250ZXh0ID0gcFZQUGN0eHQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyID0gTlVMTDsKLQotICAgIC8vIEdldCBjb2xvciBjb252ZXJ0ZXIgYW5kIGRldGVybWluZSBlbmNvZGVyIGlucHV0IGZvcm1hdAotICAgIHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlciA9IG5ldyBJNDIwQ29sb3JDb252ZXJ0ZXI7Ci0gICAgaWYgKHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlci0+aXNMb2FkZWQoKSkgewotICAgICAgICBlbmNvZGVySW5wdXQgPSBwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXItPmdldEVuY29kZXJJbnB1dEZvcm1hdCgpOwotICAgIH0KLSAgICBpZiAoZW5jb2RlcklucHV0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKLSAgICAgICAgZGVsZXRlIHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlcjsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyID0gTlVMTDsKLSAgICB9Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlckNvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWVuY29kZXJJbnB1dDsKLSAgICBBTE9HSSgiZW5jb2RlciBpbnB1dCBmb3JtYXQgPSAweCVYXG4iLCBlbmNvZGVySW5wdXQpOwotCi0gICAgKnBDb250ZXh0ID0gcEVuY29kZXJDb250ZXh0OwotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9pbml0IG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xlYW51cChwRW5jb2RlckNvbnRleHQpOwotICAgICAgICAqcENvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXQgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXRfSDI2MyhNNEVOQ09ERVJfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNFZQUF9hcHBseV9mY3QqIHBWUFBmY3QsCi0gICAgICAgIE00VlBQX0NvbnRleHQgcFZQUGN0eHQsIE00T1NBX1ZvaWQqIHBFeHRlcm5hbEFQSSwgTTRPU0FfVm9pZCogcFVzZXJEYXRhKQotICAgICAgICB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdChNNEVOQ09ERVJfa0gyNjMsIHBDb250ZXh0LAotICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSwgcFZQUGZjdCwgcFZQUGN0eHQsIHBFeHRlcm5hbEFQSSwgcFVzZXJEYXRhKTsKLX0KLQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdF9NUEVHNChNNEVOQ09ERVJfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNFZQUF9hcHBseV9mY3QqIHBWUFBmY3QsCi0gICAgICAgIE00VlBQX0NvbnRleHQgcFZQUGN0eHQsIE00T1NBX1ZvaWQqIHBFeHRlcm5hbEFQSSwgTTRPU0FfVm9pZCogcFVzZXJEYXRhKQotICAgICAgICB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdChNNEVOQ09ERVJfa01QRUc0LCBwQ29udGV4dCwKLSAgICAgICAgcFdyaXRlckRhdGFJbnRlcmZhY2UsIHBWUFBmY3QsIHBWUFBjdHh0LCBwRXh0ZXJuYWxBUEksIHBVc2VyRGF0YSk7Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXRfSDI2NChNNEVOQ09ERVJfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgIE00V1JJVEVSX0RhdGFJbnRlcmZhY2UqIHBXcml0ZXJEYXRhSW50ZXJmYWNlLCBNNFZQUF9hcHBseV9mY3QqIHBWUFBmY3QsCi0gICAgICAgIE00VlBQX0NvbnRleHQgcFZQUGN0eHQsIE00T1NBX1ZvaWQqIHBFeHRlcm5hbEFQSSwgTTRPU0FfVm9pZCogcFVzZXJEYXRhKQotICAgICAgICB7Ci0KLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfaW5pdChNNEVOQ09ERVJfa0gyNjQsIHBDb250ZXh0LAotICAgICAgICBwV3JpdGVyRGF0YUludGVyZmFjZSwgcFZQUGZjdCwgcFZQUGN0eHQsIHBFeHRlcm5hbEFQSSwgcFVzZXJEYXRhKTsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbG9zZSBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIFZJREVPRURJVE9SX0NIRUNLKE9QRU5FRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgLy8gUmVsZWFzZSBtZW1vcnkKLSAgICBTQUZFX0ZSRUUocEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMpOwotCi0gICAgLy8gRGVzdHJveSB0aGUgZ3JhcGgKLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLmNsZWFyKCk7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ2xpZW50LmRpc2Nvbm5lY3QoKTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlLmNsZWFyKCk7Ci0KLSAgICBkZWxldGUgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlciA9IE5VTEw7Ci0KLSAgICBkZWxldGUgcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUk0MjBDb2xvckNvbnZlcnRlciA9IE5VTEw7Ci0KLSAgICAvLyBTZXQgdGhlIG5ldyBzdGF0ZQotICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gQ1JFQVRFRDsKLQotY2xlYW5VcDoKLSAgICBpZiggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbG9zZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbG9zZSBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW4oTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00U1lTX0FjY2Vzc1VuaXQqIHBBVSwgTTRPU0FfVm9pZCogcFBhcmFtcykgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRFTkNPREVSX1BhcmFtcyogcENvZGVjUGFyYW1zID0gTTRPU0FfTlVMTDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLSAgICBzcDxNZXRhRGF0YT4gZW5jb2Rlck1ldGFkYXRhID0gTlVMTDsKLSAgICBjb25zdCBjaGFyKiBtaW1lID0gTlVMTDsKLSAgICBpbnQzMl90IGlQcm9maWxlID0gMDsKLSAgICBpbnQzMl90IGlMZXZlbCA9IDA7Ci0KLSAgICBpbnQzMl90IGlGcmFtZVJhdGUgPSAwOwotICAgIHVpbnQzMl90IGNvZGVjRmxhZ3MgPSAwOwotCi0gICAgQUxPR1YoIj4+PiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwQVUsICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBQYXJhbXMsICBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIHBDb2RlY1BhcmFtcyA9IChNNEVOQ09ERVJfUGFyYW1zKilwUGFyYW1zOwotICAgIFZJREVPRURJVE9SX0NIRUNLKENSRUFURUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENvbnRleHQgaW5pdGlhbGl6YXRpb24KLSAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0ID0gcEFVOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bVZpZGVvRWRpdG9yUHJvZmlsZSA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tTWF4UHJlZmV0Y2hGcmFtZXMgPQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1WaWRlb0VkaXRvclByb2ZpbGUtPmdldFZpZGVvRWRpdG9yQ2FwUGFyYW1CeU5hbWUoCi0gICAgICAgICJtYXhQcmVmZXRjaFlVVkZyYW1lcyIpOwotCi0gICAgLy8gQWxsb2NhdGUgJiBpbml0aWFsaXplIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gICAgU0FGRV9NQUxMT0MocEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMsIE00RU5DT0RFUl9QYXJhbXMsIDEsCi0gICAgICAgICJWaWRlb0VkaXRvclZpZGVvRW5jb2RlciIpOwotCi0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+SW5wdXRGb3JtYXQgPSBwQ29kZWNQYXJhbXMtPklucHV0Rm9ybWF0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5JbnB1dEZyYW1lV2lkdGggPQotICAgICAgICBwQ29kZWNQYXJhbXMtPklucHV0RnJhbWVXaWR0aDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+SW5wdXRGcmFtZUhlaWdodCA9Ci0gICAgICAgIHBDb2RlY1BhcmFtcy0+SW5wdXRGcmFtZUhlaWdodDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aCA9IHBDb2RlY1BhcmFtcy0+RnJhbWVXaWR0aDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQgPSBwQ29kZWNQYXJhbXMtPkZyYW1lSGVpZ2h0OwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5CaXRyYXRlID0gcENvZGVjUGFyYW1zLT5CaXRyYXRlOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5GcmFtZVJhdGUgPSBwQ29kZWNQYXJhbXMtPkZyYW1lUmF0ZTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ID0gcENvZGVjUGFyYW1zLT5Gb3JtYXQ7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPnZpZGVvUHJvZmlsZSA9IHBDb2RlY1BhcmFtcy0+dmlkZW9Qcm9maWxlOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT52aWRlb0xldmVsPSBwQ29kZWNQYXJhbXMtPnZpZGVvTGV2ZWw7Ci0KLSAgICAvLyBDaGVjayBvdXRwdXQgZm9ybWF0IGNvbnNpc3RlbmN5IGFuZCByZXNvbHV0aW9uCi0gICAgVklERU9FRElUT1JfQ0hFQ0soCi0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgPT0gcEVuY29kZXJDb250ZXh0LT5tRm9ybWF0LAotICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKDAgPT0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lV2lkdGggICUgMTYsCi0gICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soMCA9PSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQgJSAxNiwKLSAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIC8qKgotICAgICAqIFN0YWdlRnJpZ2h0IGdyYXBoIGJ1aWxkaW5nCi0gICAgICovCi0KLSAgICAvLyBDcmVhdGUgdGhlIG1ldGEgZGF0YSBmb3IgdGhlIGVuY29kZXIKLSAgICBlbmNvZGVyTWV0YWRhdGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgc3dpdGNoKCBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rSDI2MzoKLSAgICAgICAgICAgIG1pbWUgICAgID0gTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rTVBFRzQ6Ci0gICAgICAgICAgICBtaW1lICAgICA9IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tIMjY0OgotICAgICAgICAgICAgbWltZSAgICAgPSBNRURJQV9NSU1FVFlQRV9WSURFT19BVkM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiVmlkZW9FbmNvZGVyX29wZW4gOiBpbmNvcnJlY3QgaW5wdXQgZm9ybWF0IiwKLSAgICAgICAgICAgICAgICBNNEVSUl9QQVJBTUVURVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlQcm9maWxlID0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPnZpZGVvUHJvZmlsZTsKLSAgICBpTGV2ZWwgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+dmlkZW9MZXZlbDsKLSAgICBBTE9HVigiRW5jb2RlciBtaW1lICVzIHByb2ZpbGUgJWQsIGxldmVsICVkIiwKLSAgICAgICAgbWltZSxpUHJvZmlsZSwgaUxldmVsKTsKLSAgICBBTE9HVigiRW5jb2RlciB3ICVkLCBoICVkLCBiaXRyYXRlICVkLCBmcHMgJWQiLAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aCwKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lSGVpZ2h0LAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Qml0cmF0ZSwKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lUmF0ZSk7Ci0gICAgQ0hFQ0soaVByb2ZpbGUgIT0gMHg3ZmZmZmZmZik7Ci0gICAgQ0hFQ0soaUxldmVsICE9IDB4N2ZmZmZmZmYpOwotCi0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCBpUHJvZmlsZSk7Ci0gICAgLy9GSVhNRToKLSAgICAvLyBUZW1wOiBEbyBub3Qgc2V0IHRoZSBsZXZlbCBmb3IgTXBlZzQgLyBILjI2MyBFbmMKLSAgICAvLyBhcyBPTVguTnZpZGlhLm1wNC5lbmNvZGVyIGFuZCBPTVguTnZpZGlhLmgyNjMuZW5jb2RlcgotICAgIC8vIHJldHVybiAweDgwMDAxMDE5Ci0gICAgaWYgKHBFbmNvZGVyQ29udGV4dC0+bUNvZGVjUGFyYW1zLT5Gb3JtYXQgPT0gTTRFTkNPREVSX2tIMjY0KSB7Ci0gICAgICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleVZpZGVvTGV2ZWwsIGlMZXZlbCk7Ci0gICAgfQotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLAotICAgICAgICAoaW50MzJfdClwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aCk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5U3RyaWRlLAotICAgICAgICAoaW50MzJfdClwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aCk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LAotICAgICAgICAoaW50MzJfdClwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQpOwotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleVNsaWNlSGVpZ2h0LAotICAgICAgICAoaW50MzJfdClwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQpOwotCi0gICAgc3dpdGNoKCBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVSYXRlICkgewotICAgICAgICBjYXNlIE00RU5DT0RFUl9rNV9GUFM6ICAgIGlGcmFtZVJhdGUgPSA1OyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2s3XzVfRlBTOiAgaUZyYW1lUmF0ZSA9IDg7ICBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazEwX0ZQUzogICBpRnJhbWVSYXRlID0gMTA7IGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rMTJfNV9GUFM6IGlGcmFtZVJhdGUgPSAxMzsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2sxNV9GUFM6ICAgaUZyYW1lUmF0ZSA9IDE1OyBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfazIwX0ZQUzogICBpRnJhbWVSYXRlID0gMjA7IGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rMjVfRlBTOiAgIGlGcmFtZVJhdGUgPSAyNTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2szMF9GUFM6ICAgaUZyYW1lUmF0ZSA9IDMwOyBicmVhazsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa1ZBUklBQkxFX0ZQUzoKLSAgICAgICAgICAgIGlGcmFtZVJhdGUgPSAzMDsKLSAgICAgICAgICAgIEFMT0dJKCJGcmFtZSByYXRlIHNldCB0byBNNEVOQ09ERVJfa1ZBUklBQkxFX0ZQUzogc2V0IHRvIDMwIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tVU0VfVElNRVNDQUxFOgotICAgICAgICAgICAgaUZyYW1lUmF0ZSA9IDMwOwotICAgICAgICAgICAgQUxPR0koIkZyYW1lIHJhdGUgc2V0IHRvIE00RU5DT0RFUl9rVVNFX1RJTUVTQ0FMRTogIHNldCB0byAzMCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKCEiVmlkZW9FbmNvZGVyX29wZW46aW5jb3JyZWN0IGZyYW1lcmF0ZSIsCi0gICAgICAgICAgICAgICAgTTRFUlJfU1RBVEUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgaUZyYW1lUmF0ZSk7Ci0gICAgZW5jb2Rlck1ldGFkYXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwKLSAgICAgICAgKGludDMyX3QpcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkJpdHJhdGUpOwotICAgIGVuY29kZXJNZXRhZGF0YS0+c2V0SW50MzIoa0tleUlGcmFtZXNJbnRlcnZhbCwgMSk7Ci0KLSAgICBlbmNvZGVyTWV0YWRhdGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlckNvbG9yRm9ybWF0KTsKLQotICAgIGlmIChwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+Rm9ybWF0ICE9IE00RU5DT0RFUl9rSDI2MykgewotICAgICAgICAvLyBHZXQgdGhlIGVuY29kZXIgRFNJCi0gICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldERTSShwRW5jb2RlckNvbnRleHQsIGVuY29kZXJNZXRhZGF0YSk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSB0aGUgZW5jb2RlciBzb3VyY2UKLSAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJTb3VyY2U6OkNyZWF0ZSgKLSAgICAgICAgZW5jb2Rlck1ldGFkYXRhKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSygKLSAgICAgICAgTlVMTCAhPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlLmdldCgpLCBNNEVSUl9TVEFURSk7Ci0KLSAgICAvLyBDb25uZWN0IHRvIHRoZSBPTVggY2xpZW50Ci0gICAgcmVzdWx0ID0gcEVuY29kZXJDb250ZXh0LT5tQ2xpZW50LmNvbm5lY3QoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgT01YIGNvZGVjCi0jaWZkZWYgVklERU9FRElUT1JfRk9SQ0VDT0RFQwotICAgIGNvZGVjRmxhZ3MgfD0gT01YQ29kZWM6OlZJREVPRURJVE9SX0ZPUkNFQ09ERUM7Ci0jZW5kaWYgLyogVklERU9FRElUT1JfRk9SQ0VDT0RFQyAqLwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUVuY29kZXIgPSBPTVhDb2RlYzo6Q3JlYXRlKAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1DbGllbnQuaW50ZXJmYWNlKCksIGVuY29kZXJNZXRhZGF0YSwgdHJ1ZSwKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tRW5jb2RlclNvdXJjZSwgTlVMTCwgY29kZWNGbGFncyk7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTlVMTCAhPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLmdldCgpLCBNNEVSUl9TVEFURSk7Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX29wZW4gOiBET05FIik7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyID0gbmV3IE1lZGlhQnVmZmVyUHVsbGVyKAotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyKTsKLQotICAgIC8vIFNldCB0aGUgbmV3IHN0YXRlCi0gICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBPUEVORUQ7Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfb3BlbiBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2Nsb3NlKHBFbmNvZGVyQ29udGV4dCk7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9vcGVuIEVSUk9SIDB4JVgiLCBlcnIpOwotICAgIH0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfb3BlbiBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc0lucHV0QnVmZmVyKAotICAgICAgICBNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwgTTRPU0FfRG91YmxlIEN0cywKLSAgICAgICAgTTRPU0FfQm9vbCBiUmVhY2hlZEVPUykgewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqIHBFbmNvZGVyQ29udGV4dCA9IE00T1NBX05VTEw7Ci0gICAgTTRWSUZJX0ltYWdlUGxhbmUgcE91dFBsYW5lWzNdOwotICAgIE1lZGlhQnVmZmVyKiBidWZmZXIgPSBOVUxMOwotICAgIGludDMyX3QgbmJCdWZmZXIgPSAwOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBiZWdpbjogY3RzICAlZiIsIEN0cyk7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgcE91dFBsYW5lWzBdLnBhY19kYXRhID0gTTRPU0FfTlVMTDsKLSAgICBwT3V0UGxhbmVbMV0ucGFjX2RhdGEgPSBNNE9TQV9OVUxMOwotICAgIHBPdXRQbGFuZVsyXS5wYWNfZGF0YSA9IE00T1NBX05VTEw7Ci0KLSAgICBpZiAoIE00T1NBX0ZBTFNFID09IGJSZWFjaGVkRU9TICkgewotICAgICAgICBNNE9TQV9VSW50MzIgc2l6ZVkgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVXaWR0aCAqCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQ7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBzaXplVSA9IHNpemVZID4+IDI7Ci0gICAgICAgIE00T1NBX1VJbnQzMiBzaXplICA9IHNpemVZICsgMipzaXplVTsKLSAgICAgICAgTTRPU0FfVUludDgqIHBEYXRhID0gTTRPU0FfTlVMTDsKLSAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKChzaXplX3Qpc2l6ZSk7Ci0gICAgICAgIHBEYXRhID0gKE00T1NBX1VJbnQ4KilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgb3V0cHV0IGltYWdlIGZvciBwcmUtcHJvY2Vzc2luZwotICAgICAgICBwT3V0UGxhbmVbMF0udV93aWR0aCAgID0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lV2lkdGg7Ci0gICAgICAgIHBPdXRQbGFuZVswXS51X2hlaWdodCAgPSBwRW5jb2RlckNvbnRleHQtPm1Db2RlY1BhcmFtcy0+RnJhbWVIZWlnaHQ7Ci0gICAgICAgIHBPdXRQbGFuZVswXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBwT3V0UGxhbmVbMF0udV9zdHJpZGUgID0gcE91dFBsYW5lWzBdLnVfd2lkdGg7Ci0gICAgICAgIHBPdXRQbGFuZVsxXS51X3dpZHRoICAgPSBwT3V0UGxhbmVbMF0udV93aWR0aC8yOwotICAgICAgICBwT3V0UGxhbmVbMV0udV9oZWlnaHQgID0gcE91dFBsYW5lWzBdLnVfaGVpZ2h0LzI7Ci0gICAgICAgIHBPdXRQbGFuZVsxXS51X3RvcGxlZnQgPSAwOwotICAgICAgICBwT3V0UGxhbmVbMV0udV9zdHJpZGUgID0gcE91dFBsYW5lWzBdLnVfc3RyaWRlLzI7Ci0gICAgICAgIHBPdXRQbGFuZVsyXS51X3dpZHRoICAgPSBwT3V0UGxhbmVbMV0udV93aWR0aDsKLSAgICAgICAgcE91dFBsYW5lWzJdLnVfaGVpZ2h0ICA9IHBPdXRQbGFuZVsxXS51X2hlaWdodDsKLSAgICAgICAgcE91dFBsYW5lWzJdLnVfdG9wbGVmdCA9IDA7Ci0gICAgICAgIHBPdXRQbGFuZVsyXS51X3N0cmlkZSAgPSBwT3V0UGxhbmVbMV0udV9zdHJpZGU7Ci0KLSAgICAgICAgcE91dFBsYW5lWzBdLnBhY19kYXRhID0gcERhdGE7Ci0gICAgICAgIHBPdXRQbGFuZVsxXS5wYWNfZGF0YSA9IHBEYXRhICsgc2l6ZVk7Ci0gICAgICAgIHBPdXRQbGFuZVsyXS5wYWNfZGF0YSA9IHBEYXRhICsgc2l6ZVkgKyBzaXplVTsKLQotICAgICAgICAvLyBBcHBseSBwcmUtcHJvY2Vzc2luZwotICAgICAgICBlcnIgPSBwRW5jb2RlckNvbnRleHQtPm1QcmVQcm9jRnVuY3Rpb24oCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1QcmVQcm9jQ29udGV4dCwgTTRPU0FfTlVMTCwgcE91dFBsYW5lKTsKLSAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soTTROT19FUlJPUiA9PSBlcnIsIGVycik7Ci0KLSAgICAgICAgLy8gQ29udmVydCBNZWRpYUJ1ZmZlciB0byB0aGUgZW5jb2RlciBpbnB1dCBmb3JtYXQgaWYgbmVjZXNzYXJ5Ci0gICAgICAgIGlmIChwRW5jb2RlckNvbnRleHQtPm1JNDIwQ29sb3JDb252ZXJ0ZXIpIHsKLSAgICAgICAgICAgIEk0MjBDb2xvckNvbnZlcnRlciogY29udmVydGVyID0gcEVuY29kZXJDb250ZXh0LT5tSTQyMENvbG9yQ29udmVydGVyOwotICAgICAgICAgICAgaW50IGFjdHVhbFdpZHRoID0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lV2lkdGg7Ci0gICAgICAgICAgICBpbnQgYWN0dWFsSGVpZ2h0ID0gcEVuY29kZXJDb250ZXh0LT5tQ29kZWNQYXJhbXMtPkZyYW1lSGVpZ2h0OwotCi0gICAgICAgICAgICBpbnQgZW5jb2RlcldpZHRoLCBlbmNvZGVySGVpZ2h0OwotICAgICAgICAgICAgQVJlY3QgZW5jb2RlclJlY3Q7Ci0gICAgICAgICAgICBpbnQgZW5jb2RlckJ1ZmZlclNpemU7Ci0KLSAgICAgICAgICAgIGlmIChjb252ZXJ0ZXItPmdldEVuY29kZXJJbnB1dEJ1ZmZlckluZm8oCi0gICAgICAgICAgICAgICAgYWN0dWFsV2lkdGgsIGFjdHVhbEhlaWdodCwKLSAgICAgICAgICAgICAgICAmZW5jb2RlcldpZHRoLCAmZW5jb2RlckhlaWdodCwKLSAgICAgICAgICAgICAgICAmZW5jb2RlclJlY3QsICZlbmNvZGVyQnVmZmVyU2l6ZSkgPT0gMCkgewotCi0gICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIqIG5ld0J1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihlbmNvZGVyQnVmZmVyU2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29udmVydGVyLT5jb252ZXJ0STQyMFRvRW5jb2RlcklucHV0KAotICAgICAgICAgICAgICAgICAgICBwRGF0YSwgIC8vIHNyY0JpdHMKLSAgICAgICAgICAgICAgICAgICAgYWN0dWFsV2lkdGgsIGFjdHVhbEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlcldpZHRoLCBlbmNvZGVySGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKW5ld0J1ZmZlci0+ZGF0YSgpICsgbmV3QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjb252ZXJ0STQyMFRvRW5jb2RlcklucHV0IGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBuZXcgYnVmZmVyCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3QnVmZmVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBtZXRhZGF0YQotICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgKGludDY0X3QpKEN0cyoxMDAwKSk7Ci0gICAgfQotCi0gICAgLy8gUHVzaCB0aGUgYnVmZmVyIHRvIHRoZSBzb3VyY2UsIGEgTlVMTCBidWZmZXIsIG5vdGlmaWVzIHRoZSBzb3VyY2Ugb2YgRU9TCi0gICAgbmJCdWZmZXIgPSBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlLT5zdG9yZUJ1ZmZlcihidWZmZXIpOwotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIgZXJyb3IgMHglWCIsIGVycik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYoIE5VTEwgIT0gYnVmZmVyICkgewotICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlciBlbmQiKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcigKLSAgICAgICAgTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsIE1lZGlhQnVmZmVyKiBidWZmZXIpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIE00T1NBX1VJbnQzMiBDdHMgPSAwOwotICAgIGludDMyX3QgaTMyVG1wID0gMDsKLSAgICBpbnQ2NF90IGk2NFRtcCA9IDA7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7Ci0KLSAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBiZWdpbiIpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gYnVmZmVyLCAgIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0KLSAgICAvLyBQcm9jZXNzIHRoZSByZXR1cm5lZCBBVQotICAgIGlmICggMCA9PSBidWZmZXItPnJhbmdlX2xlbmd0aCgpICkgewotICAgICAgICAvLyBFbmNvZGVyIGhhcyBubyBkYXRhIHlldCwgbm90aGluZyB1bnVzdWFsCi0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIDogYnVmZmVyIGlzIGVtcHR5Iik7Ci0gICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICB9Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soMCA9PSAoKChpbnRwdHJfdClidWZmZXItPmRhdGEoKSklNCksIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS5nZXQoKSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICBpZiAoIGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgJmkzMlRtcCkgJiYgaTMyVG1wICl7Ci0gICAgICAgIHsgICAvLyBEaXNwbGF5IHRoZSBEU0kKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIERTSSAlZCIsCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICB1aW50OF90KiB0bXAgPSAodWludDhfdCopKGJ1ZmZlci0+ZGF0YSgpKTsKLSAgICAgICAgICAgIGZvciggdWludDMyX3QgaT0wOyBpPGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7IGkrKyApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiRFNJIFslZF0gJS4yWCIsIGksIHRtcFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBDaGVjayB0aGUgQ1RTCi0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJmk2NFRtcCksCi0gICAgICAgICAgICBNNEVSUl9TVEFURSk7Ci0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tTmJPdXRwdXRGcmFtZXMrKzsKLSAgICAgICAgaWYgKCAwID4gcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgKSB7Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1GaXJzdE91dHB1dEN0cyA9IGk2NFRtcDsKLSAgICAgICAgfQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0T3V0cHV0Q3RzID0gaTY0VG1wOwotCi0gICAgICAgIEN0cyA9IChNNE9TQV9JbnQzMikoaTY0VG1wLzEwMDApOwotICAgICAgICBBTE9HVigiW1RTX0NIRUNLXSBWSS9FTkMgV1JJVEUgZnJhbWUgJWQgQCAlbGxkIC0+ICVkIChsYXN0ICVkKSIsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcywgaTY0VG1wLCBDdHMsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0Q1RTKTsKLSAgICAgICAgaWYgKCBDdHMgPCBwRW5jb2RlckNvbnRleHQtPm1MYXN0Q1RTICkgewotICAgICAgICAgICAgQUxPR1YoIlZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIFdBUk5JTkcgOiBDdHMgaXMgZ29pbmcgIgotICAgICAgICAgICAgImJhY2t3YXJkcyAlZCA8ICVkIiwgQ3RzLCBwRW5jb2RlckNvbnRleHQtPm1MYXN0Q1RTKTsKLSAgICAgICAgICAgIGdvdG8gY2xlYW5VcDsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciA6ICVkICVkIiwKLSAgICAgICAgICAgIEN0cywgcEVuY29kZXJDb250ZXh0LT5tTGFzdENUUyk7Ci0KLSAgICAgICAgLy8gUmV0cmlldmUgdGhlIEFVIGNvbnRhaW5lcgotICAgICAgICBlcnIgPSBwRW5jb2RlckNvbnRleHQtPm1Xcml0ZXJEYXRhSW50ZXJmYWNlLT5wU3RhcnRBVSgKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVdyaXRlckRhdGFJbnRlcmZhY2UtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c3RyZWFtLT5zdHJlYW1JRCwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQpOwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgICAgICAvLyBGb3JtYXQgdGhlIEFVCi0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKAotICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA8PSBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5zaXplLAotICAgICAgICAgICAgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgLy8gUmVtb3ZlIEgyNjQgQVUgc3RhcnQgY29kZQotICAgICAgICBpZiAoIE00RU5DT0RFUl9rSDI2NCA9PSBwRW5jb2RlckNvbnRleHQtPm1Gb3JtYXQgKSB7Ci0gICAgICAgICAgICBpZiAoIW1lbWNtcCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgXAotICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX29mZnNldCgpLCAiXHgwMFx4MDBceDAwXHgwMSIsIDQpICkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyA0LAotICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gNCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIChNNEVOQ09ERVJfa0gyNjQgPT0gcEVuY29kZXJDb250ZXh0LT5tRm9ybWF0KSAmJgotICAgICAgICAgICAgKE00T1NBX05VTEwgIT0gcEVuY29kZXJDb250ZXh0LT5tSDI2NE5BTFVQb3N0UHJvY2Vzc0ZjdCkgKSB7Ci0gICAgICAgIC8vIEgyNjQgdHJpbW1pbmcgY2FzZSwgTkFMVSBwb3N0IHByb2Nlc3NpbmcgaXMgbmVlZGVkCi0gICAgICAgIE00T1NBX0ludDMyIG91dHB1dFNpemUgPSBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5zaXplOwotICAgICAgICBlcnIgPSBwRW5jb2RlckNvbnRleHQtPm1IMjY0TkFMVVBvc3RQcm9jZXNzRmN0KAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tSDI2NE5BTFVQb3N0UHJvY2Vzc0N0eCwKLSAgICAgICAgICAgIChNNE9TQV9VSW50OCopYnVmZmVyLT5kYXRhKCkrYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksCi0gICAgICAgICAgICAoTTRPU0FfVUludDgqKXBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPmRhdGFBZGRyZXNzLAotICAgICAgICAgICAgJm91dHB1dFNpemUpOwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c2l6ZSA9IChNNE9TQV9VSW50MzIpb3V0cHV0U2l6ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoZSBBVSBjYW4ganVzdCBiZSBjb3BpZWQKLSAgICAgICAgICAgIG1lbWNweSgodm9pZCAqKXBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPlwKLSAgICAgICAgICAgICAgICBkYXRhQWRkcmVzcywgKHZvaWQgKikoKE00T1NBX01lbUFkZHI4KShidWZmZXItPmRhdGEoKSkrYnVmZmVyLT5cCi0gICAgICAgICAgICAgICAgcmFuZ2Vfb2Zmc2V0KCkpLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPnNpemUgPQotICAgICAgICAgICAgICAgIChNNE9TQV9VSW50MzIpYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwmaTMyVG1wKSAmJiBpMzJUbXApewotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+YXR0cmlidXRlID0gQVVfUkFQOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+YXR0cmlidXRlID0gQVVfUF9GcmFtZTsKLSAgICAgICAgfQotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0Q1RTID0gQ3RzOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5DVFMgPSBDdHM7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQtPkRUUyA9IEN0czsKLQotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcjogQVUgQCAweCVYIDB4JVggJWQgJWQiLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICAqcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+ZGF0YUFkZHJlc3MsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1BY2Nlc3NVbml0LT5zaXplLAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+Q1RTKTsKLQotICAgICAgICAvLyBXcml0ZSB0aGUgQVUKLSAgICAgICAgZXJyID0gcEVuY29kZXJDb250ZXh0LT5tV3JpdGVyRGF0YUludGVyZmFjZS0+cFByb2Nlc3NBVSgKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVdyaXRlckRhdGFJbnRlcmZhY2UtPnBXcml0ZXJDb250ZXh0LAotICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tQWNjZXNzVW5pdC0+c3RyZWFtLT5zdHJlYW1JRCwKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUFjY2Vzc1VuaXQpOwotICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgaWYoIE00Tk9fRVJST1IgPT0gZXJyICkgewotICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlciBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFNBRkVfRlJFRShwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIucEJ1Zik7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUhlYWRlci5TaXplID0gMDsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NPdXRwdXRCdWZmZXIgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGUoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQsCi0gICAgICAgIE00VklGSV9JbWFnZVBsYW5lKiBwSW5QbGFuZSwgTTRPU0FfRG91YmxlIEN0cywKLSAgICAgICAgTTRFTkNPREVSX0ZyYW1lTW9kZSBGcmFtZU1vZGUpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190IHJlc3VsdCA9IE9LOwotICAgIE1lZGlhQnVmZmVyKiBvdXRwdXRCdWZmZXIgPSBOVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZSAweCVYICVmICVkIiwgcEluUGxhbmUsIEN0cywgRnJhbWVNb2RlKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotICAgIGlmICggU1RBUlRFRCA9PSBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSApIHsKLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBCVUZGRVJJTkc7Ci0gICAgfQotICAgIFZJREVPRURJVE9SX0NIRUNLKAotICAgICAgICAoQlVGRkVSSU5HIHwgUkVBRElORykgJiBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSwgTTRFUlJfU1RBVEUpOwotCi0gICAgcEVuY29kZXJDb250ZXh0LT5tTmJJbnB1dEZyYW1lcysrOwotICAgIGlmICggMCA+IHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0SW5wdXRDdHMgKSB7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUZpcnN0SW5wdXRDdHMgPSBDdHM7Ci0gICAgfQotICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RJbnB1dEN0cyA9IEN0czsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGUgMHglWCAlZCAlZiAoJWQpIiwgcEluUGxhbmUsIEZyYW1lTW9kZSwKLSAgICAgICAgQ3RzLCBwRW5jb2RlckNvbnRleHQtPm1MYXN0Q1RTKTsKLQotICAgIC8vIFB1c2ggdGhlIGlucHV0IGJ1ZmZlciB0byB0aGUgZW5jb2RlciBzb3VyY2UKLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIocEVuY29kZXJDb250ZXh0LCBDdHMsCi0gICAgICAgIE00T1NBX0ZBTFNFKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgIC8vIE5vdGlmeSB0aGUgc291cmNlIGluIGNhc2Ugb2YgRU9TCi0gICAgaWYgKCBNNEVOQ09ERVJfa0xhc3RGcmFtZSA9PSBGcmFtZU1vZGUgKSB7Ci0gICAgICAgIGVyciA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3Byb2Nlc3NJbnB1dEJ1ZmZlcigKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dCwgMCwgTTRPU0FfVFJVRSk7Ci0gICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotICAgIH0KLQotICAgIGlmICggQlVGRkVSSU5HID09IHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlICkgewotICAgICAgICAvLyBQcmVmZXRjaCBpcyBjb21wbGV0ZSwgc3RhcnQgcmVhZGluZwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1TdGF0ZSA9IFJFQURJTkc7Ci0gICAgfQotICAgIC8vIFJlYWQKLSAgICB3aGlsZSAoMSkgIHsKLSAgICAgICAgTWVkaWFCdWZmZXIgKm91dHB1dEJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5nZXRCdWZmZXJOb25CbG9ja2luZygpOwotCi0gICAgICAgIGlmIChvdXRwdXRCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgaW50MzJfdCBZVVZCdWZmZXJOdW1iZXIgPQotICAgICAgICAgICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyU291cmNlLT5nZXROdW1iZXJPZkJ1ZmZlcnNJblF1ZXVlKCk7Ci0gICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgY29uZmlndXJlZCBtYXhpbXVtIG51bWJlciBvZiBwcmVmZXRjaCBZVVYgZnJhbWVzIGlzCi0gICAgICAgICAgICAgKiBub3QgZXhjZWVkZWQuIFRoaXMgaXMgdG8gbGltaXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNhZ2Ugb2YgdmlkZW8gZWRpdG9yIGVuZ2luZS4KLSAgICAgICAgICAgICAqIFRoZSB2YWx1ZSBvZiBtYXhpbXVtIHByZWZldGNoIFl1diBmcmFtZXMgaXMgZGVmaW5lZCBpbiBtZWRpYV9wcm9maWxlcy54bWwgKi8KLSAgICAgICAgICAgIGlmICgoWVVWQnVmZmVyTnVtYmVyIDwgcEVuY29kZXJDb250ZXh0LT5tTWF4UHJlZmV0Y2hGcmFtZXMpIHx8Ci0gICAgICAgICAgICAgICAgKHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+aGFzTWVkaWFTb3VyY2VSZXR1cm5lZEVycm9yKCkKLSAgICAgICAgICAgICAgICAgICAgPT0gdHJ1ZSkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFByb3ZpZGUgdGhlIGVuY29kZWQgQVUgdG8gdGhlIHdyaXRlcgotICAgICAgICAgICAgZXJyID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcHJvY2Vzc091dHB1dEJ1ZmZlcihwRW5jb2RlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPnB1dEJ1ZmZlcihvdXRwdXRCdWZmZXIpOwotICAgICAgICB9Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2VuY29kZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGUgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9lbmNvZGUgZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0YXJ0KE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSICAgICAgICAgICAgICAgICAgZXJyICAgICAgICAgICAgID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotICAgIHN0YXR1c190ICAgICAgICAgICAgICAgICAgIHJlc3VsdCAgICAgICAgICA9IE9LOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0YXJ0IGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQgPSAoVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soT1BFTkVEID09IHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlLCBNNEVSUl9TVEFURSk7Ci0KLSAgICBwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzICA9IDA7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RJbnB1dEN0cyAgPSAtMS4wOwotICAgIHBFbmNvZGVyQ29udGV4dC0+bUxhc3RJbnB1dEN0cyAgID0gLTEuMDsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcyA9IDA7Ci0gICAgcEVuY29kZXJDb250ZXh0LT5tRmlyc3RPdXRwdXRDdHMgPSAtMTsKLSAgICBwRW5jb2RlckNvbnRleHQtPm1MYXN0T3V0cHV0Q3RzICA9IC0xOwotCi0gICAgcmVzdWx0ID0gcEVuY29kZXJDb250ZXh0LT5tRW5jb2Rlci0+c3RhcnQoKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhPSyA9PSByZXN1bHQsIE00RVJSX1NUQVRFKTsKLQotICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+c3RhcnQoKTsKLQotICAgIC8vIFNldCB0aGUgbmV3IHN0YXRlCi0gICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBTVEFSVEVEOwotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydCBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdGFydCBFUlJPUiAweCVYIiwgZXJyKTsKLSAgICB9Ci0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0YXJ0IGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdG9wKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0KSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLSAgICBNZWRpYUJ1ZmZlciogb3V0cHV0QnVmZmVyID0gTlVMTDsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdG9wIGJlZ2luIik7Ci0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcENvbnRleHQsIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgLy8gU2VuZCBFT1MgYWdhaW4gdG8gbWFrZSBzdXJlIHRoZSBzb3VyY2UgZG9lc24ndCBibG9jay4KLSAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzSW5wdXRCdWZmZXIocEVuY29kZXJDb250ZXh0LCAwLAotICAgICAgICBNNE9TQV9UUlVFKTsKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE5PX0VSUk9SID09IGVyciwgZXJyKTsKLQotICAgIC8vIFByb2Nlc3MgdGhlIHJlbWFpbmluZyBidWZmZXJzIGlmIG5lY2Vzc2FyeQotICAgIGlmICggKEJVRkZFUklORyB8IFJFQURJTkcpICYgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgKSB7Ci0gICAgICAgIHdoaWxlICgxKSAgewotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm91dHB1dEJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tUHVsbGVyLT5nZXRCdWZmZXJCbG9ja2luZygpOwotCi0gICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyID09IE5VTEwpIGJyZWFrOwotCi0gICAgICAgICAgICBlcnIgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9wcm9jZXNzT3V0cHV0QnVmZmVyKAotICAgICAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dCwgb3V0cHV0QnVmZmVyKTsKLSAgICAgICAgICAgIFZJREVPRURJVE9SX0NIRUNLKE00Tk9fRVJST1IgPT0gZXJyLCBlcnIpOwotCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1QdWxsZXItPnB1dEJ1ZmZlcihvdXRwdXRCdWZmZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgPSBTVEFSVEVEOwotICAgIH0KLQotICAgIC8vIFN0b3AgdGhlIGdyYXBoIG1vZHVsZSBpZiBuZWNlc3NhcnkKLSAgICBpZiAoIFNUQVJURUQgPT0gcEVuY29kZXJDb250ZXh0LT5tU3RhdGUgKSB7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVB1bGxlci0+c3RvcCgpOwotICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1FbmNvZGVyLT5zdG9wKCk7Ci0gICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bVN0YXRlID0gT1BFTkVEOwotICAgIH0KLQotICAgIGlmIChwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzICE9IHBFbmNvZGVyQ29udGV4dC0+bU5iT3V0cHV0RnJhbWVzKSB7Ci0gICAgICAgIEFMT0dXKCJTb21lIGZyYW1lcyB3ZXJlIG5vdCBlbmNvZGVkOiBpbnB1dCglZCkgIT0gb3V0cHV0KCVkKSIsCi0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1OYklucHV0RnJhbWVzLCBwRW5jb2RlckNvbnRleHQtPm1OYk91dHB1dEZyYW1lcyk7Ci0gICAgfQotCi1jbGVhblVwOgotICAgIGlmICggTTROT19FUlJPUiA9PSBlcnIgKSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdG9wIG5vIGVycm9yIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0b3AgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zdG9wIGVuZCIpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9yZWd1bEJpdFJhdGUoTTRFTkNPREVSX0NvbnRleHQgcENvbnRleHQpIHsKLSAgICBBTE9HVygicmVndWxCaXRSYXRlIGlzIG5vdCBpbXBsZW1lbnRlZCIpOwotICAgIHJldHVybiBNNE5PX0VSUk9SOwotfQotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uKE00RU5DT0RFUl9Db250ZXh0IHBDb250ZXh0LAotICAgICAgICBNNE9TQV9VSW50MzIgb3B0aW9uSUQsIE00T1NBX0RhdGFPcHRpb24gb3B0aW9uVmFsdWUpIHsKLSAgICBNNE9TQV9FUlIgZXJyID0gTTROT19FUlJPUjsKLSAgICBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KiBwRW5jb2RlckNvbnRleHQgPSBNNE9TQV9OVUxMOwotCi0gICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbiBzdGFydCBvcHRpb25JRCAweCVYIiwgb3B0aW9uSUQpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotCi0gICAgcEVuY29kZXJDb250ZXh0ID0gKFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX0NvbnRleHQqKXBDb250ZXh0OwotCi0gICAgc3dpdGNoKCBvcHRpb25JRCApIHsKLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa09wdGlvbklEX1NldEgyNjRQcm9jZXNzTkFMVWZjdHNQdHI6Ci0gICAgICAgICAgICBwRW5jb2RlckNvbnRleHQtPm1IMjY0TkFMVVBvc3RQcm9jZXNzRmN0ID0KLSAgICAgICAgICAgICAgICAoSDI2NE1DU19Qcm9jZXNzRW5jb2RlZE5BTFVfZmN0KilvcHRpb25WYWx1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE00RU5DT0RFUl9rT3B0aW9uSURfSDI2NFByb2Nlc3NOQUxVQ29udGV4dDoKLSAgICAgICAgICAgIHBFbmNvZGVyQ29udGV4dC0+bUgyNjROQUxVUG9zdFByb2Nlc3NDdHggPQotICAgICAgICAgICAgICAgIChNNE9TQV9Db250ZXh0KW9wdGlvblZhbHVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uOiB1bnN1cHBvcnRlZCBvcHRpb25JZCAweCVYIiwKLSAgICAgICAgICAgICAgICBvcHRpb25JRCk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfQkFEX09QVElPTl9JRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3NldE9wdGlvbiBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb24gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9zZXRPcHRpb24gZW5kIik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotTTRPU0FfRVJSIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldE9wdGlvbihNNEVOQ09ERVJfQ29udGV4dCBwQ29udGV4dCwKLSAgICAgICAgTTRPU0FfVUludDMyIG9wdGlvbklELCBNNE9TQV9EYXRhT3B0aW9uIG9wdGlvblZhbHVlKSB7Ci0gICAgTTRPU0FfRVJSIGVyciA9IE00Tk9fRVJST1I7Ci0gICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfQ29udGV4dCogcEVuY29kZXJDb250ZXh0ID0gTTRPU0FfTlVMTDsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb24gYmVnaW4gb3B0aW5JZCAweCVYIiwgb3B0aW9uSUQpOwotICAgIC8vIElucHV0IHBhcmFtZXRlcnMgY2hlY2sKLSAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9OVUxMICE9IHBDb250ZXh0LCBNNEVSUl9QQVJBTUVURVIpOwotICAgIHBFbmNvZGVyQ29udGV4dCA9IChWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9Db250ZXh0KilwQ29udGV4dDsKLQotICAgIHN3aXRjaCggb3B0aW9uSUQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tPcHRpb25JRF9FbmNvZGVySGVhZGVyOgotICAgICAgICAgICAgVklERU9FRElUT1JfQ0hFQ0soCi0gICAgICAgICAgICAgICAgICAgIE00T1NBX05VTEwgIT0gcEVuY29kZXJDb250ZXh0LT5tSGVhZGVyLnBCdWYsIE00RVJSX1NUQVRFKTsKLSAgICAgICAgICAgICooTTRFTkNPREVSX0hlYWRlcioqKW9wdGlvblZhbHVlID0gJihwRW5jb2RlckNvbnRleHQtPm1IZWFkZXIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVigiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uOiB1bnN1cHBvcnRlZCBvcHRpb25JZCAweCVYIiwKLSAgICAgICAgICAgICAgICBvcHRpb25JRCk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfQkFEX09QVElPTl9JRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLWNsZWFuVXA6Ci0gICAgaWYgKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldE9wdGlvbiBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRPcHRpb24gRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2UoTTRFTkNPREVSX0Zvcm1hdCBmb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9Gb3JtYXQqIHBGb3JtYXQsCi0gICAgICAgIE00RU5DT0RFUl9HbG9iYWxJbnRlcmZhY2UqKiBwRW5jb2RlckludGVyZmFjZSwgTTRFTkNPREVSX09wZW5Nb2RlIG1vZGUpewotICAgIE00T1NBX0VSUiBlcnIgPSBNNE5PX0VSUk9SOwotCi0gICAgLy8gSW5wdXQgcGFyYW1ldGVycyBjaGVjawotICAgIFZJREVPRURJVE9SX0NIRUNLKE00T1NBX05VTEwgIT0gcEZvcm1hdCwgICAgICAgICAgIE00RVJSX1BBUkFNRVRFUik7Ci0gICAgVklERU9FRElUT1JfQ0hFQ0soTTRPU0FfTlVMTCAhPSBwRW5jb2RlckludGVyZmFjZSwgTTRFUlJfUEFSQU1FVEVSKTsKLQotICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2UgYmVnaW4gMHgleCAweCV4ICVkIiwgcEZvcm1hdCwKLSAgICAgICAgcEVuY29kZXJJbnRlcmZhY2UsIG1vZGUpOwotCi0gICAgU0FGRV9NQUxMT0MoKnBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlLCAxLAotICAgICAgICAiVmlkZW9FZGl0b3JWaWRlb0VuY29kZXIiKTsKLQotICAgICpwRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgc3dpdGNoKCBmb3JtYXQgKSB7Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tIMjYzOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0SW5pdCA9Ci0gICAgICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXRfSDI2MzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBNNEVOQ09ERVJfa01QRUc0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0SW5pdCA9Ci0gICAgICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXRfTVBFRzQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgTTRFTkNPREVSX2tIMjY0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0SW5pdCA9Ci0gICAgICAgICAgICAgICAgICAgIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2luaXRfSDI2NDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2UgOiB1bnN1cHBvcnRlZCBmb3JtYXQgJWQiLAotICAgICAgICAgICAgICAgIGZvcm1hdCk7Ci0gICAgICAgICAgICBWSURFT0VESVRPUl9DSEVDSyhNNE9TQV9GQUxTRSwgTTRFUlJfUEFSQU1FVEVSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0T3BlbiAgICAgICAgID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfb3BlbjsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFN0YXJ0ICAgICAgICA9IFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX3N0YXJ0OwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0U3RvcCAgICAgICAgID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc3RvcDsKLSAgICAoKnBFbmNvZGVySW50ZXJmYWNlKS0+cEZjdFBhdXNlICAgICAgICA9IE00T1NBX05VTEw7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RSZXN1bWUgICAgICAgPSBNNE9TQV9OVUxMOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0Q2xvc2UgICAgICAgID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfY2xvc2U7Ci0gICAgKCpwRW5jb2RlckludGVyZmFjZSktPnBGY3RDbGVhbnVwICAgICAgPSBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9jbGVhbnVwOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0UmVndWxCaXRSYXRlID0KLSAgICAgICAgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfcmVndWxCaXRSYXRlOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0RW5jb2RlICAgICAgID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZW5jb2RlOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0U2V0T3B0aW9uICAgID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfc2V0T3B0aW9uOwotICAgICgqcEVuY29kZXJJbnRlcmZhY2UpLT5wRmN0R2V0T3B0aW9uICAgID0gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0T3B0aW9uOwotCi1jbGVhblVwOgotICAgIGlmKCBNNE5PX0VSUk9SID09IGVyciApIHsKLSAgICAgICAgQUxPR1YoIlZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZSBubyBlcnJvciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpwRW5jb2RlckludGVyZmFjZSA9IE00T1NBX05VTEw7Ci0gICAgICAgIEFMT0dWKCJWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2UgRVJST1IgMHglWCIsIGVycik7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLWV4dGVybiAiQyIgewotCi1NNE9TQV9FUlIgVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlX0gyNjMoTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSl7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZShNNEVOQ09ERVJfa0gyNjMsIHBGb3JtYXQsCi0gICAgICAgICAgICBwRW5jb2RlckludGVyZmFjZSwgbW9kZSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfTVBFRzQoTTRFTkNPREVSX0Zvcm1hdCogcEZvcm1hdCwKLSAgICAgICAgTTRFTkNPREVSX0dsb2JhbEludGVyZmFjZSoqIHBFbmNvZGVySW50ZXJmYWNlLCBNNEVOQ09ERVJfT3Blbk1vZGUgbW9kZSl7Ci0gICAgcmV0dXJuIFZpZGVvRWRpdG9yVmlkZW9FbmNvZGVyX2dldEludGVyZmFjZShNNEVOQ09ERVJfa01QRUc0LCBwRm9ybWF0LAotICAgICAgICAgICBwRW5jb2RlckludGVyZmFjZSwgbW9kZSk7Ci19Ci0KLU00T1NBX0VSUiBWaWRlb0VkaXRvclZpZGVvRW5jb2Rlcl9nZXRJbnRlcmZhY2VfSDI2NChNNEVOQ09ERVJfRm9ybWF0KiBwRm9ybWF0LAotICAgICAgICBNNEVOQ09ERVJfR2xvYmFsSW50ZXJmYWNlKiogcEVuY29kZXJJbnRlcmZhY2UsIE00RU5DT0RFUl9PcGVuTW9kZSBtb2RlKXsKLSAgICByZXR1cm4gVmlkZW9FZGl0b3JWaWRlb0VuY29kZXJfZ2V0SW50ZXJmYWNlKE00RU5DT0RFUl9rSDI2NCwgcEZvcm1hdCwKLSAgICAgICAgICAgcEVuY29kZXJJbnRlcmZhY2UsIG1vZGUpOwotCi19Ci0KLX0gIC8vIGV4dGVybiAiQyIKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlMmQyMTExLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSNMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLSNpbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotI2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL0FuZHJvaWQubWsgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODVhNTMwYy4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIGxpYnZpZGVvZmlsdGVycwotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFOj0gbGlidmlkZW9lZGl0b3JfdmlkZW9maWx0ZXJzCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgIFwKLSAgICAgIE00VklGSV9CR1I1NjV0b1lVVjQyMC5jIFwKLSAgICAgIE00VklGSV9SZXNpemVSR0I4ODh0b1JHQjg4OC5jIFwKLSAgICAgIE00VklGSV9SZXNpemVSR0I1NjV0b1JHQjU2NS5jIFwKLSAgICAgIE00VklGSV9DbGlwLmMgXAotICAgICAgTTRWSUZJX1Jlc2l6ZVlVVnRvQkdSNTY1LmMgXAotICAgICAgTTRWSUZJX1JHQjg4OHRvWVVWNDIwLmMgXAotICAgICAgTTRWSUZJX1JHQjU2NXRvWVVWNDIwLmMgXAotICAgICAgTTRWRkxfdHJhbnNpdGlvbi5jCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYnZpZGVvZWRpdG9yX29zYWwgXAotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9saWJ2aWRlb2VkaXRvci9vc2FsL2luYyBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbGlidmlkZW9lZGl0b3IvdnNzL2NvbW1vbi9pbmMKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi0jIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCi1MT0NBTF9MRExJQlMgOj0gXAotICAgIC1scHRocmVhZCAtbGRsCi0KLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KZGlmZiAtLWdpdCBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZGTF90cmFuc2l0aW9uLmMgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWRkxfdHJhbnNpdGlvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YTVlMGI2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZGTF90cmFuc2l0aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICAgICBNNFRSQU5fdHJhbnNpdGlvbi5jCi0gKiBAYnJpZWYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKgotICogT1NBTCAobWVtc2V0IGFuZCBtZW1jcHkpICoqKi8KLSNpbmNsdWRlICJNNE9TQV9NZW1vcnkuaCIKLQotI2luY2x1ZGUgIk00VkZMX3RyYW5zaXRpb24uaCIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWZkZWYgTElUVExFX0VORElBTgotI2RlZmluZSBNNFZGTF9TV0FQX1NIT1JUKGEpIGEgPSAoKGEgJiAweEZGKSA8PCA4KSB8ICgoYSAmIDB4RkYwMCkgPj4gOCkKLSNlbHNlCi0jZGVmaW5lIE00VkZMX1NXQVBfU0hPUlQoYSkKLSNlbmRpZgotCi0jZGVmaW5lIExVTV9GQUNUT1JfTUFYIDEwCi0KLQotdW5zaWduZWQgY2hhciBNNFZGTF9tb2RpZnlMdW1hQnlTdGVwKE00VmlDb21JbWFnZVBsYW5lICpwbGFuZV9pbiwgTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZGTF9Nb2RpZkx1bVBhcmFtICpsdW1fcGFyYW0sIHZvaWQgKnVzZXJfZGF0YSkKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCAqcF9zcmMsICpwX2Rlc3QsICpwX3NyY19saW5lLCAqcF9kZXN0X2xpbmU7Ci0gICAgdW5zaWduZWQgbG9uZyBwaXhfc3JjOwotICAgIHVuc2lnbmVkIGxvbmcgdV9vdXRweCwgdV9vdXRweDI7Ci0gICAgdW5zaWduZWQgbG9uZyB1X3dpZHRoLCB1X3N0cmlkZSwgdV9zdHJpZGVfb3V0LHVfaGVpZ2h0LCBwaXg7Ci0gICAgdW5zaWduZWQgbG9uZyBsZjEsIGxmMiwgbGYzOwotICAgIGxvbmcgaSwgajsKLQotICAgIGlmIChsdW1fcGFyYW0tPmNvcHlfY2hyb21hICE9IDApCi0gICAgewotICAgICAgICAvKiBjb3B5IGNocm9tYSBwbGFuZSAqLwotCi0gICAgfQotCi0gICAgLyogYXBwbHkgbHVtYSBmYWN0b3IgKi8KLSAgICB1X3dpZHRoID0gcGxhbmVfaW5bMF0udV93aWR0aDsKLSAgICB1X2hlaWdodCA9IHBsYW5lX2luWzBdLnVfaGVpZ2h0OwotICAgIHVfc3RyaWRlID0gKHBsYW5lX2luWzBdLnVfc3RyaWRlID4+IDEpOwotICAgIHVfc3RyaWRlX291dCA9IChwbGFuZV9vdXRbMF0udV9zdHJpZGUgPj4gMSk7Ci0gICAgcF9kZXN0ID0gKHVuc2lnbmVkIHNob3J0ICopICZwbGFuZV9vdXRbMF0ucGFjX2RhdGFbcGxhbmVfb3V0WzBdLnVfdG9wbGVmdF07Ci0gICAgcF9zcmMgPSAodW5zaWduZWQgc2hvcnQgKikgJnBsYW5lX2luWzBdLnBhY19kYXRhW3BsYW5lX2luWzBdLnVfdG9wbGVmdF07Ci0gICAgcF9kZXN0X2xpbmUgPSBwX2Rlc3Q7Ci0gICAgcF9zcmNfbGluZSA9IHBfc3JjOwotCi0gICAgc3dpdGNoKGx1bV9wYXJhbS0+bHVtX2ZhY3RvcikKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgICAvKiB2ZXJ5IHNwZWNpZmljIGNhc2UgOiBzZXQgbHVtYSBwbGFuZSB0byAxNiAqLwotICAgICAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXBfZGVzdCwxNiwgdV93aWR0aCk7Ci0gICAgICAgICAgICBwX2Rlc3QgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSAxOgotICAgICAgICAvKiAwLjI1ICovCi0gICAgICAgIGxmMSA9IDY7IGxmMiA9IDY7IGxmMyA9IDc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgLyogMC4zNzUgKi8KLSAgICAgICAgbGYxID0gNzsgbGYyID0gNzsgbGYzID0gNzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgICAvKiAwLjUgKi8KLSAgICAgICAgbGYxID0gNzsgbGYyID0gNzsgbGYzID0gODsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgICAvKiAwLjYyNSAqLwotICAgICAgICBsZjEgPSA3OyBsZjIgPSA4OyBsZjMgPSA4OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDU6Ci0gICAgICAgIC8qIDAuNzUgKi8KLSAgICAgICAgbGYxID0gODsgbGYyID0gODsgbGYzID0gODsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2OgotICAgICAgICAvKiAwLjg3NSAqLwotICAgICAgICBsZjEgPSA5OyBsZjIgPSA4OyBsZjMgPSA3OwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBsZjEgPSA4OyBsZjIgPSA4OyBsZjMgPSA5OwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBmb3IgKGogPSB1X2hlaWdodDsgaiAhPSAwOyBqLS0pCi0gICAgewotICAgICAgICBwX2Rlc3QgPSBwX2Rlc3RfbGluZTsKLSAgICAgICAgcF9zcmMgPSBwX3NyY19saW5lOwotICAgICAgICBmb3IgKGkgPSAodV93aWR0aCA+PiAxKTsgaSAhPSAwOyBpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBpeF9zcmMgPSAodW5zaWduZWQgbG9uZykgKnBfc3JjKys7Ci0gICAgICAgICAgICBwaXggPSBwaXhfc3JjICYgMHhGRjsKLSAgICAgICAgICAgIHVfb3V0cHggPSAoKChwaXggPDwgbGYxKSArIChwaXggPDwgbGYyKSArIChwaXggPDwgbGYzKSApID4+IExVTV9GQUNUT1JfTUFYKTsKLSAgICAgICAgICAgIHBpeCA9ICgocGl4X3NyYyAmIDB4RkYwMCkgPj4gOCk7Ci0gICAgICAgICAgICB1X291dHB4MiA9ICgoKChwaXggPDwgbGYxKSArIChwaXggPDwgbGYyKSArIChwaXggPDwgbGYzKSApID4+IExVTV9GQUNUT1JfTUFYKTw8IDgpIDsKLSAgICAgICAgICAgICpwX2Rlc3QrKyA9ICh1bnNpZ25lZCBzaG9ydCkgKHVfb3V0cHgyIHwgdV9vdXRweCk7Ci0gICAgICAgIH0KLSAgICAgICAgcF9kZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICBwX3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotCi11bnNpZ25lZCBjaGFyIE00VkZMX21vZGlmeUx1bWFXaXRoU2NhbGUoTTRWaUNvbUltYWdlUGxhbmUgKnBsYW5lX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZpQ29tSW1hZ2VQbGFuZSAqcGxhbmVfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGx1bV9mYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCAqcF9zcmMsICpwX2Rlc3QsICpwX3NyY19saW5lLCAqcF9kZXN0X2xpbmU7Ci0gICAgdW5zaWduZWQgY2hhciAqcF9jc3JjLCAqcF9jZGVzdCwgKnBfY3NyY19saW5lLCAqcF9jZGVzdF9saW5lOwotICAgIHVuc2lnbmVkIGxvbmcgcGl4X3NyYzsKLSAgICB1bnNpZ25lZCBsb25nIHVfb3V0cHgsIHVfb3V0cHgyOwotICAgIHVuc2lnbmVkIGxvbmcgdV93aWR0aCwgdV9zdHJpZGUsIHVfc3RyaWRlX291dCx1X2hlaWdodCwgcGl4OwotICAgIGxvbmcgaSwgajsKLQotICAgIC8qIGNvcHkgb3IgZmlsdGVyIGNocm9tYSAqLwotICAgIHVfd2lkdGggPSBwbGFuZV9pblsxXS51X3dpZHRoOwotICAgIHVfaGVpZ2h0ID0gcGxhbmVfaW5bMV0udV9oZWlnaHQ7Ci0gICAgdV9zdHJpZGUgPSBwbGFuZV9pblsxXS51X3N0cmlkZTsKLSAgICB1X3N0cmlkZV9vdXQgPSBwbGFuZV9vdXRbMV0udV9zdHJpZGU7Ci0gICAgcF9jZGVzdF9saW5lID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX291dFsxXS5wYWNfZGF0YVtwbGFuZV9vdXRbMV0udV90b3BsZWZ0XTsKLSAgICBwX2NzcmNfbGluZSA9ICh1bnNpZ25lZCBjaGFyICopICZwbGFuZV9pblsxXS5wYWNfZGF0YVtwbGFuZV9pblsxXS51X3RvcGxlZnRdOwotCi0gICAgaWYgKGx1bV9mYWN0b3IgPiAyNTYpCi0gICAgewotICAgICAgICBwX2NkZXN0ID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX291dFsyXS5wYWNfZGF0YVtwbGFuZV9vdXRbMl0udV90b3BsZWZ0XTsKLSAgICAgICAgcF9jc3JjID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX2luWzJdLnBhY19kYXRhW3BsYW5lX2luWzJdLnVfdG9wbGVmdF07Ci0gICAgICAgIC8qIGNvcHkgY2hyb21hICovCi0gICAgICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpID0gdV93aWR0aDsgaSAhPSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopcF9jZGVzdF9saW5lLCAodm9pZCAqKXBfY3NyY19saW5lLCB1X3dpZHRoKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoKHZvaWQgKilwX2NkZXN0LCh2b2lkICopIHBfY3NyYywgdV93aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX2NkZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgcF9jZGVzdCArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgICAgICBwX2NzcmNfbGluZSArPSB1X3N0cmlkZTsKLSAgICAgICAgICAgIHBfY3NyYyArPSB1X3N0cmlkZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBmaWx0ZXIgY2hyb21hICovCi0gICAgICAgIHBpeCA9ICgxMDI0IC0gbHVtX2ZhY3RvcikgPDwgNzsKLSAgICAgICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwX2NkZXN0ID0gcF9jZGVzdF9saW5lOwotICAgICAgICAgICAgcF9jc3JjID0gcF9jc3JjX2xpbmU7Ci0gICAgICAgICAgICBmb3IgKGkgPSB1X3dpZHRoOyBpICE9IDA7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcF9jZGVzdCsrID0gKChwaXggKyAoKnBfY3NyYysrICYgMHhGRikgKiBsdW1fZmFjdG9yKSA+PiBMVU1fRkFDVE9SX01BWCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwX2NkZXN0X2xpbmUgKz0gdV9zdHJpZGVfb3V0OwotICAgICAgICAgICAgcF9jc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICAgICAgcF9jZGVzdF9saW5lID0gKHVuc2lnbmVkIGNoYXIgKikgJnBsYW5lX291dFsyXS5wYWNfZGF0YVtwbGFuZV9vdXRbMl0udV90b3BsZWZ0XTsKLSAgICAgICAgcF9jc3JjX2xpbmUgPSAodW5zaWduZWQgY2hhciAqKSAmcGxhbmVfaW5bMl0ucGFjX2RhdGFbcGxhbmVfaW5bMl0udV90b3BsZWZ0XTsKLSAgICAgICAgZm9yIChqID0gdV9oZWlnaHQ7IGogIT0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwX2NkZXN0ID0gcF9jZGVzdF9saW5lOwotICAgICAgICAgICAgcF9jc3JjID0gcF9jc3JjX2xpbmU7Ci0gICAgICAgICAgICBmb3IgKGkgPSB1X3dpZHRoOyBpICE9IDA7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcF9jZGVzdCsrID0gKChwaXggKyAoKnBfY3NyYyAmIDB4RkYpICogbHVtX2ZhY3RvcikgPj4gTFVNX0ZBQ1RPUl9NQVgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcF9jZGVzdF9saW5lICs9IHVfc3RyaWRlX291dDsKLSAgICAgICAgICAgIHBfY3NyY19saW5lICs9IHVfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIGFwcGx5IGx1bWEgZmFjdG9yICovCi0gICAgdV93aWR0aCA9IHBsYW5lX2luWzBdLnVfd2lkdGg7Ci0gICAgdV9oZWlnaHQgPSBwbGFuZV9pblswXS51X2hlaWdodDsKLSAgICB1X3N0cmlkZSA9IChwbGFuZV9pblswXS51X3N0cmlkZSA+PiAxKTsKLSAgICB1X3N0cmlkZV9vdXQgPSAocGxhbmVfb3V0WzBdLnVfc3RyaWRlID4+IDEpOwotICAgIHBfZGVzdCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAmcGxhbmVfb3V0WzBdLnBhY19kYXRhW3BsYW5lX291dFswXS51X3RvcGxlZnRdOwotICAgIHBfc3JjID0gKHVuc2lnbmVkIHNob3J0ICopICZwbGFuZV9pblswXS5wYWNfZGF0YVtwbGFuZV9pblswXS51X3RvcGxlZnRdOwotICAgIHBfZGVzdF9saW5lID0gcF9kZXN0OwotICAgIHBfc3JjX2xpbmUgPSBwX3NyYzsKLQotICAgIGZvciAoaiA9IHVfaGVpZ2h0OyBqICE9IDA7IGotLSkKLSAgICB7Ci0gICAgICAgIHBfZGVzdCA9IHBfZGVzdF9saW5lOwotICAgICAgICBwX3NyYyA9IHBfc3JjX2xpbmU7Ci0gICAgICAgIGZvciAoaSA9ICh1X3dpZHRoID4+IDEpOyBpICE9IDA7IGktLSkKLSAgICAgICAgewotICAgICAgICAgICAgcGl4X3NyYyA9ICh1bnNpZ25lZCBsb25nKSAqcF9zcmMrKzsKLSAgICAgICAgICAgIHBpeCA9IHBpeF9zcmMgJiAweEZGOwotICAgICAgICAgICAgdV9vdXRweCA9ICgocGl4ICogbHVtX2ZhY3RvcikgPj4gTFVNX0ZBQ1RPUl9NQVgpOwotICAgICAgICAgICAgcGl4ID0gKChwaXhfc3JjICYgMHhGRjAwKSA+PiA4KTsKLSAgICAgICAgICAgIHVfb3V0cHgyID0gKCgocGl4ICogbHVtX2ZhY3RvcikgPj4gTFVNX0ZBQ1RPUl9NQVgpPDwgOCkgOwotICAgICAgICAgICAgKnBfZGVzdCsrID0gKHVuc2lnbmVkIHNob3J0KSAodV9vdXRweDIgfCB1X291dHB4KTsKLSAgICAgICAgfQotICAgICAgICBwX2Rlc3RfbGluZSArPSB1X3N0cmlkZV9vdXQ7Ci0gICAgICAgIHBfc3JjX2xpbmUgKz0gdV9zdHJpZGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00T1NBX0VSUiBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwICh2b2lkICpwVXNlckRhdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluMSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4yLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIFByb2dyZXNzKQotICogQGJyaWVmICAgQmxlbmRzIHR3byBZVVYgNDoyOjAgUGxhbmFyIGltYWdlcy4KLSAqIEBub3RlICAgIEJsZW5kcyBZVVY0MjAgcGxhbmFyIGltYWdlcywKLSAqICAgICAgICAgIE1hcCB0aGUgdmFsdWUgb2YgcHJvZ3Jlc3MgZnJvbSAoMCAtIDEwMDApIHRvICgwIC0gMTAyNCkKLSAqICAgICAgICAgIFNldCB0aGUgcmFuZ2Ugb2YgYmxlbmRpbmdmYWN0b3IsCi0gKiAgICAgICAgICAgICAgICAgIDEuIGZyb20gMCB0byAoUHJvZ3Jlc3MgPDwgMSkgICAgICAgICAgICA7Zm9yIFByb2dyZXNzIDw9IDUxMgotICogICAgICAgICAgICAgICAgICAyLiBmcm9tICgoIFByb2dyZXNzIC0gNTEyKTw8IDEpIHRvIDEwMjQgO290aGVyd2lzZQotICogICAgICAgICAgU2V0IHRoZSBpbmNyZW1lbnQgb2YgYmxlbmRpbmdmYWN0b3IgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgaW1hZ2Ugcm93IGJ5IHRoZSBmYWN0b3IsCi0gKiAgICAgICAgICAgICAgICAgID0gIChSYW5nZS0xKSAvIChpbWFnZSB3aWR0aC0xKSAgO2ZvciB3aWR0aCA+PSByYW5nZQotICogICAgICAgICAgICAgICAgICA9ICAoUmFuZ2UpIC8gKGltYWdlIHdpZHRoKSAgICAgIDtvdGhlcndpc2UKLSAqICAgICAgICAgIExvb3Agb24gZWFjaCg9IGkpIHJvdyBvZiBvdXRwdXQgWSBwbGFuZSAoc3RlcHMgb2YgMikKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2goPSBqKSBjb2x1bW4gb2Ygb3V0cHV0IFkgcGxhbmUgKHN0ZXBzIG9mIDIpCi0gKiAgICAgICAgICAgICAgICAgIEdldCBmb3VyIFkgc2FtcGxlcyBhbmQgb25lIFUgJiBWIHNhbXBsZSBmcm9tIHR3byBpbnB1dCBZVVY0OjI6MCBpbWFnZXMgYW5kCi0gKiAgICAgICAgICAgICAgICAgIENvbXB1dGUgZm91ciBZIHNhbXBsZSBhbmQgb25lIFUgJiBWIHNhbXBsZSBmb3Igb3V0cHV0IFlVVjQ6MjowIGltYWdlCi0gKiAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0aGUgZm9sbG93aW5nLAotICogICAgICAgICAgICAgICAgICBPdXQoaSxqKSA9IGJsZW5kaW5nZmFjdG9yKGksaikgKiBJbjEoaSxqKSsgKGwgLSBibGVuZGluZ2ZhY3RvcihpLGopKSAqSW4yKGksaikKLSAqICAgICAgICAgICAgICBlbmQgbG9vcCBjb2x1bW4KLSAqICAgICAgICAgIGVuZCBsb29wIHJvdy4KLSAqIEBwYXJhbSAgIHBVc2VyRGF0YTogKElOKSAgVXNlciBTcGVjaWZpYyBQYXJhbWV0ZXIKLSAqIEBwYXJhbSAgIHBQbGFuZUluMTogKElOKSAgUG9pbnRlciB0byBhbiBhcnJheSBvZiBpbWFnZSBwbGFuZSBzdHJ1Y3R1cmVzIG1haW50YWluZWQKLSAqICAgICAgICAgICBmb3IgWSwgVSBhbmQgViBwbGFuZXMuCi0gKiBAcGFyYW0gICBwUGxhbmVJbjI6IChJTikgIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW1hZ2UgcGxhbmUgc3RydWN0dXJlcyBtYWludGFpbmVkCi0gKiAgICAgICAgICAgZm9yIFksIFUgYW5kIFYgcGxhbmVzLgotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvIGFuIGFycmF5IG9mIGltYWdlIHBsYW5lIHN0cnVjdHVyZXMgbWFpbnRhaW5lZAotICogICAgICAgICAgIGZvciBZLCBVIGFuZCBWIHBsYW5lcy4KLSAqIEBwYXJhbSAgIFByb2dyZXNzOiAgKElOKSAgUHJvZ3Jlc3MgdmFsdWUgKHZhcmllcyBiZXR3ZWVuIDAgYW5kIDEwMDApCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IE5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IEVycm9yIGluIGhlaWdodAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBFcnJvciBpbiB3aWR0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qKiBDaGVjayBmb3IgdmFsdWUgaXMgRVZFTiAqLwotI2lmbmRlZiBJU19FVkVOCi0jZGVmaW5lIElTX0VWRU4oYSkgICghKGEgJiAweDAxKSkKLSNlbmRpZgotCi0vKiogVXNlZCBmb3IgZml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gKi8KLSNpZm5kZWYgTUFYX1NIT1JUCi0jZGVmaW5lIE1BWF9TSE9SVCAgIDB4MTAwMDAKLSNlbmRpZgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAgICAwCi0jZW5kaWYKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAgIDAKLSNkZWZpbmUgVFJVRSAgICAhRkFMU0UKLSNlbmRpZgotCi11bnNpZ25lZCBjaGFyIE00VklGSV9JbWFnZUJsZW5kaW5nb25ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBQbGFuZUluMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBQbGFuZUluMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWaUNvbUltYWdlUGxhbmUgKnBQbGFuZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIFByb2dyZXNzKQotewotICAgIFVJbnQ4ICAgICpwdThfZGF0YV9ZX3N0YXJ0MSwqcHU4X2RhdGFfVV9zdGFydDEsKnB1OF9kYXRhX1Zfc3RhcnQxOwotICAgIFVJbnQ4ICAgICpwdThfZGF0YV9ZX3N0YXJ0MiwqcHU4X2RhdGFfVV9zdGFydDIsKnB1OF9kYXRhX1Zfc3RhcnQyOwotICAgIFVJbnQ4ICAgICpwdThfZGF0YV9ZX3N0YXJ0MywqcHU4X2RhdGFfVV9zdGFydDMsKnB1OF9kYXRhX1Zfc3RhcnQzOwotICAgIFVJbnQ4ICAgICpwdThfZGF0YV9ZX2N1cnJlbnQxLCAqcHU4X2RhdGFfWV9uZXh0MSwgKnB1OF9kYXRhX1UxLCAqcHU4X2RhdGFfVjE7Ci0gICAgVUludDggICAgKnB1OF9kYXRhX1lfY3VycmVudDIsICpwdThfZGF0YV9ZX25leHQyLCAqcHU4X2RhdGFfVTIsICpwdThfZGF0YV9WMjsKLSAgICBVSW50OCAgICAqcHU4X2RhdGFfWV9jdXJyZW50MywqcHU4X2RhdGFfWV9uZXh0MywgKnB1OF9kYXRhX1UzLCAqcHU4X2RhdGFfVjM7Ci0gICAgVUludDMyICAgdTMyX3N0cmlkZV9ZMSwgdTMyX3N0cmlkZTJfWTEsIHUzMl9zdHJpZGVfVTEsIHUzMl9zdHJpZGVfVjE7Ci0gICAgVUludDMyICAgdTMyX3N0cmlkZV9ZMiwgdTMyX3N0cmlkZTJfWTIsIHUzMl9zdHJpZGVfVTIsIHUzMl9zdHJpZGVfVjI7Ci0gICAgVUludDMyICAgdTMyX3N0cmlkZV9ZMywgdTMyX3N0cmlkZTJfWTMsIHUzMl9zdHJpZGVfVTMsIHUzMl9zdHJpZGVfVjM7Ci0gICAgVUludDMyICAgdTMyX2hlaWdodCwgIHUzMl93aWR0aDsKLSAgICBVSW50MzIgICB1MzJfYmxlbmRmYWN0b3IsIHUzMl9zdGFydEEsIHUzMl9lbmRBLCB1MzJfYmxlbmRfaW5jLCB1MzJfeF9hY2N1bTsKLSAgICBVSW50MzIgICB1MzJfY29sLCB1MzJfcm93LCB1MzJfcmFuZ2VBLCB1MzJfcHJvZ3Jlc3M7Ci0gICAgVUludDMyICAgdTMyX1UxLHUzMl9WMSx1MzJfVTIsdTMyX1YyLCB1MzJfWTEsIHUzMl9ZMjsKLQotCi0gICAgLyogQ2hlY2sgdGhlIFkgcGxhbmUgaGVpZ2h0IGlzIEVWRU4gYW5kIGltYWdlIHBsYW5lIGhlaWdodHMgYXJlIHNhbWUgKi8KLSAgICBpZiggKElTX0VWRU4ocFBsYW5lSW4xWzBdLnVfaGVpZ2h0KSA9PSBGQUxTRSkgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKElTX0VWRU4ocFBsYW5lSW4yWzBdLnVfaGVpZ2h0KSA9PSBGQUxTRSkgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKElTX0VWRU4ocFBsYW5lT3V0WzBdLnVfaGVpZ2h0KSA9PSBGQUxTRSkgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZUluMVswXS51X2hlaWdodCAhPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgfHwKLSAgICAgICAgKHBQbGFuZUluMlswXS51X2hlaWdodCAhPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQpICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgdGhlIFkgcGxhbmUgd2lkdGggaXMgRVZFTiBhbmQgaW1hZ2UgcGxhbmUgd2lkdGhzIGFyZSBzYW1lICovCi0gICAgaWYoIChJU19FVkVOKHBQbGFuZUluMVswXS51X3dpZHRoKSA9PSBGQUxTRSkgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZUluMlswXS51X3dpZHRoKSA9PSBGQUxTRSkgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dFswXS51X3dpZHRoKSA9PSBGQUxTRSkgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVJbjFbMF0udV93aWR0aCAgIT0gcFBsYW5lT3V0WzBdLnVfd2lkdGgpICAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVJbjJbMF0udV93aWR0aCAgIT0gcFBsYW5lT3V0WzBdLnVfd2lkdGgpICApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0MSBZVVY0MjAgaW1hZ2UgcGxhbmVzICovCi0gICAgcHU4X2RhdGFfWV9zdGFydDEgPSBwUGxhbmVJbjFbMF0ucGFjX2RhdGEgKyBwUGxhbmVJbjFbMF0udV90b3BsZWZ0OwotICAgIHB1OF9kYXRhX1Vfc3RhcnQxID0gcFBsYW5lSW4xWzFdLnBhY19kYXRhICsgcFBsYW5lSW4xWzFdLnVfdG9wbGVmdDsKLSAgICBwdThfZGF0YV9WX3N0YXJ0MSA9IHBQbGFuZUluMVsyXS5wYWNfZGF0YSArIHBQbGFuZUluMVsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQyIFlVVjQyMCBpbWFnZSBwbGFuZXMgKi8KLSAgICBwdThfZGF0YV9ZX3N0YXJ0MiA9IHBQbGFuZUluMlswXS5wYWNfZGF0YSArIHBQbGFuZUluMlswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X2RhdGFfVV9zdGFydDIgPSBwUGxhbmVJbjJbMV0ucGFjX2RhdGEgKyBwUGxhbmVJbjJbMV0udV90b3BsZWZ0OwotICAgIHB1OF9kYXRhX1Zfc3RhcnQyID0gcFBsYW5lSW4yWzJdLnBhY19kYXRhICsgcFBsYW5lSW4yWzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgWVVWNDIwIGltYWdlIHBsYW5lcyAqLwotICAgIHB1OF9kYXRhX1lfc3RhcnQzID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwdThfZGF0YV9VX3N0YXJ0MyA9IHBQbGFuZU91dFsxXS5wYWNfZGF0YSArIHBQbGFuZU91dFsxXS51X3RvcGxlZnQ7Ci0gICAgcHU4X2RhdGFfVl9zdGFydDMgPSBwUGxhbmVPdXRbMl0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMl0udV90b3BsZWZ0OwotCi0gICAgLyogU2V0IHRoZSBzdHJpZGUgZm9yIHRoZSBuZXh0IHJvdyBpbiBlYWNoIGlucHV0MSBZVVY0MjAgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kxID0gcFBsYW5lSW4xWzBdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfVTEgPSBwUGxhbmVJbjFbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WMSA9IHBQbGFuZUluMVsyXS51X3N0cmlkZTsKLQotICAgIC8qIFNldCB0aGUgc3RyaWRlIGZvciB0aGUgbmV4dCByb3cgaW4gZWFjaCBpbnB1dDIgWVVWNDIwIHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZMiA9IHBQbGFuZUluMlswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1UyID0gcFBsYW5lSW4yWzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfVjIgPSBwUGxhbmVJbjJbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIHN0cmlkZSBmb3IgdGhlIG5leHQgcm93IGluIGVhY2ggb3V0cHV0IFlVVjQyMCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWTMgPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9VMyA9IHBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YzID0gcFBsYW5lT3V0WzJdLnVfc3RyaWRlOwotCi0gICAgdTMyX3N0cmlkZTJfWTEgICA9IHUzMl9zdHJpZGVfWTEgPDwgMTsKLSAgICB1MzJfc3RyaWRlMl9ZMiAgID0gdTMyX3N0cmlkZV9ZMiA8PCAxOwotICAgIHUzMl9zdHJpZGUyX1kzICAgPSB1MzJfc3RyaWRlX1kzIDw8IDE7Ci0KLSAgICAvKiBHZXQgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgIHUzMl9oZWlnaHQgPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0gICAgdTMyX3dpZHRoICA9IHBQbGFuZU91dFswXS51X3dpZHRoOwotCi0gICAgLyogVXNlciBTcGVjaWZpZWQgUHJvZ3Jlc3MgdmFsdWUgKi8KLSAgICB1MzJfcHJvZ3Jlc3MgPSBQcm9ncmVzczsKLQotICAgIC8qIE1hcCBQcm9ncmVzcyB2YWx1ZSBmcm9tICgwIC0gMTAwMCkgdG8gKDAgLSAxMDI0KSAtPiBmb3Igb3B0aW1pc2F0aW9uICovCi0gICAgaWYodTMyX3Byb2dyZXNzIDwgMTAwMCkKLSAgICAgICAgdTMyX3Byb2dyZXNzID0gKCh1MzJfcHJvZ3Jlc3MgPDwgMTApIC8gMTAwMCk7Ci0gICAgZWxzZQotICAgICAgICB1MzJfcHJvZ3Jlc3MgPSAxMDI0OwotCi0gICAgLyogU2V0IHRoZSByYW5nZSBvZiBibGVuZGluZ2ZhY3RvciAqLwotICAgIGlmKHUzMl9wcm9ncmVzcyA8PSA1MTIpCi0gICAgewotICAgICAgICB1MzJfc3RhcnRBID0gMDsKLSAgICAgICAgdTMyX2VuZEEgICA9ICh1MzJfcHJvZ3Jlc3MgPDwgMSk7Ci0gICAgfQotICAgIGVsc2UgLyogdTMyX3Byb2dyZXNzID4gNTEyICovCi0gICAgewotICAgICAgICB1MzJfc3RhcnRBID0gKHUzMl9wcm9ncmVzcyAtIDUxMikgPDwgMTsKLSAgICAgICAgdTMyX2VuZEEgICA9ICAxMDI0OwotICAgIH0KLSAgICB1MzJfcmFuZ2VBID0gdTMyX2VuZEEgLSB1MzJfc3RhcnRBOwotCi0gICAgLyogU2V0IHRoZSBpbmNyZW1lbnQgb2YgYmxlbmRpbmdmYWN0b3IgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgaW1hZ2Ugcm93ICovCi0gICAgaWYgKCh1MzJfd2lkdGggPj0gdTMyX3JhbmdlQSkgJiYgKHUzMl9yYW5nZUEgPiAwKSApCi0gICAgewotICAgICAgICB1MzJfYmxlbmRfaW5jICAgPSAoKHUzMl9yYW5nZUEtMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aCAtIDEpOwotICAgIH0KLSAgICBlbHNlIC8qICh1MzJfd2lkdGggPCB1MzJfcmFuZ2VBKSB8fCAodTMyX3JhbmdlQSA8IDApICovCi0gICAgewotICAgICAgICB1MzJfYmxlbmRfaW5jICAgPSAodTMyX3JhbmdlQSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoKTsKLSAgICB9Ci0KLSAgICAvKiBUd28gWVVWNDIwIHJvd3MgYXJlIGNvbXB1dGVkIGF0IGVhY2ggcGFzcyAqLwotICAgIGZvciAodTMyX3JvdyA9IHUzMl9oZWlnaHQ7IHUzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPTIpCi0gICAgewotICAgICAgICAvKiBTZXQgcG9pbnRlcnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcm93IGZvciBlYWNoIGlucHV0IGltYWdlMSBwbGFuZSAqLwotICAgICAgICBwdThfZGF0YV9ZX2N1cnJlbnQxID0gcHU4X2RhdGFfWV9zdGFydDE7Ci0gICAgICAgIHB1OF9kYXRhX1UxID0gcHU4X2RhdGFfVV9zdGFydDE7Ci0gICAgICAgIHB1OF9kYXRhX1YxID0gcHU4X2RhdGFfVl9zdGFydDE7Ci0KLSAgICAgICAgLyogU2V0IHBvaW50ZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJvdyBmb3IgZWFjaCBpbnB1dCBpbWFnZTIgcGxhbmUgKi8KLSAgICAgICAgcHU4X2RhdGFfWV9jdXJyZW50MiA9IHB1OF9kYXRhX1lfc3RhcnQyOwotICAgICAgICBwdThfZGF0YV9VMiA9IHB1OF9kYXRhX1Vfc3RhcnQyOwotICAgICAgICBwdThfZGF0YV9WMiA9IHB1OF9kYXRhX1Zfc3RhcnQyOwotCi0gICAgICAgIC8qIFNldCBwb2ludGVycyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByb3cgZm9yIGVhY2ggb3V0cHV0IGltYWdlIHBsYW5lICovCi0gICAgICAgIHB1OF9kYXRhX1lfY3VycmVudDMgPSBwdThfZGF0YV9ZX3N0YXJ0MzsKLSAgICAgICAgcHU4X2RhdGFfVTMgPSBwdThfZGF0YV9VX3N0YXJ0MzsKLSAgICAgICAgcHU4X2RhdGFfVjMgPSBwdThfZGF0YV9WX3N0YXJ0MzsKLQotICAgICAgICAvKiBTZXQgcG9pbnRlcnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCByb3cgZm9yIGltYWdlIGx1bWEgcGxhbmUgKi8KLSAgICAgICAgcHU4X2RhdGFfWV9uZXh0MSA9IHB1OF9kYXRhX1lfY3VycmVudDEgKyB1MzJfc3RyaWRlX1kxOwotICAgICAgICBwdThfZGF0YV9ZX25leHQyID0gcHU4X2RhdGFfWV9jdXJyZW50MiArIHUzMl9zdHJpZGVfWTI7Ci0gICAgICAgIHB1OF9kYXRhX1lfbmV4dDMgPSBwdThfZGF0YV9ZX2N1cnJlbnQzICsgdTMyX3N0cmlkZV9ZMzsKLQotICAgICAgICAvKiBJbml0aWFsaXNlIGJsZW5kZmFjdG9yICovCi0gICAgICAgIHUzMl9ibGVuZGZhY3RvciAgID0gdTMyX3N0YXJ0QTsKLSAgICAgICAgLyogQmxlbmRmYWN0b3IgSW5jcmVtZW50IGFjY3VtdWxhdG9yICovCi0gICAgICAgIHUzMl94X2FjY3VtID0gMDsKLQotICAgICAgICAvKiBMb29wIG9uIGVhY2ggY29sdW1uIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoOyB1MzJfY29sICE9IDAgOyB1MzJfY29sIC09MikKLSAgICAgICAgewotICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBibGVuZGluZyBmYWN0b3IgKi8KLSAgICAgICAgICAgIHUzMl9ibGVuZGZhY3RvciA9IHUzMl9zdGFydEEgKyAodTMyX3hfYWNjdW0gPj4gMTYpOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCx5KSBvZiBpbnB1dCBJbWFnZTEgKi8KLSAgICAgICAgICAgIHUzMl9ZMSA9ICpwdThfZGF0YV9ZX2N1cnJlbnQxKys7Ci0KLSAgICAgICAgICAgIC8qIEdldCBjaHJvbWluYW5jZTIgdmFsdWUgKi8KLSAgICAgICAgICAgIHUzMl9VMSA9ICpwdThfZGF0YV9VMSsrOwotICAgICAgICAgICAgdTMyX1YxID0gKnB1OF9kYXRhX1YxKys7Ci0KLSAgICAgICAgICAgIC8qIEdldCBMdW1hIHZhbHVlICh4LHkpIG9mIGlucHV0IEltYWdlMiAqLwotICAgICAgICAgICAgdTMyX1kyID0gKnB1OF9kYXRhX1lfY3VycmVudDIrKzsKLQotICAgICAgICAgICAgLyogR2V0IGNocm9taW5hbmNlMiB2YWx1ZSAqLwotICAgICAgICAgICAgdTMyX1UyID0gKnB1OF9kYXRhX1UyKys7Ci0gICAgICAgICAgICB1MzJfVjIgPSAqcHU4X2RhdGFfVjIrKzsKLQotICAgICAgICAgICAgLyogQ29tcHV0ZSBMdW1hIHZhbHVlICh4LHkpIG9mIE91dHB1dCBpbWFnZSAqLwotICAgICAgICAgICAgKnB1OF9kYXRhX1lfY3VycmVudDMrKyAgPSAoVUludDgpKCh1MzJfYmxlbmRmYWN0b3IgKiB1MzJfWTIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1kxKSA+PiAxMCk7Ci0gICAgICAgICAgICAvKiBDb21wdXRlIGNocm9tYShVKSB2YWx1ZSBvZiBPdXRwdXQgaW1hZ2UgKi8KLSAgICAgICAgICAgICpwdThfZGF0YV9VMysrICAgICAgICAgID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1UyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEwMjQgLSB1MzJfYmxlbmRmYWN0b3IpKnUzMl9VMSkgPj4gMTApOwotICAgICAgICAgICAgLyogQ29tcHV0ZSBjaHJvbWEoVikgdmFsdWUgb2YgT3V0cHV0IGltYWdlICovCi0gICAgICAgICAgICAqcHU4X2RhdGFfVjMrKyAgICAgICAgICA9IChVSW50OCkoKHUzMl9ibGVuZGZhY3RvciAqIHUzMl9WMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMDI0IC0gdTMyX2JsZW5kZmFjdG9yKSp1MzJfVjEpID4+IDEwKTsKLQotICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgseSsxKSBvZiBpbnB1dCBJbWFnZTEgKi8KLSAgICAgICAgICAgIHUzMl9ZMSA9ICpwdThfZGF0YV9ZX25leHQxKys7Ci0KLSAgICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCx5KzEpIG9mIGlucHV0IEltYWdlMiAqLwotICAgICAgICAgICAgdTMyX1kyID0gKnB1OF9kYXRhX1lfbmV4dDIrKzsKLQotICAgICAgICAgICAgLyogQ29tcHV0ZSBMdW1hIHZhbHVlICh4LHkrMSkgb2YgT3V0cHV0IGltYWdlKi8KLSAgICAgICAgICAgICpwdThfZGF0YV9ZX25leHQzKysgPSAoVUludDgpKCh1MzJfYmxlbmRmYWN0b3IgKiB1MzJfWTIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMDI0IC0gdTMyX2JsZW5kZmFjdG9yKSp1MzJfWTEpID4+IDEwKTsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gdTMyX2JsZW5kX2luYzsKLQotICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBibGVuZGluZyBmYWN0b3IgKi8KLSAgICAgICAgICAgIHUzMl9ibGVuZGZhY3RvciA9IHUzMl9zdGFydEEgKyAodTMyX3hfYWNjdW0gPj4gMTYpOwotCi0gICAgICAgICAgICAvKiBHZXQgTHVtYSB2YWx1ZSAoeCsxLHkpIG9mIGlucHV0IEltYWdlMSAqLwotICAgICAgICAgICAgdTMyX1kxID0gKnB1OF9kYXRhX1lfY3VycmVudDErKzsKLQotICAgICAgICAgICAgLyogR2V0IEx1bWEgdmFsdWUgKHgrMSx5KSBvZiBpbnB1dCBJbWFnZTIgKi8KLSAgICAgICAgICAgIHUzMl9ZMiA9ICpwdThfZGF0YV9ZX2N1cnJlbnQyKys7Ci0KLSAgICAgICAgICAgIC8qIENvbXB1dGUgTHVtYSB2YWx1ZSAoeCsxLHkpIG9mIE91dHB1dCBpbWFnZSovCi0gICAgICAgICAgICAqcHU4X2RhdGFfWV9jdXJyZW50MysrID0gKFVJbnQ4KSgodTMyX2JsZW5kZmFjdG9yICogdTMyX1kyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAyNCAtIHUzMl9ibGVuZGZhY3RvcikqdTMyX1kxKSA+PiAxMCk7Ci0KLSAgICAgICAgICAgIC8qIEdldCBMdW1hIHZhbHVlICh4KzEseSsxKSBvZiBpbnB1dCBJbWFnZTEgKi8KLSAgICAgICAgICAgIHUzMl9ZMSA9ICpwdThfZGF0YV9ZX25leHQxKys7Ci0KLSAgICAgICAgICAgIC8qIEdldCBMdW1hIHZhbHVlICh4KzEseSsxKSBvZiBpbnB1dCBJbWFnZTIgKi8KLSAgICAgICAgICAgIHUzMl9ZMiA9ICpwdThfZGF0YV9ZX25leHQyKys7Ci0KLSAgICAgICAgICAgIC8qIENvbXB1dGUgTHVtYSB2YWx1ZSAoeCsxLHkrMSkgb2YgT3V0cHV0IGltYWdlKi8KLSAgICAgICAgICAgICpwdThfZGF0YV9ZX25leHQzKysgPSAoVUludDgpKCh1MzJfYmxlbmRmYWN0b3IgKiB1MzJfWTIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMDI0IC0gdTMyX2JsZW5kZmFjdG9yKSp1MzJfWTEpID4+IDEwKTsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gdTMyX2JsZW5kX2luYzsKLQotICAgICAgICAgICAgLyogV29ya2luZyBwb2ludGVycyBhcmUgaW5jcmVtZW50ZWQganVzdCBhZnRlciBlYWNoIHN0b3JhZ2UgKi8KLQotICAgICAgICB9LyogRW5kIG9mIHJvdyBzY2FubmluZyAqLwotCi0gICAgICAgIC8qIFVwZGF0ZSB3b3JraW5nIHBvaW50ZXIgb2YgaW5wdXQgaW1hZ2UxIGZvciBuZXh0IHJvdyAqLwotICAgICAgICBwdThfZGF0YV9ZX3N0YXJ0MSArPSB1MzJfc3RyaWRlMl9ZMTsKLSAgICAgICAgcHU4X2RhdGFfVV9zdGFydDEgKz0gdTMyX3N0cmlkZV9VMTsKLSAgICAgICAgcHU4X2RhdGFfVl9zdGFydDEgKz0gdTMyX3N0cmlkZV9WMTsKLQotICAgICAgICAvKiBVcGRhdGUgd29ya2luZyBwb2ludGVyIG9mIGlucHV0IGltYWdlMiBmb3IgbmV4dCByb3cgKi8KLSAgICAgICAgcHU4X2RhdGFfWV9zdGFydDIgKz0gdTMyX3N0cmlkZTJfWTI7Ci0gICAgICAgIHB1OF9kYXRhX1Vfc3RhcnQyICs9IHUzMl9zdHJpZGVfVTI7Ci0gICAgICAgIHB1OF9kYXRhX1Zfc3RhcnQyICs9IHUzMl9zdHJpZGVfVjI7Ci0KLSAgICAgICAgLyogVXBkYXRlIHdvcmtpbmcgcG9pbnRlciBvZiBvdXRwdXQgaW1hZ2UgZm9yIG5leHQgcm93ICovCi0gICAgICAgIHB1OF9kYXRhX1lfc3RhcnQzICs9IHUzMl9zdHJpZGUyX1kzOwotICAgICAgICBwdThfZGF0YV9VX3N0YXJ0MyArPSB1MzJfc3RyaWRlX1UzOwotICAgICAgICBwdThfZGF0YV9WX3N0YXJ0MyArPSB1MzJfc3RyaWRlX1YzOwotCi0gICAgfS8qIEVuZCBvZiBjb2x1bW4gc2Nhbm5pbmcgKi8KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0vKiBFbmQgb2YgZmlsZSBNNFZJRklfSW1hZ2VCbGVuZGluZ29uWVVWNDIwLmMgKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9CR1I1NjV0b1lVVjQyMC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9CR1I1NjV0b1lVVjQyMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNjA4NzY3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfQkdSNTY1dG9ZVVY0MjAuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICBNNFZJRklfQkdSNTY1dG9ZVVY0MjAuYwotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIENvbG9yIENvbnZlcnNpb24gRmlsdGVyCi0gKiAgICAgICAgICAgLSMgQ29udGFpbnMgdGhlIGZvcm1hdCBjb252ZXJzaW9uIGZpbHRlcnMgZnJvbSBCR1I1NjUgdG8gWVVWNDIwCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9CR1I1NjV0b1lVVjQyMCAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIFRyYW5zZm9ybSBCR1I1NjUgaW1hZ2UgdG8gYSBZVVY0MjAgaW1hZ2UuCi0gKiBAbm90ZSAgICBDb252ZXJ0IEJHUjU2NSB0byBZVVY0MjAsCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93ICggMiByb3dzIGJ5IDIgcm93cyApCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoIDIgY29sIGJ5IDIgY29sICkKLSAqICAgICAgICAgICAgICAgICAgR2V0IDQgQkdSIHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhIGFuZCBidWlsZCA0IG91dHB1dCBZIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgYW5kIGVhY2ggc2luZ2xlIFUgJiBWIGRhdGEKLSAqICAgICAgICAgICAgICBlbmQgbG9vcCBvbiBjb2wKLSAqICAgICAgICAgIGVuZCBsb29wIG9uIHJvdwotICogQHBhcmFtICAgcFVzZXJEYXRhOiAoSU4pIFVzZXIgU3BlY2lmaWMgRGF0YQotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBCR1I1NjUgUGxhbmUKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byAgWVVWNDIwIGJ1ZmZlciBQbGFuZQotICogQHJldHVybiAgTTRWSUZJX09LOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBZVVYgUGxhbmUgaGVpZ2h0IGlzIE9ERAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBZVVYgUGxhbmUgd2lkdGggaXMgT0RECi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLU00VklGSV9VSW50OCAgICBNNFZJRklfQkdSNTY1dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50MzIgICB1MzJfd2lkdGgsIHUzMl9oZWlnaHQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfWSwgdTMyX3N0cmlkZTJfWSwgdTMyX3N0cmlkZV9VLCB1MzJfc3RyaWRlX1Y7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfYmdyLCB1MzJfc3RyaWRlXzJiZ3I7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jb2wsIHUzMl9yb3c7Ci0KLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3IwMCwgaTMyX3IwMSwgaTMyX3IxMCwgaTMyX3IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2cwMCwgaTMyX2cwMSwgaTMyX2cxMCwgaTMyX2cxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX2IwMCwgaTMyX2IwMSwgaTMyX2IxMCwgaTMyX2IxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3kwMCwgaTMyX3kwMSwgaTMyX3kxMCwgaTMyX3kxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3UwMCwgaTMyX3UwMSwgaTMyX3UxMCwgaTMyX3UxMTsKLSAgICBNNFZJRklfSW50MzIgICAgaTMyX3YwMCwgaTMyX3YwMSwgaTMyX3YxMCwgaTMyX3YxMTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95biwgKnB1OF95cywgKnB1OF91LCAqcHU4X3Y7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfeV9kYXRhLCAqcHU4X3VfZGF0YSwgKnB1OF92X2RhdGE7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfYmdybl9kYXRhLCAqcHU4X2Jncm47Ci0gICAgTTRWSUZJX1VJbnQxNiAgIHUxNl9waXgxLCB1MTZfcGl4MiwgdTE2X3BpeDMsIHUxNl9waXg0OwotCi0gICAgLyogQ2hlY2sgcGxhbmVzIGhlaWdodCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiggKHBQbGFuZUluLT51X2hlaWdodCAhPSBwUGxhbmVPdXRbMF0udV9oZWlnaHQpICAgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChwUGxhbmVPdXRbMV0udV9oZWlnaHQ8PDEpKSAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsyXS51X2hlaWdodDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgd2lkdGggYXJlIGFwcHJvcHJpYXRlICovCi0gICAgaWYoIChwUGxhbmVJbi0+dV93aWR0aCAhPSBwUGxhbmVPdXRbMF0udV93aWR0aCkgICAgICAgICB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsxXS51X3dpZHRoPDwxKSkgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X3dpZHRoICE9IChwUGxhbmVPdXRbMl0udV93aWR0aDw8MSkpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X3lfZGF0YSAgPSBwUGxhbmVPdXRbMF0ucGFjX2RhdGEgKyBwUGxhbmVPdXRbMF0udV90b3BsZWZ0OwotICAgIHB1OF91X2RhdGEgID0gcFBsYW5lT3V0WzFdLnBhY19kYXRhICsgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhICA9IHBQbGFuZU91dFsyXS5wYWNfZGF0YSArIHBQbGFuZU91dFsyXS51X3RvcGxlZnQ7Ci0KLSAgICAvKiBTZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgZGF0YSBidWZmZXJzICovCi0gICAgcHU4X2Jncm5fZGF0YSAgID0gcFBsYW5lSW4tPnBhY19kYXRhICsgcFBsYW5lSW4tPnVfdG9wbGVmdDsKLQotICAgIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgdTMyX3dpZHRoICAgPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0ICA9IHBQbGFuZU91dFswXS51X2hlaWdodDsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gZWFjaCBvdXRwdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX1kgPSBwUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZTJfWSA9IHUzMl9zdHJpZGVfWSA8PCAxOwotICAgIHUzMl9zdHJpZGVfVSA9IHBQbGFuZU91dFsxXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlX1YgPSBwUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGlucHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9iZ3IgPSBwUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV8yYmdyID0gdTMyX3N0cmlkZV9iZ3IgPDwgMTsKLQotICAgIC8qIExvb3Agb24gZWFjaCByb3cgb2YgdGhlIG91dHB1dCBpbWFnZSwgaW5wdXQgY29vcmRpbmF0ZXMgYXJlIGVzdGltYXRlZCBmcm9tIG91dHB1dCBvbmVzICovCi0gICAgLyogVHdvIFlVViByb3dzIGFyZSBjb21wdXRlZCBhdCBlYWNoIHBhc3MgKi8KLSAgICBmb3IgKHUzMl9yb3cgPSB1MzJfaGVpZ2h0IDt1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0yKQotICAgIHsKLSAgICAgICAgLyogQ3VycmVudCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeW4gPSBwdThfeV9kYXRhOwotICAgICAgICAvKiBOZXh0IFkgcGxhbmUgcm93IHBvaW50ZXJzICovCi0gICAgICAgIHB1OF95cyA9IHB1OF95biArIHUzMl9zdHJpZGVfWTsKLSAgICAgICAgLyogQ3VycmVudCBVIHBsYW5lIHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF91ID0gcHU4X3VfZGF0YTsKLSAgICAgICAgLyogQ3VycmVudCBWIHBsYW5lIHJvdyBwb2ludGVyICovCi0gICAgICAgIHB1OF92ID0gcHU4X3ZfZGF0YTsKLQotICAgICAgICBwdThfYmdybiA9IHB1OF9iZ3JuX2RhdGE7Ci0KLSAgICAgICAgLyogTG9vcCBvbiBlYWNoIGNvbHVtbiBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgICAgIGZvciAodTMyX2NvbCA9IHUzMl93aWR0aDsgdTMyX2NvbCAhPSAwIDsgdTMyX2NvbCAtPTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEdldCBmb3VyIEJHUiA1NjUgc2FtcGxlcyBmcm9tIGlucHV0IGRhdGEgKi8KLSAgICAgICAgICAgIHUxNl9waXgxID0gKiggKE00VklGSV9VSW50MTYgKikgcHU4X2Jncm4pOwotICAgICAgICAgICAgdTE2X3BpeDIgPSAqKCAoTTRWSUZJX1VJbnQxNiAqKSAocHU4X2Jncm4gKyBDU1RfUkdCXzE2X1NJWkUpKTsKLSAgICAgICAgICAgIHUxNl9waXgzID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9iZ3JuICsgdTMyX3N0cmlkZV9iZ3IpKTsKLSAgICAgICAgICAgIHUxNl9waXg0ID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9iZ3JuICsgdTMyX3N0cmlkZV9iZ3IgKyBDU1RfUkdCXzE2X1NJWkUpKTsKLSAgICAgICAgICAgIC8qIFVucGFjayBSR0I1NjUgdG8gOGJpdCBSLCBHLCBCICovCi0gICAgICAgICAgICAvKiAoeCx5KSAqLwotICAgICAgICAgICAgR0VUX0JHUjU2NShpMzJfYjAwLCBpMzJfZzAwLCBpMzJfcjAwLCB1MTZfcGl4MSk7Ci0gICAgICAgICAgICAvKiAoeCsxLHkpICovCi0gICAgICAgICAgICBHRVRfQkdSNTY1KGkzMl9iMTAsIGkzMl9nMTAsIGkzMl9yMTAsIHUxNl9waXgyKTsKLSAgICAgICAgICAgIC8qICh4LHkrMSkgKi8KLSAgICAgICAgICAgIEdFVF9CR1I1NjUoaTMyX2IwMSwgaTMyX2cwMSwgaTMyX3IwMSwgdTE2X3BpeDMpOwotICAgICAgICAgICAgLyogKHgrMSx5KzEpICovCi0gICAgICAgICAgICBHRVRfQkdSNTY1KGkzMl9iMTEsIGkzMl9nMTEsIGkzMl9yMTEsIHUxNl9waXg0KTsKLQotICAgICAgICAgICAgLyogQ29udmVydCBCR1IgdmFsdWUgdG8gWVVWICovCi0gICAgICAgICAgICBpMzJfdTAwID0gVTE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3YwMCA9IFYxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMCA9IFkxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLQotICAgICAgICAgICAgaTMyX3UxMCA9IFUxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl92MTAgPSBWMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTAgPSBZMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MDEgPSBVMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfdjAxID0gVjE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTAxID0gWTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotCi0gICAgICAgICAgICBpMzJfdTExID0gVTE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3YxMSA9IFYxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kxMSA9IFkxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLQotICAgICAgICAgICAgLyogU3RvcmUgbHVtaW5hbmNlIGRhdGEgKi8KLSAgICAgICAgICAgIHB1OF95blswXSA9IChNNFZJRklfVUludDgpaTMyX3kwMDsKLSAgICAgICAgICAgIHB1OF95blsxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMDsKLSAgICAgICAgICAgIHB1OF95c1swXSA9IChNNFZJRklfVUludDgpaTMyX3kwMTsKLSAgICAgICAgICAgIHB1OF95c1sxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMTsKLQotICAgICAgICAgICAgLyogU3RvcmUgY2hyb21hIGRhdGEgKi8KLSAgICAgICAgICAgICpwdThfdSA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAqcHU4X3YgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3YwMCArIGkzMl92MDEgKyBpMzJfdjEwICsgaTMyX3YxMSArIDIpID4+IDIpOwotCi0gICAgICAgICAgICAvKiBQcmVwYXJlIGZvciBuZXh0IGNvbHVtbiAqLwotICAgICAgICAgICAgcHU4X2Jncm4gKz0gKENTVF9SR0JfMTZfU0laRTw8MSk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgY3VycmVudCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeW4gKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF95cyArPSAyOwotICAgICAgICAgICAgLyogVXBkYXRlIFUgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgLyogVXBkYXRlIFYgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF92ICsrOwotICAgICAgICB9IC8qIEVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgLyogUHJlcGFyZSBwb2ludGVycyBmb3IgdGhlIG5leHQgcm93ICovCi0gICAgICAgIHB1OF95X2RhdGEgICAgICArPSB1MzJfc3RyaWRlMl9ZOwotICAgICAgICBwdThfdV9kYXRhICAgICAgKz0gdTMyX3N0cmlkZV9VOwotICAgICAgICBwdThfdl9kYXRhICAgICAgKz0gdTMyX3N0cmlkZV9WOwotICAgICAgICBwdThfYmdybl9kYXRhICAgKz0gdTMyX3N0cmlkZV8yYmdyOwotCi0gICAgfSAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0vKiBFbmQgb2YgZmlsZSBNNFZJRklfQkdSNTY1dG9ZVVY0MjAuYyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX0NsaXAuYyBiL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfQ2xpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNDI5MGIxLi4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfQ2xpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgTTRWSUZJX0NsaXAuYwotICogQGJyaWVmICAgIE1hbmFnZW1lbnQgb2YgdGhlIFJHQiBDbGlwcGluZyBtYXRyaXggaW5jbHVzaW9uIGFuZCBEaXZpc2lvbiBUYWJsZQotICogQG5vdGUgICAgIC0jIENsaXBwaW5nIE1hdHJpeCBpcyB1c2VkIGluIG9yZGVyIHRvIHByb3Blcmx5IG1hbmFnZSB0aGUgaW5jbHVzaW9uIG9mCi0gKiAgICAgICAgICAgdGhlIGV4dGVybmFsIFJHQiBDbGlwcGluZyBtYXRyaXggdXNlZCBmb3IgY29sb3IgY29udmVyc2lvbi4KLSAqICAgICAgICAgICBUaGlzIGZpbGUgSEFTIFRPIEJFIGNvbXBpbGVkIHdpdGggYWxsIGNvbG9yIGNvbnZlcnNpb24gZmlsdGVycyBwcm9qZWN0Ci0gKiAgICAgICAgICAgLSMgRGl2aXNpb24gdGFibGUgaXMgdXNlZCBpbiBSR0IgdG8gSExTIGNvbG9yIGNvbnZlcnNpb24KLSAqICAgICAgICAgICBJbXBvcnRhbnQ6IFRoaXMgZmlsZSBtdXN0IGJlIGNvbXBpbGVkIGR1cmluZyB0aGUgYXNzZW1ibHkgbGlicmFyeSBidWlsZGluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLQotQ05TVCBNNFZJRklfVUludDggICBNNFZJRklfQ2xpcFRhYmxlWzEyNTZdCi09IHsKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywKLTB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsCi0weDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLAotMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwKLTB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsCi0weDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDJiLAotMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywKLTB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsCi0weDNjLCAweDNkLCAweDNlLCAweDNmLCAweDQwLCAweDQxLCAweDQyLCAweDQzLAotMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwKLTB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsCi0weDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDViLAotMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywKLTB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsCi0weDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLCAweDcxLCAweDcyLCAweDczLAotMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwKLTB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsCi0weDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDhiLAotMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywKLTB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsCi0weDljLCAweDlkLCAweDllLCAweDlmLCAweGEwLCAweGExLCAweGEyLCAweGEzLAotMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwKLTB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIDB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsCi0weGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGJiLAotMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywKLTB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsCi0weGNjLCAweGNkLCAweGNlLCAweGNmLCAweGQwLCAweGQxLCAweGQyLCAweGQzLAotMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwKLTB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIDB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsCi0weGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGViLAotMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywKLTB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsCi0weGZjLCAweGZkLCAweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCi0weGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKLTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKLX07Ci0KLS8qIERpdmlzaW9uIHRhYmxlIGZvciAoIDY1NTM1L3ggKTsgeCA9IDAgdG8gNTEyICovCi1DTlNUIE00VklGSV9VSW50MTYgIE00VklGSV9EaXZUYWJsZVs1MTJdCi09IHsKLTAsIDY1NTM1LCAzMjc2OCwgMjE4NDUsIDE2Mzg0LCAxMzEwNywgMTA5MjIsIDkzNjIsCi04MTkyLCA3MjgxLCA2NTUzLCA1OTU3LCA1NDYxLCA1MDQxLCA0NjgxLCA0MzY5LAotNDA5NiwgMzg1NSwgMzY0MCwgMzQ0OSwgMzI3NiwgMzEyMCwgMjk3OCwgMjg0OSwKLTI3MzAsIDI2MjEsIDI1MjAsIDI0MjcsIDIzNDAsIDIyNTksIDIxODQsIDIxMTQsCi0yMDQ4LCAxOTg1LCAxOTI3LCAxODcyLCAxODIwLCAxNzcxLCAxNzI0LCAxNjgwLAotMTYzOCwgMTU5OCwgMTU2MCwgMTUyNCwgMTQ4OSwgMTQ1NiwgMTQyNCwgMTM5NCwKLTEzNjUsIDEzMzcsIDEzMTAsIDEyODUsIDEyNjAsIDEyMzYsIDEyMTMsIDExOTEsCi0xMTcwLCAxMTQ5LCAxMTI5LCAxMTEwLCAxMDkyLCAxMDc0LCAxMDU3LCAxMDQwLAotMTAyNCwgMTAwOCwgOTkyLCA5NzgsIDk2MywgOTQ5LCA5MzYsIDkyMywKLTkxMCwgODk3LCA4ODUsIDg3MywgODYyLCA4NTEsIDg0MCwgODI5LAotODE5LCA4MDksIDc5OSwgNzg5LCA3ODAsIDc3MSwgNzYyLCA3NTMsCi03NDQsIDczNiwgNzI4LCA3MjAsIDcxMiwgNzA0LCA2OTcsIDY4OSwKLTY4MiwgNjc1LCA2NjgsIDY2MSwgNjU1LCA2NDgsIDY0MiwgNjM2LAotNjMwLCA2MjQsIDYxOCwgNjEyLCA2MDYsIDYwMSwgNTk1LCA1OTAsCi01ODUsIDU3OSwgNTc0LCA1NjksIDU2NCwgNTYwLCA1NTUsIDU1MCwKLTU0NiwgNTQxLCA1MzcsIDUzMiwgNTI4LCA1MjQsIDUyMCwgNTE2LAotNTEyLCA1MDgsIDUwNCwgNTAwLCA0OTYsIDQ5MiwgNDg5LCA0ODUsCi00ODEsIDQ3OCwgNDc0LCA0NzEsIDQ2OCwgNDY0LCA0NjEsIDQ1OCwKLTQ1NSwgNDUxLCA0NDgsIDQ0NSwgNDQyLCA0MzksIDQzNiwgNDM0LAotNDMxLCA0MjgsIDQyNSwgNDIyLCA0MjAsIDQxNywgNDE0LCA0MTIsCi00MDksIDQwNywgNDA0LCA0MDIsIDM5OSwgMzk3LCAzOTQsIDM5MiwKLTM5MCwgMzg3LCAzODUsIDM4MywgMzgxLCAzNzgsIDM3NiwgMzc0LAotMzcyLCAzNzAsIDM2OCwgMzY2LCAzNjQsIDM2MiwgMzYwLCAzNTgsCi0zNTYsIDM1NCwgMzUyLCAzNTAsIDM0OCwgMzQ2LCAzNDQsIDM0MywKLTM0MSwgMzM5LCAzMzcsIDMzNiwgMzM0LCAzMzIsIDMzMCwgMzI5LAotMzI3LCAzMjYsIDMyNCwgMzIyLCAzMjEsIDMxOSwgMzE4LCAzMTYsCi0zMTUsIDMxMywgMzEyLCAzMTAsIDMwOSwgMzA3LCAzMDYsIDMwNCwKLTMwMywgMzAyLCAzMDAsIDI5OSwgMjk3LCAyOTYsIDI5NSwgMjkzLAotMjkyLCAyOTEsIDI4OSwgMjg4LCAyODcsIDI4NiwgMjg0LCAyODMsCi0yODIsIDI4MSwgMjgwLCAyNzgsIDI3NywgMjc2LCAyNzUsIDI3NCwKLTI3MywgMjcxLCAyNzAsIDI2OSwgMjY4LCAyNjcsIDI2NiwgMjY1LAotMjY0LCAyNjMsIDI2MiwgMjYxLCAyNjAsIDI1OSwgMjU4LCAyNTcsCi0yNTYsIDI1NSwgMjU0LCAyNTMsIDI1MiwgMjUxLCAyNTAsIDI0OSwKLTI0OCwgMjQ3LCAyNDYsIDI0NSwgMjQ0LCAyNDMsIDI0MiwgMjQxLAotMjQwLCAyNDAsIDIzOSwgMjM4LCAyMzcsIDIzNiwgMjM1LCAyMzQsCi0yMzQsIDIzMywgMjMyLCAyMzEsIDIzMCwgMjI5LCAyMjksIDIyOCwKLTIyNywgMjI2LCAyMjUsIDIyNSwgMjI0LCAyMjMsIDIyMiwgMjIyLAotMjIxLCAyMjAsIDIxOSwgMjE5LCAyMTgsIDIxNywgMjE3LCAyMTYsCi0yMTUsIDIxNCwgMjE0LCAyMTMsIDIxMiwgMjEyLCAyMTEsIDIxMCwKLTIxMCwgMjA5LCAyMDgsIDIwOCwgMjA3LCAyMDYsIDIwNiwgMjA1LAotMjA0LCAyMDQsIDIwMywgMjAyLCAyMDIsIDIwMSwgMjAxLCAyMDAsCi0xOTksIDE5OSwgMTk4LCAxOTcsIDE5NywgMTk2LCAxOTYsIDE5NSwKLTE5NSwgMTk0LCAxOTMsIDE5MywgMTkyLCAxOTIsIDE5MSwgMTkxLAotMTkwLCAxODksIDE4OSwgMTg4LCAxODgsIDE4NywgMTg3LCAxODYsCi0xODYsIDE4NSwgMTg1LCAxODQsIDE4NCwgMTgzLCAxODMsIDE4MiwKLTE4MiwgMTgxLCAxODEsIDE4MCwgMTgwLCAxNzksIDE3OSwgMTc4LAotMTc4LCAxNzcsIDE3NywgMTc2LCAxNzYsIDE3NSwgMTc1LCAxNzQsCi0xNzQsIDE3MywgMTczLCAxNzIsIDE3MiwgMTcyLCAxNzEsIDE3MSwKLTE3MCwgMTcwLCAxNjksIDE2OSwgMTY4LCAxNjgsIDE2OCwgMTY3LAotMTY3LCAxNjYsIDE2NiwgMTY1LCAxNjUsIDE2NSwgMTY0LCAxNjQsCi0xNjMsIDE2MywgMTYzLCAxNjIsIDE2MiwgMTYxLCAxNjEsIDE2MSwKLTE2MCwgMTYwLCAxNTksIDE1OSwgMTU5LCAxNTgsIDE1OCwgMTU3LAotMTU3LCAxNTcsIDE1NiwgMTU2LCAxNTYsIDE1NSwgMTU1LCAxNTQsCi0xNTQsIDE1NCwgMTUzLCAxNTMsIDE1MywgMTUyLCAxNTIsIDE1MiwKLTE1MSwgMTUxLCAxNTEsIDE1MCwgMTUwLCAxNDksIDE0OSwgMTQ5LAotMTQ4LCAxNDgsIDE0OCwgMTQ3LCAxNDcsIDE0NywgMTQ2LCAxNDYsCi0xNDYsIDE0NSwgMTQ1LCAxNDUsIDE0NCwgMTQ0LCAxNDQsIDE0NCwKLTE0MywgMTQzLCAxNDMsIDE0MiwgMTQyLCAxNDIsIDE0MSwgMTQxLAotMTQxLCAxNDAsIDE0MCwgMTQwLCAxNDAsIDEzOSwgMTM5LCAxMzksCi0xMzgsIDEzOCwgMTM4LCAxMzcsIDEzNywgMTM3LCAxMzcsIDEzNiwKLTEzNiwgMTM2LCAxMzUsIDEzNSwgMTM1LCAxMzUsIDEzNCwgMTM0LAotMTM0LCAxMzQsIDEzMywgMTMzLCAxMzMsIDEzMiwgMTMyLCAxMzIsCi0xMzIsIDEzMSwgMTMxLCAxMzEsIDEzMSwgMTMwLCAxMzAsIDEzMCwKLTEzMCwgMTI5LCAxMjksIDEyOSwgMTI5LCAxMjgsIDEyOCwgMTI4Ci19OwotCi1DTlNUIE00VklGSV9JbnQzMiAgY29uc3Rfc3RvcmFnZTFbOF0KLT0gewotMHgwMDAwMjU2OCwgMHgwMDAwMzM0MywweDAwMDAwNjQ5LDB4MDAwMDBkMGYsIDB4MDAwMEQ4NkMsIDB4MDAwMEQ4M0IsIDB4MDAwMTAwMDAsIDB4MDAwMTAwMDAKLX07Ci0KLUNOU1QgTTRWSUZJX0ludDMyICBjb25zdF9zdG9yYWdlWzhdCi09IHsKLTB4MDAwMDI1NjgsIDB4MDAwMDMzNDMsIDB4MUJGODAwLCAweDAwMDAwNjQ5LCAweDAwMDAwZDBmLCAweDExMDE4MCwgMHg0MGNmLCAweDIyQkUwMAotfTsKLQotCi1DTlNUIE00VklGSV9VSW50MTYgICpNNFZJRklfRGl2VGFibGVfemVybwotID0gJk00VklGSV9EaXZUYWJsZVswXTsKLQotQ05TVCBNNFZJRklfVUludDggICAqTTRWSUZJX0NsaXBUYWJsZV96ZXJvCi0gPSAmTTRWSUZJX0NsaXBUYWJsZVs1MDBdOwotCi0KLS8qIEVuZCBvZiBmaWxlIE00VklGSV9DbGlwLmMgKi8KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SR0I1NjV0b1lVVjQyMC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SR0I1NjV0b1lVVjQyMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNGNiZDU3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCNTY1dG9ZVVY0MjAuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAYnJpZWYgICAgQ29udGFpbiB2aWRlbyBsaWJyYXJ5IGZ1bmN0aW9uCi0gKiBAbm90ZSAgICAgQ29sb3IgQ29udmVyc2lvbiBGaWx0ZXIKLSAqICAgICAgICAgICBDb250YWlucyB0aGUgZm9ybWF0IGNvbnZlcnNpb24gZmlsdGVycyBmcm9tIFJHQjU2NSB0byBZVVY0MjAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0KLS8qIFByb3RvdHlwZXMgb2YgZnVuY3Rpb25zLCBhbmQgdHlwZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9GaWx0ZXJzQVBJLmgiCi0vKiBNYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgICAgIk00VklGSV9EZWZpbmVzLmgiCi0vKiBDbGlwIHRhYmxlIGRlY2xhcmF0aW9uICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0NsaXAuaCIKLQotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIE00VklGSV9VSW50OCBNNFZJRklfUkdCNTY1dG9ZVVY0MjAgKHZvaWQgKnBVc2VyRGF0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLSAqIEBicmllZiAgIHRyYW5zZm9ybSBSR0I1NjUgaW1hZ2UgdG8gYSBZVVY0MjAgaW1hZ2UuCi0gKiBAbm90ZSAgICBDb252ZXJ0IFJHQjU2NSB0byBZVVY0MjAsCi0gKiAgICAgICAgICBMb29wIG9uIGVhY2ggcm93ICggMiByb3dzIGJ5IDIgcm93cyApCi0gKiAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoIDIgY29sIGJ5IDIgY29sICkKLSAqICAgICAgICAgICAgICAgICAgR2V0IDQgUkdCIHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhIGFuZCBidWlsZCA0IG91dHB1dCBZIHNhbXBsZXMKLSAqICAgICAgICAgICAgICAgICAgYW5kIGVhY2ggc2luZ2xlIFUgJiBWIGRhdGEKLSAqICAgICAgICAgICAgICBlbmQgbG9vcCBvbiBjb2wKLSAqICAgICAgICAgIGVuZCBsb29wIG9uIHJvdwotICogQHBhcmFtICAgcFVzZXJEYXRhOiAoSU4pIFVzZXIgU3BlY2lmaWMgRGF0YQotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBSR0I1NjUgUGxhbmUKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byAgWVVWNDIwIGJ1ZmZlciBQbGFuZQotICogQHJldHVybiAgTTRWSUZJX09LOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBZVVYgUGxhbmUgaGVpZ2h0IGlzIE9ERAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBZVVYgUGxhbmUgd2lkdGggaXMgT0RECi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SR0I1NjV0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi17Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aCwgdTMyX2hlaWdodDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9ZLCB1MzJfc3RyaWRlMl9ZLCB1MzJfc3RyaWRlX1UsIHUzMl9zdHJpZGVfVjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9yZ2IsIHUzMl9zdHJpZGVfMnJnYjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX2NvbCwgdTMyX3JvdzsKLQotICAgIE00VklGSV9JbnQzMiAgICBpMzJfcjAwLCBpMzJfcjAxLCBpMzJfcjEwLCBpMzJfcjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfZzAwLCBpMzJfZzAxLCBpMzJfZzEwLCBpMzJfZzExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfYjAwLCBpMzJfYjAxLCBpMzJfYjEwLCBpMzJfYjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfeTAwLCBpMzJfeTAxLCBpMzJfeTEwLCBpMzJfeTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdTAwLCBpMzJfdTAxLCBpMzJfdTEwLCBpMzJfdTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdjAwLCBpMzJfdjAxLCBpMzJfdjEwLCBpMzJfdjExOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3luLCAqcHU4X3lzLCAqcHU4X3UsICpwdThfdjsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95X2RhdGEsICpwdThfdV9kYXRhLCAqcHU4X3ZfZGF0YTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9yZ2JuX2RhdGEsICpwdThfcmdibjsKLSAgICBNNFZJRklfVUludDE2ICAgdTE2X3BpeDEsIHUxNl9waXgyLCB1MTZfcGl4MywgdTE2X3BpeDQ7Ci0KLSAgICAvKiBDaGVjayBwbGFuZXMgaGVpZ2h0IGFyZSBhcHByb3ByaWF0ZSAqLwotICAgIGlmICgocFBsYW5lSW4tPnVfaGVpZ2h0ICE9IHBQbGFuZU91dFswXS51X2hlaWdodCkgICAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKHBQbGFuZU91dFsxXS51X2hlaWdodDw8MSkpICAgfHwKLSAgICAgICAgKHBQbGFuZU91dFswXS51X2hlaWdodCAhPSAocFBsYW5lT3V0WzJdLnVfaGVpZ2h0PDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIC8qIENoZWNrIHBsYW5lcyB3aWR0aCBhcmUgYXBwcm9wcmlhdGUgKi8KLSAgICBpZiAoKHBQbGFuZUluLT51X3dpZHRoICE9IHBQbGFuZU91dFswXS51X3dpZHRoKSAgICAgICAgIHx8Ci0gICAgICAgIChwUGxhbmVPdXRbMF0udV93aWR0aCAhPSAocFBsYW5lT3V0WzFdLnVfd2lkdGg8PDEpKSB8fAotICAgICAgICAocFBsYW5lT3V0WzBdLnVfd2lkdGggIT0gKHBQbGFuZU91dFsyXS51X3dpZHRoPDwxKSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfeV9kYXRhID0gcFBsYW5lT3V0WzBdLnBhY19kYXRhICsgcFBsYW5lT3V0WzBdLnVfdG9wbGVmdDsKLSAgICBwdThfdV9kYXRhID0gcFBsYW5lT3V0WzFdLnBhY19kYXRhICsgcFBsYW5lT3V0WzFdLnVfdG9wbGVmdDsKLSAgICBwdThfdl9kYXRhID0gcFBsYW5lT3V0WzJdLnBhY19kYXRhICsgcFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIFNldCB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfcmdibl9kYXRhICAgPSBwUGxhbmVJbi0+cGFjX2RhdGEgKyBwUGxhbmVJbi0+dV90b3BsZWZ0OwotCi0gICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgKi8KLSAgICB1MzJfd2lkdGggPSBwUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0ID0gcFBsYW5lT3V0WzBdLnVfaGVpZ2h0OwotCi0gICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBtZW1vcnkganVtcHMgY29ycmVzcG9uZGluZyB0byByb3cganVtcCBpbiBlYWNoIG91dHB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfWSA9IHBQbGFuZU91dFswXS51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlMl9ZID0gdTMyX3N0cmlkZV9ZIDw8IDE7Ci0gICAgdTMyX3N0cmlkZV9VID0gcFBsYW5lT3V0WzFdLnVfc3RyaWRlOwotICAgIHUzMl9zdHJpZGVfViA9IHBQbGFuZU91dFsyXS51X3N0cmlkZTsKLQotICAgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGp1bXBzIGNvcnJlc3BvbmRpbmcgdG8gcm93IGp1bXAgaW4gaW5wdXQgcGxhbmUgKi8KLSAgICB1MzJfc3RyaWRlX3JnYiA9IHBQbGFuZUluLT51X3N0cmlkZTsKLSAgICB1MzJfc3RyaWRlXzJyZ2IgPSB1MzJfc3RyaWRlX3JnYiA8PCAxOwotCi0KLSAgICAvKiBMb29wIG9uIGVhY2ggcm93IG9mIHRoZSBvdXRwdXQgaW1hZ2UsIGlucHV0IGNvb3JkaW5hdGVzIGFyZSBlc3RpbWF0ZWQgZnJvbSBvdXRwdXQgb25lcyAqLwotICAgIC8qIFR3byBZVVYgcm93cyBhcmUgY29tcHV0ZWQgYXQgZWFjaCBwYXNzICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodCA7dTMyX3JvdyAhPSAwOyB1MzJfcm93IC09MikKLSAgICB7Ci0gICAgICAgIC8qIEN1cnJlbnQgWSBwbGFuZSByb3cgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3luID0gcHU4X3lfZGF0YTsKLSAgICAgICAgLyogTmV4dCBZIHBsYW5lIHJvdyBwb2ludGVycyAqLwotICAgICAgICBwdThfeXMgPSBwdThfeW4gKyB1MzJfc3RyaWRlX1k7Ci0gICAgICAgIC8qIEN1cnJlbnQgVSBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdSA9IHB1OF91X2RhdGE7Ci0gICAgICAgIC8qIEN1cnJlbnQgViBwbGFuZSByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfdiA9IHB1OF92X2RhdGE7Ci0KLSAgICAgICAgcHU4X3JnYm4gPSBwdThfcmdibl9kYXRhOwotCi0gICAgICAgIC8qIExvb3Agb24gZWFjaCBjb2x1bW4gb2YgdGhlIG91dHB1dCBpbWFnZSAqLwotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGg7IHUzMl9jb2wgIT0gMCA7IHUzMl9jb2wgLT0yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBHZXQgZm91ciBSR0IgNTY1IHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICB1MTZfcGl4MSA9ICooIChNNFZJRklfVUludDE2ICopIHB1OF9yZ2JuKTsKLSAgICAgICAgICAgIHUxNl9waXgyID0gKiggKE00VklGSV9VSW50MTYgKikgKHB1OF9yZ2JuICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0gICAgICAgICAgICB1MTZfcGl4MyA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiKSk7Ci0gICAgICAgICAgICB1MTZfcGl4NCA9ICooIChNNFZJRklfVUludDE2ICopIChwdThfcmdibiArIHUzMl9zdHJpZGVfcmdiICsgQ1NUX1JHQl8xNl9TSVpFKSk7Ci0KLSAgICAgICAgICAgIC8qIFVucGFjayBSR0I1NjUgdG8gOGJpdCBSLCBHLCBCICovCi0gICAgICAgICAgICAvKiAoeCx5KSAqLwotICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfcjAwLGkzMl9nMDAsaTMyX2IwMCx1MTZfcGl4MSk7Ci0gICAgICAgICAgICAvKiAoeCsxLHkpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9yMTAsaTMyX2cxMCxpMzJfYjEwLHUxNl9waXgyKTsKLSAgICAgICAgICAgIC8qICh4LHkrMSkgKi8KLSAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX3IwMSxpMzJfZzAxLGkzMl9iMDEsdTE2X3BpeDMpOwotICAgICAgICAgICAgLyogKHgrMSx5KzEpICovCi0gICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9yMTEsaTMyX2cxMSxpMzJfYjExLHUxNl9waXg0KTsKLQotICAgICAgICAgICAgLyogQ29udmVydCBSR0IgdmFsdWUgdG8gWVVWICovCi0gICAgICAgICAgICBpMzJfdTAwID0gVTE2KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3YwMCA9IFYxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kwMCA9IFkxNihpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsKLQotICAgICAgICAgICAgaTMyX3UxMCA9IFUxNihpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl92MTAgPSBWMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgdmFsdWUgKi8KLSAgICAgICAgICAgIGkzMl95MTAgPSBZMTYoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0KLSAgICAgICAgICAgIGkzMl91MDEgPSBVMTYoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfdjAxID0gVjE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgLyogbHVtaW5hbmNlIHZhbHVlICovCi0gICAgICAgICAgICBpMzJfeTAxID0gWTE2KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotCi0gICAgICAgICAgICBpMzJfdTExID0gVTE2KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3YxMSA9IFYxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIC8qIGx1bWluYW5jZSB2YWx1ZSAqLwotICAgICAgICAgICAgaTMyX3kxMSA9IFkxNihpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLQotICAgICAgICAgICAgLyogU3RvcmUgbHVtaW5hbmNlIGRhdGEgKi8KLSAgICAgICAgICAgIHB1OF95blswXSA9IChNNFZJRklfVUludDgpaTMyX3kwMDsKLSAgICAgICAgICAgIHB1OF95blsxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMDsKLSAgICAgICAgICAgIHB1OF95c1swXSA9IChNNFZJRklfVUludDgpaTMyX3kwMTsKLSAgICAgICAgICAgIHB1OF95c1sxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMTsKLQotICAgICAgICAgICAgLyogU3RvcmUgY2hyb21hIGRhdGEgKi8KLSAgICAgICAgICAgICpwdThfdSA9IChNNFZJRklfVUludDgpKChpMzJfdTAwICsgaTMyX3UwMSArIGkzMl91MTAgKyBpMzJfdTExICsgMikgPj4gMik7Ci0gICAgICAgICAgICAqcHU4X3YgPSAoTTRWSUZJX1VJbnQ4KSgoaTMyX3YwMCArIGkzMl92MDEgKyBpMzJfdjEwICsgaTMyX3YxMSArIDIpID4+IDIpOwotCi0gICAgICAgICAgICAvKiBQcmVwYXJlIGZvciBuZXh0IGNvbHVtbiAqLwotICAgICAgICAgICAgcHU4X3JnYm4gKz0gKENTVF9SR0JfMTZfU0laRTw8MSk7Ci0gICAgICAgICAgICAvKiBVcGRhdGUgY3VycmVudCBZIHBsYW5lIGxpbmUgcG9pbnRlciovCi0gICAgICAgICAgICBwdThfeW4gKz0gMjsKLSAgICAgICAgICAgIC8qIFVwZGF0ZSBuZXh0IFkgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF95cyArPSAyOwotICAgICAgICAgICAgLyogVXBkYXRlIFUgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF91ICsrOwotICAgICAgICAgICAgLyogVXBkYXRlIFYgcGxhbmUgbGluZSBwb2ludGVyKi8KLSAgICAgICAgICAgIHB1OF92ICsrOwotICAgICAgICB9IC8qIEVuZCBvZiBob3Jpem9udGFsIHNjYW5uaW5nICovCi0KLSAgICAgICAgLyogUHJlcGFyZSBwb2ludGVycyBmb3IgdGhlIG5leHQgcm93ICovCi0gICAgICAgIHB1OF95X2RhdGEgKz0gdTMyX3N0cmlkZTJfWTsKLSAgICAgICAgcHU4X3VfZGF0YSArPSB1MzJfc3RyaWRlX1U7Ci0gICAgICAgIHB1OF92X2RhdGEgKz0gdTMyX3N0cmlkZV9WOwotICAgICAgICBwdThfcmdibl9kYXRhICs9IHUzMl9zdHJpZGVfMnJnYjsKLQotCi0gICAgfSAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SR0I4ODh0b1lVVjQyMC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SR0I4ODh0b1lVVjQyMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyODVhMmE2Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUkdCODg4dG9ZVVY0MjAuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRmlsdGVyc0FQSS5oIgotCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLQotI2luY2x1ZGUgICAgIk00VklGSV9DbGlwLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVByb3RvOgotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SR0I4ODh0b1lVVjQyMCh2b2lkICpwVXNlckRhdGEsIE00VklGSV9JbWFnZVBsYW5lICpQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lT3V0WzNdKTsKLVB1cnBvc2U6ICAgIGZpbGxpbmcgb2YgdGhlIFlVVjQyMCBwbGFuZSBmcm9tIGEgQkdSMjQgcGxhbmUKLUFic3RyYWN0OiAgICBMb29wIG9uIGVhY2ggcm93ICggMiByb3dzIGJ5IDIgcm93cyApCi0gICAgICAgICAgICAgICAgTG9vcCBvbiBlYWNoIGNvbHVtbiAoIDIgY29sIGJ5IDIgY29sICkKLSAgICAgICAgICAgICAgICAgICAgR2V0IDQgQkdSIHNhbXBsZXMgZnJvbSBpbnB1dCBkYXRhIGFuZCBidWlsZCA0IG91dHB1dCBZIHNhbXBsZXMgYW5kCi0gICAgICAgICAgICAgICAgICAgIGVhY2ggc2luZ2xlIFUgJiBWIGRhdGEKLSAgICAgICAgICAgICAgICBlbmQgbG9vcCBvbiBjb2wKLSAgICAgICAgICAgIGVuZCBsb29wIG9uIHJvdwotCi1JbjogICAgICAgICAgICBSR0IyNCBwbGFuZQotSW5PdXQ6ICAgICAgICBub25lCi1PdXQ6ICAgICAgICBhcnJheSBvZiAzIE00VklGSV9JbWFnZVBsYW5lIHN0cnVjdHVyZXMKLU1vZGlmaWVkOiAgICBNTDogUkdCIGZ1bmN0aW9uIG1vZGlmaWVkIHRvIEJHUi4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU00VklGSV9VSW50OCBNNFZJRklfUkdCODg4dG9ZVVY0MjAodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lIFBsYW5lT3V0WzNdKQotewotICAgIE00VklGSV9VSW50MzIgICAgdTMyX3dpZHRoLCB1MzJfaGVpZ2h0OwotICAgIE00VklGSV9VSW50MzIgICAgdTMyX3N0cmlkZV9ZLCB1MzJfc3RyaWRlMl9ZLCB1MzJfc3RyaWRlX1UsIHUzMl9zdHJpZGVfViwgdTMyX3N0cmlkZV9yZ2IsXAotICAgICAgICAgICAgICAgICAgICAgdTMyX3N0cmlkZV8ycmdiOwotICAgIE00VklGSV9VSW50MzIgICAgdTMyX2NvbCwgdTMyX3JvdzsKLQotICAgIE00VklGSV9JbnQzMiAgICBpMzJfcjAwLCBpMzJfcjAxLCBpMzJfcjEwLCBpMzJfcjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfZzAwLCBpMzJfZzAxLCBpMzJfZzEwLCBpMzJfZzExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfYjAwLCBpMzJfYjAxLCBpMzJfYjEwLCBpMzJfYjExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfeTAwLCBpMzJfeTAxLCBpMzJfeTEwLCBpMzJfeTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdTAwLCBpMzJfdTAxLCBpMzJfdTEwLCBpMzJfdTExOwotICAgIE00VklGSV9JbnQzMiAgICBpMzJfdjAwLCBpMzJfdjAxLCBpMzJfdjEwLCBpMzJfdjExOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3luLCAqcHU4X3lzLCAqcHU4X3UsICpwdThfdjsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF95X2RhdGEsICpwdThfdV9kYXRhLCAqcHU4X3ZfZGF0YTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9yZ2JuX2RhdGEsICpwdThfcmdibjsKLQotICAgIC8qIGNoZWNrIHNpemVzICovCi0gICAgaWYoIChQbGFuZUluLT51X2hlaWdodCAhPSBQbGFuZU91dFswXS51X2hlaWdodCkgICAgICAgICAgICB8fAotICAgICAgICAoUGxhbmVPdXRbMF0udV9oZWlnaHQgIT0gKFBsYW5lT3V0WzFdLnVfaGVpZ2h0PDwxKSkgICAgfHwKLSAgICAgICAgKFBsYW5lT3V0WzBdLnVfaGVpZ2h0ICE9IChQbGFuZU91dFsyXS51X2hlaWdodDw8MSkpKQotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotCi0gICAgaWYoIChQbGFuZUluLT51X3dpZHRoICE9IFBsYW5lT3V0WzBdLnVfd2lkdGgpICAgICAgICB8fAotICAgICAgICAoUGxhbmVPdXRbMF0udV93aWR0aCAhPSAoUGxhbmVPdXRbMV0udV93aWR0aDw8MSkpICAgIHx8Ci0gICAgICAgIChQbGFuZU91dFswXS51X3dpZHRoICE9IChQbGFuZU91dFsyXS51X3dpZHRoPDwxKSkpCi0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLQotCi0gICAgLyogc2V0IHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dCBkYXRhIGJ1ZmZlcnMgKi8KLSAgICBwdThfeV9kYXRhICAgID0gUGxhbmVPdXRbMF0ucGFjX2RhdGEgKyBQbGFuZU91dFswXS51X3RvcGxlZnQ7Ci0gICAgcHU4X3VfZGF0YSAgICA9IFBsYW5lT3V0WzFdLnBhY19kYXRhICsgUGxhbmVPdXRbMV0udV90b3BsZWZ0OwotICAgIHB1OF92X2RhdGEgICAgPSBQbGFuZU91dFsyXS5wYWNfZGF0YSArIFBsYW5lT3V0WzJdLnVfdG9wbGVmdDsKLQotICAgIC8qIGlkZW0gZm9yIGlucHV0IGJ1ZmZlciAqLwotICAgIHB1OF9yZ2JuX2RhdGEgICAgPSBQbGFuZUluLT5wYWNfZGF0YSArIFBsYW5lSW4tPnVfdG9wbGVmdDsKLQotICAgIC8qIGdldCB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgdTMyX3dpZHRoICAgID0gUGxhbmVPdXRbMF0udV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0ICAgID0gUGxhbmVPdXRbMF0udV9oZWlnaHQ7Ci0KLSAgICAvKiBzZXQgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBqdW1wcyBjb3JyZXNwb25kaW5nIHRvIHJvdyBqdW1wIGluIGVhY2ggb3V0cHV0IHBsYW5lICovCi0gICAgdTMyX3N0cmlkZV9ZID0gUGxhbmVPdXRbMF0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZTJfWT0gdTMyX3N0cmlkZV9ZIDw8IDE7Ci0gICAgdTMyX3N0cmlkZV9VID0gUGxhbmVPdXRbMV0udV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9WID0gUGxhbmVPdXRbMl0udV9zdHJpZGU7Ci0KLSAgICAvKiBpZGVtIGZvciBpbnB1dCBwbGFuZSAqLwotICAgIHUzMl9zdHJpZGVfcmdiID0gUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV8ycmdiID0gdTMyX3N0cmlkZV9yZ2IgPDwgMTsKLQotICAgIC8qIGxvb3Agb24gZWFjaCByb3cgb2YgdGhlIG91dHB1dCBpbWFnZSwgaW5wdXQgY29vcmRpbmF0ZXMgYXJlIGVzdGltYXRlZCBmcm9tIG91dHB1dCBvbmVzICovCi0gICAgLyogdHdvIFlVViByb3dzIGFyZSBjb21wdXRlZCBhdCBlYWNoIHBhc3MgKi8KLSAgICBmb3IgICAgKHUzMl9yb3cgPSB1MzJfaGVpZ2h0IDt1MzJfcm93ICE9IDA7IHUzMl9yb3cgLT0yKQotICAgIHsKLSAgICAgICAgLyogdXBkYXRlIHdvcmtpbmcgcG9pbnRlcnMgKi8KLSAgICAgICAgcHU4X3luICAgID0gcHU4X3lfZGF0YTsKLSAgICAgICAgcHU4X3lzICAgID0gcHU4X3luICsgdTMyX3N0cmlkZV9ZOwotCi0gICAgICAgIHB1OF91ICAgID0gcHU4X3VfZGF0YTsKLSAgICAgICAgcHU4X3YgICAgPSBwdThfdl9kYXRhOwotCi0gICAgICAgIHB1OF9yZ2JuPSBwdThfcmdibl9kYXRhOwotCi0gICAgICAgIC8qIGxvb3Agb24gZWFjaCBjb2x1bW4gb2YgdGhlIG91dHB1dCBpbWFnZSovCi0gICAgICAgIGZvciAgICAodTMyX2NvbCA9IHUzMl93aWR0aDsgdTMyX2NvbCAhPSAwIDsgdTMyX2NvbCAtPTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGdldCBSR0Igc2FtcGxlcyBvZiA0IHBpeGVscyAqLwotICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDAsIHB1OF9yZ2JuLCAwKTsKLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwLCBwdThfcmdibiwgQ1NUX1JHQl8yNF9TSVpFKTsKLSAgICAgICAgICAgIEdFVF9SR0IyNChpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxLCBwdThfcmdibiwgdTMyX3N0cmlkZV9yZ2IpOwotICAgICAgICAgICAgR0VUX1JHQjI0KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEsIHB1OF9yZ2JuLCB1MzJfc3RyaWRlX3JnYiArIENTVF9SR0JfMjRfU0laRSk7Ci0KLSAgICAgICAgICAgIGkzMl91MDAgICAgPSBVMjQoaTMyX3IwMCwgaTMyX2cwMCwgaTMyX2IwMCk7Ci0gICAgICAgICAgICBpMzJfdjAwICAgID0gVjI0KGkzMl9yMDAsIGkzMl9nMDAsIGkzMl9iMDApOwotICAgICAgICAgICAgaTMyX3kwMCAgICA9IFkyNChpMzJfcjAwLCBpMzJfZzAwLCBpMzJfYjAwKTsgICAgICAgIC8qIG1hdHJpeCBsdW1pbmFuY2UgKi8KLSAgICAgICAgICAgIHB1OF95blswXT0gKE00VklGSV9VSW50OClpMzJfeTAwOwotCi0gICAgICAgICAgICBpMzJfdTEwICAgID0gVTI0KGkzMl9yMTAsIGkzMl9nMTAsIGkzMl9iMTApOwotICAgICAgICAgICAgaTMyX3YxMCAgICA9IFYyNChpMzJfcjEwLCBpMzJfZzEwLCBpMzJfYjEwKTsKLSAgICAgICAgICAgIGkzMl95MTAgICAgPSBZMjQoaTMyX3IxMCwgaTMyX2cxMCwgaTMyX2IxMCk7Ci0gICAgICAgICAgICBwdThfeW5bMV09IChNNFZJRklfVUludDgpaTMyX3kxMDsKLQotICAgICAgICAgICAgaTMyX3UwMSAgICA9IFUyNChpMzJfcjAxLCBpMzJfZzAxLCBpMzJfYjAxKTsKLSAgICAgICAgICAgIGkzMl92MDEgICAgPSBWMjQoaTMyX3IwMSwgaTMyX2cwMSwgaTMyX2IwMSk7Ci0gICAgICAgICAgICBpMzJfeTAxICAgID0gWTI0KGkzMl9yMDEsIGkzMl9nMDEsIGkzMl9iMDEpOwotICAgICAgICAgICAgcHU4X3lzWzBdPSAoTTRWSUZJX1VJbnQ4KWkzMl95MDE7Ci0KLSAgICAgICAgICAgIGkzMl91MTEgICAgPSBVMjQoaTMyX3IxMSwgaTMyX2cxMSwgaTMyX2IxMSk7Ci0gICAgICAgICAgICBpMzJfdjExICAgID0gVjI0KGkzMl9yMTEsIGkzMl9nMTEsIGkzMl9iMTEpOwotICAgICAgICAgICAgaTMyX3kxMSAgICA9IFkyNChpMzJfcjExLCBpMzJfZzExLCBpMzJfYjExKTsKLSAgICAgICAgICAgIHB1OF95c1sxXSA9IChNNFZJRklfVUludDgpaTMyX3kxMTsKLQotICAgICAgICAgICAgKnB1OF91ICAgID0gKE00VklGSV9VSW50OCkoKGkzMl91MDAgKyBpMzJfdTAxICsgaTMyX3UxMCArIGkzMl91MTEgKyAyKSA+PiAyKTsKLSAgICAgICAgICAgICpwdThfdiAgICA9IChNNFZJRklfVUludDgpKChpMzJfdjAwICsgaTMyX3YwMSArIGkzMl92MTAgKyBpMzJfdjExICsgMikgPj4gMik7Ci0KLSAgICAgICAgICAgIHB1OF9yZ2JuICAgICs9ICAoQ1NUX1JHQl8yNF9TSVpFPDwxKTsKLSAgICAgICAgICAgIHB1OF95biAgICAgICAgKz0gMjsKLSAgICAgICAgICAgIHB1OF95cyAgICAgICAgKz0gMjsKLQotICAgICAgICAgICAgcHU4X3UgKys7Ci0gICAgICAgICAgICBwdThfdiArKzsKLSAgICAgICAgfSAvKiBlbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIHB1OF95X2RhdGEgICAgICAgICs9IHUzMl9zdHJpZGUyX1k7Ci0gICAgICAgIHB1OF91X2RhdGEgICAgICAgICs9IHUzMl9zdHJpZGVfVTsKLSAgICAgICAgcHU4X3ZfZGF0YSAgICAgICAgKz0gdTMyX3N0cmlkZV9WOwotICAgICAgICBwdThfcmdibl9kYXRhICAgICs9IHUzMl9zdHJpZGVfMnJnYjsKLQotCi0gICAgfSAvKiBFbmQgb2YgdmVydGljYWwgc2Nhbm5pbmcgKi8KLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19CmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVJHQjU2NXRvUkdCNTY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxN2U0ZWQuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVSR0I1NjV0b1JHQjU2NS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEBmaWxlICAgICBNNFZJRklfUmVzaXplUkdCNTY1dG9SR0I1NjUuYwotICogQGJyaWVmICAgIENvbnRhaW4gdmlkZW8gbGlicmFyeSBmdW5jdGlvbgotICogQG5vdGUgICAgIFRoaXMgZmlsZSBoYXMgYSBSZXNpemUgZmlsdGVyIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgR2VuZXJpYyByZXNpemluZyBvZiBSR0I1NjUgKFBsYW5hcikgaW1hZ2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi0vKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9ucywgYW5kIHR5cGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRmlsdGVyc0FQSS5oIgotLyogTWFjcm8gZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRGVmaW5lcy5oIgotLyogQ2xpcCB0YWJsZSBkZWNsYXJhdGlvbiAqLwotI2luY2x1ZGUgICAgIk00VklGSV9DbGlwLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCNTY1dG9SR0I1NjUodm9pZCAqcFVzZXJEYXRhLCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgUmVzaXplcyBSR0I1NjUgUGxhbmFyIHBsYW5lLgotICogQHBhcmFtICAgcFVzZXJEYXRhOiAoSU4pIFVzZXIgRGF0YQotICogQHBhcmFtICAgcFBsYW5lSW46IChJTikgUG9pbnRlciB0byBSR0I1NjUgKFBsYW5hcikgcGxhbmUgYnVmZmVyCi0gKiBAcGFyYW0gICBwUGxhbmVPdXQ6IChPVVQpIFBvaW50ZXIgdG8gUkdCNTY1IChQbGFuYXIpIHBsYW5lCi0gKiBAcmV0dXJuICBNNFZJRklfT0s6IHRoZXJlIGlzIG5vIGVycm9yCi0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ6IEVycm9yIGluIGhlaWdodAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBFcnJvciBpbiB3aWR0aAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhclJHQjU2NXRvUkdCNTY1KHZvaWQgKnBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZU91dCkKLXsKLSAgICBNNFZJRklfVUludDE2ICAgKnB1MTZfZGF0YV9pbjsKLSAgICBNNFZJRklfVUludDE2ICAgKnB1MTZfZGF0YV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aF9pbiwgdTMyX3dpZHRoX291dCwgdTMyX2hlaWdodF9pbiwgdTMyX2hlaWdodF9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfaW4sIHUzMl9zdHJpZGVfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9pbmMsIHUzMl95X2luYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfYWNjdW0sIHUzMl95X2FjY3VtLCB1MzJfeF9hY2N1bV9zdGFydDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoLCB1MzJfaGVpZ2h0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeV9mcmFjOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9mcmFjOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfUnRlbXBfdmFsdWUsdTMyX0d0ZW1wX3ZhbHVlLHUzMl9CdGVtcF92YWx1ZTsKLSAgICBNNFZJRklfVUludDE2ICAgKnB1MTZfc3JjX3RvcDsKLSAgICBNNFZJRklfVUludDE2ICAgKnB1MTZfc3JjX2JvdHRvbTsKLSAgICBNNFZJRklfVUludDMyICAgaTMyX2IwMCwgaTMyX2cwMCwgaTMyX3IwMDsKLSAgICBNNFZJRklfVUludDMyICAgaTMyX2IwMSwgaTMyX2cwMSwgaTMyX3IwMTsKLSAgICBNNFZJRklfVUludDMyICAgaTMyX2IwMiwgaTMyX2cwMiwgaTMyX3IwMjsKLSAgICBNNFZJRklfVUludDMyICAgaTMyX2IwMywgaTMyX2cwMywgaTMyX3IwMzsKLSAgICBNNFZJRklfVUludDggICAgY291bnRfdHJhbnM9MDsKLQotICAgIC8qIENoZWNrIGZvciB0aGUgUkdCIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGV2ZW4gKi8KLSAgICBpZiAoKElTX0VWRU4ocFBsYW5lSW4tPnVfaGVpZ2h0KSA9PSBGQUxTRSkgfHwKLSAgICAgICAgKElTX0VWRU4ocFBsYW5lT3V0LT51X2hlaWdodCkgPT0gRkFMU0UpKSB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9IRUlHSFQ7Ci0gICAgfQotCi0gICAgaWYgKChJU19FVkVOKHBQbGFuZUluLT51X3dpZHRoKSA9PSBGQUxTRSkgfHwKLSAgICAgICAgKElTX0VWRU4ocFBsYW5lT3V0LT51X3dpZHRoKSA9PSBGQUxTRSkpIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotICAgIC8qIFNldCB0aGUgd29ya2luZyBwb2ludGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dC9vdXRwdXQgZGF0YSBmaWVsZCAqLwotICAgIHB1MTZfZGF0YV9pbiAgICA9IChNNFZJRklfVUludDE2KikocFBsYW5lSW4tPnBhY19kYXRhICsgcFBsYW5lSW4tPnVfdG9wbGVmdCk7Ci0gICAgcHUxNl9kYXRhX291dCAgID0gKE00VklGSV9VSW50MTYqKShwUGxhbmVPdXQtPnBhY19kYXRhICsgcFBsYW5lT3V0LT51X3RvcGxlZnQpOwotCi0gICAgLyogR2V0IHRoZSBtZW1vcnkganVtcCBjb3JyZXNwb25kaW5nIHRvIGEgcm93IGp1bXAgKi8KLSAgICB1MzJfc3RyaWRlX2luICAgPSBwUGxhbmVJbi0+dV9zdHJpZGU7Ci0gICAgdTMyX3N0cmlkZV9vdXQgID0gcFBsYW5lT3V0LT51X3N0cmlkZTsKLQotICAgIC8qIFNldCB0aGUgYm91bmRzIG9mIHRoZSBhY3RpdmUgaW1hZ2UgKi8KLSAgICB1MzJfd2lkdGhfaW4gICAgPSBwUGxhbmVJbi0+dV93aWR0aDsKLSAgICB1MzJfaGVpZ2h0X2luICAgPSBwUGxhbmVJbi0+dV9oZWlnaHQ7Ci0KLSAgICB1MzJfd2lkdGhfb3V0ICAgPSBwUGxhbmVPdXQtPnVfd2lkdGg7Ci0gICAgdTMyX2hlaWdodF9vdXQgID0gcFBsYW5lT3V0LT51X2hlaWdodDsKLQotICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGguKi8KLSAgICBpZiAodTMyX3dpZHRoX291dCA+PSB1MzJfd2lkdGhfaW4pIHsKLSAgICAgICAgdTMyX3hfaW5jICAgPSAoKHUzMl93aWR0aF9pbi0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoX291dC0xKTsKLSAgICB9IGVsc2UgewotICAgICAgICB1MzJfeF9pbmMgICA9ICh1MzJfd2lkdGhfaW4gKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aF9vdXQpOwotICAgIH0KLQotICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodC4qLwotICAgIGlmICh1MzJfaGVpZ2h0X291dCA+PSB1MzJfaGVpZ2h0X2luKSB7Ci0gICAgICAgIHUzMl95X2luYyAgID0gKCh1MzJfaGVpZ2h0X2luIC0gMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHRfb3V0LTEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHUzMl95X2luYyA9ICh1MzJfaGVpZ2h0X2luICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0X291dCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICBDYWxjdWxhdGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZSA6IHUzMl95X2FjY3VtX3N0YXJ0LgotICAgIHUzMl95X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAqLwotICAgIGlmICh1MzJfeV9pbmMgPj0gTUFYX1NIT1JUKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAgICBLZWVwIHRoZSBmcmFjdGlvbmFsIHBhcnQsIGludGVnZXIgIHBhcnQgaXMgY29kZWQKLSAgICAgICAgICAgIG9uIHRoZSAxNiBoaWdoIGJpdHMgYW5kIHRoZSBmcmFjdGlvbm5hbCBvbiB0aGUgMTUgbG93IGJpdHMKLSAgICAgICAgKi8KLSAgICAgICAgdTMyX3lfYWNjdW0gPSB1MzJfeV9pbmMgJiAweGZmZmY7Ci0KLSAgICAgICAgaWYgKCF1MzJfeV9hY2N1bSkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSBNQVhfU0hPUlQ7Ci0gICAgICAgIH0KLQotICAgICAgICB1MzJfeV9hY2N1bSA+Pj0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICB1MzJfeV9hY2N1bSA9IDA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeF9hY2N1bV9zdGFydC4KLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICovCi0gICAgaWYgKHUzMl94X2luYyA+PSBNQVhfU0hPUlQpIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSB1MzJfeF9pbmMgJiAweGZmZmY7Ci0KLSAgICAgICAgaWYgKCF1MzJfeF9hY2N1bV9zdGFydCkgewotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSBNQVhfU0hPUlQ7Ci0gICAgICAgIH0KLQotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA+Pj0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IDA7Ci0gICAgfQotCi0gICAgdTMyX2hlaWdodCA9IHUzMl9oZWlnaHRfb3V0OwotCi0gICAgLyoKLSAgICBCaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZyBlYWNoIHJvdywgYW5kIHRoZW4gdXNlcyB0aGF0Ci0gICAgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG9udyBlYWNoIGNvbHVtbi4gRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlCi0gICAgb3V0cHV0IGltYWdlIGlzIGEgd2VpZ2h0ZWQgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3VycyBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGE6Ci0gICAgRihwJyxxJyk9ZihwLHEpUigtYSlSKGIpK2YocCxxLTEpUigtYSlSKGItMSkrZihwKzEscSlSKDEtYSlSKGIpK2YocCsmLHErMSlSKDEtYSlSKGItMSkKLSAgICB3aXRoICBSKHgpID0gLyB4KzEgIC0xID08IHggPTwgMCBcIDEteCAgMCA9PCB4ID08IDEgYW5kIGEgKHJlc3AuIGIpd2VpZ2h0aW5nIGNvZWZmaWNpZW50Ci0gICAgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIG5lYXJlc3QgbmVpZ2hib3IgaW4gdGhlIHAgKHJlc3AuIHEpIGRpcmVjdGlvbgotICAgICovCi0KLSAgICBkbyB7IC8qIFNjYW4gYWxsIHRoZSByb3cgKi8KLQotICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0+PjEyKSYxNTsKLQotICAgICAgICAvKiBSZWluaXQgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgdTMyX3hfYWNjdW0gPSB1MzJfeF9hY2N1bV9zdGFydDsKLQotICAgICAgICB1MzJfd2lkdGggPSB1MzJfd2lkdGhfb3V0OwotCi0gICAgICAgIGRvIHsgLyogU2NhbiBhbG9uZyBlYWNoIHJvdyAqLwotICAgICAgICAgICAgcHUxNl9zcmNfdG9wID0gcHUxNl9kYXRhX2luICsgKHUzMl94X2FjY3VtID4+IDE2KTsKLSAgICAgICAgICAgIHB1MTZfc3JjX2JvdHRvbSA9IHB1MTZfc3JjX3RvcCArICh1MzJfc3RyaWRlX2luPj4xKTsKLSAgICAgICAgICAgIHUzMl94X2ZyYWMgPSAodTMyX3hfYWNjdW0gPj4gMTIpJjE1OyAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgKi8KLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIGlmICgodTMyX2hlaWdodCA9PSAxKSAmJiAodTMyX2hlaWdodF9pbiA9PSB1MzJfaGVpZ2h0X291dCkpIHsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDAsaTMyX2cwMCxpMzJfcjAwLChNNFZJRklfVUludDE2KXB1MTZfc3JjX3RvcFswXSk7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAxLGkzMl9nMDEsaTMyX3IwMSwoTTRWSUZJX1VJbnQxNilwdTE2X3NyY190b3BbMV0pOwotICAgICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMixpMzJfZzAyLGkzMl9yMDIsKE00VklGSV9VSW50MTYpcHUxNl9zcmNfdG9wWzBdKTsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDMsaTMyX2cwMyxpMzJfcjAzLChNNFZJRklfVUludDE2KXB1MTZfc3JjX3RvcFsxXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMCxpMzJfZzAwLGkzMl9yMDAsKE00VklGSV9VSW50MTYpcHUxNl9zcmNfdG9wWzBdKTsKLSAgICAgICAgICAgICAgICBHRVRfUkdCNTY1KGkzMl9iMDEsaTMyX2cwMSxpMzJfcjAxLChNNFZJRklfVUludDE2KXB1MTZfc3JjX3RvcFsxXSk7Ci0gICAgICAgICAgICAgICAgR0VUX1JHQjU2NShpMzJfYjAyLGkzMl9nMDIsaTMyX3IwMiwoTTRWSUZJX1VJbnQxNilwdTE2X3NyY19ib3R0b21bMF0pOwotICAgICAgICAgICAgICAgIEdFVF9SR0I1NjUoaTMyX2IwMyxpMzJfZzAzLGkzMl9yMDMsKE00VklGSV9VSW50MTYpcHUxNl9zcmNfYm90dG9tWzFdKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBTb2x1dGlvbiB0byBhdm9pZCBncmVlbiBlZmZlY3RzIGR1ZSB0byB0cmFuc3BhcmVuY3kgKi8KLSAgICAgICAgICAgIGNvdW50X3RyYW5zID0gMDsKLQotICAgICAgICAgICAgLyogSWYgUkdCIGlzIHRyYW5zcGFyZW50IGNvbG9yICgwLCA2MywgMCksIHdlIHRyYW5zZm9ybSBpdCB0byB3aGl0ZSAoMzEsNjMsMzEpICovCi0gICAgICAgICAgICBpZiAoaTMyX2IwMCA9PSAwICYmIGkzMl9nMDAgPT0gNjMgJiYgaTMyX3IwMCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDAgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAwID0gMzE7Ci0gICAgICAgICAgICAgICAgY291bnRfdHJhbnMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpMzJfYjAxID09IDAgJiYgaTMyX2cwMSA9PSA2MyAmJiBpMzJfcjAxID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaTMyX2IwMSA9IDMxOwotICAgICAgICAgICAgICAgIGkzMl9yMDEgPSAzMTsKLSAgICAgICAgICAgICAgICBjb3VudF90cmFucysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkzMl9iMDIgPT0gMCAmJiBpMzJfZzAyID09IDYzICYmIGkzMl9yMDIgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpMzJfYjAyID0gMzE7Ci0gICAgICAgICAgICAgICAgaTMyX3IwMiA9IDMxOwotICAgICAgICAgICAgICAgIGNvdW50X3RyYW5zKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaTMyX2IwMyA9PSAwICYmIGkzMl9nMDMgPT0gNjMgJiYgaTMyX3IwMyA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkzMl9iMDMgPSAzMTsKLSAgICAgICAgICAgICAgICBpMzJfcjAzID0gMzE7Ci0gICAgICAgICAgICAgICAgY291bnRfdHJhbnMrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvdW50X3RyYW5zID4gMikgewotICAgICAgICAgICAgICAgIC8qIHBpeGVsIGlzIHRyYW5zcGFyZW50ICovCi0gICAgICAgICAgICAgICAgdTMyX1J0ZW1wX3ZhbHVlID0gMDsKLSAgICAgICAgICAgICAgICB1MzJfR3RlbXBfdmFsdWUgPSA2MzsKLSAgICAgICAgICAgICAgICB1MzJfQnRlbXBfdmFsdWUgPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1MzJfUnRlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKGkzMl9yMDAqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9yMDEqdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMl9yMDIqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9yMDMqdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgIHUzMl9HdGVtcF92YWx1ZSA9IChNNFZJRklfVUludDgpKCgoaTMyX2cwMCooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX2cwMSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyX2cwMiooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX2cwMyp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotCi0gICAgICAgICAgICAgICAgdTMyX0J0ZW1wX3ZhbHVlID0gIChNNFZJRklfVUludDgpKCgoaTMyX2IwMCooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX2IwMSp1MzJfeF9mcmFjKSooMTYtdTMyX3lfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyX2IwMiooMTYtdTMyX3hfZnJhYykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX2IwMyp1MzJfeF9mcmFjKSp1MzJfeV9mcmFjICk+PjgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqcHUxNl9kYXRhX291dCsrID0gKE00VklGSV9VSW50MTYpKCAoKCh1MzJfR3RlbXBfdmFsdWUgJiAweDM4KSA+PiAzKSB8ICh1MzJfQnRlbXBfdmFsdWUgPDwgMykpIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCgodTMyX0d0ZW1wX3ZhbHVlICYgMHg3KSA8PCA1ICkgfCB1MzJfUnRlbXBfdmFsdWUpPDw4ICkpOwotCi0gICAgICAgICAgICAvKiBVcGRhdGUgaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwotICAgICAgICAgICAgdTMyX3hfYWNjdW0gKz0gdTMyX3hfaW5jOwotCi0gICAgICAgIH0gd2hpbGUoLS11MzJfd2lkdGgpOwotCi0KLSAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgIHUzMl95X2FjY3VtICs9IHUzMl95X2luYzsKLSAgICAgICAgaWYgKHUzMl95X2FjY3VtPj4xNikgewotICAgICAgICAgICAgcHUxNl9kYXRhX2luID0gcHUxNl9kYXRhX2luICsgKHUzMl95X2FjY3VtID4+IDE2KSAqICh1MzJfc3RyaWRlX2luPj4xKTsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtICY9IDB4ZmZmZjsKLSAgICAgICAgfQotCi0gICAgfSB3aGlsZSgtLXUzMl9oZWlnaHQpOwotCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVSR0I4ODh0b1JHQjg4OC5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVSR0I4ODh0b1JHQjg4OC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZWI5ZDQ0Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplUkdCODg4dG9SR0I4ODguYworKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9SZXNpemVZVVY0MjB0b1lVVjQyMC5jCi0gKiBAYnJpZWYgICAgQ29udGFpbiB2aWRlbyBsaWJyYXJ5IGZ1bmN0aW9uCi0gKiBAbm90ZSAgICAgVGhpcyBmaWxlIGhhcyBhIFJlc2l6ZSBmaWx0ZXIgZnVuY3Rpb24KLSAqICAgICAgICAgICAtIyBHZW5lcmljIHJlc2l6aW5nIG9mIFlVVjQyMCAoUGxhbmFyKSBpbWFnZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLQotLyogUHJvdG90eXBlcyBvZiBmdW5jdGlvbnMsIGFuZCB0eXBlIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0ZpbHRlcnNBUEkuaCIKLS8qIE1hY3JvIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAgICAiTTRWSUZJX0RlZmluZXMuaCIKLS8qIENsaXAgdGFibGUgZGVjbGFyYXRpb24gKi8KLSNpbmNsdWRlICAgICJNNFZJRklfQ2xpcC5oIgotCi0vKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhclJHQjg4OHRvUkdCODg4KHZvaWQgKnBVc2VyRGF0YSwgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotICogQGJyaWVmICAgUmVzaXplcyBZVVY0MjAgUGxhbmFyIHBsYW5lLgotICogQG5vdGUgICAgQmFzaWMgc3RydWN0dXJlIG9mIHRoZSBmdW5jdGlvbgotICogICAgICAgICAgTG9vcCBvbiBlYWNoIHJvdyAoc3RlcCAyKQotICogICAgICAgICAgICAgIExvb3Agb24gZWFjaCBjb2x1bW4gKHN0ZXAgMikKLSAqICAgICAgICAgICAgICAgICAgR2V0IGZvdXIgWSBzYW1wbGVzIGFuZCAxIFUgJiBWIHNhbXBsZQotICogICAgICAgICAgICAgICAgICBSZXNpemUgdGhlIFkgd2l0aCBjb3JyZXNwb25pbmcgVSBhbmQgViBzYW1wbGVzCi0gKiAgICAgICAgICAgICAgICAgIFBsYWNlIHRoZSBZVVYgaW4gdGhlIG91cHV0IHBsYW5lCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3AgY29sdW1uCi0gKiAgICAgICAgICBlbmQgbG9vcCByb3cKLSAqICAgICAgICAgIEZvciByZXNpemluZyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZwotICogICAgICAgICAgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdCByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb3duIGVhY2ggY29sdW1uLgotICogICAgICAgICAgRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkCi0gKiAgICAgICAgICBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzLiBUaGUgcmF0aW8gb2YgY29tcHJlc3Npb24KLSAqICAgICAgICAgIG9yIGRpbGF0YXRpb24gaXMgZXN0aW1hdGVkIHVzaW5nIGlucHV0IGFuZCBvdXRwdXQgc2l6ZXMuCi0gKiBAcGFyYW0gICBwVXNlckRhdGE6IChJTikgVXNlciBEYXRhCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFlVVjQyMCAoUGxhbmFyKSBwbGFuZSBidWZmZXIKLSAqIEBwYXJhbSAgIHBQbGFuZU91dDogKE9VVCkgUG9pbnRlciB0byBZVVY0MjAgKFBsYW5hcikgcGxhbmUKLSAqIEByZXR1cm4gIE00VklGSV9PSzogdGhlcmUgaXMgbm8gZXJyb3IKLSAqIEByZXR1cm4gIE00VklGSV9JTExFR0FMX0ZSQU1FX0hFSUdIVDogRXJyb3IgaW4gaGVpZ2h0Ci0gKiBAcmV0dXJuICBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDogIEVycm9yIGluIHdpZHRoCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyUkdCODg4dG9SR0I4ODgodm9pZCAqcFVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lT3V0KQotewotICAgIE00VklGSV9VSW50OCAgICAqcHU4X2RhdGFfaW47Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfZGF0YV9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl93aWR0aF9pbiwgdTMyX3dpZHRoX291dCwgdTMyX2hlaWdodF9pbiwgdTMyX2hlaWdodF9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfaW4sIHUzMl9zdHJpZGVfb3V0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9pbmMsIHUzMl95X2luYzsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfYWNjdW0sIHUzMl95X2FjY3VtLCB1MzJfeF9hY2N1bV9zdGFydDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoLCB1MzJfaGVpZ2h0OwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeV9mcmFjOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9mcmFjOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfUnRlbXBfdmFsdWUsdTMyX0d0ZW1wX3ZhbHVlLHUzMl9CdGVtcF92YWx1ZTsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9zcmNfdG9wOwotICAgIE00VklGSV9VSW50OCAgICAqcHU4X3NyY19ib3R0b207Ci0gICAgTTRWSUZJX1VJbnQzMiAgICBpMzJfYjAwLCBpMzJfZzAwLCBpMzJfcjAwOwotICAgIE00VklGSV9VSW50MzIgICAgaTMyX2IwMSwgaTMyX2cwMSwgaTMyX3IwMTsKLSAgICBNNFZJRklfVUludDMyICAgIGkzMl9iMDIsIGkzMl9nMDIsIGkzMl9yMDI7Ci0gICAgTTRWSUZJX1VJbnQzMiAgICBpMzJfYjAzLCBpMzJfZzAzLCBpMzJfcjAzOwotCi0gICAgLyogQ2hlY2sgZm9yIHRoZSBZVVYgd2lkdGggYW5kIGhlaWdodCBhcmUgZXZlbiAqLwotICAgIGlmICgoSVNfRVZFTihwUGxhbmVJbi0+dV9oZWlnaHQpID09IEZBTFNFKSAgICB8fAotICAgICAgICAoSVNfRVZFTihwUGxhbmVPdXQtPnVfaGVpZ2h0KSA9PSBGQUxTRSkpCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLQotICAgIGlmICgoSVNfRVZFTihwUGxhbmVJbi0+dV93aWR0aCkgPT0gRkFMU0UpIHx8Ci0gICAgICAgIChJU19FVkVOKHBQbGFuZU91dC0+dV93aWR0aCkgPT0gRkFMU0UpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE00VklGSV9JTExFR0FMX0ZSQU1FX1dJRFRIOwotICAgIH0KLQotCi0gICAgICAgIC8qIFNldCB0aGUgd29ya2luZyBwb2ludGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dC9vdXRwdXQgZGF0YSBmaWVsZCAqLwotICAgICAgICBwdThfZGF0YV9pbiAgICAgPSAoTTRWSUZJX1VJbnQ4KikocFBsYW5lSW4tPnBhY19kYXRhICsgcFBsYW5lSW4tPnVfdG9wbGVmdCk7Ci0gICAgICAgIHB1OF9kYXRhX291dCAgICA9IChNNFZJRklfVUludDgqKShwUGxhbmVPdXQtPnBhY19kYXRhICsgcFBsYW5lT3V0LT51X3RvcGxlZnQpOwotCi0gICAgICAgIC8qIEdldCB0aGUgbWVtb3J5IGp1bXAgY29ycmVzcG9uZGluZyB0byBhIHJvdyBqdW1wICovCi0gICAgICAgIHUzMl9zdHJpZGVfaW4gICA9IHBQbGFuZUluLT51X3N0cmlkZTsKLSAgICAgICAgdTMyX3N0cmlkZV9vdXQgID0gcFBsYW5lT3V0LT51X3N0cmlkZTsKLQotICAgICAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgICAgIHUzMl93aWR0aF9pbiAgICA9IHBQbGFuZUluLT51X3dpZHRoOwotICAgICAgICB1MzJfaGVpZ2h0X2luICAgPSBwUGxhbmVJbi0+dV9oZWlnaHQ7Ci0KLSAgICAgICAgdTMyX3dpZHRoX291dCAgID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgICAgICB1MzJfaGVpZ2h0X291dCAgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0OwotCi0gICAgICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGguKi8KLSAgICAgICAgaWYgKHUzMl93aWR0aF9vdXQgPj0gdTMyX3dpZHRoX2luKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9pbmMgICA9ICgodTMyX3dpZHRoX2luLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0LTEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfaW5jICAgPSAodTMyX3dpZHRoX2luICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgdmVydGljYWwgcmF0aW8gYmV0d2VlbiBzcmMgYW5kIGRlc3RpbmF0aW9uIGhlaWdodC4qLwotICAgICAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbikKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfaW5jICAgPSAoKHUzMl9oZWlnaHRfaW4gLSAxKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQtMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9pbmMgPSAodTMyX2hlaWdodF9pbiAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodF9vdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeV9hY2N1bV9zdGFydC4KLSAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICAgICAqLwotICAgICAgICBpZiAodTMyX3lfaW5jID49IE1BWF9TSE9SVCkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBLZWVwIHRoZSBmcmFjdGlvbm5hbCBwYXJ0LCBhc3NpbXVuZyB0aGF0IGludGVnZXIgIHBhcnQgaXMgY29kZWQKLSAgICAgICAgICAgICAgICBvbiB0aGUgMTYgaGlnaCBiaXRzIGFuZCB0aGUgZnJhY3Rpb25uYWwgb24gdGhlIDE1IGxvdyBiaXRzCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSB1MzJfeV9pbmMgJiAweGZmZmY7Ci0KLSAgICAgICAgICAgIGlmICghdTMyX3lfYWNjdW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSBNQVhfU0hPUlQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHUzMl95X2FjY3VtID4+PSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3lfYWNjdW0gPSAwOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKgotICAgICAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeF9hY2N1bV9zdGFydC4KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHUzMl94X2luYyA+PSBNQVhfU0hPUlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gdTMyX3hfaW5jICYgMHhmZmZmOwotCi0gICAgICAgICAgICBpZiAoIXUzMl94X2FjY3VtX3N0YXJ0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA+Pj0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHUzMl9oZWlnaHQgPSB1MzJfaGVpZ2h0X291dDsKLQotICAgICAgICAvKgotICAgICAgICBCaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZyBlYWNoIHJvdywgYW5kIHRoZW4gdXNlcyB0aGF0Ci0gICAgICAgIHJlc3VsdCBpbiBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGRvbncgZWFjaCBjb2x1bW4uIEVhY2ggZXN0aW1hdGVkIHBpeGVsIGluIHRoZQotICAgICAgICBvdXRwdXQgaW1hZ2UgaXMgYSB3ZWlnaHRlZCBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzIGFjY29yZGluZyB0byB0aGUgZm9ybXVsYToKLSAgICAgICAgRihwJyxxJyk9ZihwLHEpUigtYSlSKGIpK2YocCxxLTEpUigtYSlSKGItMSkrZihwKzEscSlSKDEtYSlSKGIpK2YocCsmLHErMSlSKDEtYSlSKGItMSkKLSAgICAgICAgd2l0aCAgUih4KSA9IC8geCsxICAtMSA9PCB4ID08IDAgXCAxLXggIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKXdlaWdodGluZyBjb2VmZmljaWVudAotICAgICAgICBpcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgbmVhcmVzdCBuZWlnaGJvciBpbiB0aGUgcCAocmVzcC4gcSkgZGlyZWN0aW9uCi0gICAgICAgICovCi0KLSAgICAgICAgZG8geyAvKiBTY2FuIGFsbCB0aGUgcm93ICovCi0KLSAgICAgICAgICAgIC8qIFZlcnRpY2FsIHdlaWdodCBmYWN0b3IgKi8KLSAgICAgICAgICAgIHUzMl95X2ZyYWMgPSAodTMyX3lfYWNjdW0+PjEyKSYxNTsKLQotICAgICAgICAgICAgLyogUmVpbml0IGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICB1MzJfeF9hY2N1bSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotCi0gICAgICAgICAgICB1MzJfd2lkdGggPSB1MzJfd2lkdGhfb3V0OwotCi0gICAgICAgICAgICBkbyB7IC8qIFNjYW4gYWxvbmcgZWFjaCByb3cgKi8KLSAgICAgICAgICAgICAgICBwdThfc3JjX3RvcCA9IHB1OF9kYXRhX2luICsgKHUzMl94X2FjY3VtID4+IDE2KSozOwotICAgICAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tID0gcHU4X3NyY190b3AgKyAodTMyX3N0cmlkZV9pbik7Ci0gICAgICAgICAgICAgICAgdTMyX3hfZnJhYyA9ICh1MzJfeF9hY2N1bSA+PiAxMikmMTU7IC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciAqLwotCi0gICAgICAgICAgICAgICAgaWYgKCh1MzJfd2lkdGggPT0gMSkgJiYgKHUzMl93aWR0aF9pbiA9PSB1MzJfd2lkdGhfb3V0KSkgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICBXaGVuIGlucHV0IGhlaWdodCBpcyBlcXVhbCB0byBvdXRwdXQgaGVpZ2h0IGFuZCBpbnB1dCB3aWR0aAotICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBvdXRwdXQgd2lkdGgsIHJlcGxpY2F0ZSB0aGUgY29ybmVyIHBpeGVscyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbgotICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoKHUzMl9oZWlnaHQgPT0gMSkgJiYgKHUzMl9oZWlnaHRfaW4gPT0gdTMyX2hlaWdodF9vdXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMCxpMzJfZzAwLGkzMl9yMDAscHU4X3NyY190b3AsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEscHU4X3NyY190b3AsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMixpMzJfZzAyLGkzMl9yMDIscHU4X3NyY190b3AsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMyxpMzJfZzAzLGkzMl9yMDMscHU4X3NyY190b3AsMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBpbnB1dCBoZWlnaHQgaXMgbm90IGVxdWFsIHRvIG91dHB1dCBoZWlnaHQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIGlucHV0IHdpZHRoIGVxdWFsIHRvIG91dHB1dCB3aWR0aCwgcmVwbGljYXRlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMCxpMzJfZzAwLGkzMl9yMDAscHU4X3NyY190b3AsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEscHU4X3NyY190b3AsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMixpMzJfZzAyLGkzMl9yMDIscHU4X3NyY19ib3R0b20sMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMyxpMzJfZzAzLGkzMl9yMDMscHU4X3NyY19ib3R0b20sMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICBXaGVuIGlucHV0IGhlaWdodCBpcyBlcXVhbCB0byBvdXRwdXQgaGVpZ2h0IGFuZAotICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCB3aWR0aCBub3QgZXF1YWwgdG8gb3V0cHV0IHdpZHRoLCByZXBsaWNhdGUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIHJvdyBmb3IgaW50ZXJwb2xhdGlvbgotICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoKHUzMl9oZWlnaHQgPT0gMSkgJiYgKHUzMl9oZWlnaHRfaW4gPT0gdTMyX2hlaWdodF9vdXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMCxpMzJfZzAwLGkzMl9yMDAscHU4X3NyY190b3AsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEscHU4X3NyY190b3AsMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMixpMzJfZzAyLGkzMl9yMDIscHU4X3NyY190b3AsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMyxpMzJfZzAzLGkzMl9yMDMscHU4X3NyY190b3AsMyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMCxpMzJfZzAwLGkzMl9yMDAscHU4X3NyY190b3AsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMSxpMzJfZzAxLGkzMl9yMDEscHU4X3NyY190b3AsMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMixpMzJfZzAyLGkzMl9yMDIscHU4X3NyY19ib3R0b20sMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHRVRfUkdCMjQoaTMyX2IwMyxpMzJfZzAzLGkzMl9yMDMscHU4X3NyY19ib3R0b20sMyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdTMyX1J0ZW1wX3ZhbHVlID0gKE00VklGSV9VSW50OCkoKChpMzJfcjAwKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfcjAxKnUzMl94X2ZyYWMpKigxNi11MzJfeV9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpMzJfcjAyKigxNi11MzJfeF9mcmFjKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfcjAzKnUzMl94X2ZyYWMpKnUzMl95X2ZyYWMgKT4+OCk7Ci0KLSAgICAgICAgICAgICAgICB1MzJfR3RlbXBfdmFsdWUgPSAoTTRWSUZJX1VJbnQ4KSgoKGkzMl9nMDAqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9nMDEqdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMl9nMDIqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9nMDMqdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgIHUzMl9CdGVtcF92YWx1ZSA9ICAoTTRWSUZJX1VJbnQ4KSgoKGkzMl9iMDAqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9iMDEqdTMyX3hfZnJhYykqKDE2LXUzMl95X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkzMl9iMDIqKDE2LXUzMl94X2ZyYWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl9iMDMqdTMyX3hfZnJhYykqdTMyX3lfZnJhYyApPj44KTsKLQotICAgICAgICAgICAgICAgICpwdThfZGF0YV9vdXQrKyA9IHUzMl9CdGVtcF92YWx1ZSA7Ci0gICAgICAgICAgICAgICAgKnB1OF9kYXRhX291dCsrID0gdTMyX0d0ZW1wX3ZhbHVlIDsKLSAgICAgICAgICAgICAgICAqcHU4X2RhdGFfb3V0KysgPSB1MzJfUnRlbXBfdmFsdWUgOwotCi0gICAgICAgICAgICAgICAgLyogVXBkYXRlIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KLSAgICAgICAgICAgICAgICB1MzJfeF9hY2N1bSArPSB1MzJfeF9pbmM7Ci0KLSAgICAgICAgICAgIH0gd2hpbGUoLS11MzJfd2lkdGgpOwotCi0gICAgICAgICAgICAvL3B1MTZfZGF0YV9vdXQgPSBwdTE2X2RhdGFfb3V0ICsgKHUzMl9zdHJpZGVfb3V0Pj4xKSAtICh1MzJfd2lkdGhfb3V0KTsKLQotICAgICAgICAgICAgLyogVXBkYXRlIHZlcnRpY2FsIGFjY3VtdWxhdG9yICovCi0gICAgICAgICAgICB1MzJfeV9hY2N1bSArPSB1MzJfeV9pbmM7Ci0gICAgICAgICAgICBpZiAodTMyX3lfYWNjdW0+PjE2KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1OF9kYXRhX2luID0gcHU4X2RhdGFfaW4gKyAodTMyX3lfYWNjdW0gPj4gMTYpICogKHUzMl9zdHJpZGVfaW4pIDsKLSAgICAgICAgICAgICAgICB1MzJfeV9hY2N1bSAmPSAweGZmZmY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUoLS11MzJfaGVpZ2h0KTsKLQotICAgIHJldHVybiBNNFZJRklfT0s7Ci19Ci0vKiBFbmQgb2YgZmlsZSBNNFZJRklfUmVzaXplUkdCNTY1dG9SR0I1NjUuYyAqLwotCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVlVVnRvQkdSNTY1LmMgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTTRWSUZJX1Jlc2l6ZVlVVnRvQkdSNTY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwNDJlODAuLjAwMDAwMDAKLS0tIGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVZVVZ0b0JHUjU2NS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBAZmlsZSAgICAgTTRWSUZJX1Jlc2l6ZVlVVjQyMHRvQkdSNTY1LmMKLSAqIEBicmllZiAgICBDb250YWluIHZpZGVvIGxpYnJhcnkgZnVuY3Rpb24KLSAqIEBub3RlICAgICBUaGlzIGZpbGUgaGFzIGEgQ29tYm8gZmlsdGVyIGZ1bmN0aW9uCi0gKiAgICAgICAgICAgLSMgUmVzaXplcyBZVVY0MjAgYW5kIGNvbnZlcnRzIHRvIFJHUjU2NSB3aXRoIHJvdGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9ucywgYW5kIHR5cGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRmlsdGVyc0FQSS5oIgotLyogTWFjcm8gZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRGVmaW5lcy5oIgotLyogQ2xpcCB0YWJsZSBkZWNsYXJhdGlvbiAqLwotI2luY2x1ZGUgICAgIk00VklGSV9DbGlwLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTTRWSUZJX1VJbnQ4IE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1KHZvaWQgKnBDb250ZXh0LCBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICBSZXNpemUgWVVWNDIwIHBsYW5lIGFuZCBjb252ZXJ0cyB0byBCR1I1NjUgd2l0aCArOTAgcm90YXRpb24uCi0gKiBAbm90ZSAgICBCYXNpYyBzdHVydHVyZSBvZiB0aGUgZnVuY3Rpb24KLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKHN0ZXAgMikKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uIChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgICAgIEdldCBmb3VyIFkgc2FtcGxlcyBhbmQgMSB1ICYgViBzYW1wbGUKLSAqICAgICAgICAgICAgICAgICAgUmVzaXplIHRoZSBZIHdpdGggY29ycmVzcG9uaW5nIFUgYW5kIFYgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBDb21wdXRlIHRoZSBmb3VyIGNvcnJlc3BvbmRpbmcgUiBHIEIgdmFsdWVzCi0gKiAgICAgICAgICAgICAgICAgIFBsYWNlIHRoZSBSIEcgQiBpbiB0aGUgb3VwdXQgcGxhbmUgaW4gcm90YXRlZCBmYXNoaW9uCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3AgY29sdW1uCi0gKiAgICAgICAgICBlbmQgbG9vcCByb3cKLSAqICAgICAgICAgIEZvciByZXNpemluZyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZwotICogICAgICAgICAgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdCByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb3duIGVhY2ggY29sdW1uLgotICogICAgICAgICAgRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkCi0gKiAgICAgICAgICBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzLiBUaGUgcmF0aW8gb2YgY29tcHJlc3Npb24KLSAqICAgICAgICAgIG9yIGRpbGF0YXRpb24gaXMgZXN0aW1hdGVkIHVzaW5nIGlucHV0IGFuZCBvdXRwdXQgc2l6ZXMuCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFlVViBwbGFuZSBidWZmZXIKLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAoSU4pIENvbnRleHQgUG9pbnRlcgotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvIEJHUjU2NSBQbGFuZQotICogQHJldHVybiAgTTRWSUZJX09LOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBZVVYgUGxhbmUgaGVpZ2h0IGlzIE9ERAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBZVVYgUGxhbmUgd2lkdGggaXMgT0RECi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotTTRWSUZJX1VJbnQ4ICAgIE00VklGSV9SZXNpemVCaWxpbmVhcllVVjQyMHRvQkdSNTY1KHZvaWQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZJRklfSW1hZ2VQbGFuZSAqcFBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi17Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfZGF0YV9pbltQTEFORVNdLCAqcHU4X2RhdGFfaW4xW1BMQU5FU10sKnB1OF9kYXRhX291dDsKLSAgICBNNFZJRklfVUludDMyICAgKnB1MzJfcmdiX2RhdGFfY3VycmVudCwgKnB1MzJfcmdiX2RhdGFfbmV4dCwgKnB1MzJfcmdiX2RhdGFfc3RhcnQ7Ci0KLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoX2luW1BMQU5FU10sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW5bUExBTkVTXSwgdTMyX2hlaWdodF9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfaW5bUExBTkVTXTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9vdXQsIHUzMl9zdHJpZGUyX291dCwgdTMyX3dpZHRoMl9SR0IsIHUzMl9oZWlnaHQyX1JHQjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfaW5jW1BMQU5FU10sIHUzMl95X2luY1tQTEFORVNdOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9hY2N1bV9ZLCB1MzJfeF9hY2N1bV9VLCB1MzJfeF9hY2N1bV9zdGFydDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3lfYWNjdW1fWSwgdTMyX3lfYWNjdW1fVTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfZnJhY19ZLCB1MzJfeF9mcmFjX1UsIHUzMl95X2ZyYWNfWSx1MzJfeV9mcmFjX1U7Ci0gICAgTTRWSUZJX0ludDMyICAgIFVfMzIsIFZfMzIsIFlfMzIsIFl2YWxfMzI7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgIHU4X1JlZCwgdThfR3JlZW4sIHU4X0JsdWU7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9yb3csIHUzMl9jb2w7Ci0KLSAgICBNNFZJRklfVUludDMyICAgdTMyX3BsYW5lOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfcmdiX3RlbXAxLCB1MzJfcmdiX3RlbXAyOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfcmdiX3RlbXAzLHUzMl9yZ2JfdGVtcDQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jaGVja19zaXplOwotCi0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX3RvcF9ZLCpwdThfc3JjX3RvcF9VLCpwdThfc3JjX3RvcF9WIDsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9zcmNfYm90dG9tX1ksICpwdThfc3JjX2JvdHRvbV9VLCAqcHU4X3NyY19ib3R0b21fVjsKLQotICAgIC8qIENoZWNrIGZvciB0aGUgWVVWIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGV2ZW4gKi8KLSAgICB1MzJfY2hlY2tfc2l6ZSA9IElTX0VWRU4ocFBsYW5lSW5bMF0udV9oZWlnaHQpOwotICAgIGlmKCB1MzJfY2hlY2tfc2l6ZSA9PSBGQUxTRSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLSAgICB1MzJfY2hlY2tfc2l6ZSA9IElTX0VWRU4ocFBsYW5lSW5bMF0udV93aWR0aCk7Ci0gICAgaWYgKHUzMl9jaGVja19zaXplID09IEZBTFNFICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLQotICAgIH0KLSAgICAvKiBNYWtlIHRoZSBvdXB1dCB3aWR0aCBhbmQgaGVpZ2h0IGFzIGV2ZW4gKi8KLSAgICBwUGxhbmVPdXQtPnVfaGVpZ2h0ID0gcFBsYW5lT3V0LT51X2hlaWdodCAmIDB4RkZGRkZGRkU7Ci0gICAgcFBsYW5lT3V0LT51X3dpZHRoID0gcFBsYW5lT3V0LT51X3dpZHRoICYgMHhGRkZGRkZGRTsKLSAgICBwUGxhbmVPdXQtPnVfc3RyaWRlID0gcFBsYW5lT3V0LT51X3N0cmlkZSAmIDB4RkZGRkZGRkM7Ci0KLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCBwb2ludGVyICovCi0gICAgcHU4X2RhdGFfb3V0ICAgID0gcFBsYW5lT3V0LT5wYWNfZGF0YSArIHBQbGFuZU91dC0+dV90b3BsZWZ0OwotICAgIC8qIEFzc2lnbm1lbnQgb2Ygb3V0cHV0IHdpZHRoKHJvdGF0ZWQpICovCi0gICAgdTMyX3dpZHRoX291dCAgID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgIC8qIEFzc2lnbm1lbnQgb2Ygb3V0cHV0IGhlaWdodChyb3RhdGVkKSAqLwotICAgIHUzMl9oZWlnaHRfb3V0ICA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0KLSAgICB1MzJfd2lkdGgyX1JHQiAgPSBwUGxhbmVPdXQtPnVfd2lkdGggPj4gMTsKLSAgICB1MzJfaGVpZ2h0Ml9SR0IgPSBwUGxhbmVPdXQtPnVfaGVpZ2h0ID4+IDE7Ci0KLSAgICB1MzJfc3RyaWRlX291dCA9IHBQbGFuZU91dC0+dV9zdHJpZGUgPj4gMTsKLSAgICB1MzJfc3RyaWRlMl9vdXQgPSBwUGxhbmVPdXQtPnVfc3RyaWRlID4+IDI7Ci0KLSAgICBmb3IodTMyX3BsYW5lID0gMDsgdTMyX3BsYW5lIDwgUExBTkVTOyB1MzJfcGxhbmUrKykKLSAgICB7Ci0gICAgICAgIC8qIFNldCB0aGUgd29ya2luZyBwb2ludGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dC9vdXRwdXQgZGF0YSBmaWVsZCAqLwotICAgICAgICBwdThfZGF0YV9pblt1MzJfcGxhbmVdID0gcFBsYW5lSW5bdTMyX3BsYW5lXS5wYWNfZGF0YSArIHBQbGFuZUluW3UzMl9wbGFuZV0udV90b3BsZWZ0OwotCi0gICAgICAgIC8qIEdldCB0aGUgbWVtb3J5IGp1bXAgY29ycmVzcG9uZGluZyB0byBhIHJvdyBqdW1wICovCi0gICAgICAgIHUzMl9zdHJpZGVfaW5bdTMyX3BsYW5lXSA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV9zdHJpZGU7Ci0KLSAgICAgICAgLyogU2V0IHRoZSBib3VuZHMgb2YgdGhlIGFjdGl2ZSBpbWFnZSAqLwotICAgICAgICB1MzJfd2lkdGhfaW5bdTMyX3BsYW5lXSA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV93aWR0aDsKLSAgICAgICAgdTMyX2hlaWdodF9pblt1MzJfcGxhbmVdID0gcFBsYW5lSW5bdTMyX3BsYW5lXS51X2hlaWdodDsKLSAgICB9Ci0gICAgLyogQ29tcHV0ZSBob3Jpem9udGFsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiB3aWR0aCBmb3IgWSBQbGFuZS4gKi8KLSAgICBpZiAodTMyX3dpZHRoX291dCA+PSB1MzJfd2lkdGhfaW5bWVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl94X2luY1tZUGxhbmVdICAgPSAoKHUzMl93aWR0aF9pbltZUGxhbmVdLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0LTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbWVBsYW5lXSAgID0gKHUzMl93aWR0aF9pbltZUGxhbmVdICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQgZm9yIFkgUGxhbmUuKi8KLSAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbltZUGxhbmVdKQotICAgIHsKLSAgICAgICAgdTMyX3lfaW5jW1lQbGFuZV0gICA9ICgodTMyX2hlaWdodF9pbltZUGxhbmVdLTEpICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0X291dC0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3lfaW5jW1lQbGFuZV0gPSAodTMyX2hlaWdodF9pbltZUGxhbmVdICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0X291dCk7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSBob3Jpem9udGFsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiB3aWR0aCBmb3IgVSBhbmQgViBQbGFuZXMuICovCi0gICAgaWYgKHUzMl93aWR0aDJfUkdCID49IHUzMl93aWR0aF9pbltVUGxhbmVdKQotICAgIHsKLSAgICAgICAgdTMyX3hfaW5jW1VQbGFuZV0gICA9ICgodTMyX3dpZHRoX2luW1VQbGFuZV0tMSkgKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aDJfUkdCLTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbVVBsYW5lXSAgID0gKHUzMl93aWR0aF9pbltVUGxhbmVdICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGgyX1JHQik7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSB2ZXJ0aWNhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gaGVpZ2h0IGZvciBVIGFuZCBWIFBsYW5lcy4gKi8KLQotICAgIGlmICh1MzJfaGVpZ2h0Ml9SR0IgPj0gdTMyX2hlaWdodF9pbltVUGxhbmVdKQotICAgIHsKLSAgICAgICAgdTMyX3lfaW5jW1VQbGFuZV0gICA9ICgodTMyX2hlaWdodF9pbltVUGxhbmVdLTEpICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0Ml9SR0ItMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tVUGxhbmVdICA9ICh1MzJfaGVpZ2h0X2luW1VQbGFuZV0gKiBNQVhfU0hPUlQpIC8gKHUzMl9oZWlnaHQyX1JHQik7Ci0gICAgfQotCi0gICAgdTMyX3lfaW5jW1ZQbGFuZV0gPSB1MzJfeV9pbmNbVVBsYW5lXTsKLSAgICB1MzJfeF9pbmNbVlBsYW5lXSA9IHUzMl94X2luY1tVUGxhbmVdOwotCi0gICAgLyoKLSAgICAgICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeV9hY2N1bV9zdGFydC4KLSAgICAgICAgdTMyX3lfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cyxhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgKi8KLSAgICBpZiAodTMyX3lfaW5jW1lQbGFuZV0gPiBNQVhfU0hPUlQpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgICAgS2VlcCB0aGUgZnJhY3Rpb25uYWwgcGFydCwgYXNzaW11bmcgdGhhdCBpbnRlZ2VyICBwYXJ0IGlzIGNvZGVkIG9uIHRoZSAxNiBoaWdoIGJpdHMsCi0gICAgICAgICAgICBhbmQgdGhlIGZyYWN0aW9ubmFsIG9uIHRoZSAxNSBsb3cgYml0cwotICAgICAgICAqLwotICAgICAgICB1MzJfeV9hY2N1bV9ZID0gdTMyX3lfaW5jW1lQbGFuZV0gJiAweGZmZmY7Ci0gICAgICAgIHUzMl95X2FjY3VtX1UgPSB1MzJfeV9pbmNbVVBsYW5lXSAmIDB4ZmZmZjsKLQotICAgICAgICBpZiAoIXUzMl95X2FjY3VtX1kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHUzMl95X2FjY3VtX1kgPSBNQVhfU0hPUlQ7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bV9VID0gTUFYX1NIT1JUOwotICAgICAgICB9Ci0gICAgICAgIHUzMl95X2FjY3VtX1kgPj49IDE7Ci0gICAgICAgIHUzMl95X2FjY3VtX1UgPj49IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl95X2FjY3VtX1kgPSAwOwotICAgICAgICB1MzJfeV9hY2N1bV9VID0gMDsKLQotICAgIH0KLQotICAgIC8qCi0gICAgICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0IGlzIGNvZGVkIG9uIDE1IGJpdHMsIGFuZCByZXByZXNlbnRzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAwLjUKLSAgICAqLwotICAgIGlmICh1MzJfeF9pbmNbWVBsYW5lXSA+IE1BWF9TSE9SVCkKLSAgICB7Ci0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID0gdTMyX3hfaW5jW1lQbGFuZV0gJiAweGZmZmY7Ci0KLSAgICAgICAgaWYgKCF1MzJfeF9hY2N1bV9zdGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSBNQVhfU0hPUlQ7Ci0gICAgICAgIH0KLQotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA+Pj0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSAwOwotICAgIH0KLQotICAgIHB1MzJfcmdiX2RhdGFfc3RhcnQgPSAoTTRWSUZJX1VJbnQzMiopcHU4X2RhdGFfb3V0OwotCi0gICAgLyoKLSAgICAgICAgQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBsaW5lYXJseSBpbnRlcnBvbGF0ZXMgYWxvbmcgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdAotICAgICAgICByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb253IGVhY2ggY29sdW1uLiBFYWNoIGVzdGltYXRlZCBwaXhlbCBpbiB0aGUKLSAgICAgICAgb3V0cHV0IGltYWdlIGlzIGEgd2VpZ2h0ZWQgY29tYmluYXRpb24gb2YgaXRzIGZvdXIgbmVpZ2hib3VycyBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGEgOgotICAgICAgICBGKHAnLHEnKT1mKHAscSlSKC1hKVIoYikrZihwLHEtMSlSKC1hKVIoYi0xKStmKHArMSxxKVIoMS1hKVIoYikrZihwKyYscSsxKVIoMS1hKVIoYi0xKQotICAgICAgICB3aXRoICBSKHgpID0gLyB4KzEgIC0xID08IHggPTwgMCBcIDEteCAgMCA9PCB4ID08IDEgYW5kIGEgKHJlc3AuIGIpIHdlaWdodGluZyBjb2VmZmljaWVudAotICAgICAgICBpcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgbmVhcmVzdCBuZWlnaGJvciBpbiB0aGUgcCAocmVzcC4gcSkgZGlyZWN0aW9uCi0gICAgKi8KLSAgICBmb3IgKHUzMl9yb3cgPSB1MzJfaGVpZ2h0X291dDsgdTMyX3JvdyAhPSAwOyB1MzJfcm93IC09IDIpCi0gICAgewotICAgICAgICB1MzJfeF9hY2N1bV9ZID0gdTMyX3hfYWNjdW1fc3RhcnQ7Ci0gICAgICAgIHUzMl94X2FjY3VtX1UgPSB1MzJfeF9hY2N1bV9zdGFydDsKLQotICAgICAgICAvKiBWZXJ0aWNhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgIHUzMl95X2ZyYWNfWSA9ICh1MzJfeV9hY2N1bV9ZID4+IDEyKSAmIDE1OwotICAgICAgICB1MzJfeV9mcmFjX1UgPSAodTMyX3lfYWNjdW1fVSA+PiAxMikgJiAxNTsKLQotICAgICAgICAvKiBSR0IgY3VycmVudCBsaW5lIHBvc2l0aW9uIHBvaW50ZXIgKi8KLSAgICAgICAgcHUzMl9yZ2JfZGF0YV9jdXJyZW50ID0gcHUzMl9yZ2JfZGF0YV9zdGFydCA7Ci0KLSAgICAgICAgLyogUkdCIG5leHQgbGluZSBwb3NpdGlvbiBwb2ludGVyICovCi0gICAgICAgIHB1MzJfcmdiX2RhdGFfbmV4dCAgICA9IHB1MzJfcmdiX2RhdGFfY3VycmVudCArICh1MzJfc3RyaWRlMl9vdXQpOwotCi0gICAgICAgIC8qIFkgUGxhbmUgbmV4dCByb3cgcG9pbnRlciAqLwotICAgICAgICBwdThfZGF0YV9pbjFbWVBsYW5lXSA9IHB1OF9kYXRhX2luW1lQbGFuZV07Ci0KLSAgICAgICAgdTMyX3JnYl90ZW1wMyA9IHUzMl95X2FjY3VtX1kgKyAodTMyX3lfaW5jW1lQbGFuZV0pOwotICAgICAgICBpZiAodTMyX3JnYl90ZW1wMyA+PiAxNikKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW4xW1lQbGFuZV0gPSAgcHU4X2RhdGFfaW5bWVBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyX3JnYl90ZW1wMyA+PiAxNikgKiAodTMyX3N0cmlkZV9pbltZUGxhbmVdKTsKLSAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDMgJj0gMHhmZmZmOwotICAgICAgICB9Ci0gICAgICAgIHUzMl9yZ2JfdGVtcDQgPSAodTMyX3JnYl90ZW1wMyA+PiAxMikgJiAxNTsKLQotICAgICAgICBmb3IgKHUzMl9jb2wgPSB1MzJfd2lkdGhfb3V0OyB1MzJfY29sICE9IDA7IHUzMl9jb2wgLT0gMikKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKiBJbnB1dCBZIHBsYW5lIGVsZW1lbnRzICovCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9ZID0gcHU4X2RhdGFfaW5bWVBsYW5lXSArICh1MzJfeF9hY2N1bV9ZID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1kgPSBwdThfc3JjX3RvcF9ZICsgdTMyX3N0cmlkZV9pbltZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBJbnB1dCBVIFBsYW5lIGVsZW1lbnRzICovCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9VID0gcHU4X2RhdGFfaW5bVVBsYW5lXSArICh1MzJfeF9hY2N1bV9VID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1UgPSBwdThfc3JjX3RvcF9VICsgdTMyX3N0cmlkZV9pbltVUGxhbmVdOwotCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9WID0gcHU4X2RhdGFfaW5bVlBsYW5lXSArICh1MzJfeF9hY2N1bV9VID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1YgPSBwdThfc3JjX3RvcF9WICsgdTMyX3N0cmlkZV9pbltWUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgZm9yIFkgcGxhbmUgKi8KLSAgICAgICAgICAgIHUzMl94X2ZyYWNfWSA9ICh1MzJfeF9hY2N1bV9ZID4+IDEyKSYxNTsKLSAgICAgICAgICAgIC8qIEhvcml6b250YWwgd2VpZ2h0IGZhY3RvciBmb3IgVSBhbmQgViBwbGFuZXMgKi8KLSAgICAgICAgICAgIHUzMl94X2ZyYWNfVSA9ICh1MzJfeF9hY2N1bV9VID4+IDEyKSYxNTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFVfMzIgPSAoKChwdThfc3JjX3RvcF9VWzBdKigxNi11MzJfeF9mcmFjX1UpICsgcHU4X3NyY190b3BfVVsxXSp1MzJfeF9mcmFjX1UpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3lfZnJhY19VKSArIChwdThfc3JjX2JvdHRvbV9VWzBdKigxNi11MzJfeF9mcmFjX1UpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fVVsxXSp1MzJfeF9mcmFjX1UpKnUzMl95X2ZyYWNfVSApID4+IDgpOwotCi0gICAgICAgICAgICBWXzMyID0gKCgocHU4X3NyY190b3BfVlswXSooMTYtdTMyX3hfZnJhY19VKSArIHB1OF9zcmNfdG9wX1ZbMV0qdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfVSkrIChwdThfc3JjX2JvdHRvbV9WWzBdKigxNi11MzJfeF9mcmFjX1UpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fVlsxXSp1MzJfeF9mcmFjX1UpKnUzMl95X2ZyYWNfVSApID4+IDgpOwotCi0gICAgICAgICAgICBZXzMyID0gKCgocHU4X3NyY190b3BfWVswXSooMTYtdTMyX3hfZnJhY19ZKSArIHB1OF9zcmNfdG9wX1lbMV0qdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfWSkgKyAocHU4X3NyY19ib3R0b21fWVswXSooMTYtdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1lbMV0qdTMyX3hfZnJhY19ZKSp1MzJfeV9mcmFjX1kgKSA+PiA4KTsKLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fVSArPSAodTMyX3hfaW5jW1VQbGFuZV0pOwotCi0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgICAgICAgICAgREVNQVRSSVgodThfUmVkLHU4X0dyZWVuLHU4X0JsdWUsWXZhbF8zMixVXzMyLFZfMzIpOwotCi0gICAgICAgICAgICAvKiBQYWNrIDggYml0IFIsRyxCIHRvIFJHQjU2NSAqLwotICAgICAgICAgICAgI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDEgPSBQQUNLX0JHUjU2NSgwLHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbHNlICAgLyogTElUVExFX0VORElBTiAqLwotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAxID0gUEFDS19CR1I1NjUoMTYsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2VuZGlmICAvKiBMSVRUTEVfRU5ESUFOICovCi0KLQotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luMVtZUGxhbmVdKyh1MzJfeF9hY2N1bV9ZID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1kgPSBwdThfc3JjX3RvcF9ZICsgdTMyX3N0cmlkZV9pbltZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfcmdiX3RlbXA0KSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl9yZ2JfdGVtcDQgKSA+PiA4KTsKLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fWSArPSB1MzJfeF9pbmNbWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfeF9mcmFjX1kgPSAodTMyX3hfYWNjdW1fWSA+PiAxMikmMTU7Ci0KLSAgICAgICAgICAgIC8qIFlVViB0byBSR0IgKi8KLSAgICAgICAgICAgICNpZmRlZiBfX1JHQl9WMV9fCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjM3OwotICAgICAgICAgICAgI2Vsc2UgICAvKiBfX1JHQl9WMV9fdiAqLwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMioweDI1Njg7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICB1MzJfcmdiX3RlbXAyID0gUEFDS19CR1I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgdTMyX3JnYl90ZW1wMiA9IFBBQ0tfQkdSNTY1KDE2LHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbmRpZiAgLyogTElUVExFX0VORElBTiAqLwotCi0KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1kgPSBwdThfZGF0YV9pbltZUGxhbmVdICsgKHUzMl94X2FjY3VtX1kgPj4gMTYpIDsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1kgPSBwdThfc3JjX3RvcF9ZICsgdTMyX3N0cmlkZV9pbltZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1kpICsgKHB1OF9zcmNfYm90dG9tX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9ZWzFdKnUzMl94X2ZyYWNfWSkqdTMyX3lfZnJhY19ZICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIC8qIFlVViB0byBSR0IgKi8KLSAgICAgICAgICAgICNpZmRlZiBfX1JHQl9WMV9fCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjM3OwotICAgICAgICAgICAgI2Vsc2UgICAvKiBfX1JHQl9WMV9fdiAqLwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMioweDI1Njg7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICAqKHB1MzJfcmdiX2RhdGFfY3VycmVudCkrKyA9IHUzMl9yZ2JfdGVtcDEgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLX0JHUjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX2N1cnJlbnQpKysgPSB1MzJfcmdiX3RlbXAxIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19CR1I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9ZID0gcHU4X2RhdGFfaW4xW1lQbGFuZV0rICh1MzJfeF9hY2N1bV9ZID4+IDE2KTsKLSAgICAgICAgICAgIHB1OF9zcmNfYm90dG9tX1kgPSBwdThfc3JjX3RvcF9ZICsgdTMyX3N0cmlkZV9pbltZUGxhbmVdOwotCi0gICAgICAgICAgICAvKiBXZWlnaHRlZCBjb21iaW5hdGlvbiAqLwotICAgICAgICAgICAgWV8zMiA9ICgoKHB1OF9zcmNfdG9wX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkgKyBwdThfc3JjX3RvcF9ZWzFdKnUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfcmdiX3RlbXA0KSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl9yZ2JfdGVtcDQgKT4+OCk7Ci0KLSAgICAgICAgICAgIHUzMl94X2FjY3VtX1kgKz0gdTMyX3hfaW5jW1lQbGFuZV07Ci0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyPVlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzI9WV8zMioweDI1Njg7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIF9fUkdCX1YxX192ICovCi0KLSAgICAgICAgICAgIERFTUFUUklYKHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlLFl2YWxfMzIsVV8zMixWXzMyKTsKLQotICAgICAgICAgICAgLyogUGFjayA4IGJpdCBSLEcsQiB0byBSR0I1NjUgKi8KLSAgICAgICAgICAgICNpZmRlZiAgTElUVExFX0VORElBTgotICAgICAgICAgICAgICAgICAgICAqKHB1MzJfcmdiX2RhdGFfbmV4dCkrKyA9IHUzMl9yZ2JfdGVtcDIgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLX0JHUjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIExJVFRMRV9FTkRJQU4gKi8KLSAgICAgICAgICAgICAgICAgICAgKihwdTMyX3JnYl9kYXRhX25leHQpKysgPSB1MzJfcmdiX3RlbXAyIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFDS19CR1I1NjUoMCx1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotICAgICAgICB9ICAgLyogRW5kIG9mIGhvcml6b250YWwgc2Nhbm5pbmcgKi8KLQotICAgICAgICB1MzJfeV9hY2N1bV9ZICA9ICB1MzJfcmdiX3RlbXAzICsgKHUzMl95X2luY1tZUGxhbmVdKTsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSArPSAodTMyX3lfaW5jW1VQbGFuZV0pOwotCi0gICAgICAgIC8qIFkgcGxhbmUgcm93IHVwZGF0ZSAqLwotICAgICAgICBpZiAodTMyX3lfYWNjdW1fWSA+PiAxNikKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bWVBsYW5lXSA9ICBwdThfZGF0YV9pbjFbWVBsYW5lXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHUzMl95X2FjY3VtX1kgPj4gMTYpICogKHUzMl9zdHJpZGVfaW5bWVBsYW5lXSkpOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fWSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbltZUGxhbmVdID0gcHU4X2RhdGFfaW4xW1lQbGFuZV07Ci0gICAgICAgIH0KLSAgICAgICAgLyogVSBhbmQgViBwbGFuZXMgcm93IHVwZGF0ZSAqLwotICAgICAgICBpZiAodTMyX3lfYWNjdW1fVSA+PiAxNikKLSAgICAgICAgewotICAgICAgICAgICAgcHU4X2RhdGFfaW5bVVBsYW5lXSA9ICBwdThfZGF0YV9pbltVUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfeV9hY2N1bV9VID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1VQbGFuZV0pOwotICAgICAgICAgICAgcHU4X2RhdGFfaW5bVlBsYW5lXSA9ICBwdThfZGF0YV9pbltWUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzJfeV9hY2N1bV9VID4+IDE2KSAqICh1MzJfc3RyaWRlX2luW1ZQbGFuZV0pOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fVSAmPSAweGZmZmY7Ci0gICAgICAgIH0KLSAgICAgICAgLyogQkdSIHBvaW50ZXIgVXBkYXRlICovCi0gICAgICAgIHB1MzJfcmdiX2RhdGFfc3RhcnQgKz0gdTMyX3N0cmlkZV9vdXQ7Ci0KLSAgICB9ICAgLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVZVVZ0b1JHQjU2NS5jIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL000VklGSV9SZXNpemVZVVZ0b1JHQjU2NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZGE5ZDA3Li4wMDAwMDAwCi0tLSBhL2xpYnZpZGVvZWRpdG9yL3Zzcy92aWRlb19maWx0ZXJzL3NyYy9NNFZJRklfUmVzaXplWVVWdG9SR0I1NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQGZpbGUgICAgIE00VklGSV9SZXNpemVZVVY0MjB0b1JHQjU2NVJvdGF0ZWRSaWdodC5jCi0gKiBAYnJpZWYgICAgQ29udGFpbiB2aWRlbyBsaWJyYXJ5IGZ1bmN0aW9uCi0gKiBAbm90ZSAgICAgVGhpcyBmaWxlIGhhcyBhIENvbWJvIGZpbHRlciBmdW5jdGlvbgotICogICAgICAgICAgIC0jIFJlc2l6ZXMgWVVWNDIwIGFuZCBjb252ZXJ0cyB0byBSR1I1NjUgd2l0aCByb3RhdGlvbgotICogQGRhdGUKLSAqICAgICAgICAgICAtIDIwMDQvMDgvMTE6IENyZWF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotCi0vKiBQcm90b3R5cGVzIG9mIGZ1bmN0aW9ucywgYW5kIHR5cGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRmlsdGVyc0FQSS5oIgotLyogTWFjcm8gZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICAgICJNNFZJRklfRGVmaW5lcy5oIgotLyogQ2xpcCB0YWJsZSBkZWNsYXJhdGlvbiAqLwotI2luY2x1ZGUgICAgIk00VklGSV9DbGlwLmgiCi0KLS8qKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNNFZJRklfVUludDggTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjVSb3RhdGVkUmlnaHQodm9pZCAqcENvbnRleHQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi0gKiBAYnJpZWYgICBSZXNpemUgWVVWNDIwIHBsYW5lIGFuZCBjb252ZXJ0cyB0byBSR0I1NjUgd2l0aCArOTAgcm90YXRpb24uCi0gKiBAbm90ZSAgICBCYXNpYyBzdHVydHVyZSBvZiB0aGUgZnVuY3Rpb24KLSAqICAgICAgICAgIExvb3Agb24gZWFjaCByb3cgKHN0ZXAgMikKLSAqICAgICAgICAgICAgICBMb29wIG9uIGVhY2ggY29sdW1uIChzdGVwIDIpCi0gKiAgICAgICAgICAgICAgICAgIEdldCBmb3VyIFkgc2FtcGxlcyBhbmQgMSB1ICYgViBzYW1wbGUKLSAqICAgICAgICAgICAgICAgICAgUmVzaXplIHRoZSBZIHdpdGggY29ycmVzcG9uaW5nIFUgYW5kIFYgc2FtcGxlcwotICogICAgICAgICAgICAgICAgICBDb21wdXRlIHRoZSBmb3VyIGNvcnJlc3BvbmRpbmcgUiBHIEIgdmFsdWVzCi0gKiAgICAgICAgICAgICAgICAgIFBsYWNlIHRoZSBSIEcgQiBpbiB0aGUgb3VwdXQgcGxhbmUgaW4gcm90YXRlZCBmYXNoaW9uCi0gKiAgICAgICAgICAgICAgZW5kIGxvb3AgY29sdW1uCi0gKiAgICAgICAgICBlbmQgbG9vcCByb3cKLSAqICAgICAgICAgIEZvciByZXNpemluZyBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGxpbmVhcmx5IGludGVycG9sYXRlcyBhbG9uZwotICogICAgICAgICAgZWFjaCByb3csIGFuZCB0aGVuIHVzZXMgdGhhdCByZXN1bHQgaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBkb3duIGVhY2ggY29sdW1uLgotICogICAgICAgICAgRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkCi0gKiAgICAgICAgICBjb21iaW5hdGlvbiBvZiBpdHMgZm91ciBuZWlnaGJvdXJzLiBUaGUgcmF0aW8gb2YgY29tcHJlc3Npb24KLSAqICAgICAgICAgIG9yIGRpbGF0YXRpb24gaXMgZXN0aW1hdGVkIHVzaW5nIGlucHV0IGFuZCBvdXRwdXQgc2l6ZXMuCi0gKiBAcGFyYW0gICBwUGxhbmVJbjogKElOKSBQb2ludGVyIHRvIFlVViBwbGFuZSBidWZmZXIKLSAqIEBwYXJhbSAgIHBDb250ZXh0OiAoSU4pIENvbnRleHQgUG9pbnRlcgotICogQHBhcmFtICAgcFBsYW5lT3V0OiAoT1VUKSBQb2ludGVyIHRvIEJHUjU2NSBQbGFuZQotICogQHJldHVybiAgTTRWSUZJX09LOiB0aGVyZSBpcyBubyBlcnJvcgotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOiBZVVYgUGxhbmUgaGVpZ2h0IGlzIE9ERAotICogQHJldHVybiAgTTRWSUZJX0lMTEVHQUxfRlJBTUVfV0lEVEg6ICBZVVYgUGxhbmUgd2lkdGggaXMgT0RECi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1NNFZJRklfVUludDggICAgTTRWSUZJX1Jlc2l6ZUJpbGluZWFyWVVWNDIwdG9SR0I1NjUodm9pZCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWSUZJX0ltYWdlUGxhbmUgKnBQbGFuZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE00VklGSV9JbWFnZVBsYW5lICpwUGxhbmVPdXQpCi17Ci0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfZGF0YV9pbltQTEFORVNdLCAqcHU4X2RhdGFfaW4xW1BMQU5FU10sKnB1OF9kYXRhX291dDsKLSAgICBNNFZJRklfVUludDMyICAgKnB1MzJfcmdiX2RhdGFfY3VycmVudCwgKnB1MzJfcmdiX2RhdGFfbmV4dCwgKnB1MzJfcmdiX2RhdGFfc3RhcnQ7Ci0KLSAgICBNNFZJRklfVUludDMyICAgdTMyX3dpZHRoX2luW1BMQU5FU10sIHUzMl93aWR0aF9vdXQsIHUzMl9oZWlnaHRfaW5bUExBTkVTXSwgdTMyX2hlaWdodF9vdXQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9zdHJpZGVfaW5bUExBTkVTXTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3N0cmlkZV9vdXQsIHUzMl9zdHJpZGUyX291dCwgdTMyX3dpZHRoMl9SR0IsIHUzMl9oZWlnaHQyX1JHQjsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfaW5jW1BMQU5FU10sIHUzMl95X2luY1tQTEFORVNdOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfeF9hY2N1bV9ZLCB1MzJfeF9hY2N1bV9VLCB1MzJfeF9hY2N1bV9zdGFydDsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3lfYWNjdW1fWSwgdTMyX3lfYWNjdW1fVTsKLSAgICBNNFZJRklfVUludDMyICAgdTMyX3hfZnJhY19ZLCB1MzJfeF9mcmFjX1UsIHUzMl95X2ZyYWNfWSx1MzJfeV9mcmFjX1U7Ci0gICAgTTRWSUZJX0ludDMyICAgIFVfMzIsIFZfMzIsIFlfMzIsIFl2YWxfMzI7Ci0gICAgTTRWSUZJX1VJbnQ4ICAgIHU4X1JlZCwgdThfR3JlZW4sIHU4X0JsdWU7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9yb3csIHUzMl9jb2w7Ci0KLSAgICBNNFZJRklfVUludDMyICAgdTMyX3BsYW5lOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfcmdiX3RlbXAxLCB1MzJfcmdiX3RlbXAyOwotICAgIE00VklGSV9VSW50MzIgICB1MzJfcmdiX3RlbXAzLHUzMl9yZ2JfdGVtcDQ7Ci0gICAgTTRWSUZJX1VJbnQzMiAgIHUzMl9jaGVja19zaXplOwotCi0gICAgTTRWSUZJX1VJbnQ4ICAgICpwdThfc3JjX3RvcF9ZLCpwdThfc3JjX3RvcF9VLCpwdThfc3JjX3RvcF9WIDsKLSAgICBNNFZJRklfVUludDggICAgKnB1OF9zcmNfYm90dG9tX1ksICpwdThfc3JjX2JvdHRvbV9VLCAqcHU4X3NyY19ib3R0b21fVjsKLQotICAgIC8qIENoZWNrIGZvciB0aGUgIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGV2ZW4gKi8KLSAgICB1MzJfY2hlY2tfc2l6ZSA9IElTX0VWRU4ocFBsYW5lSW5bMF0udV9oZWlnaHQpOwotICAgIGlmKCB1MzJfY2hlY2tfc2l6ZSA9PSBGQUxTRSApCi0gICAgewotICAgICAgICByZXR1cm4gTTRWSUZJX0lMTEVHQUxfRlJBTUVfSEVJR0hUOwotICAgIH0KLSAgICB1MzJfY2hlY2tfc2l6ZSA9IElTX0VWRU4ocFBsYW5lSW5bMF0udV93aWR0aCk7Ci0gICAgaWYgKHUzMl9jaGVja19zaXplID09IEZBTFNFICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBNNFZJRklfSUxMRUdBTF9GUkFNRV9XSURUSDsKLQotICAgIH0KLSAgICAvKiBNYWtlIHRoZSBvdXB1dCB3aWR0aCBhbmQgaGVpZ2h0IGFzIGV2ZW4gKi8KLSAgICBwUGxhbmVPdXQtPnVfaGVpZ2h0ID0gcFBsYW5lT3V0LT51X2hlaWdodCAmIDB4RkZGRkZGRkU7Ci0gICAgcFBsYW5lT3V0LT51X3dpZHRoID0gcFBsYW5lT3V0LT51X3dpZHRoICYgMHhGRkZGRkZGRTsKLSAgICBwUGxhbmVPdXQtPnVfc3RyaWRlID0gcFBsYW5lT3V0LT51X3N0cmlkZSAmIDB4RkZGRkZGRkM7Ci0KLSAgICAvKiBBc3NpZ25tZW50IG9mIG91dHB1dCBwb2ludGVyICovCi0gICAgcHU4X2RhdGFfb3V0ICAgID0gcFBsYW5lT3V0LT5wYWNfZGF0YSArIHBQbGFuZU91dC0+dV90b3BsZWZ0OwotICAgIC8qIEFzc2lnbm1lbnQgb2Ygb3V0cHV0IHdpZHRoKHJvdGF0ZWQpICovCi0gICAgdTMyX3dpZHRoX291dCAgID0gcFBsYW5lT3V0LT51X3dpZHRoOwotICAgIC8qIEFzc2lnbm1lbnQgb2Ygb3V0cHV0IGhlaWdodChyb3RhdGVkKSAqLwotICAgIHUzMl9oZWlnaHRfb3V0ICA9IHBQbGFuZU91dC0+dV9oZWlnaHQ7Ci0KLSAgICAvKiBTZXQgdGhlIGJvdW5kcyBvZiB0aGUgYWN0aXZlIGltYWdlICovCi0gICAgdTMyX3dpZHRoMl9SR0IgID0gcFBsYW5lT3V0LT51X3dpZHRoID4+IDE7Ci0gICAgdTMyX2hlaWdodDJfUkdCID0gcFBsYW5lT3V0LT51X2hlaWdodCA+PiAxOwotICAgIC8qIEdldCB0aGUgbWVtb3J5IGp1bXAgY29ycmVzcG9uZGluZyB0byBhIHJvdyBqdW1wICovCi0gICAgdTMyX3N0cmlkZV9vdXQgPSBwUGxhbmVPdXQtPnVfc3RyaWRlID4+IDE7Ci0gICAgdTMyX3N0cmlkZTJfb3V0ID0gcFBsYW5lT3V0LT51X3N0cmlkZSA+PiAyOwotCi0gICAgZm9yKHUzMl9wbGFuZSA9IDA7IHUzMl9wbGFuZSA8IFBMQU5FUzsgdTMyX3BsYW5lKyspCi0gICAgewotICAgICAgICAvKiBTZXQgdGhlIHdvcmtpbmcgcG9pbnRlcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQvb3V0cHV0IGRhdGEgZmllbGQgKi8KLSAgICAgICAgcHU4X2RhdGFfaW5bdTMyX3BsYW5lXSA9IHBQbGFuZUluW3UzMl9wbGFuZV0ucGFjX2RhdGEgKyBwUGxhbmVJblt1MzJfcGxhbmVdLnVfdG9wbGVmdDsKLQotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBqdW1wIGNvcnJlc3BvbmRpbmcgdG8gYSByb3cganVtcCAqLwotICAgICAgICB1MzJfc3RyaWRlX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfc3RyaWRlOwotCi0gICAgICAgIC8qIFNldCB0aGUgYm91bmRzIG9mIHRoZSBhY3RpdmUgaW1hZ2UgKi8KLSAgICAgICAgdTMyX3dpZHRoX2luW3UzMl9wbGFuZV0gPSBwUGxhbmVJblt1MzJfcGxhbmVdLnVfd2lkdGg7Ci0gICAgICAgIHUzMl9oZWlnaHRfaW5bdTMyX3BsYW5lXSA9IHBQbGFuZUluW3UzMl9wbGFuZV0udV9oZWlnaHQ7Ci0gICAgfQotICAgIC8qIENvbXB1dGUgaG9yaXpvbnRhbCByYXRpbyBiZXR3ZWVuIHNyYyBhbmQgZGVzdGluYXRpb24gd2lkdGggZm9yIFkgUGxhbmUuKi8KLSAgICBpZiAodTMyX3dpZHRoX291dCA+PSB1MzJfd2lkdGhfaW5bWVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl94X2luY1tZUGxhbmVdICAgPSAoKHUzMl93aWR0aF9pbltZUGxhbmVdLTEpICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0LTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbWVBsYW5lXSAgID0gKHUzMl93aWR0aF9pbltZUGxhbmVdICogTUFYX1NIT1JUKSAvICh1MzJfd2lkdGhfb3V0KTsKLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQgZm9yIFkgUGxhbmUuKi8KLSAgICBpZiAodTMyX2hlaWdodF9vdXQgPj0gdTMyX2hlaWdodF9pbltZUGxhbmVdKQotICAgIHsKLSAgICAgICAgdTMyX3lfaW5jW1lQbGFuZV0gICA9ICgodTMyX2hlaWdodF9pbltZUGxhbmVdLTEpICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0X291dC0xKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdTMyX3lfaW5jW1lQbGFuZV0gPSAodTMyX2hlaWdodF9pbltZUGxhbmVdICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0X291dCk7Ci0gICAgfQotCi0gICAgLyogQ29tcHV0ZSBob3Jpem9udGFsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiB3aWR0aCBmb3IgVSBhbmQgViBQbGFuZXMuKi8KLSAgICBpZiAodTMyX3dpZHRoMl9SR0IgPj0gdTMyX3dpZHRoX2luW1VQbGFuZV0pCi0gICAgewotICAgICAgICB1MzJfeF9pbmNbVVBsYW5lXSAgID0gKCh1MzJfd2lkdGhfaW5bVVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX3dpZHRoMl9SR0ItMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHUzMl94X2luY1tVUGxhbmVdICAgPSAodTMyX3dpZHRoX2luW1VQbGFuZV0gKiBNQVhfU0hPUlQpIC8gKHUzMl93aWR0aDJfUkdCKTsKLSAgICB9Ci0KLSAgICAvKiBDb21wdXRlIHZlcnRpY2FsIHJhdGlvIGJldHdlZW4gc3JjIGFuZCBkZXN0aW5hdGlvbiBoZWlnaHQgZm9yIFUgYW5kIFYgUGxhbmVzLiovCi0KLSAgICBpZiAodTMyX2hlaWdodDJfUkdCID49IHUzMl9oZWlnaHRfaW5bVVBsYW5lXSkKLSAgICB7Ci0gICAgICAgIHUzMl95X2luY1tVUGxhbmVdICAgPSAoKHUzMl9oZWlnaHRfaW5bVVBsYW5lXS0xKSAqIE1BWF9TSE9SVCkgLyAodTMyX2hlaWdodDJfUkdCLTEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeV9pbmNbVVBsYW5lXSAgPSAodTMyX2hlaWdodF9pbltVUGxhbmVdICogTUFYX1NIT1JUKSAvICh1MzJfaGVpZ2h0Ml9SR0IpOwotICAgIH0KLQotICAgIHUzMl95X2luY1tWUGxhbmVdID0gdTMyX3lfaW5jW1VQbGFuZV07Ci0gICAgdTMyX3hfaW5jW1ZQbGFuZV0gPSB1MzJfeF9pbmNbVVBsYW5lXTsKLQotICAgIC8qCi0gICAgQ2FsY3VsYXRlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUgOiB1MzJfeV9hY2N1bV9zdGFydC4KLSAgICB1MzJfeV9hY2N1bV9zdGFydCBpcyBjb2RlZCBvbiAxNSBiaXRzLCBhbmQgcmVwcmVzZW50cyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMC41Ci0gICAgKi8KLSAgICBpZiAodTMyX3lfaW5jW1lQbGFuZV0gPiBNQVhfU0hPUlQpCi0gICAgewotICAgICAgICAvKgotICAgICAgICBLZWVwIHRoZSBmcmFjdGlvbm5hbCBwYXJ0LCBhc3NpbXVuZyB0aGF0IGludGVnZXIgIHBhcnQgaXMgY29kZWQgb24gdGhlIDE2IGhpZ2ggYml0cywKLSAgICAgICAgYW5kIHRoZSBmcmFjdGlvbm5hbCBvbiB0aGUgMTUgbG93IGJpdHMKLSAgICAgICAgKi8KLSAgICAgICAgdTMyX3lfYWNjdW1fWSA9IHUzMl95X2luY1tZUGxhbmVdICYgMHhmZmZmOwotICAgICAgICB1MzJfeV9hY2N1bV9VID0gdTMyX3lfaW5jW1VQbGFuZV0gJiAweGZmZmY7Ci0KLSAgICAgICAgaWYgKCF1MzJfeV9hY2N1bV9ZKQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bV9ZID0gTUFYX1NIT1JUOwotICAgICAgICAgICAgdTMyX3lfYWNjdW1fVSA9IE1BWF9TSE9SVDsKLSAgICAgICAgfQotICAgICAgICB1MzJfeV9hY2N1bV9ZID4+PSAxOwotICAgICAgICB1MzJfeV9hY2N1bV9VID4+PSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeV9hY2N1bV9ZID0gMDsKLSAgICAgICAgdTMyX3lfYWNjdW1fVSA9IDA7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgIENhbGN1bGF0ZSBpbml0aWFsIGFjY3VtdWxhdG9yIHZhbHVlIDogdTMyX3hfYWNjdW1fc3RhcnQuCi0gICAgdTMyX3hfYWNjdW1fc3RhcnQgaXMgY29kZWQgb24gMTUgYml0cywgYW5kIHJlcHJlc2VudHMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDAuNQotICAgICovCi0gICAgaWYgKHUzMl94X2luY1tZUGxhbmVdID4gTUFYX1NIT1JUKQotICAgIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fc3RhcnQgPSB1MzJfeF9pbmNbWVBsYW5lXSAmIDB4ZmZmZjsKLQotICAgICAgICBpZiAoIXUzMl94X2FjY3VtX3N0YXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IE1BWF9TSE9SVDsKLSAgICAgICAgfQotCi0gICAgICAgIHUzMl94X2FjY3VtX3N0YXJ0ID4+PSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB1MzJfeF9hY2N1bV9zdGFydCA9IDA7Ci0gICAgfQotICAgIC8qIEludGlhbGlzZSB0aGUgUkdCIHBvaW50ZXIgKi8KLSAgICBwdTMyX3JnYl9kYXRhX3N0YXJ0ID0gKE00VklGSV9VSW50MzIqKXB1OF9kYXRhX291dDsKLQotICAgIC8qCi0gICAgICAgIEJpbGluZWFyIGludGVycG9sYXRpb24gbGluZWFybHkgaW50ZXJwb2xhdGVzIGFsb25nIGVhY2ggcm93LCBhbmQgdGhlbiB1c2VzIHRoYXQKLSAgICAgICAgcmVzdWx0IGluIGEgbGluZWFyIGludGVycG9sYXRpb24gZG9udyBlYWNoIGNvbHVtbi4gRWFjaCBlc3RpbWF0ZWQgcGl4ZWwgaW4gdGhlCi0gICAgICAgIG91dHB1dCBpbWFnZSBpcyBhIHdlaWdodGVkIGNvbWJpbmF0aW9uIG9mIGl0cyBmb3VyIG5laWdoYm91cnMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhIDoKLSAgICAgICAgRihwJyxxJyk9ZihwLHEpUigtYSlSKGIpK2YocCxxLTEpUigtYSlSKGItMSkrZihwKzEscSlSKDEtYSlSKGIpK2YocCsmLHErMSlSKDEtYSlSKGItMSkKLSAgICAgICAgd2l0aCAgUih4KSA9IC8geCsxICAtMSA9PCB4ID08IDAgXCAxLXggIDAgPTwgeCA9PCAxIGFuZCBhIChyZXNwLiBiKSB3ZWlnaHRpbmcgY29lZmZpY2llbnQKLSAgICAgICAgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIG5lYXJlc3QgbmVpZ2hib3IgaW4gdGhlIHAgKHJlc3AuIHEpIGRpcmVjdGlvbgotICAgICovCi0gICAgZm9yICh1MzJfcm93ID0gdTMyX2hlaWdodF9vdXQ7IHUzMl9yb3cgIT0gMDsgdTMyX3JvdyAtPSAyKQotICAgIHsKLSAgICAgICAgdTMyX3hfYWNjdW1fWSA9IHUzMl94X2FjY3VtX3N0YXJ0OwotICAgICAgICB1MzJfeF9hY2N1bV9VID0gdTMyX3hfYWNjdW1fc3RhcnQ7Ci0KLSAgICAgICAgLyogVmVydGljYWwgd2VpZ2h0IGZhY3RvciAqLwotICAgICAgICB1MzJfeV9mcmFjX1kgPSAodTMyX3lfYWNjdW1fWSA+PiAxMikgJiAxNTsKLSAgICAgICAgdTMyX3lfZnJhY19VID0gKHUzMl95X2FjY3VtX1UgPj4gMTIpICYgMTU7Ci0KLSAgICAgICAgLyogUkdCIGN1cnJlbnQgbGluZSBQb3NpdGlvbiBQb2ludGVyICovCi0gICAgICAgIHB1MzJfcmdiX2RhdGFfY3VycmVudCA9IHB1MzJfcmdiX2RhdGFfc3RhcnQgOwotCi0gICAgICAgIC8qIFJHQiBuZXh0IGxpbmUgcG9zaXRpb24gcG9pbnRlciAqLwotICAgICAgICBwdTMyX3JnYl9kYXRhX25leHQgICAgPSBwdTMyX3JnYl9kYXRhX2N1cnJlbnQgKyAodTMyX3N0cmlkZTJfb3V0KTsKLQotICAgICAgICAvKiBZIFBsYW5lIG5leHQgcm93IHBvaW50ZXIgKi8KLSAgICAgICAgcHU4X2RhdGFfaW4xW1lQbGFuZV0gPSBwdThfZGF0YV9pbltZUGxhbmVdOwotCi0gICAgICAgIHUzMl9yZ2JfdGVtcDMgPSB1MzJfeV9hY2N1bV9ZICsgKHUzMl95X2luY1tZUGxhbmVdKTsKLSAgICAgICAgaWYgKHUzMl9yZ2JfdGVtcDMgPj4gMTYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luMVtZUGxhbmVdID0gIHB1OF9kYXRhX2luW1lQbGFuZV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl9yZ2JfdGVtcDMgPj4gMTYpICogKHUzMl9zdHJpZGVfaW5bWVBsYW5lXSk7Ci0gICAgICAgICAgICB1MzJfcmdiX3RlbXAzICY9IDB4ZmZmZjsKLSAgICAgICAgfQotICAgICAgICB1MzJfcmdiX3RlbXA0ID0gKHUzMl9yZ2JfdGVtcDMgPj4gMTIpICYgMTU7Ci0KLSAgICAgICAgZm9yICh1MzJfY29sID0gdTMyX3dpZHRoX291dDsgdTMyX2NvbCAhPSAwOyB1MzJfY29sIC09IDIpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgLyogSW5wdXQgWSBwbGFuZSBlbGVtZW50cyAqLwotICAgICAgICAgICAgcHU4X3NyY190b3BfWSA9IHB1OF9kYXRhX2luW1lQbGFuZV0gKyAodTMyX3hfYWNjdW1fWSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogSW5wdXQgVSBQbGFuZSBlbGVtZW50cyAqLwotICAgICAgICAgICAgcHU4X3NyY190b3BfVSA9IHB1OF9kYXRhX2luW1VQbGFuZV0gKyAodTMyX3hfYWNjdW1fVSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9VID0gcHU4X3NyY190b3BfVSArIHUzMl9zdHJpZGVfaW5bVVBsYW5lXTsKLQotICAgICAgICAgICAgcHU4X3NyY190b3BfViA9IHB1OF9kYXRhX2luW1ZQbGFuZV0gKyAodTMyX3hfYWNjdW1fVSA+PiAxNik7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9WID0gcHU4X3NyY190b3BfViArIHUzMl9zdHJpZGVfaW5bVlBsYW5lXTsKLQotICAgICAgICAgICAgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yIGZvciBZIFBsYW5lICovCi0gICAgICAgICAgICB1MzJfeF9mcmFjX1kgPSAodTMyX3hfYWNjdW1fWSA+PiAxMikmMTU7Ci0gICAgICAgICAgICAvKiBIb3Jpem9udGFsIHdlaWdodCBmYWN0b3IgZm9yIFUgYW5kIFYgUGxhbmVzICovCi0gICAgICAgICAgICB1MzJfeF9mcmFjX1UgPSAodTMyX3hfYWNjdW1fVSA+PiAxMikmMTU7Ci0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBVXzMyID0gKCgocHU4X3NyY190b3BfVVswXSooMTYtdTMyX3hfZnJhY19VKSArIHB1OF9zcmNfdG9wX1VbMV0qdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl95X2ZyYWNfVSkgKyAocHU4X3NyY19ib3R0b21fVVswXSooMTYtdTMyX3hfZnJhY19VKQotICAgICAgICAgICAgICAgICAgICArIHB1OF9zcmNfYm90dG9tX1VbMV0qdTMyX3hfZnJhY19VKSp1MzJfeV9mcmFjX1UgKSA+PiA4KTsKLQotICAgICAgICAgICAgVl8zMiA9ICgoKHB1OF9zcmNfdG9wX1ZbMF0qKDE2LXUzMl94X2ZyYWNfVSkgKyBwdThfc3JjX3RvcF9WWzFdKnUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKigxNi11MzJfeV9mcmFjX1UpICsgKHB1OF9zcmNfYm90dG9tX1ZbMF0qKDE2LXUzMl94X2ZyYWNfVSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9WWzFdKnUzMl94X2ZyYWNfVSkqdTMyX3lfZnJhY19VICkgPj4gOCk7Ci0KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3lfZnJhY19ZKSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl95X2ZyYWNfWSApID4+IDgpOwotCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9VICs9ICh1MzJfeF9pbmNbVVBsYW5lXSk7Ci0KLSAgICAgICAgICAgIC8qIFlVViB0byBSR0IgKi8KLSAgICAgICAgICAgICNpZmRlZiBfX1JHQl9WMV9fCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjM3OwotICAgICAgICAgICAgI2Vsc2UgICAvKiBfX1JHQl9WMV9fdiAqLwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMioweDI1Njg7Ci0gICAgICAgICAgICAjZW5kaWYgLyogX19SR0JfVjFfX3YgKi8KLQotICAgICAgICAgICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgdTMyX3JnYl90ZW1wMSA9IFBBQ0tfUkdCNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDEgPSBQQUNLX1JHQjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9ZID0gcHU4X2RhdGFfaW4xW1lQbGFuZV0rKHUzMl94X2FjY3VtX1kgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fWSA9IHB1OF9zcmNfdG9wX1kgKyB1MzJfc3RyaWRlX2luW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBZXzMyID0gKCgocHU4X3NyY190b3BfWVswXSooMTYtdTMyX3hfZnJhY19ZKSArIHB1OF9zcmNfdG9wX1lbMV0qdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl9yZ2JfdGVtcDQpICsgKHB1OF9zcmNfYm90dG9tX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9ZWzFdKnUzMl94X2ZyYWNfWSkqdTMyX3JnYl90ZW1wNCApID4+IDgpOwotCi0gICAgICAgICAgICB1MzJfeF9hY2N1bV9ZICs9IHUzMl94X2luY1tZUGxhbmVdOwotICAgICAgICAgICAgLyogSG9yaXpvbnRhbCB3ZWlnaHQgZmFjdG9yICovCi0gICAgICAgICAgICB1MzJfeF9mcmFjX1kgPSAodTMyX3hfYWNjdW1fWSA+PiAxMikmMTU7Ci0gICAgICAgICAgICAvKiBZVVYgdG8gUkdCICovCi0gICAgICAgICAgICAjaWZkZWYgX19SR0JfVjFfXwotICAgICAgICAgICAgICAgICAgICBZdmFsXzMyID0gWV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMHgyNTY4OwotICAgICAgICAgICAgI2VuZGlmICAvKiBfX1JHQl9WMV9fdiAqLwotCi0gICAgICAgICAgICBERU1BVFJJWCh1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSxZdmFsXzMyLFVfMzIsVl8zMik7Ci0KLSAgICAgICAgICAgIC8qIFBhY2sgOCBiaXQgUixHLEIgdG8gUkdCNTY1ICovCi0gICAgICAgICAgICAjaWZkZWYgIExJVFRMRV9FTkRJQU4KLSAgICAgICAgICAgICAgICAgICAgdTMyX3JnYl90ZW1wMiA9IFBBQ0tfUkdCNTY1KDAsdThfUmVkLHU4X0dyZWVuLHU4X0JsdWUpOwotICAgICAgICAgICAgI2Vsc2UgICAvKiBMSVRUTEVfRU5ESUFOICovCi0gICAgICAgICAgICAgICAgICAgIHUzMl9yZ2JfdGVtcDIgPSBQQUNLX1JHQjU2NSgxNix1OF9SZWQsdThfR3JlZW4sdThfQmx1ZSk7Ci0gICAgICAgICAgICAjZW5kaWYgIC8qIExJVFRMRV9FTkRJQU4gKi8KLQotCi0gICAgICAgICAgICBwdThfc3JjX3RvcF9ZID0gcHU4X2RhdGFfaW5bWVBsYW5lXSArICh1MzJfeF9hY2N1bV9ZID4+IDE2KSA7Ci0gICAgICAgICAgICBwdThfc3JjX2JvdHRvbV9ZID0gcHU4X3NyY190b3BfWSArIHUzMl9zdHJpZGVfaW5bWVBsYW5lXTsKLQotICAgICAgICAgICAgLyogV2VpZ2h0ZWQgY29tYmluYXRpb24gKi8KLSAgICAgICAgICAgIFlfMzIgPSAoKChwdThfc3JjX3RvcF9ZWzBdKigxNi11MzJfeF9mcmFjX1kpICsgcHU4X3NyY190b3BfWVsxXSp1MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICooMTYtdTMyX3lfZnJhY19ZKSArIChwdThfc3JjX2JvdHRvbV9ZWzBdKigxNi11MzJfeF9mcmFjX1kpCi0gICAgICAgICAgICAgICAgICAgICsgcHU4X3NyY19ib3R0b21fWVsxXSp1MzJfeF9mcmFjX1kpKnUzMl95X2ZyYWNfWSApID4+IDgpOwotICAgICAgICAgICAgLyogWVVWIHRvIFJHQiAqLwotICAgICAgICAgICAgI2lmZGVmIF9fUkdCX1YxX18KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMiA9IFlfMzIqMzc7Ci0gICAgICAgICAgICAjZWxzZSAgIC8qIF9fUkdCX1YxX192ICovCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzIgPSBZXzMyKjB4MjU2ODsKLSAgICAgICAgICAgICNlbmRpZiAgLyogX19SR0JfVjFfX3YgKi8KLQotICAgICAgICAgICAgREVNQVRSSVgodThfUmVkLHU4X0dyZWVuLHU4X0JsdWUsWXZhbF8zMixVXzMyLFZfMzIpOwotCi0gICAgICAgICAgICAvKiBQYWNrIDggYml0IFIsRyxCIHRvIFJHQjU2NSAqLwotICAgICAgICAgICAgI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAgICoocHUzMl9yZ2JfZGF0YV9jdXJyZW50KSsrID0gdTMyX3JnYl90ZW1wMSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tfUkdCNTY1KDE2LHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbHNlICAgLyogTElUVExFX0VORElBTiAqLwotICAgICAgICAgICAgICAgICAgICAqKHB1MzJfcmdiX2RhdGFfY3VycmVudCkrKyA9IHUzMl9yZ2JfdGVtcDEgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLX1JHQjU2NSgwLHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbmRpZiAgLyogTElUVExFX0VORElBTiAqLwotCi0KLSAgICAgICAgICAgIHB1OF9zcmNfdG9wX1kgPSBwdThfZGF0YV9pbjFbWVBsYW5lXSsgKHUzMl94X2FjY3VtX1kgPj4gMTYpOwotICAgICAgICAgICAgcHU4X3NyY19ib3R0b21fWSA9IHB1OF9zcmNfdG9wX1kgKyB1MzJfc3RyaWRlX2luW1lQbGFuZV07Ci0KLSAgICAgICAgICAgIC8qIFdlaWdodGVkIGNvbWJpbmF0aW9uICovCi0gICAgICAgICAgICBZXzMyID0gKCgocHU4X3NyY190b3BfWVswXSooMTYtdTMyX3hfZnJhY19ZKSArIHB1OF9zcmNfdG9wX1lbMV0qdTMyX3hfZnJhY19ZKQotICAgICAgICAgICAgICAgICAgICAqKDE2LXUzMl9yZ2JfdGVtcDQpICsgKHB1OF9zcmNfYm90dG9tX1lbMF0qKDE2LXUzMl94X2ZyYWNfWSkKLSAgICAgICAgICAgICAgICAgICAgKyBwdThfc3JjX2JvdHRvbV9ZWzFdKnUzMl94X2ZyYWNfWSkqdTMyX3JnYl90ZW1wNCApPj44KTsKLQotICAgICAgICAgICAgdTMyX3hfYWNjdW1fWSArPSB1MzJfeF9pbmNbWVBsYW5lXTsKLSAgICAgICAgICAgIC8qIFlVViB0byBSR0IgKi8KLSAgICAgICAgICAgICNpZmRlZiBfX1JHQl9WMV9fCi0gICAgICAgICAgICAgICAgICAgIFl2YWxfMzI9WV8zMiozNzsKLSAgICAgICAgICAgICNlbHNlICAgLyogX19SR0JfVjFfX3YgKi8KLSAgICAgICAgICAgICAgICAgICAgWXZhbF8zMj1ZXzMyKjB4MjU2ODsKLSAgICAgICAgICAgICNlbmRpZiAgLyogX19SR0JfVjFfX3YgKi8KLQotICAgICAgICAgICAgREVNQVRSSVgodThfUmVkLHU4X0dyZWVuLHU4X0JsdWUsWXZhbF8zMixVXzMyLFZfMzIpOwotCi0gICAgICAgICAgICAvKiBQYWNrIDggYml0IFIsRyxCIHRvIFJHQjU2NSAqLwotICAgICAgICAgICAgI2lmZGVmICBMSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAgICoocHUzMl9yZ2JfZGF0YV9uZXh0KSsrID0gdTMyX3JnYl90ZW1wMiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBQ0tfUkdCNTY1KDE2LHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbHNlICAgLyogTElUVExFX0VORElBTiAqLwotICAgICAgICAgICAgICAgICAgICAqKHB1MzJfcmdiX2RhdGFfbmV4dCkrKyA9IHUzMl9yZ2JfdGVtcDIgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLX1JHQjU2NSgwLHU4X1JlZCx1OF9HcmVlbix1OF9CbHVlKTsKLSAgICAgICAgICAgICNlbmRpZiAgLyogTElUVExFX0VORElBTiAqLwotCi0gICAgICAgIH0gICAvKiBFbmQgb2YgaG9yaXpvbnRhbCBzY2FubmluZyAqLwotCi0gICAgICAgIHUzMl95X2FjY3VtX1kgID0gIHUzMl9yZ2JfdGVtcDMgKyAodTMyX3lfaW5jW1lQbGFuZV0pOwotICAgICAgICB1MzJfeV9hY2N1bV9VICs9ICh1MzJfeV9pbmNbVVBsYW5lXSk7Ci0KLSAgICAgICAgLyogWSBwbGFuZSByb3cgdXBkYXRlICovCi0gICAgICAgIGlmICh1MzJfeV9hY2N1bV9ZID4+IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbltZUGxhbmVdID0gIHB1OF9kYXRhX2luMVtZUGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTMyX3lfYWNjdW1fWSA+PiAxNikgKiAodTMyX3N0cmlkZV9pbltZUGxhbmVdKSk7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bV9ZICY9IDB4ZmZmZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1OF9kYXRhX2luW1lQbGFuZV0gPSBwdThfZGF0YV9pbjFbWVBsYW5lXTsKLSAgICAgICAgfQotICAgICAgICAvKiBVIGFuZCBWIHBsYW5lcyByb3cgdXBkYXRlICovCi0gICAgICAgIGlmICh1MzJfeV9hY2N1bV9VID4+IDE2KQotICAgICAgICB7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbltVUGxhbmVdID0gIHB1OF9kYXRhX2luW1VQbGFuZV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl95X2FjY3VtX1UgPj4gMTYpICogKHUzMl9zdHJpZGVfaW5bVVBsYW5lXSk7Ci0gICAgICAgICAgICBwdThfZGF0YV9pbltWUGxhbmVdID0gIHB1OF9kYXRhX2luW1ZQbGFuZV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMl95X2FjY3VtX1UgPj4gMTYpICogKHUzMl9zdHJpZGVfaW5bVlBsYW5lXSk7Ci0gICAgICAgICAgICB1MzJfeV9hY2N1bV9VICY9IDB4ZmZmZjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1MzJfcmdiX2RhdGFfc3RhcnQgKz0gdTMyX3N0cmlkZV9vdXQ7Ci0KLSAgICB9ICAgLyogRW5kIG9mIHZlcnRpY2FsIHNjYW5uaW5nICovCi0gICAgcmV0dXJuIE00VklGSV9PSzsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTk9USUNFIGIvbGlidmlkZW9lZGl0b3IvdnNzL3ZpZGVvX2ZpbHRlcnMvc3JjL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9saWJ2aWRlb2VkaXRvci92c3MvdmlkZW9fZmlsdGVycy9zcmMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwppbmRleCBhMzlkODM3Li4xNjYzZDQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKQEAgLTE2LDcgKzE2LDggQEAKIAogI2RlZmluZSBMT0dfVEFHICJFZmZlY3REb3dubWl4IgogLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CkBAIC05OSw3ICsxMDAsNyBAQAogLy8gc3RyaWN0bHkgZm9yIHRlc3RpbmcsIGxvZ3MgdGhlIGluZGljZXMgb2YgdGhlIGNoYW5uZWxzIGZvciBhIGdpdmVuIG1hc2ssCiAvLyB1c2VzIHRoZSBzYW1lIGNvZGUgYXMgRG93bm1peF9mb2xkR2VuZXJpYygpCiB2b2lkIERvd25taXhfdGVzdEluZGV4Q29tcHV0YXRpb24odWludDMyX3QgbWFzaykgewotICAgIEFMT0dJKCJUZXN0aW5nIGluZGV4IGNvbXB1dGF0aW9uIGZvciAweCV4OiIsIG1hc2spOworICAgIEFMT0dJKCJUZXN0aW5nIGluZGV4IGNvbXB1dGF0aW9uIGZvciAweCUiIFBSSXgzMiAiOiIsIG1hc2spOwogICAgIC8vIGNoZWNrIGFnYWluc3QgdW5zdXBwb3J0ZWQgY2hhbm5lbHMKICAgICBpZiAobWFzayAmIGtVbnN1cHBvcnRlZCkgewogICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY2hhbm5lbHMgKHRvcCBvciBmcm9udCBsZWZ0L3JpZ2h0IG9mIGNlbnRlcikiKTsKQEAgLTIyMCw3ICsyMjEsNyBAQAogCiAgICAgKnBIYW5kbGUgPSAoZWZmZWN0X2hhbmRsZV90KSBtb2R1bGU7CiAKLSAgICBBTE9HVigiRG93bm1peExpYl9DcmVhdGUoKSAlcCAsIHNpemUgJWQiLCBtb2R1bGUsIHNpemVvZihkb3dubWl4X21vZHVsZV90KSk7CisgICAgQUxPR1YoIkRvd25taXhMaWJfQ3JlYXRlKCkgJXAgLCBzaXplICV6dSIsIG1vZHVsZSwgc2l6ZW9mKGRvd25taXhfbW9kdWxlX3QpKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMjU0LDcgKzI1NSw3IEBACiAgICAgICAgIEFMT0dWKCJEb3dubWl4TGliX0dldERlc2NyaXB0b3IoKSBpPSVkIiwgaSk7CiAgICAgICAgIGlmIChtZW1jbXAodXVpZCwgJmdEZXNjcmlwdG9yc1tpXS0+dXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CiAgICAgICAgICAgICBtZW1jcHkocERlc2NyaXB0b3IsIGdEZXNjcmlwdG9yc1tpXSwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICAgICAgICAgIEFMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yIC0gVVVJRCBtYXRjaGVkIGRvd25taXggdHlwZSAlZCwgVVVJRCA9ICV4IiwKKyAgICAgICAgICAgIEFMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yIC0gVVVJRCBtYXRjaGVkIGRvd25taXggdHlwZSAlZCwgVVVJRCA9ICUiIFBSSXgzMiwKICAgICAgICAgICAgICAgICAgaSwgZ0Rlc2NyaXB0b3JzW2ldLT51dWlkLnRpbWVMb3cpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KQEAgLTMyOCw3ICszMjksNyBAQAogICAgICAgICAgIC8vIGJ5cGFzcyB0aGUgb3B0aW1pemVkIGRvd25taXggcm91dGluZXMgZm9yIHRoZSBjb21tb24gZm9ybWF0cwogICAgICAgICAgIGlmICghRG93bm1peF9mb2xkR2VuZXJpYygKICAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrLCBwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpKSB7Ci0gICAgICAgICAgICAgIEFMT0dFKCJNdWx0aWNoYW5uZWwgY29uZmlndXJhdGlvbiAweCV4IGlzIG5vdCBzdXBwb3J0ZWQiLCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgIEFMT0dFKCJNdWx0aWNoYW5uZWwgY29uZmlndXJhdGlvbiAweCUiIFBSSXgzMiAiIGlzIG5vdCBzdXBwb3J0ZWQiLCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKQEAgLTM1Miw3ICszNTMsNyBAQAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKCFEb3dubWl4X2ZvbGRHZW5lcmljKAogICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJNdWx0aWNoYW5uZWwgY29uZmlndXJhdGlvbiAweCV4IGlzIG5vdCBzdXBwb3J0ZWQiLCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgQUxPR0UoIk11bHRpY2hhbm5lbCBjb25maWd1cmF0aW9uIDB4JSIgUFJJeDMyICIgaXMgbm90IHN1cHBvcnRlZCIsIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzgwLDcgKzM4MSw3IEBACiAKICAgICBwRG93bm1peGVyID0gKGRvd25taXhfb2JqZWN0X3QqKSAmcER3bU1vZHVsZS0+Y29udGV4dDsKIAotICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKKyAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIGNvbW1hbmQgJSIgUFJJdTMyICIgY21kU2l6ZSAlIiBQUkl1MzIsIGNtZENvZGUsIGNtZFNpemUpOwogCiAgICAgc3dpdGNoIChjbWRDb2RlKSB7CiAgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CkBAIC00MDQsNyArNDA1LDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOgotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICVkLCBwUmVwbHlEYXRhOiAlcCIsCisgICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gcENtZERhdGEgJXAsICpyZXBseVNpemUgJSIgUFJJdTMyICIsIHBSZXBseURhdGE6ICVwIiwKICAgICAgICAgICAgICAgICBwQ21kRGF0YSwgKnJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CiAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAogICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fApAQCAtNDEzLDcgKzQxNCw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnJlcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwUmVwbHlEYXRhOwogICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgcENtZERhdGEsIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpOwotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNIHBhcmFtICVkLCByZXBseVNpemUgJWQiLAorICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNIHBhcmFtICUiIFBSSWQzMiAiLCByZXBseVNpemUgJSIgUFJJdTMyLAogICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXJlcC0+ZGF0YSwgcmVwLT52c2l6ZSk7CiAgICAgICAgIHJlcC0+c3RhdHVzID0gRG93bm1peF9nZXRQYXJhbWV0ZXIocERvd25taXhlciwgKihpbnQzMl90ICopcmVwLT5kYXRhLCAmcmVwLT52c2l6ZSwKICAgICAgICAgICAgICAgICByZXAtPmRhdGEgKyBzaXplb2YoaW50MzJfdCkpOwpAQCAtNDIxLDggKzQyMiw4IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTToKLSAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBjbWRTaXplICVkIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICVkLCAiIFwKLSAgICAgICAgICAgICAgICAicFJlcGx5RGF0YSAlcCIsIGNtZFNpemUsIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBjbWRTaXplICVkIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICUiIFBSSXUzMgorICAgICAgICAgICAgICAgICIsIHBSZXBseURhdGEgJXAiLCBjbWRTaXplLCBwQ21kRGF0YSwgKnJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CiAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IChjbWRTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpCiAgICAgICAgICAgICAgICAgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gKGludClzaXplb2YoaW50MzJfdCkpIHsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtNDcxLDcgKzQ3Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogICAgICAgICAvLyBGSVhNRSBjaGFuZ2UgdHlwZSBpZiBwbGF5aW5nIG9uIGhlYWRzZXQgdnMgc3BlYWtlcgotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfU0VUX0RFVklDRTogMHglMDh4IiwgKih1aW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6IDB4JTA4IiBQUkl4MzIsICoodWludDMyX3QgKilwQ21kRGF0YSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IHsKQEAgLTQ5MSw3ICs0OTIsNyBAQAogICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IChpbnQpc2l6ZW9mKHVpbnQzMl90KSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOiAlZCIsICoodWludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERTogJSIgUFJJdTMyLCAqKHVpbnQzMl90ICopcENtZERhdGEpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0U6CkBAIC01MDAsNyArNTAxLDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiRG93bm1peF9Db21tYW5kIGludmFsaWQgY29tbWFuZCAlZCIsY21kQ29kZSk7CisgICAgICAgIEFMT0dXKCJEb3dubWl4X0NvbW1hbmQgaW52YWxpZCBjb21tYW5kICUiIFBSSXUzMiwgY21kQ29kZSk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtNzAyLDI4ICs3MDMsMjggQEAKIGludCBEb3dubWl4X3NldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCBzaXplLCB2b2lkICpwVmFsdWUpIHsKIAogICAgIGludDE2X3QgdmFsdWUxNjsKLSAgICBBTE9HVigiRG93bm1peF9zZXRQYXJhbWV0ZXIsIGNvbnRleHQgJXAsIHBhcmFtICVkLCB2YWx1ZTE2ICVkLCB2YWx1ZTMyICVkIiwKKyAgICBBTE9HVigiRG93bm1peF9zZXRQYXJhbWV0ZXIsIGNvbnRleHQgJXAsIHBhcmFtICUiIFBSSWQzMiAiLCB2YWx1ZTE2ICUiIFBSSWQxNiAiLCB2YWx1ZTMyICUiIFBSSWQzMiwKICAgICAgICAgICAgIHBEb3dubWl4ZXIsIHBhcmFtLCAqKGludDE2X3QgKilwVmFsdWUsICooaW50MzJfdCAqKXBWYWx1ZSk7CiAKICAgICBzd2l0Y2ggKHBhcmFtKSB7CiAKICAgICAgIGNhc2UgRE9XTk1JWF9QQVJBTV9UWVBFOgogICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoZG93bm1peF90eXBlX3QpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIoRE9XTk1JWF9QQVJBTV9UWVBFKSBpbnZhbGlkIHNpemUgJXUsIHNob3VsZCBiZSAlenUiLAorICAgICAgICAgICAgQUxPR0UoIkRvd25taXhfc2V0UGFyYW1ldGVyKERPV05NSVhfUEFSQU1fVFlQRSkgaW52YWxpZCBzaXplICUiIFBSSXUzMiAiLCBzaG91bGQgYmUgJXp1IiwKICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgc2l6ZW9mKGRvd25taXhfdHlwZV90KSk7CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogICAgICAgICB2YWx1ZTE2ID0gKihpbnQxNl90ICopcFZhbHVlOwotICAgICAgICBBTE9HVigic2V0IERPV05NSVhfUEFSQU1fVFlQRSwgdHlwZSAlZCIsIHZhbHVlMTYpOworICAgICAgICBBTE9HVigic2V0IERPV05NSVhfUEFSQU1fVFlQRSwgdHlwZSAlIiBQUklkMTYsIHZhbHVlMTYpOwogICAgICAgICBpZiAoISgodmFsdWUxNiA+IERPV05NSVhfVFlQRV9JTlZBTElEKSAmJiAodmFsdWUxNiA8PSBET1dOTUlYX1RZUEVfTEFTVCkpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIgaW52YWxpZCBET1dOTUlYX1BBUkFNX1RZUEUgdmFsdWUgJWQiLCB2YWx1ZTE2KTsKKyAgICAgICAgICAgIEFMT0dFKCJEb3dubWl4X3NldFBhcmFtZXRlciBpbnZhbGlkIERPV05NSVhfUEFSQU1fVFlQRSB2YWx1ZSAlIiBQUklkMTYsIHZhbHVlMTYpOwogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwRG93bm1peGVyLT50eXBlID0gKGRvd25taXhfdHlwZV90KSB2YWx1ZTE2OwogICAgICAgICBicmVhazsKIAogICAgICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoIkRvd25taXhfc2V0UGFyYW1ldGVyIHVua25vd24gcGFyYW1ldGVyICVkIiwgcGFyYW0pOworICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIgdW5rbm93biBwYXJhbWV0ZXIgJSIgUFJJZDMyLCBwYXJhbSk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIH0KQEAgLTc2MiwxNyArNzYzLDE3IEBACiAKICAgICBjYXNlIERPV05NSVhfUEFSQU1fVFlQRToKICAgICAgIGlmICgqcFNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKLSAgICAgICAgICBBTE9HRSgiRG93bm1peF9nZXRQYXJhbWV0ZXIgaW52YWxpZCBwYXJhbWV0ZXIgc2l6ZSAlenUgZm9yIERPV05NSVhfUEFSQU1fVFlQRSIsICpwU2l6ZSk7CisgICAgICAgICAgQUxPR0UoIkRvd25taXhfZ2V0UGFyYW1ldGVyIGludmFsaWQgcGFyYW1ldGVyIHNpemUgJSIgUFJJdTMyICIgZm9yIERPV05NSVhfUEFSQU1fVFlQRSIsICpwU2l6ZSk7CiAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICB9CiAgICAgICBwVmFsdWUxNiA9IChpbnQxNl90ICopcFZhbHVlOwogICAgICAgKnBWYWx1ZTE2ID0gKGludDE2X3QpIHBEb3dubWl4ZXItPnR5cGU7CiAgICAgICAqcFNpemUgPSBzaXplb2YoaW50MTZfdCk7Ci0gICAgICBBTE9HVigiRG93bm1peF9nZXRQYXJhbWV0ZXIgRE9XTk1JWF9QQVJBTV9UWVBFIGlzICVkIiwgKnBWYWx1ZTE2KTsKKyAgICAgIEFMT0dWKCJEb3dubWl4X2dldFBhcmFtZXRlciBET1dOTUlYX1BBUkFNX1RZUEUgaXMgJSIgUFJJZDE2LCAqcFZhbHVlMTYpOwogICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgQUxPR0UoIkRvd25taXhfZ2V0UGFyYW1ldGVyIHVua25vd24gcGFyYW1ldGVyICVkIiwgcGFyYW0pOworICAgICAgQUxPR0UoIkRvd25taXhfZ2V0UGFyYW1ldGVyIHVua25vd24gcGFyYW1ldGVyICUiIFBSSWQxNiwgcGFyYW0pOwogICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKaW5kZXggNWJkYWEwMy4uNDdjYWI2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcApAQCAtMTYsOCArMTYsOSBAQAogCiAjZGVmaW5lIExPR19UQUcgIkVmZmVjdFZpc3VhbGl6ZXIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPG5ldz4KQEAgLTIyNiw4ICsyMjcsOCBAQAogLy8KIAogaW50IFZpc3VhbGl6ZXJMaWJfQ3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpb0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgLypzZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qaW9JZCovLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSkgewogICAgIGludCByZXQ7CiAgICAgaW50IGk7CkBAIC00MTgsNyArNDE5LDcgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0vLyAgICBBTE9HVigiVmlzdWFsaXplcl9jb21tYW5kIGNvbW1hbmQgJWQgY21kU2l6ZSAlZCIsY21kQ29kZSwgY21kU2l6ZSk7CisvLyAgICBBTE9HVigiVmlzdWFsaXplcl9jb21tYW5kIGNvbW1hbmQgJSIgUFJJdTMyICIgY21kU2l6ZSAlIiBQUkl1MzIsIGNtZENvZGUsIGNtZFNpemUpOwogCiAgICAgc3dpdGNoIChjbWRDb2RlKSB7CiAgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CkBAIC00ODQsMTkgKzQ4NSwxOSBAQAogICAgICAgICB9CiAgICAgICAgIHN3aXRjaCAoKih1aW50MzJfdCAqKXAtPmRhdGEpIHsKICAgICAgICAgY2FzZSBWSVNVQUxJWkVSX1BBUkFNX0NBUFRVUkVfU0laRToKLSAgICAgICAgICAgIEFMT0dWKCJnZXQgbUNhcHR1cmVTaXplID0gJWQiLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKKyAgICAgICAgICAgIEFMT0dWKCJnZXQgbUNhcHR1cmVTaXplID0gJSIgUFJJdTMyLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKICAgICAgICAgICAgICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpID0gcENvbnRleHQtPm1DYXB0dXJlU2l6ZTsKICAgICAgICAgICAgIHAtPnZzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgICpyZXBseVNpemUgKz0gc2l6ZW9mKHVpbnQzMl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFZJU1VBTElaRVJfUEFSQU1fU0NBTElOR19NT0RFOgotICAgICAgICAgICAgQUxPR1YoImdldCBtU2NhbGluZ01vZGUgPSAlZCIsIHBDb250ZXh0LT5tU2NhbGluZ01vZGUpOworICAgICAgICAgICAgQUxPR1YoImdldCBtU2NhbGluZ01vZGUgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tU2NhbGluZ01vZGUpOwogICAgICAgICAgICAgKigodWludDMyX3QgKilwLT5kYXRhICsgMSkgPSBwQ29udGV4dC0+bVNjYWxpbmdNb2RlOwogICAgICAgICAgICAgcC0+dnNpemUgPSBzaXplb2YodWludDMyX3QpOwogICAgICAgICAgICAgKnJlcGx5U2l6ZSArPSBzaXplb2YodWludDMyX3QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVklTVUFMSVpFUl9QQVJBTV9NRUFTVVJFTUVOVF9NT0RFOgotICAgICAgICAgICAgQUxPR1YoImdldCBtTWVhc3VyZW1lbnRNb2RlID0gJWQiLCBwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSk7CisgICAgICAgICAgICBBTE9HVigiZ2V0IG1NZWFzdXJlbWVudE1vZGUgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRNb2RlKTsKICAgICAgICAgICAgICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpID0gcENvbnRleHQtPm1NZWFzdXJlbWVudE1vZGU7CiAgICAgICAgICAgICBwLT52c2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CiAgICAgICAgICAgICAqcmVwbHlTaXplICs9IHNpemVvZih1aW50MzJfdCk7CkBAIC01MjAsMTkgKzUyMSwxOSBAQAogICAgICAgICBzd2l0Y2ggKCoodWludDMyX3QgKilwLT5kYXRhKSB7CiAgICAgICAgIGNhc2UgVklTVUFMSVpFUl9QQVJBTV9DQVBUVVJFX1NJWkU6CiAgICAgICAgICAgICBwQ29udGV4dC0+bUNhcHR1cmVTaXplID0gKigodWludDMyX3QgKilwLT5kYXRhICsgMSk7Ci0gICAgICAgICAgICBBTE9HVigic2V0IG1DYXB0dXJlU2l6ZSA9ICVkIiwgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSk7CisgICAgICAgICAgICBBTE9HVigic2V0IG1DYXB0dXJlU2l6ZSA9ICUiIFBSSXUzMiwgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBWSVNVQUxJWkVSX1BBUkFNX1NDQUxJTkdfTU9ERToKICAgICAgICAgICAgIHBDb250ZXh0LT5tU2NhbGluZ01vZGUgPSAqKCh1aW50MzJfdCAqKXAtPmRhdGEgKyAxKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXQgbVNjYWxpbmdNb2RlID0gJWQiLCBwQ29udGV4dC0+bVNjYWxpbmdNb2RlKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXQgbVNjYWxpbmdNb2RlID0gJSIgUFJJdTMyLCBwQ29udGV4dC0+bVNjYWxpbmdNb2RlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFZJU1VBTElaRVJfUEFSQU1fTEFURU5DWToKICAgICAgICAgICAgIHBDb250ZXh0LT5tTGF0ZW5jeSA9ICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpOwotICAgICAgICAgICAgQUxPR1YoInNldCBtTGF0ZW5jeSA9ICVkIiwgcENvbnRleHQtPm1MYXRlbmN5KTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXQgbUxhdGVuY3kgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tTGF0ZW5jeSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBWSVNVQUxJWkVSX1BBUkFNX01FQVNVUkVNRU5UX01PREU6CiAgICAgICAgICAgICBwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSA9ICooKHVpbnQzMl90ICopcC0+ZGF0YSArIDEpOwotICAgICAgICAgICAgQUxPR1YoInNldCBtTWVhc3VyZW1lbnRNb2RlID0gJWQiLCBwQ29udGV4dC0+bU1lYXN1cmVtZW50TW9kZSk7CisgICAgICAgICAgICBBTE9HVigic2V0IG1NZWFzdXJlbWVudE1vZGUgPSAlIiBQUkl1MzIsIHBDb250ZXh0LT5tTWVhc3VyZW1lbnRNb2RlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgKihpbnQzMl90ICopcFJlcGx5RGF0YSA9IC1FSU5WQUw7CkBAIC01NDUsOSArNTQ2LDkgQEAKIAogCiAgICAgY2FzZSBWSVNVQUxJWkVSX0NNRF9DQVBUVVJFOiB7Ci0gICAgICAgIGludDMyX3QgY2FwdHVyZVNpemUgPSBwQ29udGV4dC0+bUNhcHR1cmVTaXplOworICAgICAgICB1aW50MzJfdCBjYXB0dXJlU2l6ZSA9IHBDb250ZXh0LT5tQ2FwdHVyZVNpemU7CiAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBjYXB0dXJlU2l6ZSkgewotICAgICAgICAgICAgQUxPR1YoIlZJU1VBTElaRVJfQ01EX0NBUFRVUkUoKSBlcnJvciAqcmVwbHlTaXplICVkIGNhcHR1cmVTaXplICVkIiwKKyAgICAgICAgICAgIEFMT0dWKCJWSVNVQUxJWkVSX0NNRF9DQVBUVVJFKCkgZXJyb3IgKnJlcGx5U2l6ZSAlIiBQUkl1MzIgIiBjYXB0dXJlU2l6ZSAlIiBQUkl1MzIsCiAgICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUsIGNhcHR1cmVTaXplKTsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CkBAIC01NzMsNyArNTc0LDcgQEAKICAgICAgICAgICAgICAgICBpbnQzMl90IGNhcHR1cmVQb2ludCA9IHBDb250ZXh0LT5tQ2FwdHVyZUlkeCAtIGNhcHR1cmVTaXplIC0gZGVsdGFTbXBsOwogCiAgICAgICAgICAgICAgICAgaWYgKGNhcHR1cmVQb2ludCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaXplID0gLWNhcHR1cmVQb2ludDsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IC1jYXB0dXJlUG9pbnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gY2FwdHVyZVNpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBjYXB0dXJlU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjA0LDcgKzYwNSw3IEBACiAgICAgICAgIC8vIG1lYXN1cmVtZW50cyBhcmVuJ3QgcmVsZXZhbnQgYW55bW9yZSBhbmQgc2hvdWxkbid0IGJpYXMgdGhlIG5ldyBvbmUpCiAgICAgICAgIGNvbnN0IGludDMyX3QgZGVsYXlNcyA9IFZpc3VhbGl6ZXJfZ2V0RGVsdGFUaW1lTXNGcm9tVXBkYXRlZFRpbWUocENvbnRleHQpOwogICAgICAgICBpZiAoZGVsYXlNcyA+IERJU0NBUkRfTUVBU1VSRU1FTlRTX1RJTUVfTVMpIHsKLSAgICAgICAgICAgIEFMT0dWKCJEaXNjYXJkaW5nIG1lYXN1cmVtZW50cywgbGFzdCBtZWFzdXJlbWVudCBpcyAlZG1zIG9sZCIsIGRlbGF5TXMpOworICAgICAgICAgICAgQUxPR1YoIkRpc2NhcmRpbmcgbWVhc3VyZW1lbnRzLCBsYXN0IG1lYXN1cmVtZW50IGlzICUiIFBSSWQzMiAibXMgb2xkIiwgZGVsYXlNcyk7CiAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGk9MCA7IGk8cENvbnRleHQtPm1NZWFzdXJlbWVudFdpbmRvd1NpemVJbkJ1ZmZlcnMgOyBpKyspIHsKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bVBhc3RNZWFzdXJlbWVudHNbaV0ubUlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bVBhc3RNZWFzdXJlbWVudHNbaV0ubVBlYWtVMTYgPSAwOwpAQCAtNjM4LDE0ICs2MzksMTQgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBJbnRSZXBseURhdGFbTUVBU1VSRU1FTlRfSURYX1BFQUtdID0gKGludDMyX3QpICgyMDAwICogbG9nMTAocGVha1UxNiAvIDMyNzY3LjBmKSk7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIlZJU1VBTElaRVJfQ01EX01FQVNVUkUgcGVhaz0lZCAoJWRtQiksIHJtcz0lLjFmICglZG1CKSIsCisgICAgICAgIEFMT0dWKCJWSVNVQUxJWkVSX0NNRF9NRUFTVVJFIHBlYWs9JSIgUFJJdTE2ICIgKCUiIFBSSWQzMiAibUIpLCBybXM9JS4xZiAoJSIgUFJJZDMyICJtQikiLAogICAgICAgICAgICAgICAgIHBlYWtVMTYsIHBJbnRSZXBseURhdGFbTUVBU1VSRU1FTlRfSURYX1BFQUtdLAogICAgICAgICAgICAgICAgIHJtcywgcEludFJlcGx5RGF0YVtNRUFTVVJFTUVOVF9JRFhfUk1TXSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiVmlzdWFsaXplcl9jb21tYW5kIGludmFsaWQgY29tbWFuZCAlZCIsY21kQ29kZSk7CisgICAgICAgIEFMT0dXKCJWaXN1YWxpemVyX2NvbW1hbmQgaW52YWxpZCBjb21tYW5kICUiIFBSSXUzMiwgY21kQ29kZSk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKaW5kZXggNGFlY2I4MC4uZjExNzkxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KIAogI2luY2x1ZGUgPE9NWF9BdWRpb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgogI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KICNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KIApAQCAtMjM3MCwxMiArMjM3MSw4MSBAQAogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwVlBYRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBpbnQzMl90IGJpdHJhdGU7CisgICAgaW50MzJfdCBpRnJhbWVJbnRlcnZhbCA9IDA7CisgICAgc2l6ZV90IHRzTGF5ZXJzID0gMDsKKyAgICBPTVhfVklERU9fQU5EUk9JRF9WUFhURU1QT1JBTExBWUVSUEFUVEVSTlRZUEUgcGF0dGVybiA9CisgICAgICAgIE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmU7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtWcDhMYXllclJhdGVBbGxvY3Rpb24KKyAgICAgICAgW09NWF9WSURFT19BTkRST0lEX01BWFZQOFRFTVBPUkFMTEFZRVJTXQorICAgICAgICBbT01YX1ZJREVPX0FORFJPSURfTUFYVlA4VEVNUE9SQUxMQVlFUlNdID0geworICAgICAgICB7MTAwLCAxMDAsIDEwMH0sICAvLyAxIGxheWVyCisgICAgICAgIHsgNjAsIDEwMCwgMTAwfSwgIC8vIDIgbGF5ZXJzIHs2MCUsIDQwJX0KKyAgICAgICAgeyA0MCwgIDYwLCAxMDB9LCAgLy8gMyBsYXllcnMgezQwJSwgMjAlLCA0MCV9CisgICAgfTsKICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJiaXRyYXRlIiwgJmJpdHJhdGUpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CisgICAgbXNnLT5maW5kSW50MzIoImktZnJhbWUtaW50ZXJ2YWwiLCAmaUZyYW1lSW50ZXJ2YWwpOwogCiAgICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBiaXRyYXRlTW9kZSA9IGdldEJpdHJhdGVNb2RlKG1zZyk7CiAKKyAgICBmbG9hdCBmcmFtZVJhdGU7CisgICAgaWYgKCFtc2ctPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZSIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgIGludDMyX3QgdG1wOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJmcmFtZS1yYXRlIiwgJnRtcCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBmcmFtZVJhdGUgPSAoZmxvYXQpdG1wOworICAgIH0KKworICAgIEFTdHJpbmcgdHNTY2hlbWE7CisgICAgaWYgKG1zZy0+ZmluZFN0cmluZygidHMtc2NoZW1hIiwgJnRzU2NoZW1hKSkgeworICAgICAgICBpZiAodHNTY2hlbWEgPT0gIndlYnJ0Yy52cDguMS1sYXllciIpIHsKKyAgICAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEM7CisgICAgICAgICAgICB0c0xheWVycyA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAodHNTY2hlbWEgPT0gIndlYnJ0Yy52cDguMi1sYXllciIpIHsKKyAgICAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEM7CisgICAgICAgICAgICB0c0xheWVycyA9IDI7CisgICAgICAgIH0gZWxzZSBpZiAodHNTY2hlbWEgPT0gIndlYnJ0Yy52cDguMy1sYXllciIpIHsKKyAgICAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEM7CisgICAgICAgICAgICB0c0xheWVycyA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiVW5zdXBwb3J0ZWQgdHMtc2NoZW1hIFslc10iLCB0c1NjaGVtYS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFIHZwOHR5cGU7CisgICAgSW5pdE9NWFBhcmFtcygmdnA4dHlwZSk7CisgICAgdnA4dHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRWcDhFbmNvZGVyLAorICAgICAgICAgICAgJnZwOHR5cGUsIHNpemVvZih2cDh0eXBlKSk7CisKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGlmIChpRnJhbWVJbnRlcnZhbCA+IDApIHsKKyAgICAgICAgICAgIHZwOHR5cGUubktleUZyYW1lSW50ZXJ2YWwgPSBzZXRQRnJhbWVzU3BhY2luZyhpRnJhbWVJbnRlcnZhbCwgZnJhbWVSYXRlKTsKKyAgICAgICAgfQorICAgICAgICB2cDh0eXBlLmVUZW1wb3JhbFBhdHRlcm4gPSBwYXR0ZXJuOworICAgICAgICB2cDh0eXBlLm5UZW1wb3JhbExheWVyQ291bnQgPSB0c0xheWVyczsKKyAgICAgICAgaWYgKHRzTGF5ZXJzID4gMCkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBPTVhfVklERU9fQU5EUk9JRF9NQVhWUDhURU1QT1JBTExBWUVSUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgdnA4dHlwZS5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpXSA9CisgICAgICAgICAgICAgICAgICAgIGtWcDhMYXllclJhdGVBbGxvY3Rpb25bdHNMYXllcnMgLSAxXVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYml0cmF0ZU1vZGUgPT0gT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnQpIHsKKyAgICAgICAgICAgIHZwOHR5cGUubk1pblF1YW50aXplciA9IDI7CisgICAgICAgICAgICB2cDh0eXBlLm5NYXhRdWFudGl6ZXIgPSA2MzsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRWcDhFbmNvZGVyLAorICAgICAgICAgICAgICAgICZ2cDh0eXBlLCBzaXplb2YodnA4dHlwZSkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiRXh0ZW5kZWQgVlA4IHBhcmFtZXRlcnMgc2V0IGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIGNvbmZpZ3VyZUJpdHJhdGUoYml0cmF0ZSwgYml0cmF0ZU1vZGUpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCmluZGV4IGU5MjQwNzYuLjZlNTAwM2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCkBAIC03MTgsMTEgKzcxOCw5IEBACiAgICAgICAgICAgICAgICAgZmluaXNoQXN5bmNQcmVwYXJlX2woKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludDY0X3QgYml0cmF0ZTsKLSAgICAgICAgICAgIGlmIChnZXRCaXRyYXRlKCZiaXRyYXRlKSkgewotICAgICAgICAgICAgICAgIHNpemVfdCBjYWNoZWRTaXplID0gbUNhY2hlZFNvdXJjZS0+Y2FjaGVkU2l6ZSgpOwotICAgICAgICAgICAgICAgIGludDY0X3QgY2FjaGVkRHVyYXRpb25VcyA9IGNhY2hlZFNpemUgKiA4MDAwMDAwbGwgLyBiaXRyYXRlOwotCisgICAgICAgICAgICBib29sIGVvczI7CisgICAgICAgICAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXM7CisgICAgICAgICAgICBpZiAoZ2V0Q2FjaGVkRHVyYXRpb25fbCgmY2FjaGVkRHVyYXRpb25VcywgJmVvczIpICYmIG1EdXJhdGlvblVzID4gMCkgewogICAgICAgICAgICAgICAgIGludCBwZXJjZW50YWdlID0gMTAwLjAgKiAoZG91YmxlKWNhY2hlZER1cmF0aW9uVXMgLyBtRHVyYXRpb25VczsKICAgICAgICAgICAgICAgICBpZiAocGVyY2VudGFnZSA+IDEwMCkgewogICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlID0gMTAwOwpAQCAtNzMwLDcgKzcyOCw3IEBACiAKICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0JVRkZFUklOR19VUERBVEUsIHBlcmNlbnRhZ2UpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBiaXRyYXRlIG9mIHRoZSBzdHJlYW0sIHVzZSBhYnNvbHV0ZSBzaXplCisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgYml0cmF0ZS9kdXJhdGlvbiBvZiB0aGUgc3RyZWFtLCB1c2UgYWJzb2x1dGUgc2l6ZQogICAgICAgICAgICAgICAgIC8vIGxpbWl0cyB0byBtYWludGFpbiB0aGUgY2FjaGUuCiAKICAgICAgICAgICAgICAgICBpZiAoKG1GbGFncyAmIFBMQVlJTkcpICYmICFlb3MKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcAppbmRleCBiM2E2YmNjLi5kYzM4ZWE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCkBAIC0yNyw3ICsyNyw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotCiB0ZW1wbGF0ZTxjbGFzcyBUPgogc3RhdGljIHZvaWQgSW5pdE9NWFBhcmFtcyhUICpwYXJhbXMpIHsKICAgICBwYXJhbXMtPm5TaXplID0gc2l6ZW9mKFQpOwpAQCAtMTQ4LDEwICsxNDcsMjAgQEAKICAgICAgIG1FcnJvclJlc2lsaWVuY2UoT01YX0ZBTFNFKSwKICAgICAgIG1Db2xvckZvcm1hdChPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSwKICAgICAgIG1MZXZlbChPTVhfVklERU9fVlA4TGV2ZWxfVmVyc2lvbjApLAorICAgICAgbUtleUZyYW1lSW50ZXJ2YWwoMCksCisgICAgICBtTWluUXVhbnRpemVyKDApLAorICAgICAgbU1heFF1YW50aXplcigwKSwKKyAgICAgIG1UZW1wb3JhbExheWVycygwKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5UeXBlKE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUpLAorICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCgwKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5JZHgoMCksCisgICAgICBtTGFzdFRpbWVzdGFtcCgweDdGRkZGRkZGRkZGRkZGRkZMTCksCiAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcihOVUxMKSwKICAgICAgIG1JbnB1dERhdGFJc01ldGEoZmFsc2UpLAogICAgICAgbUdyYWxsb2NNb2R1bGUoTlVMTCksCiAgICAgICBtS2V5RnJhbWVSZXF1ZXN0ZWQoZmFsc2UpIHsKKyAgICBtZW1zZXQobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sIDAsIHNpemVvZihtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbykpOworICAgIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvWzBdID0gMTAwOwogICAgIGluaXRQb3J0cygpOwogfQogCkBAIC0yMzUsNyArMjQ0LDkgQEAKICAgICBpZiAobUNvZGVjSW50ZXJmYWNlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQotCisgICAgQUxPR0QoIlZQODogaW5pdEVuY29kZXIuIEJSTW9kZTogJXUuIFRTTGF5ZXJzOiAlenUuIEtGOiAldS4gUVA6ICV1IC0gJXUiLAorICAgICAgICAgICh1aW50MzJfdCltQml0cmF0ZUNvbnRyb2xNb2RlLCBtVGVtcG9yYWxMYXllcnMsIG1LZXlGcmFtZUludGVydmFsLAorICAgICAgICAgIG1NaW5RdWFudGl6ZXIsIG1NYXhRdWFudGl6ZXIpOwogICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19lbmNfY29uZmlnX2RlZmF1bHQobUNvZGVjSW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgLy8gQ29kZWMgc3BlY2lmaWMgZmxhZ3MKQEAgLTI3Niw3ICsyODcsNyBAQAogICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdGltZWJhc2UubnVtID0gMTsKICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3RpbWViYXNlLmRlbiA9IDEwMDAwMDA7CiAgICAgLy8gcmNfdGFyZ2V0X2JpdHJhdGUgaXMgaW4ga2JwcywgbUJpdHJhdGUgaW4gYnBzCi0gICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdGFyZ2V0X2JpdHJhdGUgPSBtQml0cmF0ZSAvIDEwMDA7CisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdGFyZ2V0X2JpdHJhdGUgPSAobUJpdHJhdGUgKyA1MDApIC8gMTAwMDsKICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19lbmRfdXNhZ2UgPSBtQml0cmF0ZUNvbnRyb2xNb2RlOwogICAgIC8vIERpc2FibGUgZnJhbWUgZHJvcCAtIG5vdCBhbGxvd2VkIGluIE1lZGlhQ29kZWMgbm93LgogICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2Ryb3BmcmFtZV90aHJlc2ggPSAwOwpAQCAtMjg1LDEwICsyOTYsNiBAQAogICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19yZXNpemVfYWxsb3dlZCA9IDA7CiAgICAgICAgIC8vIFNpbmdsZS1wYXNzIG1vZGUuCiAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcGFzcyA9IFZQWF9SQ19PTkVfUEFTUzsKLSAgICAgICAgLy8gTWluaW11bSBxdWFudGl6YXRpb24gbGV2ZWwuCi0gICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX21pbl9xdWFudGl6ZXIgPSAyOwotICAgICAgICAvLyBNYXhpbXVtIHF1YW50aXphdGlvbiBsZXZlbC4KLSAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfbWF4X3F1YW50aXplciA9IDYzOwogICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgdGFyZ2V0CiAgICAgICAgIC8vIGJpdHJhdGUgLSBleHByZXNzZWQgYXMgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUuCiAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3VuZGVyc2hvb3RfcGN0ID0gMTAwOwpAQCAtMzA2LDEwICszMTMsOTUgQEAKICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19lcnJvcl9yZXNpbGllbnQgPSAxOwogICAgICAgICAvLyBEaXNhYmxlIGxhZ2dlZCBlbmNvZGluZy4KICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19sYWdfaW5fZnJhbWVzID0gMDsKKyAgICAgICAgLy8gTWF4aW11bSBrZXkgZnJhbWUgaW50ZXJ2YWwgLSBmb3IgQ0JSIGJvb3N0IHRvIDMwMDAKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWF4X2Rpc3QgPSAzMDAwOwogICAgICAgICAvLyBFbmNvZGVyIGRldGVybWluZXMgb3B0aW1hbCBrZXkgZnJhbWUgcGxhY2VtZW50IGF1dG9tYXRpY2FsbHkuCiAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21vZGUgPSBWUFhfS0ZfQVVUTzsKICAgICB9CiAKKyAgICAvLyBGcmFtZXMgdGVtcG9yYWwgcGF0dGVybiAtIGZvciBub3cgV2ViUlRDIGxpa2UgcGF0dGVybiBpcyBvbmx5IHN1cHBvcnRlZC4KKyAgICBzd2l0Y2ggKG1UZW1wb3JhbExheWVycykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAxOgorICAgICAgICB7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDI6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnMgPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcGVyaW9kaWNpdHkgPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMF0gPSAwOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMV0gPSAxOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblswXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzFdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzJdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bM10gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzRdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNV0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzZdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bN10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDM6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnMgPSAzOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSA0OworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMl0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcGVyaW9kaWNpdHkgPSA0OworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMF0gPSAwOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMV0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMl0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbM10gPSAyOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblswXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzFdID0ga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsyXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblszXSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzRdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNV0gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls2XSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bN10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HRSgiV3JvbmcgbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyAldSIsIG1UZW1wb3JhbExheWVycyk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCBiaXRyYXRlIHZhbHVlcyBmb3IgZWFjaCBsYXllcgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVyczsgaSsrKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3RhcmdldF9iaXRyYXRlW2ldID0KKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3RhcmdldF9iaXRyYXRlICoKKyAgICAgICAgICAgIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvW2ldIC8gMTAwOworICAgIH0KKyAgICBpZiAobUtleUZyYW1lSW50ZXJ2YWwgPiAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21heF9kaXN0ID0gbUtleUZyYW1lSW50ZXJ2YWw7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21pbl9kaXN0ID0gbUtleUZyYW1lSW50ZXJ2YWw7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21vZGUgPSBWUFhfS0ZfQVVUTzsKKyAgICB9CisgICAgaWYgKG1NaW5RdWFudGl6ZXIgPiAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX21pbl9xdWFudGl6ZXIgPSBtTWluUXVhbnRpemVyOworICAgIH0KKyAgICBpZiAobU1heFF1YW50aXplciA+IDApIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfbWF4X3F1YW50aXplciA9IG1NYXhRdWFudGl6ZXI7CisgICAgfQorCiAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY19pbml0KG1Db2RlY0NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0ludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbiwKQEAgLTQ2Niw2ICs1NTgsMjQgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRWcDhFbmNvZGVyOiB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQU5EUk9JRF9WUDhFTkNPREVSVFlQRSAqdnA4QW5kcm9pZFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFICopcGFyYW07CisKKyAgICAgICAgICAgICAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5LZXlGcmFtZUludGVydmFsID0gbUtleUZyYW1lSW50ZXJ2YWw7CisgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiA9IG1UZW1wb3JhbFBhdHRlcm5UeXBlOworICAgICAgICAgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQ291bnQgPSBtVGVtcG9yYWxMYXllcnM7CisgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+bk1pblF1YW50aXplciA9IG1NaW5RdWFudGl6ZXI7CisgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+bk1heFF1YW50aXplciA9IG1NYXhRdWFudGl6ZXI7CisgICAgICAgICAgICAgICAgbWVtY3B5KHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLAorICAgICAgICAgICAgICAgICAgICAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbywgc2l6ZW9mKG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZDogewogICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnByb2ZpbGVBbmRMZXZlbCA9CiAgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcGFyYW07CkBAIC01NTIsMTEgKzY2MiwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIGludGVybmFsU2V0VnA4UGFyYW1zKAogICAgICAgICAgICAgICAgIChjb25zdCBPTVhfVklERU9fUEFSQU1fVlA4VFlQRSAqKXBhcmFtKTsKIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkVnA4RW5jb2RlcjoKKyAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFNldEFuZHJvaWRWcDhQYXJhbXMoCisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFICopcGFyYW0pOworCiAgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbEN1cnJlbnQ6CiAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxTZXRQcm9maWxlTGV2ZWwoCiAgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcGFyYW0pOwogCi0gICAgICAgIGNhc2UgT01YX0luZGV4VmVuZG9yU3RhcnRVbnVzZWQ6CisgICAgICAgIGNhc2Uga1N0b3JlTWV0YURhdGFFeHRlbnNpb25JbmRleDoKICAgICAgICAgewogICAgICAgICAgICAgLy8gc3RvcmVNZXRhRGF0YUluQnVmZmVycwogICAgICAgICAgICAgY29uc3QgU3RvcmVNZXRhRGF0YUluQnVmZmVyc1BhcmFtcyAqc3RvcmVQYXJhbSA9CkBAIC02NjUsNiArNzc5LDUwIEBACiAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiB9CiAKK09NWF9FUlJPUlRZUEUgU29mdFZQWEVuY29kZXI6OmludGVybmFsU2V0QW5kcm9pZFZwOFBhcmFtcygKKyAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX0FORFJPSURfVlA4RU5DT0RFUlRZUEUqIHZwOEFuZHJvaWRQYXJhbXMpIHsKKyAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+blBvcnRJbmRleCAhPSBrT3V0cHV0UG9ydEluZGV4KSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgIH0KKyAgICBpZiAodnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiAhPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lICYmCisgICAgICAgIHZwOEFuZHJvaWRQYXJhbXMtPmVUZW1wb3JhbFBhdHRlcm4gIT0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgfQorICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckNvdW50ID4gT01YX1ZJREVPX0FORFJPSURfTUFYVlA4VEVNUE9SQUxMQVlFUlMpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICB9CisgICAgaWYgKHZwOEFuZHJvaWRQYXJhbXMtPm5NaW5RdWFudGl6ZXIgPiB2cDhBbmRyb2lkUGFyYW1zLT5uTWF4UXVhbnRpemVyKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgfQorCisgICAgbVRlbXBvcmFsUGF0dGVyblR5cGUgPSB2cDhBbmRyb2lkUGFyYW1zLT5lVGVtcG9yYWxQYXR0ZXJuOworICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5lVGVtcG9yYWxQYXR0ZXJuID09IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybldlYlJUQykgeworICAgICAgICBtVGVtcG9yYWxMYXllcnMgPSB2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckNvdW50OworICAgIH0gZWxzZSBpZiAodnA4QW5kcm9pZFBhcmFtcy0+ZVRlbXBvcmFsUGF0dGVybiA9PSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lKSB7CisgICAgICAgIG1UZW1wb3JhbExheWVycyA9IDA7CisgICAgfQorICAgIC8vIENoZWNrIHRoZSBiaXRyYXRlIGRpc3RyaWJ1dGlvbiBiZXR3ZWVuIGxheWVycyBpcyBpbiBpbmNyZWFzaW5nIG9yZGVyCisgICAgaWYgKG1UZW1wb3JhbExheWVycyA+IDEpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVGVtcG9yYWxMYXllcnMgLSAxOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2cDhBbmRyb2lkUGFyYW1zLT5uVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpICsgMV0gPD0KKyAgICAgICAgICAgICAgICAgICAgdnA4QW5kcm9pZFBhcmFtcy0+blRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9baV0pIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiV3JvbmcgYml0cmF0ZSByYXRpbyAtIHNob3VsZCBiZSBpbiBpbmNyZWFzaW5nIG9yZGVyLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUtleUZyYW1lSW50ZXJ2YWwgPSB2cDhBbmRyb2lkUGFyYW1zLT5uS2V5RnJhbWVJbnRlcnZhbDsKKyAgICBtTWluUXVhbnRpemVyID0gdnA4QW5kcm9pZFBhcmFtcy0+bk1pblF1YW50aXplcjsKKyAgICBtTWF4UXVhbnRpemVyID0gdnA4QW5kcm9pZFBhcmFtcy0+bk1heFF1YW50aXplcjsKKyAgICBtZW1jcHkobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sIHZwOEFuZHJvaWRQYXJhbXMtPm5UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvLAorICAgICAgICAgICAgc2l6ZW9mKG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvKSk7CisgICAgQUxPR0QoIlZQODogaW50ZXJuYWxTZXRBbmRyb2lkVnA4UGFyYW1zLiBCUk1vZGU6ICV1LiBUUzogJXp1LiBLRjogJXUuIgorICAgICAgICAgICIgUVA6ICV1IC0gJXUgQlIwOiAldS4gQlIxOiAldS4gQlIyOiAldSIsCisgICAgICAgICAgKHVpbnQzMl90KW1CaXRyYXRlQ29udHJvbE1vZGUsIG1UZW1wb3JhbExheWVycywgbUtleUZyYW1lSW50ZXJ2YWwsCisgICAgICAgICAgbU1pblF1YW50aXplciwgbU1heFF1YW50aXplciwgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMF0sCisgICAgICAgICAgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bMV0sIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvWzJdKTsKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KIAogT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6aW50ZXJuYWxTZXRGb3JtYXRQYXJhbXMoCiAgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSogZm9ybWF0KSB7CkBAIC03MjgsNyArODg2LDcgQEAKICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqZGVmID0gJmVkaXRQb3J0SW5mbyhrSW5wdXRQb3J0SW5kZXgpLT5tRGVmOwogICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKLSAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IHBvcnQtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICBkZWYtPmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gbUZyYW1lcmF0ZTsKICAgICAgICAgZGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gbUNvbG9yRm9ybWF0OwogICAgICAgICBkZWYgPSAmZWRpdFBvcnRJbmZvKGtPdXRwdXRQb3J0SW5kZXgpLT5tRGVmOwogICAgICAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKQEAgLTc3MCw2ICs5MjgsNzQgQEAKICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKIH0KIAordnB4X2VuY19mcmFtZV9mbGFnc190IFNvZnRWUFhFbmNvZGVyOjpnZXRFbmNvZGVGbGFncygpIHsKKyAgICB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZmxhZ3MgPSAwOworICAgIGludCBwYXR0ZXJuSWR4ID0gbVRlbXBvcmFsUGF0dGVybklkeCAlIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGg7CisgICAgbVRlbXBvcmFsUGF0dGVybklkeCsrOworICAgIHN3aXRjaCAobVRlbXBvcmFsUGF0dGVybltwYXR0ZXJuSWR4XSkgeworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3Q6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeToKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgbm8gYnJlYWsgaGVyZS4KKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW46CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlQWx0cmVmV2l0aG91dERlcGVuZGVuY3k6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgbm8gYnJlYWsgaGVyZS4KKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVBbHRyZWY6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmQWx0cmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgbm8gYnJlYWsgaGVyZS4KKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVOb25lOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9FTlRST1BZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfRU5UUk9QWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjoKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY6CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsOgorICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBmbGFnczsKK30KIAogdm9pZCBTb2Z0VlBYRW5jb2Rlcjo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewogICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciBpZiBub3QgYWxyZWFkeQpAQCAtODU0LDYgKzEwODAsOSBAQAogICAgICAgICAgICAgICAgICAgICAga0lucHV0QnVmZmVyQWxpZ25tZW50LCBzb3VyY2UpOwogCiAgICAgICAgIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBmbGFncyA9IDA7CisgICAgICAgIGlmIChtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZmxhZ3MgPSBnZXRFbmNvZGVGbGFncygpOworICAgICAgICB9CiAgICAgICAgIGlmIChtS2V5RnJhbWVSZXF1ZXN0ZWQpIHsKICAgICAgICAgICAgIGZsYWdzIHw9IFZQWF9FRkxBR19GT1JDRV9LRjsKICAgICAgICAgICAgIG1LZXlGcmFtZVJlcXVlc3RlZCA9IGZhbHNlOwpAQCAtODc0LDcgKzExMDMsMTMgQEAKICAgICAgICAgICAgIG1CaXRyYXRlVXBkYXRlZCA9IGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgdWludDMyX3QgZnJhbWVEdXJhdGlvbiA9ICh1aW50MzJfdCkoKCh1aW50NjRfdCkxMDAwMDAwIDw8IDE2KSAvIG1GcmFtZXJhdGUpOworICAgICAgICB1aW50MzJfdCBmcmFtZUR1cmF0aW9uOworICAgICAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPiBtTGFzdFRpbWVzdGFtcCkgeworICAgICAgICAgICAgZnJhbWVEdXJhdGlvbiA9ICh1aW50MzJfdCkoaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgLSBtTGFzdFRpbWVzdGFtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZUR1cmF0aW9uID0gKHVpbnQzMl90KSgoKHVpbnQ2NF90KTEwMDAwMDAgPDwgMTYpIC8gbUZyYW1lcmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RUaW1lc3RhbXAgPSBpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcDsKICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY29kZSgKICAgICAgICAgICAgICAgICBtQ29kZWNDb250ZXh0LAogICAgICAgICAgICAgICAgICZyYXdfZnJhbWUsCkBAIC05MjEsMTAgKzExNTYsOSBAQAogT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6Z2V0RXh0ZW5zaW9uSW5kZXgoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CiAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIikpIHsKLSAgICAgICAgKmluZGV4ID0gT01YX0luZGV4VmVuZG9yU3RhcnRVbnVzZWQ7CisgICAgICAgICooaW50MzJfdCopaW5kZXggPSBrU3RvcmVNZXRhRGF0YUV4dGVuc2lvbkluZGV4OwogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9Ci0KICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgobmFtZSwgaW5kZXgpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAppbmRleCAxYzk4M2FiLi5jNWE4M2QxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKQEAgLTkxLDYgKzkxLDQ3IEBACiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCk7CiAKIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtTdG9yZU1ldGFEYXRhRXh0ZW5zaW9uSW5kZXggPSBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZCArIDEsCisgICAgfTsKKworICAgIGVudW0gVGVtcG9yYWxSZWZlcmVuY2VzIHsKKyAgICAgICAgLy8gRm9yIDEgbGF5ZXIgY2FzZTogcmVmZXJlbmNlIGFsbCAobGFzdCwgZ29sZGVuLCBhbmQgYWx0IHJlZiksIGJ1dCBvbmx5CisgICAgICAgIC8vIHVwZGF0ZSBsYXN0LgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsID0gMTIsCisgICAgICAgIC8vIEZpcnN0IGJhc2UgbGF5ZXIgZnJhbWUgZm9yIDMgdGVtcG9yYWwgbGF5ZXJzLCB3aGljaCB1cGRhdGVzIGxhc3QgYW5kCisgICAgICAgIC8vIGdvbGRlbiB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZiA9IDExLAorICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmID0gMTAsCisgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZiA9IDksCisgICAgICAgIC8vIEJhc2UgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWYgPSA4LAorICAgICAgICAvLyBIaWdoZXN0IGVuaGFjZW1lbnQgbGF5ZXIgd2l0aG91dCBkZXBlbmRlbmN5IG9uIGdvbGRlbiB3aXRoIGFsdCByZWYKKyAgICAgICAgLy8gZGVwZW5kZW5jeS4KKyAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmID0gNywKKyAgICAgICAgLy8gU2Vjb25kIGxheWVyIGFuZCBsYXN0IGZyYW1lIGluIGN5Y2xlLCBmb3IgMiBsYXllcnMuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZiA9IDYsCisgICAgICAgIC8vIEhpZ2hlc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmUgPSA1LAorICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZiA9IDQsCisgICAgICAgIC8vIFNlY29uZCBlbmhhbmNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gcHJldmlvdXMgZnJhbWVzIGluCisgICAgICAgIC8vIHRoZSBzZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZldpdGhvdXREZXBlbmRlbmN5ID0gMywKKyAgICAgICAgLy8gRmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbiA9IDIsCisgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBwcmV2aW91cyBmcmFtZXMgaW4KKyAgICAgICAgLy8gdGhlIGZpcnN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeSA9IDEsCisgICAgICAgIC8vIEJhc2UgbGF5ZXIuCisgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3QgPSAwLAorICAgIH07CisgICAgZW51bSB7CisgICAgICAgIGtNYXhUZW1wb3JhbFBhdHRlcm4gPSA4CisgICAgfTsKKwogICAgIC8vIG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZCBwZXIgcG9ydAogICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTnVtQnVmZmVycyA9IDQ7CiAKQEAgLTE1OSw2ICsyMDAsMzYgQEAKICAgICAvLyBzb21ldGhpbmcgZWxzZS4KICAgICBPTVhfVklERU9fVlA4TEVWRUxUWVBFIG1MZXZlbDsKIAorICAgIC8vIEtleSBmcmFtZSBpbnRlcnZhbCBpbiBmcmFtZXMKKyAgICB1aW50MzJfdCBtS2V5RnJhbWVJbnRlcnZhbDsKKworICAgIC8vIE1pbmltdW0gKGJlc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgdWludDMyX3QgbU1pblF1YW50aXplcjsKKworICAgIC8vIE1heGltdW0gKHdvcnN0IHF1YWxpdHkpIHF1YW50aXplcgorICAgIHVpbnQzMl90IG1NYXhRdWFudGl6ZXI7CisKKyAgICAvLyBOdW1iZXIgb2YgY29kaW5nIHRlbXBvcmFsIGxheWVycyB0byBiZSB1c2VkLgorICAgIHNpemVfdCBtVGVtcG9yYWxMYXllcnM7CisKKyAgICAvLyBUZW1wb3JhbCBsYXllciBiaXRyYXJlIHJhdGlvIGluIHBlcmNlbnRhZ2UKKyAgICB1aW50MzJfdCBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tPTVhfVklERU9fQU5EUk9JRF9NQVhWUDhURU1QT1JBTExBWUVSU107CisKKyAgICAvLyBUZW1wb3JhbCBwYXR0ZXJuIHR5cGUKKyAgICBPTVhfVklERU9fQU5EUk9JRF9WUFhURU1QT1JBTExBWUVSUEFUVEVSTlRZUEUgbVRlbXBvcmFsUGF0dGVyblR5cGU7CisKKyAgICAvLyBUZW1wb3JhbCBwYXR0ZXJuIGxlbmd0aAorICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworCisgICAgLy8gVGVtcG9yYWwgcGF0dGVybiBjdXJyZW50IGluZGV4CisgICAgc2l6ZV90IG1UZW1wb3JhbFBhdHRlcm5JZHg7CisKKyAgICAvLyBGcmFtZSB0eXBlIHRlbXBvcmFsIHBhdHRlcm4KKyAgICBUZW1wb3JhbFJlZmVyZW5jZXMgbVRlbXBvcmFsUGF0dGVybltrTWF4VGVtcG9yYWxQYXR0ZXJuXTsKKworICAgIC8vIExhc3QgaW5wdXQgYnVmZmVyIHRpbWVzdGFtcAorICAgIE9NWF9USUNLUyBtTGFzdFRpbWVzdGFtcDsKKwogICAgIC8vIENvbnZlcnNpb24gYnVmZmVyIGlzIG5lZWRlZCB0byBjb252ZXJ0IHNlbWkKICAgICAvLyBwbGFuYXIgeXV2NDIwIHRvIHBsYW5hciBmb3JtYXQKICAgICAvLyBJdCBpcyBvbmx5IGFsbG9jYXRlZCBpZiBpbnB1dCBmb3JtYXQgaXMKQEAgLTE4NCw2ICsyNTUsOSBAQAogICAgIC8vIGR0b3IuCiAgICAgc3RhdHVzX3QgcmVsZWFzZUVuY29kZXIoKTsKIAorICAgIC8vIEdldCBjdXJyZW50IGVuY29kZSBmbGFncworICAgIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBnZXRFbmNvZGVGbGFncygpOworCiAgICAgLy8gSGFuZGxlcyBwb3J0IGNoYW5nZXMgd2l0aCByZXNwZWN0IHRvIGNvbG9yIGZvcm1hdHMKICAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Rm9ybWF0UGFyYW1zKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUqIGZvcm1hdCk7CkBAIC0yMDUsNiArMjc5LDEwIEBACiAgICAgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFZwOFBhcmFtcygKICAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX1ZQOFRZUEUqIHZwOFBhcmFtcyk7CiAKKyAgICAvLyBIYW5kbGVzIEFuZHJvaWQgdnA4IHNwZWNpZmljIHBhcmFtZXRlcnMuCisgICAgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldEFuZHJvaWRWcDhQYXJhbXMoCisgICAgICAgIGNvbnN0IE9NWF9WSURFT19QQVJBTV9BTkRST0lEX1ZQOEVOQ09ERVJUWVBFKiB2cDhBbmRyb2lkUGFyYW1zKTsKKwogICAgIC8vIFVwZGF0ZXMgZW5jb2RlciBwcm9maWxlCiAgICAgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFByb2ZpbGVMZXZlbCgKICAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUqIHByb2ZpbGVBbmRMZXZlbCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAppbmRleCBmY2Q4MjVmLi5mMmQ1MDFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKQEAgLTE5Nyw2NCArMTk3LDY0IEBACiAKIHZvaWQgQVN0cmluZzo6YXBwZW5kKGludCB4KSB7CiAgICAgY2hhciBzWzE2XTsKLSAgICBzcHJpbnRmKHMsICIlZCIsIHgpOwotCisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVkIiwgeCk7CisgICAgQ0hFQ0soKHJlc3VsdCA+IDApICYmICgoc2l6ZV90KSByZXN1bHQpIDwgc2l6ZW9mKHMpKTsKICAgICBhcHBlbmQocyk7CiB9CiAKIHZvaWQgQVN0cmluZzo6YXBwZW5kKHVuc2lnbmVkIHgpIHsKICAgICBjaGFyIHNbMTZdOwotICAgIHNwcmludGYocywgIiV1IiwgeCk7Ci0KKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJXUiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIAogdm9pZCBBU3RyaW5nOjphcHBlbmQobG9uZyB4KSB7Ci0gICAgY2hhciBzWzE2XTsKLSAgICBzcHJpbnRmKHMsICIlbGQiLCB4KTsKLQorICAgIGNoYXIgc1szMl07CisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVsZCIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZCh1bnNpZ25lZCBsb25nIHgpIHsKLSAgICBjaGFyIHNbMTZdOwotICAgIHNwcmludGYocywgIiVsdSIsIHgpOwotCisgICAgY2hhciBzWzMyXTsKKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJWx1IiwgeCk7CisgICAgQ0hFQ0soKHJlc3VsdCA+IDApICYmICgoc2l6ZV90KSByZXN1bHQpIDwgc2l6ZW9mKHMpKTsKICAgICBhcHBlbmQocyk7CiB9CiAKIHZvaWQgQVN0cmluZzo6YXBwZW5kKGxvbmcgbG9uZyB4KSB7CiAgICAgY2hhciBzWzMyXTsKLSAgICBzcHJpbnRmKHMsICIlbGxkIiwgeCk7Ci0KKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJWxsZCIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZCh1bnNpZ25lZCBsb25nIGxvbmcgeCkgewogICAgIGNoYXIgc1szMl07Ci0gICAgc3ByaW50ZihzLCAiJWxsdSIsIHgpOwotCisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHMsIHNpemVvZihzKSwgIiVsbHUiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIAogdm9pZCBBU3RyaW5nOjphcHBlbmQoZmxvYXQgeCkgewogICAgIGNoYXIgc1sxNl07Ci0gICAgc3ByaW50ZihzLCAiJWYiLCB4KTsKLQorICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzLCBzaXplb2YocyksICIlZiIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZChkb3VibGUgeCkgewogICAgIGNoYXIgc1sxNl07Ci0gICAgc3ByaW50ZihzLCAiJWYiLCB4KTsKLQorICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzLCBzaXplb2YocyksICIlZiIsIHgpOworICAgIENIRUNLKChyZXN1bHQgPiAwKSAmJiAoKHNpemVfdCkgcmVzdWx0KSA8IHNpemVvZihzKSk7CiAgICAgYXBwZW5kKHMpOwogfQogCiB2b2lkIEFTdHJpbmc6OmFwcGVuZCh2b2lkICp4KSB7Ci0gICAgY2hhciBzWzE2XTsKLSAgICBzcHJpbnRmKHMsICIlcCIsIHgpOwotCisgICAgY2hhciBzWzMyXTsKKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocywgc2l6ZW9mKHMpLCAiJXAiLCB4KTsKKyAgICBDSEVDSygocmVzdWx0ID4gMCkgJiYgKChzaXplX3QpIHJlc3VsdCkgPCBzaXplb2YocykpOwogICAgIGFwcGVuZChzKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDNkZjU3YjQuLjE2ZjZjNTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTI5LDYgKzI5LDggQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBib29sIEVYVFJBX0NIRUNLID0gdHJ1ZTsKQEAgLTc2MywxMyArNzY1LDEzIEBACiB2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6Om9uQnVmZmVyc1JlbGVhc2VkKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKLSAgICB1aW50MzJfdCBzbG90TWFzazsKKyAgICB1aW50NjRfdCBzbG90TWFzazsKICAgICBpZiAobUNvbnN1bWVyLT5nZXRSZWxlYXNlZEJ1ZmZlcnMoJnNsb3RNYXNrKSAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HVygib25CdWZmZXJzUmVsZWFzZWQ6IHVuYWJsZSB0byBnZXQgcmVsZWFzZWQgYnVmZmVyIHNldCIpOwotICAgICAgICBzbG90TWFzayA9IDB4ZmZmZmZmZmY7CisgICAgICAgIHNsb3RNYXNrID0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMOwogICAgIH0KIAotICAgIEFMT0dWKCJvbkJ1ZmZlcnNSZWxlYXNlZDogMHglMDh4Iiwgc2xvdE1hc2spOworICAgIEFMT0dWKCJvbkJ1ZmZlcnNSZWxlYXNlZDogMHglMDE2IiBQUkl4NjQsIHNsb3RNYXNrKTsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFM7IGkrKykgewogICAgICAgICBpZiAoKHNsb3RNYXNrICYgMHgwMSkgIT0gMCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAppbmRleCBkMGE3YTU4Li4zNTU1M2VmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1Jlc2FtcGxlclNpbmMiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUwogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMzcsMTIgKzM4LDE0IEBACiAjZGVmaW5lIFVTRV9JTkxJTkVfQVNTRU1CTFkgKGZhbHNlKQogI2VuZGlmCiAKLSNpZiBVU0VfSU5MSU5FX0FTU0VNQkxZICYmIGRlZmluZWQoX19BUk1fTkVPTl9fKQotI2RlZmluZSBVU0VfTkVPTiAodHJ1ZSkKKyNpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKSB8fCBkZWZpbmVkKF9fQVJNX05FT05fXykKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorI2RlZmluZSBVU0VfTkVPTgogI2Vsc2UKLSNkZWZpbmUgVVNFX05FT04gKGZhbHNlKQorI3VuZGVmIFVTRV9ORU9OCiAjZW5kaWYKIAorI2RlZmluZSBVTlVTRUQoeCkgKCh2b2lkKSh4KSkKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjM0LDggKzYzNyw4IEBACiB9CiAKIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KLXZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpmaWx0ZXJDb2VmZmljaWVudCgKLSAgICAgICAgaW50MzJfdCogb3V0LCB1aW50MzJfdCBwaGFzZSwgY29uc3QgaW50MTZfdCAqc2FtcGxlcywgdWludDMyX3QgdlJMKQordm9pZCBBdWRpb1Jlc2FtcGxlclNpbmM6OmZpbHRlckNvZWZmaWNpZW50KGludDMyX3QqIG91dCwgdWludDMyX3QgcGhhc2UsCisgICAgICAgICBjb25zdCBpbnQxNl90ICpzYW1wbGVzLCB1aW50MzJfdCB2UkwpCiB7CiAgICAgLy8gTk9URTogYmUgdmVyeSBjYXJlZnVsIHdoZW4gbW9kaWZ5aW5nIHRoZSBjb2RlIGhlcmUuIHJlZ2lzdGVyCiAgICAgLy8gcHJlc3N1cmUgaXMgdmVyeSBoaWdoIGFuZCBhIHNtYWxsIGNoYW5nZSBtaWdodCBjYXVzZSB0aGUgY29tcGlsZXIKQEAgLTY2MiwxNjAgKzY2NSwxNzEgQEAKIAogICAgIHNpemVfdCBjb3VudCA9IG9mZnNldDsKIAotICAgIGlmICghVVNFX05FT04pIHsKLSAgICAgICAgaW50MzJfdCBsID0gMDsKLSAgICAgICAgaW50MzJfdCByID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzUCsrLCBvZmZzZXQsIGxlcnBQLCBzUCk7Ci0gICAgICAgICAgICBzUCAtPSBDSEFOTkVMUzsKLSAgICAgICAgICAgIGludGVycG9sYXRlPENIQU5ORUxTPihsLCByLCBjb2Vmc04rKywgb2Zmc2V0LCBsZXJwTiwgc04pOwotICAgICAgICAgICAgc04gKz0gQ0hBTk5FTFM7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0WzBdICs9IDIgKiBtdWxSTCgxLCBsLCB2UkwpOwotICAgICAgICBvdXRbMV0gKz0gMiAqIG11bFJMKDAsIHIsIHZSTCk7Ci0gICAgfSBlbHNlIGlmIChDSEFOTkVMUyA9PSAxKSB7CisjaWZuZGVmIFVTRV9ORU9OCisgICAgaW50MzJfdCBsID0gMDsKKyAgICBpbnQzMl90IHIgPSAwOworICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKKyAgICAgICAgaW50ZXJwb2xhdGU8Q0hBTk5FTFM+KGwsIHIsIGNvZWZzUCsrLCBvZmZzZXQsIGxlcnBQLCBzUCk7CisgICAgICAgIHNQIC09IENIQU5ORUxTOworICAgICAgICBpbnRlcnBvbGF0ZTxDSEFOTkVMUz4obCwgciwgY29lZnNOKyssIG9mZnNldCwgbGVycE4sIHNOKTsKKyAgICAgICAgc04gKz0gQ0hBTk5FTFM7CisgICAgfQorICAgIG91dFswXSArPSAyICogbXVsUkwoMSwgbCwgdlJMKTsKKyAgICBvdXRbMV0gKz0gMiAqIG11bFJMKDAsIHIsIHZSTCk7CisjZWxzZQorICAgIFVOVVNFRCh2UkwpOworICAgIGlmIChDSEFOTkVMUyA9PSAxKSB7CiAgICAgICAgIGludDMyX3QgY29uc3QqIGNvZWZzUDEgPSBjb2Vmc1AgKyBvZmZzZXQ7CiAgICAgICAgIGludDMyX3QgY29uc3QqIGNvZWZzTjEgPSBjb2Vmc04gKyBvZmZzZXQ7CiAgICAgICAgIHNQIC09IENIQU5ORUxTKjM7Ci0gICAgICAgIGFzbSAoCi0gICAgICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIiAgICAvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQotICAgICAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzFdLCAlW2xlcnBOXSAgICAgICAgICBcbiIgICAgLy8gbG9hZCB0aGUgbmVnYXRpdmUgcGhhc2UKLSAgICAgICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iICAgIC8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCi0gICAgICAgICAgICAidnNobC5zMzIgICAgICAgZDIsIGQyLCAjMTYgICAgICAgICAgICAgIFxuIiAgICAvLyBjb252ZXJ0IHRvIDMyIGJpdHMKIAotICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAgICAgICAgICJ2bGQxLjE2ICAgICAgICB7IGQ0fSwgWyVbc1BdXSAgICAgICAgICAgXG4iICAgIC8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICAgICAidmxkMS4zMiAgICAgICAgeyBxOH0sIFslW2NvZWZzUDBdOjEyOF0hIFxuIiAgICAvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAgICAgInZsZDEuMzIgICAgICAgIHsgcTl9LCBbJVtjb2Vmc1AxXToxMjhdISBcbiIgICAgLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgICAgICJ2bGQxLjE2ICAgICAgICB7IGQ2fSwgWyVbc05dXSEgICAgICAgICAgXG4iICAgIC8vIGxvYWQgNCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMH0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIiAgICAvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTF9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIgICAgLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KKyAgICAgICAgaW50MzJ4NF90IHN1bTsKKyAgICAgICAgaW50MzJ4Ml90IGxlcnBQTjsKKyAgICAgICAgbGVycFBOID0gdmR1cF9uX3MzMigwKTsKKyAgICAgICAgbGVycFBOID0gdmxkMV9sYW5lX3MzMigoaW50MzJfdCAqKSZsZXJwUCwgbGVycFBOLCAwKTsKKyAgICAgICAgbGVycFBOID0gdmxkMV9sYW5lX3MzMigoaW50MzJfdCAqKSZsZXJwTiwgbGVycFBOLCAxKTsKKyAgICAgICAgbGVycFBOID0gdnNobF9uX3MzMihsZXJwUE4sIDE2KTsKKyAgICAgICAgc3VtID0gdmR1cHFfbl9zMzIoMCk7CiAKLSAgICAgICAgICAgICJ2cmV2NjQuMTYgICAgICBkNCwgZDQgICAgICAgICAgICAgICAgICAgXG4iICAgIC8vIHJldmVyc2UgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKyAgICAgICAgaW50MTZ4NF90IHNhbXBsZVAsIHNhbXBsZU47CisgICAgICAgIGludDMyeDRfdCBzYW1wbGVQRXh0LCBzYW1wbGVORXh0OworICAgICAgICBpbnQzMng0X3QgY29lZnNQVjAsIGNvZWZzUFYxLCBjb2Vmc05WMCwgY29lZnNOVjE7CiAKLSAgICAgICAgICAgICJ2c3ViLnMzMiAgICAgICAgcTksICBxOSwgIHE4ICAgICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAgICAgInZzdWIuczMyICAgICAgIHExMSwgcTExLCBxMTAgICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCi0gICAgICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDQsICMxNSAgICAgICAgICAgIFxuIiAgICAvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCisgICAgICAgIGNvZWZzUCA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNQLCAxNik7CisgICAgICAgIGNvZWZzTiA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNOLCAxNik7CisgICAgICAgIGNvZWZzUDEgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzUDEsIDE2KTsKKyAgICAgICAgY29lZnNOMSA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNOMSwgMTYpOworICAgICAgICBmb3IgKDsgY291bnQgPiAwOyBjb3VudCAtPSA0KSB7CisgICAgICAgICAgICBzYW1wbGVQID0gdmxkMV9zMTYoc1ApOworICAgICAgICAgICAgc2FtcGxlTiA9IHZsZDFfczE2KHNOKTsKKyAgICAgICAgICAgIGNvZWZzUFYwID0gdmxkMXFfczMyKGNvZWZzUCk7CisgICAgICAgICAgICBjb2Vmc05WMCA9IHZsZDFxX3MzMihjb2Vmc04pOworICAgICAgICAgICAgY29lZnNQVjEgPSB2bGQxcV9zMzIoY29lZnNQMSk7CisgICAgICAgICAgICBjb2Vmc05WMSA9IHZsZDFxX3MzMihjb2Vmc04xKTsKKyAgICAgICAgICAgIHNQIC09IDQ7CisgICAgICAgICAgICBzTiArPSA0OworICAgICAgICAgICAgY29lZnNQICs9IDQ7CisgICAgICAgICAgICBjb2Vmc04gKz0gNDsKKyAgICAgICAgICAgIGNvZWZzUDEgKz0gNDsKKyAgICAgICAgICAgIGNvZWZzTjEgKz0gNDsKIAotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgICBxOSwgIHE5LCBkMlswXSAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgcTExLCBxMTEsIGQyWzFdICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQgb2YgY29lZnMKLSAgICAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsICBkNiwgIzE1ICAgICAgICAgICAgXG4iICAgIC8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgICAgIHNhbXBsZVAgPSB2cmV2NjRfczE2KHNhbXBsZVApOwogCi0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgIHE4LCAgcTgsICBxOSAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTAsIHExMCwgcTExICAgICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwNCkgMm5kIHNldAotICAgICAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIgICAgLy8gdXBkYXRlIGxvb3AgY291bnRlcgorICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKQorICAgICAgICAgICAgY29lZnNQVjEgPSB2c3VicV9zMzIoY29lZnNQVjEsIGNvZWZzUFYwKTsKKyAgICAgICAgICAgIGNvZWZzTlYxID0gdnN1YnFfczMyKGNvZWZzTlYxLCBjb2Vmc05WMCk7CisgICAgICAgICAgICBzYW1wbGVQRXh0ID0gdnNobGxfbl9zMTYoc2FtcGxlUCwgMTUpOworICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKQorICAgICAgICAgICAgY29lZnNQVjEgPSB2cXJkbXVsaHFfbGFuZV9zMzIoY29lZnNQVjEsIGxlcnBQTiwgMCk7CisgICAgICAgICAgICBjb2Vmc05WMSA9IHZxcmRtdWxocV9sYW5lX3MzMihjb2Vmc05WMSwgbGVycFBOLCAxKTsKKyAgICAgICAgICAgIHNhbXBsZU5FeHQgPSB2c2hsbF9uX3MxNihzYW1wbGVOLCAxNSk7CisgICAgICAgICAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCisgICAgICAgICAgICBjb2Vmc1BWMCA9IHZhZGRxX3MzMihjb2Vmc1BWMCwgY29lZnNQVjEpOworICAgICAgICAgICAgY29lZnNOVjAgPSB2YWRkcV9zMzIoY29lZnNOVjAsIGNvZWZzTlYxKTsKIAotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICBcbiIgICAgLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIgICAgLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzggICAgICAgICBcbiIgICAgLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKyAgICAgICAgICAgIHNhbXBsZVBFeHQgPSB2cXJkbXVsaHFfczMyKHNhbXBsZVBFeHQsIGNvZWZzUFYwKTsKKyAgICAgICAgICAgIHNhbXBsZU5FeHQgPSB2cXJkbXVsaHFfczMyKHNhbXBsZU5FeHQsIGNvZWZzTlYwKTsKKyAgICAgICAgICAgIHN1bSA9IHZhZGRxX3MzMihzdW0sIHNhbXBsZVBFeHQpOworICAgICAgICAgICAgc3VtID0gdmFkZHFfczMyKHN1bSwgc2FtcGxlTkV4dCk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJ4Ml90IHZvbHVtZXNWLCBvdXRWOworICAgICAgICB2b2x1bWVzViA9IHZsZDFfczMyKG1Wb2x1bWVTSU1EKTsKKyAgICAgICAgb3V0ViA9IHZsZDFfczMyKG91dCk7CiAKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgXG4iICAgIC8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIiAgICAvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAvL2FkZCBhbGwgNCBwYXJ0aWFsIHN1bXMKKyAgICAgICAgaW50MzJ4Ml90IHN1bUxvdywgc3VtSGlnaDsKKyAgICAgICAgc3VtTG93ID0gdmdldF9sb3dfczMyKHN1bSk7CisgICAgICAgIHN1bUhpZ2ggPSB2Z2V0X2hpZ2hfczMyKHN1bSk7CisgICAgICAgIHN1bUxvdyA9IHZwYWRkX3MzMihzdW1Mb3csIHN1bUhpZ2gpOworICAgICAgICBzdW1Mb3cgPSB2cGFkZF9zMzIoc3VtTG93LCBzdW1Mb3cpOwogCi0gICAgICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgICAvLyBsb29wCi0KLSAgICAgICAgICAgICJ2bGQxLnMzMiAgICAgICB7ZDJ9LCBbJVt2TFJdXSAgICAgICAgICAgXG4iICAgIC8vIGxvYWQgdm9sdW1lcwotICAgICAgICAgICAgInZsZDEuczMyICAgICAgIHtkM30sICVbb3V0XSAgICAgICAgICAgICBcbiIgICAgLy8gbG9hZCB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAidnBhZGQuczMyICAgICAgZDAsIGQwLCBkMSAgICAgICAgICAgICAgIFxuIiAgICAvLyBhZGQgYWxsIDQgcGFydGlhbCBzdW1zCi0gICAgICAgICAgICAidnBhZGQuczMyICAgICAgZDAsIGQwLCBkMCAgICAgICAgICAgICAgIFxuIiAgICAvLyB0b2dldGhlcgotICAgICAgICAgICAgInZkdXAuaTMyICAgICAgIGQwLCBkMFswXSAgICAgICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJsZWF2ZSBMLFIgY2hhbm5lbHMKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBkMCwgZDAsIGQyICAgICAgICAgICAgICAgXG4iICAgIC8vIGFwcGx5IHZvbHVtZQotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIGQzLCBkMywgZDAgICAgICAgICAgICAgICBcbiIgICAgLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgICAgICJ2c3QxLnMzMiAgICAgICB7ZDN9LCAlW291dF0gICAgICAgICAgICAgXG4iICAgIC8vIHN0b3JlIHJlc3VsdAotCi0gICAgICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKLSAgICAgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKLSAgICAgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCi0gICAgICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKLSAgICAgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCi0gICAgICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKLSAgICAgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKLSAgICAgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQotICAgICAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCi0gICAgICAgICAgICAgIFtsZXJwTl0gICAiciIgKGxlcnBOKSwKLSAgICAgICAgICAgICAgW3ZMUl0gICAgICJyIiAobVZvbHVtZVNJTUQpCi0gICAgICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAotICAgICAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAotICAgICAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCi0gICAgICAgICAgICAgICJxMTIiLCAicTE0IgotICAgICAgICApOworICAgICAgICBzdW1Mb3cgPSB2cXJkbXVsaF9zMzIoc3VtTG93LCB2b2x1bWVzVik7CisgICAgICAgIG91dFYgPSB2YWRkX3MzMihvdXRWLCBzdW1Mb3cpOworICAgICAgICB2c3QxX3MzMihvdXQsIG91dFYpOwogICAgIH0gZWxzZSBpZiAoQ0hBTk5FTFMgPT0gMikgewogICAgICAgICBpbnQzMl90IGNvbnN0KiBjb2Vmc1AxID0gY29lZnNQICsgb2Zmc2V0OwogICAgICAgICBpbnQzMl90IGNvbnN0KiBjb2Vmc04xID0gY29lZnNOICsgb2Zmc2V0OwogICAgICAgICBzUCAtPSBDSEFOTkVMUyozOwotICAgICAgICBhc20gKAotICAgICAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIgICAgLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UKLSAgICAgICAgICAgICJ2bW92LjMyICAgICAgICBkMlsxXSwgJVtsZXJwTl0gICAgICAgICAgXG4iICAgIC8vIGxvYWQgdGhlIG5lZ2F0aXZlIHBoYXNlCi0gICAgICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIiAgICAvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAotICAgICAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIgICAgLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKLSAgICAgICAgICAgICJ2c2hsLnMzMiAgICAgICBkMiwgZDIsICMxNiAgICAgICAgICAgICAgXG4iICAgIC8vIGNvbnZlcnQgdG8gMzIgYml0cwogCi0gICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNCxkNX0sIFslW3NQXV0gICAgICAgICBcbiIgICAgLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgICAgICJ2bGQxLjMyICAgICAgICB7IHE4fSwgWyVbY29lZnNQMF06MTI4XSEgXG4iICAgIC8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0gICAgICAgICAgICAidmxkMS4zMiAgICAgICAgeyBxOX0sIFslW2NvZWZzUDFdOjEyOF0hIFxuIiAgICAvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgotICAgICAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNixkN30sIFslW3NOXV0hICAgICAgICBcbiIgICAgLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iICAgIC8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0gICAgICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMX0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIiAgICAvLyBsb2FkIDQgMzItYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgorICAgICAgICBpbnQzMng0X3Qgc3VtMCwgc3VtMTsKKyAgICAgICAgaW50MzJ4Ml90IGxlcnBQTjsKIAotICAgICAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIgICAgLy8gcmV2ZXJzZSAyIGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQotICAgICAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ1LCBkNSAgICAgICAgICAgICAgICAgICBcbiIgICAgLy8gcmV2ZXJzZSAyIGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorICAgICAgICBsZXJwUE4gPSB2ZHVwX25fczMyKDApOworICAgICAgICBsZXJwUE4gPSB2bGQxX2xhbmVfczMyKChpbnQzMl90ICopJmxlcnBQLCBsZXJwUE4sIDApOworICAgICAgICBsZXJwUE4gPSB2bGQxX2xhbmVfczMyKChpbnQzMl90ICopJmxlcnBOLCBsZXJwUE4sIDEpOworICAgICAgICBsZXJwUE4gPSB2c2hsX25fczMyKGxlcnBQTiwgMTYpOworICAgICAgICBzdW0wID0gdmR1cHFfbl9zMzIoMCk7CisgICAgICAgIHN1bTEgPSB2ZHVwcV9uX3MzMigwKTsKIAotICAgICAgICAgICAgInZzdWIuczMyICAgICAgICBxOSwgIHE5LCAgcTggICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAxKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICAgICAidnN1Yi5zMzIgICAgICAgcTExLCBxMTEsIHExMCAgICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKLSAgICAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsICBkNCwgIzE1ICAgICAgICAgICAgXG4iICAgIC8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLSAgICAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsICBkNSwgIzE1ICAgICAgICAgICAgXG4iICAgIC8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKKyAgICAgICAgaW50MTZ4NHgyX3Qgc2FtcGxlUCwgc2FtcGxlTjsKKyAgICAgICAgaW50MzJ4NHgyX3Qgc2FtcGxlUEV4dCwgc2FtcGxlTkV4dDsKKyAgICAgICAgaW50MzJ4NF90IGNvZWZzUFYwLCBjb2Vmc1BWMSwgY29lZnNOVjAsIGNvZWZzTlYxOwogCi0gICAgICAgICAgICAidnFyZG11bGguczMyICAgIHE5LCAgcTksIGQyWzBdICAgICAgICAgIFxuIiAgICAvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTEsIHExMSwgZDJbMV0gICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMykgMm5kIHNldCBvZiBjb2VmcwotICAgICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgIGQ2LCAjMTUgICAgICAgICAgICBcbiIgICAgLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotICAgICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNSwgIGQ3LCAjMTUgICAgICAgICAgICBcbiIgICAgLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cworICAgICAgICBjb2Vmc1AgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzUCwgMTYpOworICAgICAgICBjb2Vmc04gPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzTiwgMTYpOworICAgICAgICBjb2Vmc1AxID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc1AxLCAxNik7CisgICAgICAgIGNvZWZzTjEgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzTjEsIDE2KTsKKyAgICAgICAgZm9yICg7IGNvdW50ID4gMDsgY291bnQgLT0gNCkgeworICAgICAgICAgICAgc2FtcGxlUCA9IHZsZDJfczE2KHNQKTsKKyAgICAgICAgICAgIHNhbXBsZU4gPSB2bGQyX3MxNihzTik7CisgICAgICAgICAgICBjb2Vmc1BWMCA9IHZsZDFxX3MzMihjb2Vmc1ApOworICAgICAgICAgICAgY29lZnNOVjAgPSB2bGQxcV9zMzIoY29lZnNOKTsKKyAgICAgICAgICAgIGNvZWZzUFYxID0gdmxkMXFfczMyKGNvZWZzUDEpOworICAgICAgICAgICAgY29lZnNOVjEgPSB2bGQxcV9zMzIoY29lZnNOMSk7CisgICAgICAgICAgICBzUCAtPSA4OworICAgICAgICAgICAgc04gKz0gODsKKyAgICAgICAgICAgIGNvZWZzUCArPSA0OworICAgICAgICAgICAgY29lZnNOICs9IDQ7CisgICAgICAgICAgICBjb2Vmc1AxICs9IDQ7CisgICAgICAgICAgICBjb2Vmc04xICs9IDQ7CiAKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICAgcTgsICBxOCwgIHE5ICAgICAgICAgICAgXG4iICAgIC8vIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIHExMCwgcTEwLCBxMTEgICAgICAgICAgICBcbiIgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXA0KSAybmQgc2V0Ci0gICAgICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIiAgICAvLyB1cGRhdGUgbG9vcCBjb3VudGVyCisgICAgICAgICAgICBzYW1wbGVQLnZhbFswXSA9IHZyZXY2NF9zMTYoc2FtcGxlUC52YWxbMF0pOworICAgICAgICAgICAgc2FtcGxlUC52YWxbMV0gPSB2cmV2NjRfczE2KHNhbXBsZVAudmFsWzFdKTsKIAotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICBcbiIgICAgLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICBcbiIgICAgLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIgICAgLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTAgICAgICAgICAgICBcbiIgICAgLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIgICAgLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKKyAgICAgICAgICAgIC8vIGludGVycG9sYXRlIChzdGVwMSkKKyAgICAgICAgICAgIGNvZWZzUFYxID0gdnN1YnFfczMyKGNvZWZzUFYxLCBjb2Vmc1BWMCk7CisgICAgICAgICAgICBjb2Vmc05WMSA9IHZzdWJxX3MzMihjb2Vmc05WMSwgY29lZnNOVjApOworICAgICAgICAgICAgc2FtcGxlUEV4dC52YWxbMF0gPSB2c2hsbF9uX3MxNihzYW1wbGVQLnZhbFswXSwgMTUpOworICAgICAgICAgICAgc2FtcGxlUEV4dC52YWxbMV0gPSB2c2hsbF9uX3MxNihzYW1wbGVQLnZhbFsxXSwgMTUpOworICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKQorICAgICAgICAgICAgY29lZnNQVjEgPSB2cXJkbXVsaHFfbGFuZV9zMzIoY29lZnNQVjEsIGxlcnBQTiwgMCk7CisgICAgICAgICAgICBjb2Vmc05WMSA9IHZxcmRtdWxocV9sYW5lX3MzMihjb2Vmc05WMSwgbGVycFBOLCAxKTsKKyAgICAgICAgICAgIHNhbXBsZU5FeHQudmFsWzBdID0gdnNobGxfbl9zMTYoc2FtcGxlTi52YWxbMF0sIDE1KTsKKyAgICAgICAgICAgIHNhbXBsZU5FeHQudmFsWzFdID0gdnNobGxfbl9zMTYoc2FtcGxlTi52YWxbMV0sIDE1KTsKKyAgICAgICAgICAgIC8vIGludGVycG9sYXRlIChzdGVwMykKKyAgICAgICAgICAgIGNvZWZzUFYwID0gdmFkZHFfczMyKGNvZWZzUFYwLCBjb2Vmc1BWMSk7CisgICAgICAgICAgICBjb2Vmc05WMCA9IHZhZGRxX3MzMihjb2Vmc05WMCwgY29lZnNOVjEpOwogCi0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTIgICAgICAgICAgICAgIFxuIiAgICAvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICBcbiIgICAgLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNCAgICAgICAgICAgICAgXG4iICAgIC8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTUgICAgICAgICAgICAgIFxuIiAgICAvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAgICAgc2FtcGxlUEV4dC52YWxbMF0gPSB2cXJkbXVsaHFfczMyKHNhbXBsZVBFeHQudmFsWzBdLCBjb2Vmc1BWMCk7CisgICAgICAgICAgICBzYW1wbGVQRXh0LnZhbFsxXSA9IHZxcmRtdWxocV9zMzIoc2FtcGxlUEV4dC52YWxbMV0sIGNvZWZzUFYwKTsKKyAgICAgICAgICAgIHNhbXBsZU5FeHQudmFsWzBdID0gdnFyZG11bGhxX3MzMihzYW1wbGVORXh0LnZhbFswXSwgY29lZnNOVjApOworICAgICAgICAgICAgc2FtcGxlTkV4dC52YWxbMV0gPSB2cXJkbXVsaHFfczMyKHNhbXBsZU5FeHQudmFsWzFdLCBjb2Vmc05WMCk7CisgICAgICAgICAgICBzdW0wID0gdmFkZHFfczMyKHN1bTAsIHNhbXBsZVBFeHQudmFsWzBdKTsKKyAgICAgICAgICAgIHN1bTEgPSB2YWRkcV9zMzIoc3VtMSwgc2FtcGxlUEV4dC52YWxbMV0pOworICAgICAgICAgICAgc3VtMCA9IHZhZGRxX3MzMihzdW0wLCBzYW1wbGVORXh0LnZhbFswXSk7CisgICAgICAgICAgICBzdW0xID0gdmFkZHFfczMyKHN1bTEsIHNhbXBsZU5FeHQudmFsWzFdKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMngyX3Qgdm9sdW1lc1YsIG91dFY7CisgICAgICAgIHZvbHVtZXNWID0gdmxkMV9zMzIobVZvbHVtZVNJTUQpOworICAgICAgICBvdXRWID0gdmxkMV9zMzIob3V0KTsKIAotICAgICAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIgICAgLy8gbG9vcAorICAgICAgICAvL2FkZCBhbGwgNCBwYXJ0aWFsIHN1bXMKKyAgICAgICAgaW50MzJ4Ml90IHN1bUxvdzAsIHN1bUhpZ2gwLCBzdW1Mb3cxLCBzdW1IaWdoMTsKKyAgICAgICAgc3VtTG93MCA9IHZnZXRfbG93X3MzMihzdW0wKTsKKyAgICAgICAgc3VtSGlnaDAgPSB2Z2V0X2hpZ2hfczMyKHN1bTApOworICAgICAgICBzdW1Mb3cxID0gdmdldF9sb3dfczMyKHN1bTEpOworICAgICAgICBzdW1IaWdoMSA9IHZnZXRfaGlnaF9zMzIoc3VtMSk7CisgICAgICAgIHN1bUxvdzAgPSB2cGFkZF9zMzIoc3VtTG93MCwgc3VtSGlnaDApOworICAgICAgICBzdW1Mb3cwID0gdnBhZGRfczMyKHN1bUxvdzAsIHN1bUxvdzApOworICAgICAgICBzdW1Mb3cxID0gdnBhZGRfczMyKHN1bUxvdzEsIHN1bUhpZ2gxKTsKKyAgICAgICAgc3VtTG93MSA9IHZwYWRkX3MzMihzdW1Mb3cxLCBzdW1Mb3cxKTsKIAotICAgICAgICAgICAgInZsZDEuczMyICAgICAgIHtkMn0sIFslW3ZMUl1dICAgICAgICAgICBcbiIgICAgLy8gbG9hZCB2b2x1bWVzCi0gICAgICAgICAgICAidmxkMS5zMzIgICAgICAge2QzfSwgJVtvdXRdICAgICAgICAgICAgIFxuIiAgICAvLyBsb2FkIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICJ2cGFkZC5zMzIgICAgICBkMCwgZDAsIGQxICAgICAgICAgICAgICAgXG4iICAgIC8vIGFkZCBhbGwgNCBwYXJ0aWFsIHN1bXMgZnJvbSBxMAotICAgICAgICAgICAgInZwYWRkLnMzMiAgICAgIGQ4LCBkOCwgZDkgICAgICAgICAgICAgICBcbiIgICAgLy8gYWRkIGFsbCA0IHBhcnRpYWwgc3VtcyBmcm9tIHE0Ci0gICAgICAgICAgICAidnBhZGQuczMyICAgICAgZDAsIGQwLCBkMCAgICAgICAgICAgICAgIFxuIiAgICAvLyB0b2dldGhlcgotICAgICAgICAgICAgInZwYWRkLnMzMiAgICAgIGQ4LCBkOCwgZDggICAgICAgICAgICAgICBcbiIgICAgLy8gdG9nZXRoZXIKLSAgICAgICAgICAgICJ2dHJuLnMzMiAgICAgICBkMCwgZDggICAgICAgICAgICAgICAgICAgXG4iICAgIC8vIGludGVybGFjZSBMLFIgY2hhbm5lbHMKLSAgICAgICAgICAgICJ2cXJkbXVsaC5zMzIgICBkMCwgZDAsIGQyICAgICAgICAgICAgICAgXG4iICAgIC8vIGFwcGx5IHZvbHVtZQotICAgICAgICAgICAgInZhZGQuczMyICAgICAgIGQzLCBkMywgZDAgICAgICAgICAgICAgICBcbiIgICAgLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgICAgICJ2c3QxLnMzMiAgICAgICB7ZDN9LCAlW291dF0gICAgICAgICAgICAgXG4iICAgIC8vIHN0b3JlIHJlc3VsdAotCi0gICAgICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKLSAgICAgICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKLSAgICAgICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCi0gICAgICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKLSAgICAgICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCi0gICAgICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKLSAgICAgICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKLSAgICAgICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQotICAgICAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCi0gICAgICAgICAgICAgIFtsZXJwTl0gICAiciIgKGxlcnBOKSwKLSAgICAgICAgICAgICAgW3ZMUl0gICAgICJyIiAobVZvbHVtZVNJTUQpCi0gICAgICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAotICAgICAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLCAicTQiLAotICAgICAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCi0gICAgICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCi0gICAgICAgICk7CisgICAgICAgIHN1bUxvdzAgPSB2dHJuX3MzMihzdW1Mb3cwLCBzdW1Mb3cxKS52YWxbMF07CisgICAgICAgIHN1bUxvdzAgPSB2cXJkbXVsaF9zMzIoc3VtTG93MCwgdm9sdW1lc1YpOworICAgICAgICBvdXRWID0gdmFkZF9zMzIob3V0Viwgc3VtTG93MCk7CisgICAgICAgIHZzdDFfczMyKG91dCwgb3V0Vik7CiAgICAgfQorI2VuZGlmCiB9CiAKIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAppbmRleCAzZDg1ZTkwLi41YTQ4YTYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCkBAIC00OTcsNiArNDk3LDcgQEAKIAogICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwogCisgICAgbVN0cmVhbWluZ1JlcXVlc3RMaXN0LmNsZWFyKCk7CiAgICAgcmV0dXJuIG1EZXZpY2UtPmZsdXNoKGxhc3RGcmFtZU51bWJlcik7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCmluZGV4IGE2NDkxN2QuLmM3YWJlM2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcApAQCAtNDIyLDYyICs0MjIsMjQgQEAKICAgICAgICAgfQogCiAgICAgICAgIHJlcXVlc3RMaXN0LT5wdXNoX2JhY2sobmV3UmVxdWVzdCk7Ci0gICAgICAgIGlmIChuZXdSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCA+IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCIlczogcmVxdWVzdElkID0gJSIgUFJJZDMyLCBfX0ZVTkNUSU9OX18sIG5ld1JlcXVlc3QtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkKTsKLSAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCIlczogcmVxdWVzdElkID0gJSIgUFJJZDMyLCBfX0ZVTkNUSU9OX18sIG5ld1JlcXVlc3QtPm1SZXN1bHRFeHRyYXMucmVxdWVzdElkKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICAvLyBUT0RPOiB0YWtlIG93bmVyc2hpcCBvZiB0aGUgcmVxdWVzdAotCi0gICAgc3dpdGNoIChtU3RhdHVzKSB7Ci0gICAgICAgIGNhc2UgU1RBVFVTX0VSUk9SOgotICAgICAgICAgICAgQ0xPR0UoIkRldmljZSBoYXMgZW5jb3VudGVyZWQgYSBzZXJpb3VzIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgU1RBVFVTX1VOSU5JVElBTElaRUQ6Ci0gICAgICAgICAgICBDTE9HRSgiRGV2aWNlIG5vdCBpbml0aWFsaXplZCIpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBjYXNlIFNUQVRVU19VTkNPTkZJR1VSRUQ6Ci0gICAgICAgICAgICAvLyBNYXkgYmUgbGF6aWx5IGNvbmZpZ3VyaW5nIHN0cmVhbXMsIHdpbGwgY2hlY2sgZHVyaW5nIHNldHVwCi0gICAgICAgIGNhc2UgU1RBVFVTX0NPTkZJR1VSRUQ6Ci0gICAgICAgIGNhc2UgU1RBVFVTX0FDVElWRToKLSAgICAgICAgICAgIC8vIE9LCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFNFVF9FUlJfTCgiVW5leHBlY3RlZCBzdGF0dXM6ICVkIiwgbVN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IG5ld1JlcXVlc3QgPSBzZXRVcFJlcXVlc3RMb2NrZWQocmVxdWVzdCk7Ci0gICAgaWYgKG5ld1JlcXVlc3QgPT0gTlVMTCkgewotICAgICAgICBDTE9HRSgiQ2FuJ3QgY3JlYXRlIGNhcHR1cmUgcmVxdWVzdCIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHJlcyA9IG1SZXF1ZXN0VGhyZWFkLT5xdWV1ZVJlcXVlc3QobmV3UmVxdWVzdCk7Ci0gICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soLyphY3RpdmUqLyB0cnVlLCBrQWN0aXZlVGltZW91dCk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIFNFVF9FUlJfTCgiQ2FuJ3QgdHJhbnNpdGlvbiB0byBhY3RpdmUgaW4gJWYgc2Vjb25kcyEiLAotICAgICAgICAgICAgICAgICAgICBrQWN0aXZlVGltZW91dC8xZTkpOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJDYW1lcmEgJWQ6IENhcHR1cmUgcmVxdWVzdCBlbnF1ZXVlZCIsIG1JZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0xPR0UoIkNhbm5vdCBxdWV1ZSByZXF1ZXN0LiBJbXBvc3NpYmxlLiIpOyAvLyBxdWV1ZVJlcXVlc3QgYWx3YXlzIHJldHVybnMgT0suCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHJldHVybiByZXM7CisgICAgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gcmVxdWVzdHM7CisgICAgcmVxdWVzdHMucHVzaF9iYWNrKHJlcXVlc3QpOworICAgIHJldHVybiBjYXB0dXJlTGlzdChyZXF1ZXN0cywgLypsYXN0RnJhbWVOdW1iZXIqL05VTEwpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzdWJtaXRSZXF1ZXN0c0hlbHBlcigKLSAgICAgICAgY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLCBib29sIHJlcGVhdGluZywgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgICAgIGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywgYm9vbCByZXBlYXRpbmcsCisgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTQ5NywxNSArNDU5LDkgQEAKICAgICB9CiAKICAgICBpZiAocmVwZWF0aW5nKSB7Ci0gICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXF1ZXN0VGhyZWFkLT5nZXRMYXN0RnJhbWVOdW1iZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+c2V0UmVwZWF0aW5nUmVxdWVzdHMocmVxdWVzdExpc3QpOworICAgICAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+c2V0UmVwZWF0aW5nUmVxdWVzdHMocmVxdWVzdExpc3QsIGxhc3RGcmFtZU51bWJlcik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnF1ZXVlUmVxdWVzdExpc3QocmVxdWVzdExpc3QpOwotICAgICAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpsYXN0RnJhbWVOdW1iZXIgPSBtUmVxdWVzdFRocmVhZC0+Z2V0TGFzdEZyYW1lTnVtYmVyKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnF1ZXVlUmVxdWVzdExpc3QocmVxdWVzdExpc3QsIGxhc3RGcmFtZU51bWJlcik7CiAgICAgfQogCiAgICAgaWYgKHJlcyA9PSBPSykgewpAQCAtNTE0LDcgKzQ3MCw4IEBACiAgICAgICAgICAgICBTRVRfRVJSX0woIkNhbid0IHRyYW5zaXRpb24gdG8gYWN0aXZlIGluICVmIHNlY29uZHMhIiwKICAgICAgICAgICAgICAgICAgICAga0FjdGl2ZVRpbWVvdXQvMWU5KTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiQ2FtZXJhICVkOiBDYXB0dXJlIHJlcXVlc3QgZW5xdWV1ZWQiLCBtSWQpOworICAgICAgICBBTE9HVigiQ2FtZXJhICVkOiBDYXB0dXJlIHJlcXVlc3QgJSIgUFJJZDMyICIgZW5xdWV1ZWQiLCBtSWQsCisgICAgICAgICAgICAgICgqKHJlcXVlc3RMaXN0LmJlZ2luKCkpKS0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIENMT0dFKCJDYW5ub3QgcXVldWUgcmVxdWVzdC4gSW1wb3NzaWJsZS4iKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTUzMyw0NyArNDkwLDEwIEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzZXRTdHJlYW1pbmdSZXF1ZXN0KGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBzd2l0Y2ggKG1TdGF0dXMpIHsKLSAgICAgICAgY2FzZSBTVEFUVVNfRVJST1I6Ci0gICAgICAgICAgICBDTE9HRSgiRGV2aWNlIGhhcyBlbmNvdW50ZXJlZCBhIHNlcmlvdXMgZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgY2FzZSBTVEFUVVNfVU5JTklUSUFMSVpFRDoKLSAgICAgICAgICAgIENMT0dFKCJEZXZpY2Ugbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGNhc2UgU1RBVFVTX1VOQ09ORklHVVJFRDoKLSAgICAgICAgICAgIC8vIE1heSBiZSBsYXppbHkgY29uZmlndXJpbmcgc3RyZWFtcywgd2lsbCBjaGVjayBkdXJpbmcgc2V0dXAKLSAgICAgICAgY2FzZSBTVEFUVVNfQ09ORklHVVJFRDoKLSAgICAgICAgY2FzZSBTVEFUVVNfQUNUSVZFOgotICAgICAgICAgICAgLy8gT0sKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgU0VUX0VSUl9MKCJVbmV4cGVjdGVkIHN0YXR1czogJWQiLCBtU3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzcDxDYXB0dXJlUmVxdWVzdD4gbmV3UmVwZWF0aW5nUmVxdWVzdCA9IHNldFVwUmVxdWVzdExvY2tlZChyZXF1ZXN0KTsKLSAgICBpZiAobmV3UmVwZWF0aW5nUmVxdWVzdCA9PSBOVUxMKSB7Ci0gICAgICAgIENMT0dFKCJDYW4ndCBjcmVhdGUgcmVwZWF0aW5nIHJlcXVlc3QiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBSZXF1ZXN0TGlzdCBuZXdSZXBlYXRpbmdSZXF1ZXN0czsKLSAgICBuZXdSZXBlYXRpbmdSZXF1ZXN0cy5wdXNoX2JhY2sobmV3UmVwZWF0aW5nUmVxdWVzdCk7Ci0KLSAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+c2V0UmVwZWF0aW5nUmVxdWVzdHMobmV3UmVwZWF0aW5nUmVxdWVzdHMpOwotICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgd2FpdFVudGlsU3RhdGVUaGVuUmVsb2NrKC8qYWN0aXZlKi8gdHJ1ZSwga0FjdGl2ZVRpbWVvdXQpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBTRVRfRVJSX0woIkNhbid0IHRyYW5zaXRpb24gdG8gYWN0aXZlIGluICVmIHNlY29uZHMhIiwKLSAgICAgICAgICAgICAgICAgICAga0FjdGl2ZVRpbWVvdXQvMWU5KTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiQ2FtZXJhICVkOiBSZXBlYXRpbmcgcmVxdWVzdCBzZXQiLCBtSWQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzOworICAgIExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+IHJlcXVlc3RzOworICAgIHJlcXVlc3RzLnB1c2hfYmFjayhyZXF1ZXN0KTsKKyAgICByZXR1cm4gc2V0U3RyZWFtaW5nUmVxdWVzdExpc3QocmVxdWVzdHMsIC8qbGFzdEZyYW1lTnVtYmVyKi9OVUxMKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c2V0U3RyZWFtaW5nUmVxdWVzdExpc3QoY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJnJlcXVlc3RzLApAQCAtNjI2LDEzICs1NDYsNyBAQAogICAgIH0KICAgICBBTE9HVigiQ2FtZXJhICVkOiBDbGVhcmluZyByZXBlYXRpbmcgcmVxdWVzdCIsIG1JZCk7CiAKLSAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKLSAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXF1ZXN0VGhyZWFkLT5nZXRMYXN0RnJhbWVOdW1iZXIoKTsKLSAgICAgICAgQUxPR1YoIiVzOiBsYXN0RnJhbWVOdW1iZXIgYWRkcmVzcyAlcCwgdmFsdWUgJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sIGxhc3RGcmFtZU51bWJlciwKLSAgICAgICAgICAgICAgKmxhc3RGcmFtZU51bWJlcik7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5jbGVhclJlcGVhdGluZ1JlcXVlc3RzKCk7CisgICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5jbGVhclJlcGVhdGluZ1JlcXVlc3RzKGxhc3RGcmFtZU51bWJlcik7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OndhaXRVbnRpbFJlcXVlc3RSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgbnNlY3NfdCB0aW1lb3V0KSB7CkBAIC03NjcsNiArNjgxLDggQEAKICAgICB9CiAgICAgbUlucHV0U3RyZWFtID0gbmV3U3RyZWFtOwogCisgICAgbU5lZWRDb25maWcgPSB0cnVlOworCiAgICAgKmlkID0gbU5leHRTdHJlYW1JZCsrOwogICAgICp6c2xTdHJlYW0gPSBuZXdTdHJlYW07CiAKQEAgLTEyNDYsMTcgKzExNjIsMTcgQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBGbHVzaGluZyBhbGwgcmVxdWVzdHMiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBpZiAoZnJhbWVOdW1iZXIgIT0gTlVMTCkgewotICAgICAgICAqZnJhbWVOdW1iZXIgPSBtUmVxdWVzdFRocmVhZC0+Z2V0TGFzdEZyYW1lTnVtYmVyKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIG1SZXF1ZXN0VGhyZWFkLT5jbGVhcigvKm91dCovZnJhbWVOdW1iZXIpOwogICAgIH0KIAotICAgIG1SZXF1ZXN0VGhyZWFkLT5jbGVhcigpOwogICAgIHN0YXR1c190IHJlczsKICAgICBpZiAobUhhbDNEZXZpY2UtPmNvbW1vbi52ZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xKSB7CiAgICAgICAgIHJlcyA9IG1IYWwzRGV2aWNlLT5vcHMtPmZsdXNoKG1IYWwzRGV2aWNlKTsKICAgICB9IGVsc2UgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgICAgIHJlcyA9IHdhaXRVbnRpbERyYWluZWRMb2NrZWQoKTsKICAgICB9CiAKQEAgLTE1OTYsNyArMTUxMiw3IEBACiAgICAgQUxPR1ZWKCIlczogQ2FtZXJhICVkOiBGcmFtZSAlZCwgUmVxdWVzdCBJRCAlZDogQUYgbW9kZSAlZCwgQVdCIG1vZGUgJWQsICIKICAgICAgICAgIkFGIHN0YXRlICVkLCBBRSBzdGF0ZSAlZCwgQVdCIHN0YXRlICVkLCAiCiAgICAgICAgICJBRiB0cmlnZ2VyICVkLCBBRSBwcmVjYXB0dXJlIHRyaWdnZXIgJWQiLAotICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgZnJhbWVOdW1iZXIsIHJlcXVlc3RJZCwKKyAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIGZyYW1lTnVtYmVyLCByZXN1bHRFeHRyYXMucmVxdWVzdElkLAogICAgICAgICBhZk1vZGUsIGF3Yk1vZGUsCiAgICAgICAgIGFmU3RhdGUsIGFlU3RhdGUsIGF3YlN0YXRlLAogICAgICAgICBhZlRyaWdnZXJJZCwgYWVUcmlnZ2VySWQpOwpAQCAtMTc4MCw4ICsxNjk2LDYgQEAKIAogICAgICAgICB0aW1lc3RhbXAgPSByZXF1ZXN0LmNhcHR1cmVUaW1lc3RhbXA7CiAgICAgICAgIHJlc3VsdEV4dHJhcyA9IHJlcXVlc3QucmVzdWx0RXh0cmFzOwotICAgICAgICBBTE9HVlYoIiVzOiBhZnRlciBjaGVja2luZyBwYXJ0aWFsIGJ1cnN0SWQgPSAlZCwgZnJhbWVOdW1iZXIgJWxsZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnJlc3VsdEV4dHJhcy5idXJzdElkLCByZXF1ZXN0LnJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIE9uZSBvZiB0aGUgZm9sbG93aW5nIG11c3QgaGFwcGVuIGJlZm9yZSBpdCdzIGxlZ2FsIHRvIGNhbGwgcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdCwKQEAgLTE4NDEsMTMgKzE3NTUsMTQgQEAKIAogICAgICAgICBnb3RSZXN1bHQgPSB0cnVlOwogCi0gICAgICAgIGlmIChmcmFtZU51bWJlciAhPSBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyKSB7CisgICAgICAgIC8vIFRPRE86IG5lZWQgdG8gdHJhY2sgZXJyb3JzIGZvciB0aWdodGVyIGJvdW5kcyBvbiBleHBlY3RlZCBmcmFtZSBudW1iZXIKKyAgICAgICAgaWYgKGZyYW1lTnVtYmVyIDwgbU5leHRSZXN1bHRGcmFtZU51bWJlcikgewogICAgICAgICAgICAgU0VUX0VSUigiT3V0LW9mLW9yZGVyIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHN1Ym1pdHRlZCEgIgogICAgICAgICAgICAgICAgICAgICAiKGdvdCBmcmFtZSBudW1iZXIgJWQsIGV4cGVjdGluZyAlZCkiLAogICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgbU5leHRSZXN1bHRGcmFtZU51bWJlcik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlcisrOworICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXIgKyAxOwogCiAgICAgICAgIENhcHR1cmVSZXN1bHQgY2FwdHVyZVJlc3VsdDsKICAgICAgICAgY2FwdHVyZVJlc3VsdC5tUmVzdWx0RXh0cmFzID0gcmVzdWx0RXh0cmFzOwpAQCAtMTk4MSwxMyArMTg5NiwxNCBAQAogICAgICAgICAgICAgLy8gVmVyaWZ5IG9yZGVyaW5nIG9mIHNodXR0ZXIgbm90aWZpY2F0aW9ucwogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVOdW1iZXIgIT0gbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIHRyYWNrIGVycm9ycyBmb3IgdGlnaHRlciBib3VuZHMgb24gZXhwZWN0ZWQgZnJhbWUgbnVtYmVyLgorICAgICAgICAgICAgICAgIGlmIChmcmFtZU51bWJlciA8IG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyKSB7CiAgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlNodXR0ZXIgbm90aWZpY2F0aW9uIG91dC1vZi1vcmRlci4gRXhwZWN0ZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3RpZmljYXRpb24gZm9yIGZyYW1lICVkLCBnb3QgZnJhbWUgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyLCBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcisrOworICAgICAgICAgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXIgKyAxOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsKQEAgLTIwNTIsNyArMTk2OCw3IEBACiAgICAgICAgIG1QYXVzZWQodHJ1ZSksCiAgICAgICAgIG1GcmFtZU51bWJlcigwKSwKICAgICAgICAgbUxhdGVzdFJlcXVlc3RJZChOQU1FX05PVF9GT1VORCksCi0gICAgICAgIG1MYXN0RnJhbWVOdW1iZXIoLTEpIHsKKyAgICAgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcihOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUykgewogICAgIG1TdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOwogfQogCkBAIC0yMDYxLDI3ICsxOTc3LDIyIEBACiAgICAgbVJlY29uZmlndXJlZCA9IHRydWU7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnF1ZXVlUmVxdWVzdCgKLSAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKLSAgICBtUmVxdWVzdFF1ZXVlLnB1c2hfYmFjayhyZXF1ZXN0KTsKLQotICAgIG1MYXN0RnJhbWVOdW1iZXIrKzsKLQotICAgIHVucGF1c2VGb3JOZXdSZXF1ZXN0cygpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpxdWV1ZVJlcXVlc3RMaXN0KAotICAgICAgICBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+ICZyZXF1ZXN0cykgeworICAgICAgICBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+ICZyZXF1ZXN0cywKKyAgICAgICAgLypvdXQqLworICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwogICAgIGZvciAoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPjo6aXRlcmF0b3IgaXQgPSByZXF1ZXN0cy5iZWdpbigpOyBpdCAhPSByZXF1ZXN0cy5lbmQoKTsKICAgICAgICAgICAgICsraXQpIHsKICAgICAgICAgbVJlcXVlc3RRdWV1ZS5wdXNoX2JhY2soKml0KTsKICAgICB9CiAKLSAgICBtTGFzdEZyYW1lTnVtYmVyICs9IHJlcXVlc3RzLnNpemUoKTsKKyAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1GcmFtZU51bWJlciArIG1SZXF1ZXN0UXVldWUuc2l6ZSgpIC0gMTsKKyAgICAgICAgQUxPR1YoIiVzOiByZXF1ZXN0SWQgJWQsIG1GcmFtZU51bWJlciAlIiBQUklkMzIgIiwgbGFzdEZyYW1lTnVtYmVyICUiIFBSSWQ2NCAiLiIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKCoocmVxdWVzdHMuYmVnaW4oKSkpLT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgbUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAqbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CiAKICAgICB1bnBhdXNlRm9yTmV3UmVxdWVzdHMoKTsKIApAQCAtMjE0NSwyOSArMjA1Niw0MyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzZXRSZXBlYXRpbmdSZXF1ZXN0cygKLSAgICAgICAgY29uc3QgUmVxdWVzdExpc3QgJnJlcXVlc3RzKSB7CisgICAgICAgIGNvbnN0IFJlcXVlc3RMaXN0ICZyZXF1ZXN0cywKKyAgICAgICAgLypvdXQqLworICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgIT0gTlVMTCkgeworICAgICAgICAqbGFzdEZyYW1lTnVtYmVyID0gbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcjsKKyAgICB9CiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmNsZWFyKCk7CiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmluc2VydChtUmVwZWF0aW5nUmVxdWVzdHMuYmVnaW4oKSwKICAgICAgICAgICAgIHJlcXVlc3RzLmJlZ2luKCksIHJlcXVlc3RzLmVuZCgpKTsKIAogICAgIHVucGF1c2VGb3JOZXdSZXF1ZXN0cygpOwogCisgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlciA9IE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYXJSZXBlYXRpbmdSZXF1ZXN0cygpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFyUmVwZWF0aW5nUmVxdWVzdHMoLypvdXQqL2ludDY0X3QgKmxhc3RGcmFtZU51bWJlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmNsZWFyKCk7CisgICAgaWYgKGxhc3RGcmFtZU51bWJlciAhPSBOVUxMKSB7CisgICAgICAgICpsYXN0RnJhbWVOdW1iZXIgPSBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyOworICAgIH0KKyAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyID0gTk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVM7CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhcigpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFyKC8qb3V0Ki9pbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworICAgIEFMT0dWKCJSZXF1ZXN0VGhyZWFkOjolczoiLCBfX0ZVTkNUSU9OX18pOwogICAgIG1SZXBlYXRpbmdSZXF1ZXN0cy5jbGVhcigpOwogICAgIG1SZXF1ZXN0UXVldWUuY2xlYXIoKTsKICAgICBtVHJpZ2dlck1hcC5jbGVhcigpOwotICAgIC8vIFF1ZXN0aW9uOiBubyBuZWVkIHRvIHJlc2V0IGZyYW1lIG51bWJlcj8KKyAgICBpZiAobGFzdEZyYW1lTnVtYmVyICE9IE5VTEwpIHsKKyAgICAgICAgKmxhc3RGcmFtZU51bWJlciA9IG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXI7CisgICAgfQorICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBOT19JTl9GTElHSFRfUkVQRUFUSU5HX0ZSQU1FUzsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIyMTksNiArMjE0NCw3IEBACiAKICAgICAvLyBDcmVhdGUgcmVxdWVzdCB0byBIQUwKICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90IHJlcXVlc3QgPSBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KCk7CisgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIgPSBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcjsKICAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IG91dHB1dEJ1ZmZlcnM7CiAKICAgICAvLyBHZXQgdGhlIHJlcXVlc3QgSUQsIGlmIGFueQpAQCAtMjIzOSw3ICsyMTY1LDcgQEAKICAgICBpZiAocmVzIDwgMCkgewogICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gaW5zZXJ0IHRyaWdnZXJzICIKICAgICAgICAgICAgICAgICAiKGNhcHR1cmUgcmVxdWVzdCAlZCwgSEFMIGRldmljZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgKG1GcmFtZU51bWJlcisxKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0yMjU3LDcgKzIxODMsNyBAQAogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gaW5zZXJ0IGR1bW15IHRyaWdnZXIgSURzICIKICAgICAgICAgICAgICAgICAgICAgIihjYXB0dXJlIHJlcXVlc3QgJWQsIEhBTCBkZXZpY2U6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAobUZyYW1lTnVtYmVyKzEpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgY2xlYW5VcEZhaWxlZFJlcXVlc3QocmVxdWVzdCwgbmV4dFJlcXVlc3QsIG91dHB1dEJ1ZmZlcnMpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC0yMjgxLDcgKzIyMDcsNyBAQAogICAgICAgICAgICAgaWYgKGUuY291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBSZXF1ZXN0IChmcmFtZSBudW0gJWQpIGhhZCBBRiB0cmlnZ2VyIDB4JXgiLAogICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVOdW1iZXIrMSwKKyAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmZyYW1lX251bWJlciwKICAgICAgICAgICAgICAgICAgICAgICBlLmRhdGEudThbMF0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMzIzLDEwICsyMjQ5LDYgQEAKICAgICAgICAgcmVxdWVzdC5udW1fb3V0cHV0X2J1ZmZlcnMrKzsKICAgICB9CiAKLSAgICByZXF1ZXN0LmZyYW1lX251bWJlciA9IG1GcmFtZU51bWJlcisrOwotICAgIC8vIFVwZGF0ZSBmcmFtZU51bWJlciBvZiBDYXB0dXJlUmVzdWx0RXh0cmFzCi0gICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIgPSByZXF1ZXN0LmZyYW1lX251bWJlcjsKLQogICAgIC8vIExvZyByZXF1ZXN0IGluIHRoZSBpbi1mbGlnaHQgcXVldWUKICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKICAgICBpZiAocGFyZW50ID09IE5VTEwpIHsKQEAgLTIzMzcsNyArMjI1OSw4IEBACiAKICAgICByZXMgPSBwYXJlbnQtPnJlZ2lzdGVySW5GbGlnaHQocmVxdWVzdC5mcmFtZV9udW1iZXIsCiAgICAgICAgICAgICByZXF1ZXN0Lm51bV9vdXRwdXRfYnVmZmVycywgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMpOwotICAgIEFMT0dWVigiJXM6IHJlZ2lzdGVyZWQgaW4gZmxpZ2h0IHJlcXVlc3RJZCA9ICVkLCBmcmFtZU51bWJlciA9ICVsbGQsIGJ1cnN0SWQgPSAlZCAiLAorICAgIEFMT0dWVigiJXM6IHJlZ2lzdGVyZWQgaW4gZmxpZ2h0IHJlcXVlc3RJZCA9ICUiIFBSSWQzMiAiLCBmcmFtZU51bWJlciA9ICUiIFBSSWQ2NAorICAgICAgICAgICAiLCBidXJzdElkID0gJSIgUFJJZDMyICIuIiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsCiAgICAgICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5idXJzdElkKTsKQEAgLTI0MTcsMTMgKzIzNDAsNiBAQAogICAgIHJldHVybiBtTGF0ZXN0UmVxdWVzdDsKIH0KIAotaW50NjRfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpnZXRMYXN0RnJhbWVOdW1iZXIoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1SZXF1ZXN0TG9jayk7Ci0KLSAgICBBTE9HVigiUmVxdWVzdFRocmVhZDo6JXMiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgcmV0dXJuIG1MYXN0RnJhbWVOdW1iZXI7Ci19CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYW5VcEZhaWxlZFJlcXVlc3QoCiAgICAgICAgIGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgJnJlcXVlc3QsCkBAIC0yNDY3LDcgKzIzODMsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cy5lbmQoKSk7CiAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHdhaXQgYW55IGxvbmdlcgogCi0gICAgICAgICAgICBtTGFzdEZyYW1lTnVtYmVyICs9IHJlcXVlc3RzLnNpemUoKTsKKyAgICAgICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIgPSBtRnJhbWVOdW1iZXIgKyByZXF1ZXN0cy5zaXplKCkgLSAxOwogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjUyMCw2ICsyNDM2LDkgQEAKICAgICAgICAgbVJlY29uZmlndXJlZCA9IGZhbHNlOwogICAgIH0KIAorICAgIGlmIChuZXh0UmVxdWVzdCAhPSBOVUxMKSB7CisgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyKys7CisgICAgfQogICAgIHJldHVybiBuZXh0UmVxdWVzdDsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAppbmRleCBiMWVhNWVkLi4zZWYzOWYzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaD4KIAogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9TdGF0dXNUcmFja2VyLmgiCkBAIC0yMTIsNyArMjEzLDggQEAKIAogICAgIHN0YXR1c190IGNvbnZlcnRNZXRhZGF0YUxpc3RUb1JlcXVlc3RMaXN0TG9ja2VkKAogICAgICAgICAgICAgY29uc3QgTGlzdDxjb25zdCBDYW1lcmFNZXRhZGF0YT4gJm1ldGFkYXRhTGlzdCwKLSAgICAgICAgICAgIC8qb3V0Ki9SZXF1ZXN0TGlzdCAqcmVxdWVzdExpc3QpOworICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgUmVxdWVzdExpc3QgKnJlcXVlc3RMaXN0KTsKIAogICAgIHN0YXR1c190IHN1Ym1pdFJlcXVlc3RzSGVscGVyKGNvbnN0IExpc3Q8Y29uc3QgQ2FtZXJhTWV0YWRhdGE+ICZyZXF1ZXN0cywgYm9vbCByZXBlYXRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CkBAIC0zMzAsMTcgKzMzMiwyMSBAQAogICAgICAgICAgKiBvbiBlaXRoZXIuIFVzZSB3YWl0VW50aWxQYXVzZWQgdG8gd2FpdCB1bnRpbCByZXF1ZXN0IHF1ZXVlCiAgICAgICAgICAqIGhhcyBlbXB0aWVkIG91dC4KICAgICAgICAgICovCi0gICAgICAgIHN0YXR1c190IHNldFJlcGVhdGluZ1JlcXVlc3RzKGNvbnN0IFJlcXVlc3RMaXN0JiByZXF1ZXN0cyk7Ci0gICAgICAgIHN0YXR1c190IGNsZWFyUmVwZWF0aW5nUmVxdWVzdHMoKTsKKyAgICAgICAgc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdHMoY29uc3QgUmVxdWVzdExpc3QmIHJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgICAgICBzdGF0dXNfdCBjbGVhclJlcGVhdGluZ1JlcXVlc3RzKC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAotICAgICAgICBzdGF0dXNfdCBxdWV1ZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QpOwotCi0gICAgICAgIHN0YXR1c190IHF1ZXVlUmVxdWVzdExpc3QoTGlzdDxzcDxDYXB0dXJlUmVxdWVzdD4gPiAmcmVxdWVzdHMpOworICAgICAgICBzdGF0dXNfdCBxdWV1ZVJlcXVlc3RMaXN0KExpc3Q8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gJnJlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogUmVtb3ZlIGFsbCBxdWV1ZWQgYW5kIHJlcGVhdGluZyByZXF1ZXN0cywgYW5kIHBlbmRpbmcgdHJpZ2dlcnMKICAgICAgICAgICovCi0gICAgICAgIHN0YXR1c190IGNsZWFyKCk7CisgICAgICAgIHN0YXR1c190IGNsZWFyKC8qb3V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqbGFzdEZyYW1lTnVtYmVyID0gTlVMTCk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFF1ZXVlIGEgdHJpZ2dlciB0byBiZSBkaXNwYXRjaGVkIHdpdGggdGhlIG5leHQgb3V0Z29pbmcKQEAgLTM3Nyw4ICszODMsNiBAQAogICAgICAgICAgKi8KICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgZ2V0TGF0ZXN0UmVxdWVzdCgpIGNvbnN0OwogCi0gICAgICAgIGludDY0X3QgZ2V0TGFzdEZyYW1lTnVtYmVyKCk7Ci0KICAgICAgIHByb3RlY3RlZDoKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwpAQCAtNDU2LDcgKzQ2MCw3IEBACiAgICAgICAgIFRyaWdnZXJNYXAgICAgICAgICBtVHJpZ2dlclJlbW92ZWRNYXA7CiAgICAgICAgIFRyaWdnZXJNYXAgICAgICAgICBtVHJpZ2dlclJlcGxhY2VkTWFwOwogCi0gICAgICAgIGludDY0X3QgICAgICAgICAgICBtTGFzdEZyYW1lTnVtYmVyOworICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcjsKICAgICB9OwogICAgIHNwPFJlcXVlc3RUaHJlYWQ+IG1SZXF1ZXN0VGhyZWFkOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAppbmRleCAyMjU3NjgyLi41MGEyYzEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKQEAgLTM0LDcgKzM0LDggQEAKICAgICAgICAgQ2FtZXJhM1N0cmVhbShpZCwgdHlwZSwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBtYXhTaXplLCBmb3JtYXQpLAogICAgICAgICBtVG90YWxCdWZmZXJDb3VudCgwKSwKLSAgICAgICAgbURlcXVldWVkQnVmZmVyQ291bnQoMCksCisgICAgICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCgwKSwKKyAgICAgICAgbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudCgwKSwKICAgICAgICAgbUZyYW1lQ291bnQoMCksCiAgICAgICAgIG1MYXN0VGltZXN0YW1wKDApIHsKIApAQCAtNTUsOCArNTYsOCBAQAogICAgIG5zZWNzX3Qgc2lnbmFsVGltZSA9IG1Db21iaW5lZEZlbmNlLT5nZXRTaWduYWxUaW1lKCk7CiAgICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQ6IEhhcyAlenUgb3V0c3RhbmRpbmcgYnVmZmVycywiCiAgICAgICAgICAgICAiIGJ1ZmZlciBzaWduYWwgdGltZSBpcyAlIiBQUklkNjQsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbURlcXVldWVkQnVmZmVyQ291bnQsIHNpZ25hbFRpbWUpOwotICAgIGlmIChtRGVxdWV1ZWRCdWZmZXJDb3VudCA+IDAgfHwgc2lnbmFsVGltZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQsIHNpZ25hbFRpbWUpOworICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPiAwIHx8IHNpZ25hbFRpbWUgPT0gSU5UNjRfTUFYKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC03NSw3ICs3Niw3IEBACiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBGcmFtZXMgcHJvZHVjZWQ6ICVkLCBsYXN0IHRpbWVzdGFtcDogJSIgUFJJZDY0ICIgbnNcbiIsCiAgICAgICAgICAgICBtRnJhbWVDb3VudCwgbUxhc3RUaW1lc3RhbXApOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgVG90YWwgYnVmZmVyczogJXp1LCBjdXJyZW50bHkgZGVxdWV1ZWQ6ICV6dVxuIiwKLSAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50LCBtRGVxdWV1ZWRCdWZmZXJDb3VudCk7CisgICAgICAgICAgICBtVG90YWxCdWZmZXJDb3VudCwgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50KTsKICAgICB3cml0ZShmZCwgbGluZXMuc3RyaW5nKCksIGxpbmVzLnNpemUoKSk7CiB9CiAKQEAgLTEwNCw2ICsxMDUsMTQgQEAKICAgICByZXR1cm4gbVRvdGFsQnVmZmVyQ291bnQ7CiB9CiAKK3NpemVfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSB7CisgICAgcmV0dXJuIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQ7Cit9CisKK3NpemVfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpIHsKKyAgICByZXR1cm4gKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCAtIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQpOworfQorCiBzdGF0dXNfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpkaXNjb25uZWN0TG9ja2VkKCkgewogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfSU5fUkVDT05GSUc6CkBAIC0xMTcsOSArMTI2LDkgQEAKICAgICAgICAgICAgIHJldHVybiAtRU5PVENPTk47CiAgICAgfQogCi0gICAgaWYgKG1EZXF1ZXVlZEJ1ZmZlckNvdW50ID4gMCkgeworICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPiAwKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgZGlzY29ubmVjdCB3aXRoICV6dSBidWZmZXJzIHN0aWxsIGRlcXVldWVkISIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGVxdWV1ZWRCdWZmZXJDb3VudCk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0xMzAsNyArMTM5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNxdWlyZUZlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWxlYXNlRmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3V0cHV0KSB7CiAgICAgLyoqCiAgICAgICogTm90ZSB0aGF0IGFsbCBmZW5jZXMgYXJlIG5vdyBvd25lZCBieSBIQUwuCiAgICAgICovCkBAIC0xNDQsNyArMTU0LDcgQEAKICAgICBidWZmZXIuc3RhdHVzID0gc3RhdHVzOwogCiAgICAgLy8gSW5mb3JtIHRyYWNrZXIgYWJvdXQgYmVjb21pbmcgYnVzeQotICAgIGlmIChtRGVxdWV1ZWRCdWZmZXJDb3VudCA9PSAwICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYKKyAgICBpZiAobUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID09IDAgJiYgbVN0YXRlICE9IFNUQVRFX0lOX0NPTkZJRyAmJgogICAgICAgICAgICAgbVN0YXRlICE9IFNUQVRFX0lOX1JFQ09ORklHKSB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBBdm9pZCBhIHNwdXJpb3VzIElETEUtPkFDVElWRS0+SURMRSB0cmFuc2l0aW9uIHdoZW4gdXNpbmcgYnVmZmVycwpAQCAtMTU4LDcgKzE2OCwxMSBAQAogICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudEFjdGl2ZShtU3RhdHVzSWQpOwogICAgICAgICB9CiAgICAgfQotICAgIG1EZXF1ZXVlZEJ1ZmZlckNvdW50Kys7CisgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50Kys7CisKKyAgICBpZiAob3V0cHV0KSB7CisgICAgICAgIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQrKzsKKyAgICB9CiB9CiAKIHN0YXR1c190IENhbWVyYTNJT1N0cmVhbUJhc2U6OmdldEJ1ZmZlclByZWNvbmRpdGlvbkNoZWNrTG9ja2VkKCkgY29uc3QgewpAQCAtMTcyLDcgKzE4Niw3IEBACiAKICAgICAvLyBPbmx5IGxpbWl0IGRlcXVldWUgYW1vdW50IHdoZW4gZnVsbHkgY29uZmlndXJlZAogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCAmJgotICAgICAgICAgICAgbURlcXVldWVkQnVmZmVyQ291bnQgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKSB7CisgICAgICAgICAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBBbHJlYWR5IGRlcXVldWVkIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyIKICAgICAgICAgICAgICAgICAiIGJ1ZmZlcnMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLAogICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7CkBAIC0xOTAsNyArMjA0LDcgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAobURlcXVldWVkQnVmZmVyQ291bnQgPT0gMCkgeworICAgIGlmIChtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPT0gMCkgewogICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogTm8gYnVmZmVycyBvdXRzdGFuZGluZyB0byByZXR1cm4iLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgbUlkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjI4LDggKzI0MiwxMiBAQAogICAgICAgICBtQ29tYmluZWRGZW5jZSA9IEZlbmNlOjptZXJnZShtTmFtZSwgbUNvbWJpbmVkRmVuY2UsIHJlbGVhc2VGZW5jZSk7CiAgICAgfQogCi0gICAgbURlcXVldWVkQnVmZmVyQ291bnQtLTsKLSAgICBpZiAobURlcXVldWVkQnVmZmVyQ291bnQgPT0gMCAmJiBtU3RhdGUgIT0gU1RBVEVfSU5fQ09ORklHICYmCisgICAgaWYgKG91dHB1dCkgeworICAgICAgICBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50LS07CisgICAgfQorCisgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50LS07CisgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9PSAwICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9DT05GSUcgJiYKICAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFURV9JTl9SRUNPTkZJRykgewogICAgICAgICAvKioKICAgICAgICAgICogQXZvaWQgYSBzcHVyaW91cyBJRExFLT5BQ1RJVkUtPklETEUgdHJhbnNpdGlvbiB3aGVuIHVzaW5nIGJ1ZmZlcnMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKaW5kZXggZmNiOWQwNC4uYTM1YzI5MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKQEAgLTQ4LDcgKzQ4LDEwIEBACiAgIHByb3RlY3RlZDoKICAgICBzaXplX3QgICAgICAgICAgICBtVG90YWxCdWZmZXJDb3VudDsKICAgICAvLyBzdW0gb2YgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3F1aXJlZCBieSBIQUwKLSAgICBzaXplX3QgICAgICAgICAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudDsKKyAgICBzaXplX3QgICAgICAgICAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQ7CisgICAgLy8gbnVtYmVyIG9mIG91dHB1dCBidWZmZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3F1aXJlZCBieSBIQUwuIFRoaXMgd2lsbCBiZQorICAgIC8vIFJlZHVuZGFudCB3aGVuIGNhbWVyYTMgc3RyZWFtcyBhcmUgbm8gbG9uZ2VyIGJpZGlyZWN0aW9uYWwgc3RyZWFtcy4KKyAgICBzaXplX3QgICAgICAgICAgICBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50OwogICAgIENvbmRpdGlvbiAgICAgICAgIG1CdWZmZXJSZXR1cm5lZFNpZ25hbDsKICAgICB1aW50MzJfdCAgICAgICAgICBtRnJhbWVDb3VudDsKICAgICAvLyBMYXN0IHJlY2VpdmVkIG91dHB1dCBidWZmZXIncyB0aW1lc3RhbXAKQEAgLTc2LDYgKzc5LDEwIEBACiAKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEJ1ZmZlckNvdW50TG9ja2VkKCk7CiAKKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpOworCisgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgPSAwOwogCiAgICAgc3RhdHVzX3QgZ2V0QnVmZmVyUHJlY29uZGl0aW9uQ2hlY2tMb2NrZWQoKSBjb25zdDsKQEAgLTkyLDcgKzk5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY3F1aXJlX2ZlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVsZWFzZV9mZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG91dHB1dCk7CiAKIH07IC8vIGNsYXNzIENhbWVyYTNJT1N0cmVhbUJhc2UKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCmluZGV4IGRkN2ZiNmMuLjMxOWJlMWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKQEAgLTgxLDcgKzgxLDcgQEAKICAgICAgKiBpbiB3aGljaCBjYXNlIHdlIHJlYXNzaWduIGl0IHRvIGFjcXVpcmVfZmVuY2UKICAgICAgKi8KICAgICBoYW5kb3V0QnVmZmVyTG9ja2VkKCpidWZmZXIsICYoYW5iLT5oYW5kbGUpLCAvKmFjcXVpcmVGZW5jZSovZmVuY2VGZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LLCAvKm91dHB1dCovZmFsc2UpOwogICAgIG1CdWZmZXJzSW5GbGlnaHQucHVzaF9iYWNrKGJ1ZmZlckl0ZW0pOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTk5LDcgKzE5OSw3IEBACiAgICAgYXNzZXJ0KG1NYXhTaXplID09IDApOwogICAgIGFzc2VydChjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfQkxPQik7CiAKLSAgICBtRGVxdWV1ZWRCdWZmZXJDb3VudCA9IDA7CisgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID0gMDsKICAgICBtRnJhbWVDb3VudCA9IDA7CiAKICAgICBpZiAobUNvbnN1bWVyLmdldCgpID09IDApIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCmluZGV4IDY4Mjc1NWQuLjdlYzY0OWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcApAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICogaW4gd2hpY2ggY2FzZSB3ZSByZWFzc2lnbiBpdCB0byBhY3F1aXJlX2ZlbmNlCiAgICAgICovCiAgICAgaGFuZG91dEJ1ZmZlckxvY2tlZCgqYnVmZmVyLCAmKGFuYi0+aGFuZGxlKSwgLyphY3F1aXJlRmVuY2UqL2ZlbmNlRmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSywgLypvdXRwdXQqL3RydWUpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMzI0LDcgKzMyNCw3IEBACiAgICAgfQogCiAgICAgbVRvdGFsQnVmZmVyQ291bnQgPSBtYXhDb25zdW1lckJ1ZmZlcnMgKyBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnM7Ci0gICAgbURlcXVldWVkQnVmZmVyQ291bnQgPSAwOworICAgIG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9IDA7CiAgICAgbUZyYW1lQ291bnQgPSAwOwogICAgIG1MYXN0VGltZXN0YW1wID0gMDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKaW5kZXggNjQ2ZjI4Ni4uYWJmYjYwMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCkBAIC0yMTIsOCArMjEyLDMwIEBACiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRCdWZmZXIoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIHN0YXR1c190IHJlcyA9IGdldEJ1ZmZlckxvY2tlZChidWZmZXIpOworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBjb25maWd1cmVkIGFscmVhZHkuCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DT05GSUdVUkVEKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBnZXQgYnVmZmVycyBpZiBzdHJlYW0gaXMgbm90IGluIENPTkZJR1VSRUQgc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gV2FpdCBmb3IgbmV3IGJ1ZmZlciByZXR1cm5lZCBiYWNrIGlmIHdlIGFyZSBydW5uaW5nIGludG8gdGhlIGxpbWl0LgorICAgIGlmIChnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9PSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBBbHJlYWR5IGRlcXVldWVkIG1heCBvdXRwdXQgYnVmZmVycyAoJWQpLCB3YWl0IGZvciBuZXh0IHJldHVybmVkIG9uZS4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKKyAgICAgICAgcmVzID0gbU91dHB1dEJ1ZmZlclJldHVybmVkU2lnbmFsLndhaXRSZWxhdGl2ZShtTG9jaywga1dhaXRGb3JCdWZmZXJEdXJhdGlvbik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB3YWl0IGZvciBvdXRwdXQgYnVmZmVyIHJldHVybiB0aW1lZCBvdXQgYWZ0ZXIgJWxsZG1zIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAga1dhaXRGb3JCdWZmZXJEdXJhdGlvbiAvIDEwMDAwMDBMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gZ2V0QnVmZmVyTG9ja2VkKGJ1ZmZlcik7CiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKCpidWZmZXIsIC8qYWNxdWlyZWQqL3RydWUsIC8qb3V0cHV0Ki90cnVlKTsKICAgICB9CkBAIC0yMzcsNiArMjU5LDcgQEAKICAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5CdWZmZXJMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXApOwogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChidWZmZXIsIC8qYWNxdWlyZWQqL2ZhbHNlLCAvKm91dHB1dCovdHJ1ZSk7CisgICAgICAgIG1PdXRwdXRCdWZmZXJSZXR1cm5lZFNpZ25hbC5zaWduYWwoKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzOwpAQCAtMjQ1LDggKzI2OCwzMCBAQAogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6Z2V0SW5wdXRCdWZmZXIoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAotICAgIHN0YXR1c190IHJlcyA9IGdldElucHV0QnVmZmVyTG9ja2VkKGJ1ZmZlcik7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb25seSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGNvbmZpZ3VyZWQgYWxyZWFkeS4KKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGdldCBpbnB1dCBidWZmZXJzIGlmIHN0cmVhbSBpcyBub3QgaW4gQ09ORklHVVJFRCBzdGF0ZSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1TdGF0ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyBXYWl0IGZvciBuZXcgYnVmZmVyIHJldHVybmVkIGJhY2sgaWYgd2UgYXJlIHJ1bm5pbmcgaW50byB0aGUgbGltaXQuCisgICAgaWYgKGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKSB7CisgICAgICAgIEFMT0dWKCIlczogQWxyZWFkeSBkZXF1ZXVlZCBtYXggaW5wdXQgYnVmZmVycyAoJWQpLCB3YWl0IGZvciBuZXh0IHJldHVybmVkIG9uZS4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKKyAgICAgICAgcmVzID0gbUlucHV0QnVmZmVyUmV0dXJuZWRTaWduYWwud2FpdFJlbGF0aXZlKG1Mb2NrLCBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgaWYgKHJlcyA9PSBUSU1FRF9PVVQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHdhaXQgZm9yIGlucHV0IGJ1ZmZlciByZXR1cm4gdGltZWQgb3V0IGFmdGVyICVsbGRtcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24gLyAxMDAwMDAwTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IGdldElucHV0QnVmZmVyTG9ja2VkKGJ1ZmZlcik7CiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKCpidWZmZXIsIC8qYWNxdWlyZWQqL3RydWUsIC8qb3V0cHV0Ki9mYWxzZSk7CiAgICAgfQpAQCAtMjYxLDYgKzMwNiw3IEBACiAgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuSW5wdXRCdWZmZXJMb2NrZWQoYnVmZmVyKTsKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoYnVmZmVyLCAvKmFjcXVpcmVkKi9mYWxzZSwgLypvdXRwdXQqL2ZhbHNlKTsKKyAgICAgICAgbUlucHV0QnVmZmVyUmV0dXJuZWRTaWduYWwuc2lnbmFsKCk7CiAgICAgfQogICAgIHJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCmluZGV4IDc2NmI3NzIuLjE0ZjUzODcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCkBAIC0yNzksNiArMjc5LDEyIEBACiAgICAgLy8gR2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgYnVmZmVycyBpbiB0aGUgcXVldWUKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOwogCisgICAgLy8gR2V0IGhhbmRvdXQgb3V0cHV0IGJ1ZmZlciBjb3VudC4KKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpID0gMDsKKworICAgIC8vIEdldCBoYW5kb3V0IGlucHV0IGJ1ZmZlciBjb3VudC4KKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOworCiAgICAgLy8gR2V0IHRoZSB1c2FnZSBmbGFncyBmb3IgdGhlIG90aGVyIGVuZHBvaW50LCBvciByZXR1cm4KICAgICAvLyBJTlZBTElEX09QRVJBVElPTiBpZiB0aGV5IGNhbm5vdCBiZSBvYnRhaW5lZC4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSA9IDA7CkBAIC0yOTEsNiArMjk3LDkgQEAKICAgcHJpdmF0ZToKICAgICB1aW50MzJfdCBvbGRVc2FnZTsKICAgICB1aW50MzJfdCBvbGRNYXhCdWZmZXJzOworICAgIENvbmRpdGlvbiBtT3V0cHV0QnVmZmVyUmV0dXJuZWRTaWduYWw7CisgICAgQ29uZGl0aW9uIG1JbnB1dEJ1ZmZlclJldHVybmVkU2lnbmFsOworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24gPSAzMDAwMDAwMDAwTEw7IC8vIDMwMDAgbXMKIAogICAgIC8vIEdldHMgYWxsIGJ1ZmZlcnMgZnJvbSBlbmRwb2ludCBhbmQgcmVnaXN0ZXJzIHRoZW0gd2l0aCB0aGUgSEFMLgogICAgIHN0YXR1c190IHJlZ2lzdGVyQnVmZmVyc0xvY2tlZChjYW1lcmEzX2RldmljZSAqaGFsM0RldmljZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcAppbmRleCAwOWUxNGM1Li4wNWIzZDFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAKQEAgLTE3Niw3ICsxNzYsNyBAQAogICAgICAqIGluIHdoaWNoIGNhc2Ugd2UgcmVhc3NpZ24gaXQgdG8gYWNxdWlyZV9mZW5jZQogICAgICAqLwogICAgIGhhbmRvdXRCdWZmZXJMb2NrZWQoKmJ1ZmZlciwgJihhbmItPmhhbmRsZSksIC8qYWNxdWlyZUZlbmNlKi9mZW5jZUZkLAotICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSywgLypvdXRwdXQqL2ZhbHNlKTsKIAogICAgIG1CdWZmZXJzSW5GbGlnaHQucHVzaF9iYWNrKGJ1ZmZlckl0ZW0pOwogCg==