LyoKICoJdzgzNjI3aGYvdGhmIFdEVCBkcml2ZXIKICoKICoJKGMpIENvcHlyaWdodCAyMDA3IFZsYWQgRHJ1a2tlciA8dmxhZEBzdG9yZXdpei5jb20+CiAqCQlhZGRlZCBzdXBwb3J0IGZvciBXODM2MjdUSEYuCiAqCiAqCShjKSBDb3B5cmlnaHQgMjAwMywyMDA3IFDhZHJhaWcgQnJhZHkgPFBAZHJhaWdCcmFkeS5jb20+CiAqCiAqCUJhc2VkIG9uIGFkdmFudGVjaHdkdC5jIHdoaWNoIGlzIGJhc2VkIG9uIHdkdC5jLgogKglPcmlnaW5hbCBjb3B5cmlnaHQgbWVzc2FnZXM6CiAqCiAqCShjKSBDb3B5cmlnaHQgMjAwMC0yMDAxIE1hcmVrIE1pY2hhbGtpZXdpY3ogPG1hcmVrbUBsaW51eC5vcmcucGw+CiAqCiAqCShjKSBDb3B5cmlnaHQgMTk5NiBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiwKICoJCQkJCQlBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKglOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZQogKgl3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQKICoJIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKgogKgkoYykgQ29weXJpZ2h0IDE5OTUgICAgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CiNpbmNsdWRlIDxsaW51eC9mcy5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgojaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgojaW5jbHVkZSA8bGludXgvaW8uaD4KI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KCiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CgojZGVmaW5lIFdBVENIRE9HX05BTUUgInc4MzYyN2hmL3RoZi9oZyBXRFQiCiNkZWZpbmUgUEZYIFdBVENIRE9HX05BTUUgIjogIgojZGVmaW5lIFdBVENIRE9HX1RJTUVPVVQgNjAJCS8qIDYwIHNlYyBkZWZhdWx0IHRpbWVvdXQgKi8KCnN0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9pc19vcGVuOwpzdGF0aWMgY2hhciBleHBlY3RfY2xvc2U7CnN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW9fbG9jayk7CgovKiBZb3UgbXVzdCBzZXQgdGhpcyAtIHRoZXJlIGlzIG5vIHNhbmUgd2F5IHRvIHByb2JlIGZvciB0aGlzIGJvYXJkLiAqLwpzdGF0aWMgaW50IHdkdF9pbyA9IDB4MkU7Cm1vZHVsZV9wYXJhbSh3ZHRfaW8sIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0Mod2R0X2lvLCAidzgzNjI3aGYvdGhmIFdEVCBpbyBwb3J0IChkZWZhdWx0IDB4MkUpIik7CgpzdGF0aWMgaW50IHRpbWVvdXQgPSBXQVRDSERPR19USU1FT1VUOwkvKiBpbiBzZWNvbmRzICovCm1vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHRpbWVvdXQsCgkJIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcy4gMSA8PSB0aW1lb3V0IDw9IDI1NSwgZGVmYXVsdD0iCgkJCQlfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfVElNRU9VVCkgIi4iKTsKCnN0YXRpYyBpbnQgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKbW9kdWxlX3BhcmFtKG5vd2F5b3V0LCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LAoJCSJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9IgoJCQkJX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX05PV0FZT1VUKSAiKSIpOwoKLyoKICoJS2VybmVsIG1ldGhvZHMuCiAqLwoKI2RlZmluZSBXRFRfRUZFUiAod2R0X2lvKzApICAgLyogRXh0ZW5kZWQgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVycyAqLwojZGVmaW5lIFdEVF9FRklSICh3ZHRfaW8rMCkgICAvKiBFeHRlbmRlZCBGdW5jdGlvbiBJbmRleCBSZWdpc3RlcgoJCQkJCQkJKHNhbWUgYXMgRUZFUikgKi8KI2RlZmluZSBXRFRfRUZEUiAoV0RUX0VGSVIrMSkgLyogRXh0ZW5kZWQgRnVuY3Rpb24gRGF0YSBSZWdpc3RlciAqLwoKc3RhdGljIHZvaWQgdzgzNjI3aGZfc2VsZWN0X3dkX3JlZ2lzdGVyKHZvaWQpCnsKCXVuc2lnbmVkIGNoYXIgYzsKCW91dGJfcCgweDg3LCBXRFRfRUZFUik7IC8qIEVudGVyIGV4dGVuZGVkIGZ1bmN0aW9uIG1vZGUgKi8KCW91dGJfcCgweDg3LCBXRFRfRUZFUik7IC8qIEFnYWluIGFjY29yZGluZyB0byBtYW51YWwgKi8KCglvdXRiKDB4MjAsIFdEVF9FRkVSKTsJLyogY2hlY2sgY2hpcCB2ZXJzaW9uCSovCgljID0gaW5iKFdEVF9FRkRSKTsKCWlmIChjID09IDB4ODIpIHsJLyogVzgzNjI3VEhGCQkqLwoJCW91dGJfcCgweDJiLCBXRFRfRUZFUik7IC8qIHNlbGVjdCBHUElPMyAqLwoJCWMgPSAoKGluYl9wKFdEVF9FRkRSKSAmIDB4ZjcpIHwgMHgwNCk7IC8qIHNlbGVjdCBXRFQwICovCgkJb3V0Yl9wKDB4MmIsIFdEVF9FRkVSKTsKCQlvdXRiX3AoYywgV0RUX0VGRFIpOwkvKiBzZXQgR1BJTzMgdG8gV0RUMCAqLwoJfSBlbHNlIGlmIChjID09IDB4ODgpIHsJLyogVzgzNjI3RUhGICovCgkJb3V0Yl9wKDB4MmQsIFdEVF9FRkVSKTsgLyogc2VsZWN0IEdQSU81ICovCgkJYyA9IGluYl9wKFdEVF9FRkRSKSAmIH4weDAxOyAvKiBQSU43NyAtPiBXRFQwIyAqLwoJCW91dGJfcCgweDJkLCBXRFRfRUZFUik7CgkJb3V0Yl9wKGMsIFdEVF9FRkRSKTsgLyogc2V0IEdQSU81IHRvIFdEVDAgKi8KCX0KCglvdXRiX3AoMHgwNywgV0RUX0VGRVIpOyAvKiBwb2ludCB0byBsb2dpY2FsIGRldmljZSBudW1iZXIgcmVnICovCglvdXRiX3AoMHgwOCwgV0RUX0VGRFIpOyAvKiBzZWxlY3QgbG9naWNhbCBkZXZpY2UgOCAoR1BJTzIpICovCglvdXRiX3AoMHgzMCwgV0RUX0VGRVIpOyAvKiBzZWxlY3QgQ1IzMCAqLwoJb3V0Yl9wKDB4MDEsIFdEVF9FRkRSKTsgLyogc2V0IGJpdCAwIHRvIGFjdGl2YXRlIEdQSU8yICovCn0KCnN0YXRpYyB2b2lkIHc4MzYyN2hmX3Vuc2VsZWN0X3dkX3JlZ2lzdGVyKHZvaWQpCnsKCW91dGJfcCgweEFBLCBXRFRfRUZFUik7IC8qIExlYXZlIGV4dGVuZGVkIGZ1bmN0aW9uIG1vZGUgKi8KfQoKLyogdHlhbiBtb3RoZXJib2FyZHMgc2VlbSB0byBzZXQgRjUgdG8gMHg0QyA/CiAqIFNvIGV4cGxpY2l0bHkgaW5pdCB0byBhcHByb3ByaWF0ZSB2YWx1ZS4gKi8KCnN0YXRpYyB2b2lkIHc4MzYyN2hmX2luaXQodm9pZCkKewoJdW5zaWduZWQgY2hhciB0OwoKCXc4MzYyN2hmX3NlbGVjdF93ZF9yZWdpc3RlcigpOwoKCW91dGJfcCgweEY2LCBXRFRfRUZFUik7IC8qIFNlbGVjdCBDUkY2ICovCgl0ID0gaW5iX3AoV0RUX0VGRFIpOyAgICAgIC8qIHJlYWQgQ1JGNiAqLwoJaWYgKHQgIT0gMCkgewoJCXByaW50ayhLRVJOX0lORk8gUEZYCgkJICAgICAiV2F0Y2hkb2cgYWxyZWFkeSBydW5uaW5nLiBSZXNldHRpbmcgdGltZW91dCB0byAlZCBzZWNcbiIsCgkJCQkJCQkJdGltZW91dCk7CgkJb3V0Yl9wKHRpbWVvdXQsIFdEVF9FRkRSKTsgICAgLyogV3JpdGUgYmFjayB0byBDUkY2ICovCgl9CgoJb3V0Yl9wKDB4RjUsIFdEVF9FRkVSKTsgLyogU2VsZWN0IENSRjUgKi8KCXQgPSBpbmJfcChXRFRfRUZEUik7ICAgICAgLyogcmVhZCBDUkY1ICovCgl0ICY9IH4weDBDOyAgICAgICAgICAgICAgIC8qIHNldCBzZWNvbmQgbW9kZSAmIGRpc2FibGUga2V5Ym9hcmQKCQkJCSAgICB0dXJuaW5nIG9mZiB3YXRjaGRvZyAqLwoJb3V0Yl9wKHQsIFdEVF9FRkRSKTsgICAgLyogV3JpdGUgYmFjayB0byBDUkY1ICovCgoJb3V0Yl9wKDB4RjcsIFdEVF9FRkVSKTsgLyogU2VsZWN0IENSRjcgKi8KCXQgPSBpbmJfcChXRFRfRUZEUik7ICAgICAgLyogcmVhZCBDUkY3ICovCgl0ICY9IH4weEMwOyAgICAgICAgICAgICAgIC8qIGRpc2FibGUga2V5Ym9hcmQgJiBtb3VzZSB0dXJuaW5nIG9mZgoJCQkJICAgIHdhdGNoZG9nICovCglvdXRiX3AodCwgV0RUX0VGRFIpOyAgICAvKiBXcml0ZSBiYWNrIHRvIENSRjcgKi8KCgl3ODM2MjdoZl91bnNlbGVjdF93ZF9yZWdpc3RlcigpOwp9CgpzdGF0aWMgdm9pZCB3ZHRfY3RybChpbnQgdGltZW91dCkKewoJc3Bpbl9sb2NrKCZpb19sb2NrKTsKCgl3ODM2MjdoZl9zZWxlY3Rfd2RfcmVnaXN0ZXIoKTsKCglvdXRiX3AoMHhGNiwgV0RUX0VGRVIpOyAgICAvKiBTZWxlY3QgQ1JGNiAqLwoJb3V0Yl9wKHRpbWVvdXQsIFdEVF9FRkRSKTsgLyogV3JpdGUgVGltZW91dCBjb3VudGVyIHRvIENSRjYgKi8KCgl3ODM2MjdoZl91bnNlbGVjdF93ZF9yZWdpc3RlcigpOwoKCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKfQoKc3RhdGljIGludCB3ZHRfcGluZyh2b2lkKQp7Cgl3ZHRfY3RybCh0aW1lb3V0KTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdkdF9kaXNhYmxlKHZvaWQpCnsKCXdkdF9jdHJsKDApOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2R0X3NldF9oZWFydGJlYXQoaW50IHQpCnsKCWlmICh0IDwgMSB8fCB0ID4gMjU1KQoJCXJldHVybiAtRUlOVkFMOwoJdGltZW91dCA9IHQ7CglyZXR1cm4gMDsKfQoKc3RhdGljIHNzaXplX3Qgd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAoJCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKewoJaWYgKGNvdW50KSB7CgkJaWYgKCFub3dheW91dCkgewoJCQlzaXplX3QgaTsKCgkJCWV4cGVjdF9jbG9zZSA9IDA7CgoJCQlmb3IgKGkgPSAwOyBpICE9IGNvdW50OyBpKyspIHsKCQkJCWNoYXIgYzsKCQkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKCQkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJCWlmIChjID09ICdWJykKCQkJCQlleHBlY3RfY2xvc2UgPSA0MjsKCQkJfQoJCX0KCQl3ZHRfcGluZygpOwoJfQoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgbG9uZyB3ZHRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7Cgl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKCWludCBfX3VzZXIgKnAgPSBhcmdwOwoJaW50IG5ld190aW1lb3V0OwoJc3RhdGljIGNvbnN0IHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0gewoJCS5vcHRpb25zID0gV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX1NFVFRJTUVPVVQgfAoJCQkJCQkJV0RJT0ZfTUFHSUNDTE9TRSwKCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCgkJLmlkZW50aXR5ID0gIlc4MzYyN0hGIFdEVCIsCgl9OwoKCXN3aXRjaCAoY21kKSB7CgljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaWRlbnQsIHNpemVvZihpZGVudCkpKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgoJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgoJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKCXsKCQlpbnQgb3B0aW9ucywgcmV0dmFsID0gLUVJTlZBTDsKCgkJaWYgKGdldF91c2VyKG9wdGlvbnMsIHApKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpZiAob3B0aW9ucyAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CgkJCXdkdF9kaXNhYmxlKCk7CgkJCXJldHZhbCA9IDA7CgkJfQoJCWlmIChvcHRpb25zICYgV0RJT1NfRU5BQkxFQ0FSRCkgewoJCQl3ZHRfcGluZygpOwoJCQlyZXR2YWwgPSAwOwoJCX0KCQlyZXR1cm4gcmV0dmFsOwoJfQoJY2FzZSBXRElPQ19LRUVQQUxJVkU6CgkJd2R0X3BpbmcoKTsKCQlicmVhazsKCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKCQlpZiAoZ2V0X3VzZXIobmV3X3RpbWVvdXQsIHApKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpZiAod2R0X3NldF9oZWFydGJlYXQobmV3X3RpbWVvdXQpKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQl3ZHRfcGluZygpOwoJCS8qIEZhbGwgKi8KCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKCQlyZXR1cm4gcHV0X3VzZXIodGltZW91dCwgcCk7CglkZWZhdWx0OgoJCXJldHVybiAtRU5PVFRZOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZ3ZHRfaXNfb3BlbikpCgkJcmV0dXJuIC1FQlVTWTsKCS8qCgkgKglBY3RpdmF0ZQoJICovCgoJd2R0X3BpbmcoKTsKCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKfQoKc3RhdGljIGludCB3ZHRfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpCgkJd2R0X2Rpc2FibGUoKTsKCWVsc2UgewoJCXByaW50ayhLRVJOX0NSSVQgUEZYCgkJCSJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKCQl3ZHRfcGluZygpOwoJfQoJZXhwZWN0X2Nsb3NlID0gMDsKCWNsZWFyX2JpdCgwLCAmd2R0X2lzX29wZW4pOwoJcmV0dXJuIDA7Cn0KCi8qCiAqCU5vdGlmaWVyIGZvciBzeXN0ZW0gZG93bgogKi8KCnN0YXRpYyBpbnQgd2R0X25vdGlmeV9zeXMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGNvZGUsCgl2b2lkICp1bnVzZWQpCnsKCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpCgkJd2R0X2Rpc2FibGUoKTsJLyogVHVybiB0aGUgV0RUIG9mZiAqLwoKCXJldHVybiBOT1RJRllfRE9ORTsKfQoKLyoKICoJS2VybmVsIEludGVyZmFjZXMKICovCgpzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3ZHRfZm9wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAoJLndyaXRlCQk9IHdkdF93cml0ZSwKCS51bmxvY2tlZF9pb2N0bAk9IHdkdF9pb2N0bCwKCS5vcGVuCQk9IHdkdF9vcGVuLAoJLnJlbGVhc2UJPSB3ZHRfY2xvc2UsCn07CgpzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugd2R0X21pc2NkZXYgPSB7CgkubWlub3IgPSBXQVRDSERPR19NSU5PUiwKCS5uYW1lID0gIndhdGNoZG9nIiwKCS5mb3BzID0gJndkdF9mb3BzLAp9OwoKLyoKICoJVGhlIFdEVCBuZWVkcyB0byBsZWFybiBhYm91dCBzb2Z0IHNodXRkb3ducyBpbiBvcmRlciB0bwogKgl0dXJuIHRoZSB0aW1lYm9tYiByZWdpc3RlcnMgb2ZmLgogKi8KCnN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgd2R0X25vdGlmaWVyID0gewoJLm5vdGlmaWVyX2NhbGwgPSB3ZHRfbm90aWZ5X3N5cywKfTsKCnN0YXRpYyBpbnQgX19pbml0IHdkdF9pbml0KHZvaWQpCnsKCWludCByZXQ7CgoJcHJpbnRrKEtFUk5fSU5GTyAiV0RUIGRyaXZlciBmb3IgdGhlIFdpbmJvbmQoVE0pIFc4MzYyN0hGL1RIRi9IRyBTdXBlciBJL08gY2hpcCBpbml0aWFsaXNpbmcuXG4iKTsKCglpZiAod2R0X3NldF9oZWFydGJlYXQodGltZW91dCkpIHsKCQl3ZHRfc2V0X2hlYXJ0YmVhdChXQVRDSERPR19USU1FT1VUKTsKCQlwcmludGsoS0VSTl9JTkZPIFBGWAoJCSAgICAgInRpbWVvdXQgdmFsdWUgbXVzdCBiZSAxIDw9IHRpbWVvdXQgPD0gMjU1LCB1c2luZyAlZFxuIiwKCQkJCVdBVENIRE9HX1RJTUVPVVQpOwoJfQoKCWlmICghcmVxdWVzdF9yZWdpb24od2R0X2lvLCAxLCBXQVRDSERPR19OQU1FKSkgewoJCXByaW50ayhLRVJOX0VSUiBQRlggIkkvTyBhZGRyZXNzIDB4JTA0eCBhbHJlYWR5IGluIHVzZVxuIiwKCQkJd2R0X2lvKTsKCQlyZXQgPSAtRUlPOwoJCWdvdG8gb3V0OwoJfQoKCXc4MzYyN2hmX2luaXQoKTsKCglyZXQgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CglpZiAocmV0ICE9IDApIHsKCQlwcmludGsoS0VSTl9FUlIgUEZYCgkJCSJjYW5ub3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLCByZXQpOwoJCWdvdG8gdW5yZWdfcmVnaW9uczsKCX0KCglyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CglpZiAocmV0ICE9IDApIHsKCQlwcmludGsoS0VSTl9FUlIgUEZYCgkJCSJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKCQkJCQkJCVdBVENIRE9HX01JTk9SLCByZXQpOwoJCWdvdG8gdW5yZWdfcmVib290OwoJfQoKCXByaW50ayhLRVJOX0lORk8gUEZYCgkJCSJpbml0aWFsaXplZC4gdGltZW91dD0lZCBzZWMgKG5vd2F5b3V0PSVkKVxuIiwKCQkJCQkJCXRpbWVvdXQsIG5vd2F5b3V0KTsKCm91dDoKCXJldHVybiByZXQ7CnVucmVnX3JlYm9vdDoKCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOwp1bnJlZ19yZWdpb25zOgoJcmVsZWFzZV9yZWdpb24od2R0X2lvLCAxKTsKCWdvdG8gb3V0Owp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgd2R0X2V4aXQodm9pZCkKewoJbWlzY19kZXJlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7Cgl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmd2R0X25vdGlmaWVyKTsKCXJlbGVhc2VfcmVnaW9uKHdkdF9pbywgMSk7Cn0KCm1vZHVsZV9pbml0KHdkdF9pbml0KTsKbW9kdWxlX2V4aXQod2R0X2V4aXQpOwoKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpNT0RVTEVfQVVUSE9SKCJQ4WRyYWlnIEJyYWR5IDxQQGRyYWlnQnJhZHkuY29tPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oInc4MzYyN2hmL3RoZiBXRFQgZHJpdmVyIik7Ck1PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsK