LyogSW1wbGVtZW50YXRpb24gb2YgdGhlIERBVEVfQU5EX1RJTUUgaW50cmluc2ljLgogICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBCb3NzY2hlci4KClRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgRm9ydHJhbiA5NSBydW50aW1lIGxpYnJhcnkgKGxpYmdmb3J0cmFuKS4KCkxpYmdmb3J0cmFuIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCnZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCkluIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQpGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMgeW91IHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlCmNvbXBpbGVkIHZlcnNpb24gb2YgdGhpcyBmaWxlIGludG8gY29tYmluYXRpb25zIHdpdGggb3RoZXIgcHJvZ3JhbXMsCmFuZCB0byBkaXN0cmlidXRlIHRob3NlIGNvbWJpbmF0aW9ucyB3aXRob3V0IGFueSByZXN0cmljdGlvbiBjb21pbmcKZnJvbSB0aGUgdXNlIG9mIHRoaXMgZmlsZS4gIChUaGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByZXN0cmljdGlvbnMKZG8gYXBwbHkgaW4gb3RoZXIgcmVzcGVjdHM7IGZvciBleGFtcGxlLCB0aGV5IGNvdmVyIG1vZGlmaWNhdGlvbiBvZgp0aGUgZmlsZSwgYW5kIGRpc3RyaWJ1dGlvbiB3aGVuIG5vdCBsaW5rZWQgaW50byBhIGNvbWJpbmUKZXhlY3V0YWJsZS4pCgpMaWJnZm9ydHJhbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBhbG9uZyB3aXRoIGxpYmdmb3J0cmFuOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwKd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAibGliZ2ZvcnRyYW4uaCIKCiN1bmRlZiBIQVZFX05PX0RBVEVfVElNRQojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyAgaWYgSEFWRV9TWVNfVElNRV9ICiMgICAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyAgZWxzZQojICAgIGlmZGVmIEhBVkVfVElNRV9ICiMgICAgICBpbmNsdWRlIDx0aW1lLmg+CiMgICAgZWxzZQojICAgICAgZGVmaW5lIEhBVkVfTk9fREFURV9USU1FCiMgICAgZW5kaWYgIC8qIEhBVkVfVElNRV9IICAqLwojICBlbmRpZiAgLyogSEFWRV9TWVNfVElNRV9IICAqLwojZW5kaWYgIC8qIFRJTUVfV0lUSF9TWVNfVElNRSAgKi8KCiNpZm5kZWYgYWJzCiNkZWZpbmUgYWJzKHgpICgoeCk+PTAgPyAoeCkgOiAtKHgpKQojZW5kaWYKCi8qIERBVEVfQU5EX1RJTUUgKFtEQVRFLCBUSU1FLCBaT05FLCBWQUxVRVNdKQoKICAgRGVzY3JpcHRpb246IFJldHVybnMgZGF0YSBvbiB0aGUgcmVhbC10aW1lIGNsb2NrIGFuZCBkYXRlIGluIGEgZm9ybQogICBjb21wYXRpYmxlIHdpdGggdGhlIHJlcHJlc2VudGF0aW9ucyBkZWZpbmVkIGluIElTTyA4NjAxOjE5ODguCgogICBDbGFzczogTm9uLWVsZW1lbnRhbCBzdWJyb3V0aW5lLgoKICAgQXJndW1lbnRzOgoKICAgREFURSAob3B0aW9uYWwpIHNoYWxsIGJlIHNjYWxhciBhbmQgb2YgdHlwZSBkZWZhdWx0IGNoYXJhY3RlciwgYW5kCiAgIHNoYWxsIGJlIG9mIGxlbmd0aCBhdCBsZWFzdCA4IGluIG9yZGVyIHRvIGNvbnRhaW4gdGhlIGNvbXBsZXRlCiAgIHZhbHVlLiBJdCBpcyBhbiBJTlRFTlQoT1VUKSBhcmd1bWVudC4gSXRzIGxlZnRtb3N0IDggY2hhcmFjdGVycwogICBhcmUgYXNzaWduZWQgYSB2YWx1ZSBvZiB0aGUgZm9ybSBDQ1lZTU1ERCwgd2hlcmUgQ0MgaXMgdGhlIGNlbnR1cnksCiAgIFlZIHRoZSB5ZWFyIHdpdGhpbiB0aGUgY2VudHVyeSwgTU0gdGhlIG1vbnRoIHdpdGhpbiB0aGUgeWVhciwgYW5kCiAgIEREIHRoZSBkYXkgd2l0aGluIHRoZSBtb250aC4gSWYgdGhlcmUgaXMgbm8gZGF0ZSBhdmFpbGFibGUsIHRoZXkKICAgYXJlIGFzc2lnbmVkIGJsYW5rcy4KCiAgIFRJTUUgKG9wdGlvbmFsKSBzaGFsbCBiZSBzY2FsYXIgYW5kIG9mIHR5cGUgZGVmYXVsdCBjaGFyYWN0ZXIsIGFuZAogICBzaGFsbCBiZSBvZiBsZW5ndGggYXQgbGVhc3QgMTAgaW4gb3JkZXIgdG8gY29udGFpbiB0aGUgY29tcGxldGUKICAgdmFsdWUuIEl0IGlzIGFuIElOVEVOVChPVVQpIGFyZ3VtZW50LiBJdHMgbGVmdG1vc3QgMTAgY2hhcmFjdGVycwogICBhcmUgYXNzaWduZWQgYSB2YWx1ZSBvZiB0aGUgZm9ybSBoaG1tc3Muc3NzLCB3aGVyZSBoaCBpcyB0aGUgaG91cgogICBvZiB0aGUgZGF5LCBtbSBpcyB0aGUgbWludXRlcyBvZiB0aGUgaG91ciwgYW5kIHNzLnNzcyBpcyB0aGUKICAgc2Vjb25kcyBhbmQgbWlsbGlzZWNvbmRzIG9mIHRoZSBtaW51dGUuIElmIHRoZXJlIGlzIG5vIGNsb2NrCiAgIGF2YWlsYWJsZSwgdGhleSBhcmUgYXNzaWduZWQgYmxhbmtzLgoKICAgWk9ORSAob3B0aW9uYWwpIHNoYWxsIGJlIHNjYWxhciBhbmQgb2YgdHlwZSBkZWZhdWx0IGNoYXJhY3RlciwgYW5kCiAgIHNoYWxsIGJlIG9mIGxlbmd0aCBhdCBsZWFzdCA1IGluIG9yZGVyIHRvIGNvbnRhaW4gdGhlIGNvbXBsZXRlCiAgIHZhbHVlLiBJdCBpcyBhbiBJTlRFTlQoT1VUKSBhcmd1bWVudC4gSXRzIGxlZnRtb3N0IDUgY2hhcmFjdGVycwogICBhcmUgYXNzaWduZWQgYSB2YWx1ZSBvZiB0aGUgZm9ybSCxaGhtbSwgd2hlcmUgaGggYW5kIG1tIGFyZSB0aGUKICAgdGltZSBkaWZmZXJlbmNlIHdpdGggcmVzcGVjdCB0byBDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSAoVVRDKSBpbgogICBob3VycyBhbmQgcGFydHMgb2YgYW4gaG91ciBleHByZXNzZWQgaW4gbWludXRlcywgcmVzcGVjdGl2ZWx5LiBJZgogICB0aGVyZSBpcyBubyBjbG9jayBhdmFpbGFibGUsIHRoZXkgYXJlIGFzc2lnbmVkIGJsYW5rcy4KCiAgIFZBTFVFUyAob3B0aW9uYWwpIHNoYWxsIGJlIG9mIHR5cGUgZGVmYXVsdCBpbnRlZ2VyIGFuZCBvZiByYW5rCiAgIG9uZS4gSXQgaXMgYW4gSU5URU5UKE9VVCkgYXJndW1lbnQuIEl0cyBzaXplIHNoYWxsIGJlIGF0IGxlYXN0CiAgIDguIFRoZSB2YWx1ZXMgcmV0dXJuZWQgaW4gVkFMVUVTIGFyZSBhcyBmb2xsb3dzOgoKICAgICAgVkFMVUVTKDEpIHRoZSB5ZWFyIChmb3IgZXhhbXBsZSwgMjAwMyksIG9yIC1IVUdFKDApIGlmIHRoZXJlIGlzCiAgICAgIG5vIGRhdGUgYXZhaWxhYmxlOwoKICAgICAgVkFMVUVTKDIpIHRoZSBtb250aCBvZiB0aGUgeWVhciwgb3IgLUhVR0UoMCkgaWYgdGhlcmUKICAgICAgaXMgbm8gZGF0ZSBhdmFpbGFibGU7CgogICAgICBWQUxVRVMoMykgdGhlIGRheSBvZiB0aGUgbW9udGgsIG9yIC1IVUdFKDApIGlmIHRoZXJlIGlzIG5vIGRhdGUKICAgICAgYXZhaWxhYmxlOwoKICAgICAgVkFMVUVTKDQpIHRoZSB0aW1lIGRpZmZlcmVuY2Ugd2l0aCByZXNwZWN0IHRvIENvb3JkaW5hdGVkCiAgICAgIFVuaXZlcnNhbCBUaW1lIChVVEMpIGluIG1pbnV0ZXMsIG9yIC1IVUdFKDApIGlmIHRoaXMgaW5mb3JtYXRpb24KICAgICAgaXMgbm90IGF2YWlsYWJsZTsKCiAgICAgIFZBTFVFUyg1KSB0aGUgaG91ciBvZiB0aGUgZGF5LCBpbiB0aGUgcmFuZ2Ugb2YgMCB0byAyMywgb3IKICAgICAgLUhVR0UoMCkgaWYgdGhlcmUgaXMgbm8gY2xvY2s7CgogICAgICBWQUxVRVMoNikgdGhlIG1pbnV0ZXMgb2YgdGhlIGhvdXIsIGluIHRoZSByYW5nZSAwIHRvIDU5LCBvcgogICAgICAtSFVHRSgwKSBpZiB0aGVyZSBpcyBubyBjbG9jazsKCiAgICAgIFZBTFVFUyg3KSB0aGUgc2Vjb25kcyBvZiB0aGUgbWludXRlLCBpbiB0aGUgcmFuZ2UgMCB0byA2MCwgb3IKICAgICAgLUhVR0UoMCkgaWYgdGhlcmUgaXMgbm8gY2xvY2s7CgogICAgICBWQUxVRVMoOCkgdGhlIG1pbGxpc2Vjb25kcyBvZiB0aGUgc2Vjb25kLCBpbiB0aGUgcmFuZ2UgMCB0bwogICAgICA5OTksIG9yIC1IVUdFKDApIGlmIHRoZXJlIGlzIG5vIGNsb2NrLgoKICAgTlVMTCBwb2ludGVyIHJlcHJlc2VudCBtaXNzaW5nIE9QVElPTkFMIGFyZ3VtZW50cy4gIEFsbCBhcmd1bWVudHMKICAgaGF2ZSBJTlRFTlQoT1VUKS4gIEJlY2F1c2Ugb2YgdGhlIC1pOCBvcHRpb24sIHdlIG11c3QgaW1wbGVtZW50CiAgIFZBTFVFUyBmb3IgSU5URUdFUihraW5kPTQpIGFuZCBJTlRFR0VSKGtpbmQ9OCkuCgogICBCYXNlZCBvbiBsaWJVNzcncyBkYXRlX3RpbWVfLmMuCgogICBUT0RPIDoKICAgLSBDaGVjayB5ZWFyIGJvdW5kYXJpZXMuCiAgIC0gVGhlcmUgaXMgbm8gU1REQy9QT1NJWCB3YXkgdG8gZ2V0IFZBTFVFUyg4KS4gIEEgR05VaXNoIHdheSBtYXkKICAgICBiZSB0byB1c2UgZnRpbWUuCiovCiNkZWZpbmUgREFURV9MRU4gOAojZGVmaW5lIFRJTUVfTEVOIDEwICAgCiNkZWZpbmUgWk9ORV9MRU4gNQojZGVmaW5lIFZBTFVFU19TSVpFIDgKCmV4dGVybiB2b2lkIGRhdGVfYW5kX3RpbWUgKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGdmY19hcnJheV9pNCAqLAoJCQkgICBHRkNfSU5URUdFUl80LCBHRkNfSU5URUdFUl80LCBHRkNfSU5URUdFUl80KTsKZXhwb3J0X3Byb3RvKGRhdGVfYW5kX3RpbWUpOwoKdm9pZApkYXRlX2FuZF90aW1lIChjaGFyICpfX2RhdGUsIGNoYXIgKl9fdGltZSwgY2hhciAqX196b25lLAoJICAgICAgIGdmY19hcnJheV9pNCAqX192YWx1ZXMsIEdGQ19JTlRFR0VSXzQgX19kYXRlX2xlbiwKCSAgICAgICBHRkNfSU5URUdFUl80IF9fdGltZV9sZW4sIEdGQ19JTlRFR0VSXzQgX196b25lX2xlbikKewogIGludCBpOwogIGNoYXIgZGF0ZVtEQVRFX0xFTiArIDFdOwogIGNoYXIgdGltZWNbVElNRV9MRU4gKyAxXTsKICBjaGFyIHpvbmVbWk9ORV9MRU4gKyAxXTsKICBHRkNfSU5URUdFUl80IHZhbHVlc1tWQUxVRVNfU0laRV07CgojaWZuZGVmIEhBVkVfTk9fREFURV9USU1FCiAgdGltZV90IGx0OwogIHN0cnVjdCB0bSBsb2NhbF90aW1lOwogIHN0cnVjdCB0bSBVVENfdGltZTsKCiAgbHQgPSB0aW1lIChOVUxMKTsKCiAgaWYgKGx0ICE9ICh0aW1lX3QpIC0xKQogICAgewogICAgICBsb2NhbF90aW1lID0gKmxvY2FsdGltZSAoJmx0KTsKICAgICAgVVRDX3RpbWUgPSAqZ210aW1lICgmbHQpOwoKICAgICAgLyogQWxsIGFyZ3VtZW50cyBjYW4gYmUgZGVyaXZlZCBmcm9tIFZBTFVFUy4gICovCiAgICAgIHZhbHVlc1swXSA9IDE5MDAgKyBsb2NhbF90aW1lLnRtX3llYXI7CiAgICAgIHZhbHVlc1sxXSA9IDEgKyBsb2NhbF90aW1lLnRtX21vbjsKICAgICAgdmFsdWVzWzJdID0gbG9jYWxfdGltZS50bV9tZGF5OwogICAgICB2YWx1ZXNbM10gPSAobG9jYWxfdGltZS50bV9taW4gLSBVVENfdGltZS50bV9taW4gKwoJICAgICAgICAgICA2MCAqIChsb2NhbF90aW1lLnRtX2hvdXIgLSBVVENfdGltZS50bV9ob3VyICsKCQkgICAgIDI0ICogKGxvY2FsX3RpbWUudG1feWRheSAtIFVUQ190aW1lLnRtX3lkYXkpKSk7CiAgICAgIHZhbHVlc1s0XSA9IGxvY2FsX3RpbWUudG1faG91cjsKICAgICAgdmFsdWVzWzVdID0gbG9jYWxfdGltZS50bV9taW47CiAgICAgIHZhbHVlc1s2XSA9IGxvY2FsX3RpbWUudG1fc2VjOwogICAgICB2YWx1ZXNbN10gPSAwOwoKI2lmIEhBVkVfR0VUVElNRU9GREFZCiAgICAgIHsKCXN0cnVjdCB0aW1ldmFsIHRwOwojICBpZiBHRVRUSU1FT0ZEQVlfT05FX0FSR1VNRU5UCglpZiAoIWdldHRpbWVvZmRheSAoJnRwKSkKIyAgZWxzZQojICAgIGlmIEhBVkVfU1RSVUNUX1RJTUVaT05FCglzdHJ1Y3QgdGltZXpvbmUgdHpwOwoKICAgICAgLyogU29tZSBzeXN0ZW1zIHN1Y2ggYXMgSFAtVVgsIGRvIGhhdmUgc3RydWN0IHRpbWV6b25lLCBidXQKCSBnZXR0aW1lb2ZkYXkgdGFrZXMgdm9pZCogYXMgdGhlIDJuZCBhcmcuICBIb3dldmVyLCB0aGUKCSBlZmZlY3Qgb2YgcGFzc2luZyBhbnl0aGluZyBvdGhlciB0aGFuIGEgbnVsbCBwb2ludGVyIGlzCgkgdW5zcGVjaWZpZWQgb24gSFAtVVguICBDb25maWd1cmUgY2hlY2tzIGlmIGdldHRpbWVvZmRheQoJIGFjdHVhbGx5IGZhaWxzIHdpdGggYSBub24tTlVMTCBhcmcgYW5kIHByZXRlbmRzIHRoYXQKCSBzdHJ1Y3QgdGltZXpvbmUgaXMgbWlzc2luZyBpZiBpdCBkb2VzIGZhaWwuICAqLwoJaWYgKCFnZXR0aW1lb2ZkYXkgKCZ0cCwgJnR6cCkpCiMgICAgZWxzZQoJaWYgKCFnZXR0aW1lb2ZkYXkgKCZ0cCwgKHZvaWQgKikgMCkpCiMgICAgZW5kaWYgLyogSEFWRV9TVFJVQ1RfVElNRVpPTkUgICovCiMgIGVuZGlmIC8qIEdFVFRJTUVPRkRBWV9PTkVfQVJHVU1FTlQgICovCgl2YWx1ZXNbN10gPSB0cC50dl91c2VjIC8gMTAwMDsKICAgICAgfQojZW5kaWYgLyogSEFWRV9HRVRUSU1FT0ZEQVkgKi8KCiNpZiBIQVZFX1NOUFJJTlRGCiAgICAgIGlmIChfX2RhdGUpCglzbnByaW50ZiAoZGF0ZSwgREFURV9MRU4gKyAxLCAiJTA0ZCUwMmQlMDJkIiwKCQkgIHZhbHVlc1swXSwgdmFsdWVzWzFdLCB2YWx1ZXNbMl0pOwogICAgICBpZiAoX190aW1lKQoJc25wcmludGYgKHRpbWVjLCBUSU1FX0xFTiArIDEsICIlMDJkJTAyZCUwMmQuJTAzZCIsCgkJICB2YWx1ZXNbNF0sIHZhbHVlc1s1XSwgdmFsdWVzWzZdLCB2YWx1ZXNbN10pOwoKICAgICAgaWYgKF9fem9uZSkKCXNucHJpbnRmICh6b25lLCBaT05FX0xFTiArIDEsICIlKzAzZCUwMmQiLAoJCSAgdmFsdWVzWzNdIC8gNjAsIGFicyAodmFsdWVzWzNdICUgNjApKTsKI2Vsc2UKICAgICAgaWYgKF9fZGF0ZSkKCXNwcmludGYgKGRhdGUsICIlMDRkJTAyZCUwMmQiLCB2YWx1ZXNbMF0sIHZhbHVlc1sxXSwgdmFsdWVzWzJdKTsKCiAgICAgIGlmIChfX3RpbWUpCglzcHJpbnRmICh0aW1lYywgIiUwMmQlMDJkJTAyZC4lMDNkIiwKCQkgdmFsdWVzWzRdLCB2YWx1ZXNbNV0sIHZhbHVlc1s2XSwgdmFsdWVzWzddKTsKCiAgICAgIGlmIChfX3pvbmUpCglzcHJpbnRmICh6b25lLCAiJSswM2QlMDJkIiwKCQkgdmFsdWVzWzNdIC8gNjAsIGFicyAodmFsdWVzWzNdICUgNjApKTsKI2VuZGlmCiAgICB9CiAgZWxzZQogICAgewogICAgICBtZW1zZXQgKGRhdGUsICcgJywgREFURV9MRU4pOwogICAgICBkYXRlW0RBVEVfTEVOXSA9ICdcMCc7CgogICAgICBtZW1zZXQgKHRpbWVjLCAnICcsIFRJTUVfTEVOKTsKICAgICAgdGltZWNbVElNRV9MRU5dID0gJ1wwJzsKCiAgICAgIG1lbXNldCAoem9uZSwgJyAnLCBaT05FX0xFTik7CiAgICAgIHpvbmVbWk9ORV9MRU5dID0gJ1wwJzsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBWQUxVRVNfU0laRTsgaSsrKQoJdmFsdWVzW2ldID0gLSBHRkNfSU5URUdFUl80X0hVR0U7CiAgICB9ICAgCiNlbHNlIC8qIGlmIGRlZmluZWQgSEFWRV9OT19EQVRFX1RJTUUgICovCiAgLyogV2UgcmVhbGx5IGhhdmUgKm5vdGhpbmcqIHRvIHJldHVybiwgc28gcmV0dXJuIGJsYW5rcyBhbmQgSFVHRSgwKS4gICovCiAgICAgIAogIG1lbXNldCAoZGF0ZSwgJyAnLCBEQVRFX0xFTik7CiAgZGF0ZVtEQVRFX0xFTl0gPSAnXDAnOwoKICBtZW1zZXQgKHRpbWVjLCAnICcsIFRJTUVfTEVOKTsKICB0aW1lY1tUSU1FX0xFTl0gPSAnXDAnOwoKICBtZW1zZXQgKHpvbmUsICcgJywgWk9ORV9MRU4pOwogIHpvbmVbWk9ORV9MRU5dID0gJ1wwJzsKCiAgZm9yIChpID0gMDsgaSA8IFZBTFVFU19TSVpFOyBpKyspCiAgICB2YWx1ZXNbaV0gPSAtIEdGQ19JTlRFR0VSXzRfSFVHRTsKI2VuZGlmICAvKiBIQVZFX05PX0RBVEVfVElNRSAgKi8KCiAgLyogQ29weSB0aGUgdmFsdWVzIGludG8gdGhlIGFyZ3VtZW50cy4gICovCiAgaWYgKF9fdmFsdWVzKQogICAgewogICAgICBzaXplX3QgbGVuLCBkZWx0YSwgZWx0X3NpemU7CgogICAgICBlbHRfc2l6ZSA9IEdGQ19ERVNDUklQVE9SX1NJWkUgKF9fdmFsdWVzKTsKICAgICAgbGVuID0gX192YWx1ZXMtPmRpbVswXS51Ym91bmQgKyAxIC0gX192YWx1ZXMtPmRpbVswXS5sYm91bmQ7CiAgICAgIGRlbHRhID0gX192YWx1ZXMtPmRpbVswXS5zdHJpZGU7CiAgICAgIGlmIChkZWx0YSA9PSAwKQoJZGVsdGEgPSAxOwoKICAgICAgYXNzZXJ0IChsZW4gPj0gVkFMVUVTX1NJWkUpOwogICAgICAvKiBDb3BlIHdpdGggZGlmZmVyZW50IHR5cGUga2luZHMuICAqLwogICAgICBpZiAoZWx0X3NpemUgPT0gNCkKICAgICAgICB7CgkgIEdGQ19JTlRFR0VSXzQgKnZwdHI0ID0gX192YWx1ZXMtPmRhdGE7CgoJICBmb3IgKGkgPSAwOyBpIDwgVkFMVUVTX1NJWkU7IGkrKywgdnB0cjQgKz0gZGVsdGEpCgkgICAgKnZwdHI0ID0gdmFsdWVzW2ldOwoJfQogICAgICBlbHNlIGlmIChlbHRfc2l6ZSA9PSA4KQogICAgICAgIHsKCSAgR0ZDX0lOVEVHRVJfOCAqdnB0cjggPSAoR0ZDX0lOVEVHRVJfOCAqKV9fdmFsdWVzLT5kYXRhOwoKCSAgZm9yIChpID0gMDsgaSA8IFZBTFVFU19TSVpFOyBpKyssIHZwdHI4ICs9IGRlbHRhKQoJICAgIHsKCSAgICAgIGlmICh2YWx1ZXNbaV0gPT0gLSBHRkNfSU5URUdFUl80X0hVR0UpCgkJKnZwdHI4ID0gLSBHRkNfSU5URUdFUl84X0hVR0U7CgkgICAgICBlbHNlCgkJKnZwdHI4ID0gdmFsdWVzW2ldOwoJICAgIH0KCX0KICAgICAgZWxzZSAKCWFib3J0ICgpOwogICAgfQoKICBpZiAoX196b25lKQogICAgewogICAgICBhc3NlcnQgKF9fem9uZV9sZW4gPj0gWk9ORV9MRU4pOwogICAgICBmc3RyY3B5IChfX3pvbmUsIFpPTkVfTEVOLCB6b25lLCBaT05FX0xFTik7CiAgICB9CgogIGlmIChfX3RpbWUpCiAgICB7CiAgICAgIGFzc2VydCAoX190aW1lX2xlbiA+PSBUSU1FX0xFTik7CiAgICAgIGZzdHJjcHkgKF9fdGltZSwgVElNRV9MRU4sIHRpbWVjLCBUSU1FX0xFTik7CiAgICB9CgogIGlmIChfX2RhdGUpCiAgICB7CiAgICAgIGFzc2VydCAoX19kYXRlX2xlbiA+PSBEQVRFX0xFTik7CiAgICAgIGZzdHJjcHkgKF9fZGF0ZSwgREFURV9MRU4sIGRhdGUsIERBVEVfTEVOKTsKICAgIH0KfQo=